diff --git a/.azuredevops/dependabot.yml b/.azuredevops/dependabot.yml new file mode 100644 index 00000000000..f18e60565a4 --- /dev/null +++ b/.azuredevops/dependabot.yml @@ -0,0 +1,5 @@ +version: 2 + +# Disabling dependabot on Azure DevOps as this is a mirrored repo. Updates should go through github. +enable-campaigned-updates: false +enable-security-updates: false diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 04a96644854..f04f261d6e3 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -39,7 +39,7 @@ "omnisharp.useModernNet": true, "omnisharp.enableAsyncCompletion": true, // ms-dotnettools.csdevkit settings - "dotnet.defaultSolution": "Razor.sln", + "dotnet.defaultSolution": "Razor.slnx", // ms-vscode.powershell settings "powershell.promptToUpdatePowerShell": false, "powershell.integratedConsole.showOnStartup": false, diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 95628bb7bb9..7bcc5e34ffd 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -46,6 +46,7 @@ Razor documents contain multiple languages: - Prefer raw string literals over verbatim strings - Ideally we test the end user scenario, not implementation details - Consider cross-platform compatibility by testing path handling and case sensitivity where applicable +- For tooling, "Cohosting" is the new architecture we're moving towards, so always create tests in the src\Razor\test\Microsoft.VisualStudioCode.RazorExtension.Test project ### Architecture Considerations @@ -57,7 +58,7 @@ Razor documents contain multiple languages: ## Build and Development ### Prerequisites -- .NET 8.0+ SDK (latest version specified in `global.json`) +- .NET 9.0+ SDK (latest version specified in `global.json`) - Visual Studio 2026 (Windows) or VS Code with C# extension (Windows, macOS or Linux) - PowerShell (for Windows build scripts) diff --git a/.gitignore b/.gitignore index f6e049037f9..8fda6ed6d3a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,6 @@ artifacts/ [Dd]ebug/ [Rr]elease/ -x64/ x86/ !eng/common/cross/x86/ [Bb]in/ [Oo]bj/ diff --git a/Directory.Build.props b/Directory.Build.props index 28e0653949b..24c0403f639 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -40,8 +40,11 @@ true - - $(NoWarn);NU1505 + + $(NoWarn);NU1505;NETSDK1233 false @@ -51,10 +54,20 @@ net472 net8.0 - net9.0 + net10.0 $(NetVS);$(NetVSCode) + + RoslynDev + CommonExtensions + + Microsoft\RazorLanguageServices + + ServiceHubCore + Microsoft.VisualStudio.RazorExtension + + <_MicrosoftWebToolsPackageVersion>17.11.11-preview-0001 - <_MicrosoftVisualStudioShellPackagesVersion>18.0.2101-preview.1 - <_MicrosoftVisualStudioPackagesVersion>18.0.332-preview + <_MicrosoftVisualStudioShellPackagesVersion>18.0.2188-preview.1 + <_MicrosoftVisualStudioPackagesVersion>18.0.404-preview <_VisualStudioLanguageServerProtocolVersion>17.12.1-preview <_MicrosoftExtensionsPackageVersion>9.0.0 <_BasicReferenceAssembliesVersion>1.7.2 <_BenchmarkDotNetPackageVersion>0.13.5.2136 - <_MicrosoftVisualStudioExtensibilityTestingVersion>0.1.785-beta - <_RoslynDiagnosticAnalyzersPackageVersion>3.11.0-beta1.24508.2 + <_MicrosoftVisualStudioExtensibilityTestingVersion>0.1.800-beta <_MicrosoftVisualStudioLanguageServicesPackageVersion>$(MicrosoftVisualStudioLanguageServicesPackageVersion) <_XunitPackageVersion>2.9.2 - <_MicrosoftBuildPackageVersion>17.15.0-preview-25353-11 + <_MicrosoftBuildPackageVersion>17.15.0-preview-25357-08 @@ -87,7 +86,7 @@ - + @@ -101,7 +100,7 @@ - + diff --git a/NuGet.config b/NuGet.config index b81680e6562..ae8329cc170 100644 --- a/NuGet.config +++ b/NuGet.config @@ -56,6 +56,7 @@ + diff --git a/Razor.Slim.slnf b/Razor.Slim.slnf index 1dc8a06ff9a..bc92a610737 100644 --- a/Razor.Slim.slnf +++ b/Razor.Slim.slnf @@ -1,6 +1,6 @@ { "solution": { - "path": "Razor.sln", + "path": "Razor.slnx", "projects": [ "src\\Analyzers\\Razor.Diagnostics.Analyzers.Test\\Razor.Diagnostics.Analyzers.Test.csproj", "src\\Analyzers\\Razor.Diagnostics.Analyzers\\Razor.Diagnostics.Analyzers.csproj", @@ -20,13 +20,11 @@ "src\\Compiler\\tools\\Microsoft.CodeAnalysis.Razor.Tooling.Internal\\Microsoft.CodeAnalysis.Razor.Tooling.Internal.csproj", "src\\Razor\\src\\Microsoft.CodeAnalysis.Razor.Workspaces\\Microsoft.CodeAnalysis.Razor.Workspaces.csproj", "src\\Razor\\src\\Microsoft.CodeAnalysis.Remote.Razor\\Microsoft.CodeAnalysis.Remote.Razor.csproj", - "src\\Razor\\src\\Microsoft.VisualStudio.DevKit.Razor\\Microsoft.VisualStudio.DevKit.Razor.csproj", "src\\Razor\\src\\Microsoft.VisualStudio.LanguageServer.ContainedLanguage\\Microsoft.VisualStudio.LanguageServer.ContainedLanguage.csproj", "src\\Razor\\src\\Microsoft.VisualStudio.LanguageServices.Razor\\Microsoft.VisualStudio.LanguageServices.Razor.csproj", "src\\Razor\\src\\Microsoft.VisualStudio.RazorExtension\\Microsoft.VisualStudio.RazorExtension.csproj", "src\\Razor\\src\\Microsoft.VisualStudioCode.RazorExtension\\Microsoft.VisualStudioCode.RazorExtension.csproj", "src\\Razor\\src\\Microsoft.AspNetCore.Razor.LanguageServer\\Microsoft.AspNetCore.Razor.LanguageServer.csproj", - "src\\Razor\\src\\rzls\\rzls.csproj", "src\\Razor\\test\\Microsoft.AspNetCore.Razor.Test.Common.Tooling\\Microsoft.AspNetCore.Razor.Test.Common.Tooling.csproj", "src\\Razor\\test\\Microsoft.AspNetCore.Razor.LanguageServer.Test\\Microsoft.AspNetCore.Razor.LanguageServer.Test.csproj", "src\\Razor\\test\\Microsoft.CodeAnalysis.Razor.Workspaces.Test\\Microsoft.CodeAnalysis.Razor.Workspaces.Test.csproj", diff --git a/Razor.sln b/Razor.sln deleted file mode 100644 index b45fcf1597f..00000000000 --- a/Razor.sln +++ /dev/null @@ -1,618 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 18 -VisualStudioVersion = 18.0.10919.115 main -MinimumVisualStudioVersion = 16.0.0.0 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.RazorExtension", "src\Razor\src\Microsoft.VisualStudio.RazorExtension\Microsoft.VisualStudio.RazorExtension.csproj", "{BCF712D4-329A-4C7A-8292-9EFC864B2ABA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tooling", "Tooling", "{3C0D6505-79B3-49D0-B4C3-176F0F1836ED}" - ProjectSection(SolutionItems) = preProject - src\Razor\src\Directory.Build.props = src\Razor\src\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tooling Tests", "Tooling Tests", "{92463391-81BE-462B-AC3C-78C6C760741F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Razor.Workspaces", "src\Razor\src\Microsoft.CodeAnalysis.Razor.Workspaces\Microsoft.CodeAnalysis.Razor.Workspaces.csproj", "{0F265874-C592-448B-BC4F-3430AB03E0DC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Remote.Razor", "src\Razor\src\Microsoft.CodeAnalysis.Remote.Razor\Microsoft.CodeAnalysis.Remote.Razor.csproj", "{4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.LanguageServices.Razor", "src\Razor\src\Microsoft.VisualStudio.LanguageServices.Razor\Microsoft.VisualStudio.LanguageServices.Razor.csproj", "{E5D92DB7-5CBF-410A-9685-FF76F71EC96F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.LanguageServices.Razor.Test", "src\Razor\test\Microsoft.VisualStudio.LanguageServices.Razor.Test\Microsoft.VisualStudio.LanguageServices.Razor.Test.csproj", "{37E61BDB-658E-4F44-A499-D64CC6D35485}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Test.Common.Tooling", "src\Razor\test\Microsoft.AspNetCore.Razor.Test.Common.Tooling\Microsoft.AspNetCore.Razor.Test.Common.Tooling.csproj", "{078AEF36-F319-4CE2-BAA2-5B58A6536B46}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Razor.Workspaces.Test", "src\Razor\test\Microsoft.CodeAnalysis.Razor.Workspaces.Test\Microsoft.CodeAnalysis.Razor.Workspaces.Test.csproj", "{C61AAE12-5007-4205-A220-68F354A7F235}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Microbenchmarks", "src\Razor\benchmarks\Microsoft.AspNetCore.Razor.Microbenchmarks\Microsoft.AspNetCore.Razor.Microbenchmarks.csproj", "{6205467F-E381-4C42-AEEC-763BD62B3D5E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", "{C2C98051-0F39-47F2-80B6-E72B29159F2C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.LanguageServer", "src\Razor\src\Microsoft.AspNetCore.Razor.LanguageServer\Microsoft.AspNetCore.Razor.LanguageServer.csproj", "{1D15867E-E50F-4107-92A4-BBC2EE6B088C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.LanguageServer.Test", "src\Razor\test\Microsoft.AspNetCore.Razor.LanguageServer.Test\Microsoft.AspNetCore.Razor.LanguageServer.Test.csproj", "{FBAE9975-77BE-411B-A1A3-4790C8A367EF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "rzls", "src\Razor\src\rzls\rzls.csproj", "{35FEC0EA-09B5-45D2-832D-D6FEBA364871}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.LanguageServer.ContainedLanguage", "src\Razor\src\Microsoft.VisualStudio.LanguageServer.ContainedLanguage\Microsoft.VisualStudio.LanguageServer.ContainedLanguage.csproj", "{0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.LanguageServer.ContainedLanguage.Test", "src\Razor\test\Microsoft.VisualStudio.LanguageServer.ContainedLanguage.Test\Microsoft.VisualStudio.LanguageServer.ContainedLanguage.Test.csproj", "{0FC409AF-B92B-42D0-9096-1F20360D2672}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Remote.Razor.Test", "src\Razor\test\Microsoft.CodeAnalysis.Remote.Razor.Test\Microsoft.CodeAnalysis.Remote.Razor.Test.csproj", "{39233703-B752-43AC-AD86-E9D3E61B4AD9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Remote.Razor.CoreComponents", "src\Razor\src\Microsoft.CodeAnalysis.Remote.Razor.CoreComponents\Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.csproj", "{17C4A6DF-3AA5-43FE-8A0E-53DF14340446}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{4CAC99E0-6ECE-4264-96C3-AF4EEE7BC9D1}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - Directory.Packages.props = Directory.Packages.props - NuGet.config = NuGet.config - eng\targets\Services.props = eng\targets\Services.props - SpellingExclusions.dic = SpellingExclusions.dic - eng\Versions.props = eng\Versions.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.Razor.IntegrationTests", "src\Razor\test\Microsoft.VisualStudio.Razor.IntegrationTests\Microsoft.VisualStudio.Razor.IntegrationTests.csproj", "{8CEC0991-259F-4313-B3EF-E398F2B40E61}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.RazorExtension.Dependencies", "src\Razor\src\Microsoft.VisualStudio.RazorExtension.Dependencies\Microsoft.VisualStudio.RazorExtension.Dependencies.csproj", "{87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RazorDeployment", "src\Razor\src\RazorDeployment\RazorDeployment.csproj", "{0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Compiler", "Compiler", "{5B60F564-4AD7-4B70-A887-7D91496799A2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{3AE210D1-C435-4693-BF79-2EF13ED554B9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.AspNetCore.Mvc.Razor.Extensions", "Microsoft.AspNetCore.Mvc.Razor.Extensions", "{DE461FC6-663E-4362-9B33-C5A88C7B4DB8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Razor.Extensions.Test", "src\Compiler\Microsoft.AspNetCore.Mvc.Razor.Extensions\test\Microsoft.AspNetCore.Mvc.Razor.Extensions.Test.csproj", "{7BDA653C-6164-4ACB-913B-C7BB91E2390A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X", "Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X", "{9B419123-4D1D-4ADB-ABB0-C324ED5A62E3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.Test", "src\Compiler\Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X\test\Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.Test.csproj", "{1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X", "Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X", "{F8C0166A-2714-44AA-87B5-3365F1FB1AE2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X.Test", "src\Compiler\Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X\test\Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X.Test.csproj", "{D811DDE3-FDE4-4E9E-837B-11AF73465768}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.AspNetCore.Razor.Language", "Microsoft.AspNetCore.Razor.Language", "{D9BDF88A-8F0B-4FAF-B77B-206042C1D402}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Language.Test", "src\Compiler\Microsoft.AspNetCore.Razor.Language\test\Microsoft.AspNetCore.Razor.Language.Test.csproj", "{E2D95310-84DA-4ED2-A1F0-0B34B029F579}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.CodeAnalysis.Razor", "Microsoft.CodeAnalysis.Razor", "{C2E49955-A0B0-4F4A-B3AC-F120DCF9B13F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Razor.Test", "src\Compiler\Microsoft.CodeAnalysis.Razor\test\Microsoft.CodeAnalysis.Razor.Test.csproj", "{D5CC33F8-6883-496C-AE99-8AE855784D13}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler", "src\Compiler\perf\Microbenchmarks\Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler.csproj", "{7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sdk", "sdk", "{AA4EE974-E765-4B97-AF35-F734BF9830F6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{FB7C870E-A173-4F75-BE63-4EF39C79A759}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.NET.Sdk.Razor.SourceGenerators.Transport", "src\Compiler\Microsoft.NET.Sdk.Razor.SourceGenerators.Transport\Microsoft.NET.Sdk.Razor.SourceGenerators.Transport.csproj", "{F5017FD5-EA78-4CD2-A1B6-F534910683F8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.NET.Sdk.Razor.SourceGenerators.Test", "src\Compiler\test\Microsoft.NET.Sdk.Razor.SourceGenerators.Tests\Microsoft.NET.Sdk.Razor.SourceGenerators.Test.csproj", "{BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X.Compiler", "src\Compiler\test\Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X\Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X.Compiler.csproj", "{A0867F6B-3DBB-4743-B241-F59878BFA15D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X.Compiler", "src\Compiler\test\Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X\Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X.Compiler.csproj", "{B040B919-D8E3-4656-BD85-88A541AA893D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Razor.Extensions.Tooling.Internal", "src\Compiler\tools\Microsoft.AspNetCore.Mvc.Razor.Extensions.Tooling.Internal\Microsoft.AspNetCore.Mvc.Razor.Extensions.Tooling.Internal.csproj", "{907EDA43-B4D9-40DA-BA07-8E00DD89FA33}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Razor.Tooling.Internal", "src\Compiler\tools\Microsoft.CodeAnalysis.Razor.Tooling.Internal\Microsoft.CodeAnalysis.Razor.Tooling.Internal.csproj", "{97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RazorSyntaxGenerator", "src\Compiler\tools\RazorSyntaxGenerator\RazorSyntaxGenerator.csproj", "{A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Compiler Tests", "Compiler Tests", "{A5E2E4FA-6087-4C16-BB7A-89E23AA0F4E3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Microbenchmarks.Generator", "src\Compiler\perf\Microsoft.AspNetCore.Razor.Microbenchmarks.Generator\Microsoft.AspNetCore.Razor.Microbenchmarks.Generator.csproj", "{7400A168-2552-49C7-93E3-D4DAA90C216F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudioCode.RazorExtension", "src\Razor\src\Microsoft.VisualStudioCode.RazorExtension\Microsoft.VisualStudioCode.RazorExtension.csproj", "{2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudioCode.RazorExtension.Test", "src\Razor\test\Microsoft.VisualStudioCode.RazorExtension.Test\Microsoft.VisualStudioCode.RazorExtension.Test.csproj", "{70C6EAF1-202B-481B-ADD4-D30DF1396BDE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Compilers.Razor.Toolset", "src\Compiler\Microsoft.Net.Compilers.Razor.Toolset\Microsoft.Net.Compilers.Razor.Toolset.csproj", "{6117D32B-DDAE-4654-8260-783B27153E0B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor", "src\Razor\src\Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor\Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor.csproj", "{53977089-1A87-4521-8368-0D50DFDA1279}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor.Test", "src\Razor\test\Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor.Test\Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor.Test.csproj", "{C0C2AD17-5F5B-4B11-956D-203D91C377FB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Utilities.Shared.Test", "src\Shared\Microsoft.AspNetCore.Razor.Utilities.Shared.Test\Microsoft.AspNetCore.Razor.Utilities.Shared.Test.csproj", "{7275F376-1B63-49D3-8078-0F7CA15CC637}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Utilities.Shared", "src\Shared\Microsoft.AspNetCore.Razor.Utilities.Shared\Microsoft.AspNetCore.Razor.Utilities.Shared.csproj", "{BAFE178B-7AD4-41AE-A75D-9B920B9EA050}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{4AA319E0-C81E-47CC-841A-6EFCB6784A1F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Razor.Diagnostics.Analyzers", "src\Analyzers\Razor.Diagnostics.Analyzers\Razor.Diagnostics.Analyzers.csproj", "{45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Razor.Diagnostics.Analyzers.Test", "src\Analyzers\Razor.Diagnostics.Analyzers.Test\Razor.Diagnostics.Analyzers.Test.csproj", "{167F1426-D9AE-49DF-B214-F00536DBC305}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.DevKit.Razor", "src\Razor\src\Microsoft.VisualStudio.DevKit.Razor\Microsoft.VisualStudio.DevKit.Razor.csproj", "{0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Test.Common", "src\Shared\Microsoft.AspNetCore.Razor.Test.Common\Microsoft.AspNetCore.Razor.Test.Common.csproj", "{64A72A33-38B4-4C23-9E12-D7FEBD673FB7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Language.Legacy.Test", "src\Compiler\Microsoft.AspNetCore.Razor.Language\legacyTest\Microsoft.AspNetCore.Razor.Language.Legacy.Test.csproj", "{C504C2D7-8313-46D8-A159-7EB79047C09C}" -EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.AspNetCore.Razor.Serialization.Json", "src\Shared\Microsoft.AspNetCore.Razor.Serialization.Json\Microsoft.AspNetCore.Razor.Serialization.Json.shproj", "{CD6913F3-EC47-4470-9C45-F5F898615E9D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.LegacyEditor.Razor", "src\Razor\src\Microsoft.VisualStudio.LegacyEditor.Razor\Microsoft.VisualStudio.LegacyEditor.Razor.csproj", "{18E29992-32E3-4801-90EE-C8D8E76F637A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.LegacyEditor.Razor.Test", "src\Razor\test\Microsoft.VisualStudio.LegacyEditor.Razor.Test\Microsoft.VisualStudio.LegacyEditor.Razor.Test.csproj", "{094A024C-7DC1-487B-9F52-9D65CDFEE18D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.CodeAnalysis.Razor.Compiler", "Microsoft.CodeAnalysis.Razor.Compiler", "{440580F4-D746-49BB-AE8E-9F898483EA75}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Razor.Compiler", "src\Compiler\Microsoft.CodeAnalysis.Razor.Compiler\src\Microsoft.CodeAnalysis.Razor.Compiler.csproj", "{E102632D-EC30-474F-B2EB-6EB07ED45F27}" -EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.CodeAnalysis.Razor.CohostingShared", "src\Razor\src\Microsoft.CodeAnalysis.Razor.CohostingShared\Microsoft.CodeAnalysis.Razor.CohostingShared.shproj", "{6778F3D4-C6C2-4882-9F86-54FCD44B078A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Razor.Test.Common.Cohosting", "src\Razor\test\Microsoft.AspNetCore.Razor.Test.Common.Cohosting\Microsoft.AspNetCore.Razor.Test.Common.Cohosting.csproj", "{8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - DebugNoVSIX|Any CPU = DebugNoVSIX|Any CPU - Release|Any CPU = Release|Any CPU - ReleaseNoVSIX|Any CPU = ReleaseNoVSIX|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA}.Release|Any CPU.Build.0 = Release|Any CPU - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {0F265874-C592-448B-BC4F-3430AB03E0DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F265874-C592-448B-BC4F-3430AB03E0DC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F265874-C592-448B-BC4F-3430AB03E0DC}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {0F265874-C592-448B-BC4F-3430AB03E0DC}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {0F265874-C592-448B-BC4F-3430AB03E0DC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F265874-C592-448B-BC4F-3430AB03E0DC}.Release|Any CPU.Build.0 = Release|Any CPU - {0F265874-C592-448B-BC4F-3430AB03E0DC}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {0F265874-C592-448B-BC4F-3430AB03E0DC}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}.Release|Any CPU.Build.0 = Release|Any CPU - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F}.Release|Any CPU.Build.0 = Release|Any CPU - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {37E61BDB-658E-4F44-A499-D64CC6D35485}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {37E61BDB-658E-4F44-A499-D64CC6D35485}.Debug|Any CPU.Build.0 = Debug|Any CPU - {37E61BDB-658E-4F44-A499-D64CC6D35485}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {37E61BDB-658E-4F44-A499-D64CC6D35485}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {37E61BDB-658E-4F44-A499-D64CC6D35485}.Release|Any CPU.ActiveCfg = Release|Any CPU - {37E61BDB-658E-4F44-A499-D64CC6D35485}.Release|Any CPU.Build.0 = Release|Any CPU - {37E61BDB-658E-4F44-A499-D64CC6D35485}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {37E61BDB-658E-4F44-A499-D64CC6D35485}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {078AEF36-F319-4CE2-BAA2-5B58A6536B46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {078AEF36-F319-4CE2-BAA2-5B58A6536B46}.Debug|Any CPU.Build.0 = Debug|Any CPU - {078AEF36-F319-4CE2-BAA2-5B58A6536B46}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {078AEF36-F319-4CE2-BAA2-5B58A6536B46}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {078AEF36-F319-4CE2-BAA2-5B58A6536B46}.Release|Any CPU.ActiveCfg = Release|Any CPU - {078AEF36-F319-4CE2-BAA2-5B58A6536B46}.Release|Any CPU.Build.0 = Release|Any CPU - {078AEF36-F319-4CE2-BAA2-5B58A6536B46}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {078AEF36-F319-4CE2-BAA2-5B58A6536B46}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {C61AAE12-5007-4205-A220-68F354A7F235}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C61AAE12-5007-4205-A220-68F354A7F235}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C61AAE12-5007-4205-A220-68F354A7F235}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {C61AAE12-5007-4205-A220-68F354A7F235}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {C61AAE12-5007-4205-A220-68F354A7F235}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C61AAE12-5007-4205-A220-68F354A7F235}.Release|Any CPU.Build.0 = Release|Any CPU - {C61AAE12-5007-4205-A220-68F354A7F235}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {C61AAE12-5007-4205-A220-68F354A7F235}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {6205467F-E381-4C42-AEEC-763BD62B3D5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6205467F-E381-4C42-AEEC-763BD62B3D5E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6205467F-E381-4C42-AEEC-763BD62B3D5E}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {6205467F-E381-4C42-AEEC-763BD62B3D5E}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {6205467F-E381-4C42-AEEC-763BD62B3D5E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6205467F-E381-4C42-AEEC-763BD62B3D5E}.Release|Any CPU.Build.0 = Release|Any CPU - {6205467F-E381-4C42-AEEC-763BD62B3D5E}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {6205467F-E381-4C42-AEEC-763BD62B3D5E}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {1D15867E-E50F-4107-92A4-BBC2EE6B088C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D15867E-E50F-4107-92A4-BBC2EE6B088C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D15867E-E50F-4107-92A4-BBC2EE6B088C}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {1D15867E-E50F-4107-92A4-BBC2EE6B088C}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {1D15867E-E50F-4107-92A4-BBC2EE6B088C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D15867E-E50F-4107-92A4-BBC2EE6B088C}.Release|Any CPU.Build.0 = Release|Any CPU - {1D15867E-E50F-4107-92A4-BBC2EE6B088C}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {1D15867E-E50F-4107-92A4-BBC2EE6B088C}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {FBAE9975-77BE-411B-A1A3-4790C8A367EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FBAE9975-77BE-411B-A1A3-4790C8A367EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FBAE9975-77BE-411B-A1A3-4790C8A367EF}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {FBAE9975-77BE-411B-A1A3-4790C8A367EF}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {FBAE9975-77BE-411B-A1A3-4790C8A367EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FBAE9975-77BE-411B-A1A3-4790C8A367EF}.Release|Any CPU.Build.0 = Release|Any CPU - {FBAE9975-77BE-411B-A1A3-4790C8A367EF}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {FBAE9975-77BE-411B-A1A3-4790C8A367EF}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {35FEC0EA-09B5-45D2-832D-D6FEBA364871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35FEC0EA-09B5-45D2-832D-D6FEBA364871}.Debug|Any CPU.Build.0 = Debug|Any CPU - {35FEC0EA-09B5-45D2-832D-D6FEBA364871}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {35FEC0EA-09B5-45D2-832D-D6FEBA364871}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {35FEC0EA-09B5-45D2-832D-D6FEBA364871}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35FEC0EA-09B5-45D2-832D-D6FEBA364871}.Release|Any CPU.Build.0 = Release|Any CPU - {35FEC0EA-09B5-45D2-832D-D6FEBA364871}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {35FEC0EA-09B5-45D2-832D-D6FEBA364871}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}.Release|Any CPU.Build.0 = Release|Any CPU - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {0FC409AF-B92B-42D0-9096-1F20360D2672}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0FC409AF-B92B-42D0-9096-1F20360D2672}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0FC409AF-B92B-42D0-9096-1F20360D2672}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {0FC409AF-B92B-42D0-9096-1F20360D2672}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {0FC409AF-B92B-42D0-9096-1F20360D2672}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0FC409AF-B92B-42D0-9096-1F20360D2672}.Release|Any CPU.Build.0 = Release|Any CPU - {0FC409AF-B92B-42D0-9096-1F20360D2672}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {0FC409AF-B92B-42D0-9096-1F20360D2672}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {39233703-B752-43AC-AD86-E9D3E61B4AD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39233703-B752-43AC-AD86-E9D3E61B4AD9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39233703-B752-43AC-AD86-E9D3E61B4AD9}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {39233703-B752-43AC-AD86-E9D3E61B4AD9}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {39233703-B752-43AC-AD86-E9D3E61B4AD9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39233703-B752-43AC-AD86-E9D3E61B4AD9}.Release|Any CPU.Build.0 = Release|Any CPU - {39233703-B752-43AC-AD86-E9D3E61B4AD9}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {39233703-B752-43AC-AD86-E9D3E61B4AD9}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446}.Debug|Any CPU.Build.0 = Debug|Any CPU - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446}.Release|Any CPU.ActiveCfg = Release|Any CPU - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446}.Release|Any CPU.Build.0 = Release|Any CPU - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {8CEC0991-259F-4313-B3EF-E398F2B40E61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8CEC0991-259F-4313-B3EF-E398F2B40E61}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8CEC0991-259F-4313-B3EF-E398F2B40E61}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {8CEC0991-259F-4313-B3EF-E398F2B40E61}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {8CEC0991-259F-4313-B3EF-E398F2B40E61}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8CEC0991-259F-4313-B3EF-E398F2B40E61}.Release|Any CPU.Build.0 = Release|Any CPU - {8CEC0991-259F-4313-B3EF-E398F2B40E61}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {8CEC0991-259F-4313-B3EF-E398F2B40E61}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}.Release|Any CPU.Build.0 = Release|Any CPU - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}.Release|Any CPU.Build.0 = Release|Any CPU - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {7BDA653C-6164-4ACB-913B-C7BB91E2390A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7BDA653C-6164-4ACB-913B-C7BB91E2390A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7BDA653C-6164-4ACB-913B-C7BB91E2390A}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {7BDA653C-6164-4ACB-913B-C7BB91E2390A}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {7BDA653C-6164-4ACB-913B-C7BB91E2390A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7BDA653C-6164-4ACB-913B-C7BB91E2390A}.Release|Any CPU.Build.0 = Release|Any CPU - {7BDA653C-6164-4ACB-913B-C7BB91E2390A}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {7BDA653C-6164-4ACB-913B-C7BB91E2390A}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}.Release|Any CPU.Build.0 = Release|Any CPU - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {D811DDE3-FDE4-4E9E-837B-11AF73465768}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D811DDE3-FDE4-4E9E-837B-11AF73465768}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D811DDE3-FDE4-4E9E-837B-11AF73465768}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {D811DDE3-FDE4-4E9E-837B-11AF73465768}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {D811DDE3-FDE4-4E9E-837B-11AF73465768}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D811DDE3-FDE4-4E9E-837B-11AF73465768}.Release|Any CPU.Build.0 = Release|Any CPU - {D811DDE3-FDE4-4E9E-837B-11AF73465768}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {D811DDE3-FDE4-4E9E-837B-11AF73465768}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {E2D95310-84DA-4ED2-A1F0-0B34B029F579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2D95310-84DA-4ED2-A1F0-0B34B029F579}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2D95310-84DA-4ED2-A1F0-0B34B029F579}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {E2D95310-84DA-4ED2-A1F0-0B34B029F579}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {E2D95310-84DA-4ED2-A1F0-0B34B029F579}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2D95310-84DA-4ED2-A1F0-0B34B029F579}.Release|Any CPU.Build.0 = Release|Any CPU - {E2D95310-84DA-4ED2-A1F0-0B34B029F579}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {E2D95310-84DA-4ED2-A1F0-0B34B029F579}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {D5CC33F8-6883-496C-AE99-8AE855784D13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5CC33F8-6883-496C-AE99-8AE855784D13}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5CC33F8-6883-496C-AE99-8AE855784D13}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {D5CC33F8-6883-496C-AE99-8AE855784D13}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {D5CC33F8-6883-496C-AE99-8AE855784D13}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5CC33F8-6883-496C-AE99-8AE855784D13}.Release|Any CPU.Build.0 = Release|Any CPU - {D5CC33F8-6883-496C-AE99-8AE855784D13}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {D5CC33F8-6883-496C-AE99-8AE855784D13}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}.Release|Any CPU.Build.0 = Release|Any CPU - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {F5017FD5-EA78-4CD2-A1B6-F534910683F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F5017FD5-EA78-4CD2-A1B6-F534910683F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F5017FD5-EA78-4CD2-A1B6-F534910683F8}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {F5017FD5-EA78-4CD2-A1B6-F534910683F8}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {F5017FD5-EA78-4CD2-A1B6-F534910683F8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F5017FD5-EA78-4CD2-A1B6-F534910683F8}.Release|Any CPU.Build.0 = Release|Any CPU - {F5017FD5-EA78-4CD2-A1B6-F534910683F8}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {F5017FD5-EA78-4CD2-A1B6-F534910683F8}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}.Release|Any CPU.Build.0 = Release|Any CPU - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {A0867F6B-3DBB-4743-B241-F59878BFA15D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A0867F6B-3DBB-4743-B241-F59878BFA15D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A0867F6B-3DBB-4743-B241-F59878BFA15D}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {A0867F6B-3DBB-4743-B241-F59878BFA15D}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {A0867F6B-3DBB-4743-B241-F59878BFA15D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0867F6B-3DBB-4743-B241-F59878BFA15D}.Release|Any CPU.Build.0 = Release|Any CPU - {A0867F6B-3DBB-4743-B241-F59878BFA15D}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {A0867F6B-3DBB-4743-B241-F59878BFA15D}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {B040B919-D8E3-4656-BD85-88A541AA893D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B040B919-D8E3-4656-BD85-88A541AA893D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B040B919-D8E3-4656-BD85-88A541AA893D}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {B040B919-D8E3-4656-BD85-88A541AA893D}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {B040B919-D8E3-4656-BD85-88A541AA893D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B040B919-D8E3-4656-BD85-88A541AA893D}.Release|Any CPU.Build.0 = Release|Any CPU - {B040B919-D8E3-4656-BD85-88A541AA893D}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {B040B919-D8E3-4656-BD85-88A541AA893D}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33}.Debug|Any CPU.Build.0 = Debug|Any CPU - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33}.Release|Any CPU.ActiveCfg = Release|Any CPU - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33}.Release|Any CPU.Build.0 = Release|Any CPU - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}.Release|Any CPU.Build.0 = Release|Any CPU - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}.Release|Any CPU.Build.0 = Release|Any CPU - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {7400A168-2552-49C7-93E3-D4DAA90C216F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7400A168-2552-49C7-93E3-D4DAA90C216F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7400A168-2552-49C7-93E3-D4DAA90C216F}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {7400A168-2552-49C7-93E3-D4DAA90C216F}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {7400A168-2552-49C7-93E3-D4DAA90C216F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7400A168-2552-49C7-93E3-D4DAA90C216F}.Release|Any CPU.Build.0 = Release|Any CPU - {7400A168-2552-49C7-93E3-D4DAA90C216F}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {7400A168-2552-49C7-93E3-D4DAA90C216F}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}.Release|Any CPU.Build.0 = Release|Any CPU - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE}.Release|Any CPU.Build.0 = Release|Any CPU - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {6117D32B-DDAE-4654-8260-783B27153E0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6117D32B-DDAE-4654-8260-783B27153E0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6117D32B-DDAE-4654-8260-783B27153E0B}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {6117D32B-DDAE-4654-8260-783B27153E0B}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {6117D32B-DDAE-4654-8260-783B27153E0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6117D32B-DDAE-4654-8260-783B27153E0B}.Release|Any CPU.Build.0 = Release|Any CPU - {6117D32B-DDAE-4654-8260-783B27153E0B}.ReleaseNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {6117D32B-DDAE-4654-8260-783B27153E0B}.ReleaseNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {53977089-1A87-4521-8368-0D50DFDA1279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {53977089-1A87-4521-8368-0D50DFDA1279}.Debug|Any CPU.Build.0 = Debug|Any CPU - {53977089-1A87-4521-8368-0D50DFDA1279}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {53977089-1A87-4521-8368-0D50DFDA1279}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {53977089-1A87-4521-8368-0D50DFDA1279}.Release|Any CPU.ActiveCfg = Release|Any CPU - {53977089-1A87-4521-8368-0D50DFDA1279}.Release|Any CPU.Build.0 = Release|Any CPU - {53977089-1A87-4521-8368-0D50DFDA1279}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {53977089-1A87-4521-8368-0D50DFDA1279}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {C0C2AD17-5F5B-4B11-956D-203D91C377FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C0C2AD17-5F5B-4B11-956D-203D91C377FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C0C2AD17-5F5B-4B11-956D-203D91C377FB}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {C0C2AD17-5F5B-4B11-956D-203D91C377FB}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {C0C2AD17-5F5B-4B11-956D-203D91C377FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C0C2AD17-5F5B-4B11-956D-203D91C377FB}.Release|Any CPU.Build.0 = Release|Any CPU - {C0C2AD17-5F5B-4B11-956D-203D91C377FB}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {C0C2AD17-5F5B-4B11-956D-203D91C377FB}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {7275F376-1B63-49D3-8078-0F7CA15CC637}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7275F376-1B63-49D3-8078-0F7CA15CC637}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7275F376-1B63-49D3-8078-0F7CA15CC637}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {7275F376-1B63-49D3-8078-0F7CA15CC637}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {7275F376-1B63-49D3-8078-0F7CA15CC637}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7275F376-1B63-49D3-8078-0F7CA15CC637}.Release|Any CPU.Build.0 = Release|Any CPU - {7275F376-1B63-49D3-8078-0F7CA15CC637}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {7275F376-1B63-49D3-8078-0F7CA15CC637}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050}.Release|Any CPU.Build.0 = Release|Any CPU - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}.Release|Any CPU.Build.0 = Release|Any CPU - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {167F1426-D9AE-49DF-B214-F00536DBC305}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {167F1426-D9AE-49DF-B214-F00536DBC305}.Debug|Any CPU.Build.0 = Debug|Any CPU - {167F1426-D9AE-49DF-B214-F00536DBC305}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {167F1426-D9AE-49DF-B214-F00536DBC305}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {167F1426-D9AE-49DF-B214-F00536DBC305}.Release|Any CPU.ActiveCfg = Release|Any CPU - {167F1426-D9AE-49DF-B214-F00536DBC305}.Release|Any CPU.Build.0 = Release|Any CPU - {167F1426-D9AE-49DF-B214-F00536DBC305}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {167F1426-D9AE-49DF-B214-F00536DBC305}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}.Release|Any CPU.Build.0 = Release|Any CPU - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7}.Release|Any CPU.Build.0 = Release|Any CPU - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7}.ReleaseNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7}.ReleaseNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {C504C2D7-8313-46D8-A159-7EB79047C09C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C504C2D7-8313-46D8-A159-7EB79047C09C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C504C2D7-8313-46D8-A159-7EB79047C09C}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {C504C2D7-8313-46D8-A159-7EB79047C09C}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {C504C2D7-8313-46D8-A159-7EB79047C09C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C504C2D7-8313-46D8-A159-7EB79047C09C}.Release|Any CPU.Build.0 = Release|Any CPU - {C504C2D7-8313-46D8-A159-7EB79047C09C}.ReleaseNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {C504C2D7-8313-46D8-A159-7EB79047C09C}.ReleaseNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {18E29992-32E3-4801-90EE-C8D8E76F637A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {18E29992-32E3-4801-90EE-C8D8E76F637A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {18E29992-32E3-4801-90EE-C8D8E76F637A}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {18E29992-32E3-4801-90EE-C8D8E76F637A}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {18E29992-32E3-4801-90EE-C8D8E76F637A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {18E29992-32E3-4801-90EE-C8D8E76F637A}.Release|Any CPU.Build.0 = Release|Any CPU - {18E29992-32E3-4801-90EE-C8D8E76F637A}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {18E29992-32E3-4801-90EE-C8D8E76F637A}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {094A024C-7DC1-487B-9F52-9D65CDFEE18D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {094A024C-7DC1-487B-9F52-9D65CDFEE18D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {094A024C-7DC1-487B-9F52-9D65CDFEE18D}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {094A024C-7DC1-487B-9F52-9D65CDFEE18D}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {094A024C-7DC1-487B-9F52-9D65CDFEE18D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {094A024C-7DC1-487B-9F52-9D65CDFEE18D}.Release|Any CPU.Build.0 = Release|Any CPU - {094A024C-7DC1-487B-9F52-9D65CDFEE18D}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {094A024C-7DC1-487B-9F52-9D65CDFEE18D}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {E102632D-EC30-474F-B2EB-6EB07ED45F27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E102632D-EC30-474F-B2EB-6EB07ED45F27}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E102632D-EC30-474F-B2EB-6EB07ED45F27}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {E102632D-EC30-474F-B2EB-6EB07ED45F27}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {E102632D-EC30-474F-B2EB-6EB07ED45F27}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E102632D-EC30-474F-B2EB-6EB07ED45F27}.Release|Any CPU.Build.0 = Release|Any CPU - {E102632D-EC30-474F-B2EB-6EB07ED45F27}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {E102632D-EC30-474F-B2EB-6EB07ED45F27}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}.Release|Any CPU.Build.0 = Release|Any CPU - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {BCF712D4-329A-4C7A-8292-9EFC864B2ABA} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {0F265874-C592-448B-BC4F-3430AB03E0DC} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {4EAD959D-73B2-4FB2-B46F-16CEB1EF49D4} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {E5D92DB7-5CBF-410A-9685-FF76F71EC96F} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {37E61BDB-658E-4F44-A499-D64CC6D35485} = {92463391-81BE-462B-AC3C-78C6C760741F} - {078AEF36-F319-4CE2-BAA2-5B58A6536B46} = {92463391-81BE-462B-AC3C-78C6C760741F} - {C61AAE12-5007-4205-A220-68F354A7F235} = {92463391-81BE-462B-AC3C-78C6C760741F} - {6205467F-E381-4C42-AEEC-763BD62B3D5E} = {C2C98051-0F39-47F2-80B6-E72B29159F2C} - {1D15867E-E50F-4107-92A4-BBC2EE6B088C} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {FBAE9975-77BE-411B-A1A3-4790C8A367EF} = {92463391-81BE-462B-AC3C-78C6C760741F} - {35FEC0EA-09B5-45D2-832D-D6FEBA364871} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {0D6FD2CD-3C0A-452B-AC12-DE6301C287AC} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {0FC409AF-B92B-42D0-9096-1F20360D2672} = {92463391-81BE-462B-AC3C-78C6C760741F} - {39233703-B752-43AC-AD86-E9D3E61B4AD9} = {92463391-81BE-462B-AC3C-78C6C760741F} - {17C4A6DF-3AA5-43FE-8A0E-53DF14340446} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {8CEC0991-259F-4313-B3EF-E398F2B40E61} = {92463391-81BE-462B-AC3C-78C6C760741F} - {87D808DC-5C9D-4D72-A9B7-C828A8DC09FA} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {0C7CB1C1-6CA3-42A1-AE3A-71A4DF581AC3} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {DE461FC6-663E-4362-9B33-C5A88C7B4DB8} = {5B60F564-4AD7-4B70-A887-7D91496799A2} - {7BDA653C-6164-4ACB-913B-C7BB91E2390A} = {DE461FC6-663E-4362-9B33-C5A88C7B4DB8} - {9B419123-4D1D-4ADB-ABB0-C324ED5A62E3} = {5B60F564-4AD7-4B70-A887-7D91496799A2} - {1E26FEFF-20D6-4E3B-8DE5-F350919BB73D} = {9B419123-4D1D-4ADB-ABB0-C324ED5A62E3} - {F8C0166A-2714-44AA-87B5-3365F1FB1AE2} = {5B60F564-4AD7-4B70-A887-7D91496799A2} - {D811DDE3-FDE4-4E9E-837B-11AF73465768} = {F8C0166A-2714-44AA-87B5-3365F1FB1AE2} - {D9BDF88A-8F0B-4FAF-B77B-206042C1D402} = {5B60F564-4AD7-4B70-A887-7D91496799A2} - {E2D95310-84DA-4ED2-A1F0-0B34B029F579} = {D9BDF88A-8F0B-4FAF-B77B-206042C1D402} - {C2E49955-A0B0-4F4A-B3AC-F120DCF9B13F} = {5B60F564-4AD7-4B70-A887-7D91496799A2} - {D5CC33F8-6883-496C-AE99-8AE855784D13} = {C2E49955-A0B0-4F4A-B3AC-F120DCF9B13F} - {7B1C5668-B4BC-45D9-AE4C-9C2382FC47A9} = {C2C98051-0F39-47F2-80B6-E72B29159F2C} - {AA4EE974-E765-4B97-AF35-F734BF9830F6} = {5B60F564-4AD7-4B70-A887-7D91496799A2} - {FB7C870E-A173-4F75-BE63-4EF39C79A759} = {5B60F564-4AD7-4B70-A887-7D91496799A2} - {F5017FD5-EA78-4CD2-A1B6-F534910683F8} = {AA4EE974-E765-4B97-AF35-F734BF9830F6} - {BD96BB0F-84DE-4A5F-8832-C8EADA36F43A} = {AA4EE974-E765-4B97-AF35-F734BF9830F6} - {A0867F6B-3DBB-4743-B241-F59878BFA15D} = {A5E2E4FA-6087-4C16-BB7A-89E23AA0F4E3} - {B040B919-D8E3-4656-BD85-88A541AA893D} = {A5E2E4FA-6087-4C16-BB7A-89E23AA0F4E3} - {907EDA43-B4D9-40DA-BA07-8E00DD89FA33} = {FB7C870E-A173-4F75-BE63-4EF39C79A759} - {97DE8703-467C-49A7-BCE4-42FF1FEC8AC2} = {FB7C870E-A173-4F75-BE63-4EF39C79A759} - {A9F9B5E5-C5C2-4860-BE56-038C70ADBAC9} = {FB7C870E-A173-4F75-BE63-4EF39C79A759} - {7400A168-2552-49C7-93E3-D4DAA90C216F} = {C2C98051-0F39-47F2-80B6-E72B29159F2C} - {2223B8FD-D98A-47BE-94A9-6A3A6B8557B8} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {70C6EAF1-202B-481B-ADD4-D30DF1396BDE} = {92463391-81BE-462B-AC3C-78C6C760741F} - {6117D32B-DDAE-4654-8260-783B27153E0B} = {AA4EE974-E765-4B97-AF35-F734BF9830F6} - {53977089-1A87-4521-8368-0D50DFDA1279} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {C0C2AD17-5F5B-4B11-956D-203D91C377FB} = {92463391-81BE-462B-AC3C-78C6C760741F} - {7275F376-1B63-49D3-8078-0F7CA15CC637} = {3AE210D1-C435-4693-BF79-2EF13ED554B9} - {BAFE178B-7AD4-41AE-A75D-9B920B9EA050} = {3AE210D1-C435-4693-BF79-2EF13ED554B9} - {45B207E2-DDB3-44F0-87C5-DEFB5A9534A5} = {4AA319E0-C81E-47CC-841A-6EFCB6784A1F} - {167F1426-D9AE-49DF-B214-F00536DBC305} = {4AA319E0-C81E-47CC-841A-6EFCB6784A1F} - {0F2D75D1-89AD-40A6-9F02-D45708AEA3EB} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {64A72A33-38B4-4C23-9E12-D7FEBD673FB7} = {3AE210D1-C435-4693-BF79-2EF13ED554B9} - {C504C2D7-8313-46D8-A159-7EB79047C09C} = {C2E49955-A0B0-4F4A-B3AC-F120DCF9B13F} - {CD6913F3-EC47-4470-9C45-F5F898615E9D} = {3AE210D1-C435-4693-BF79-2EF13ED554B9} - {18E29992-32E3-4801-90EE-C8D8E76F637A} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {094A024C-7DC1-487B-9F52-9D65CDFEE18D} = {92463391-81BE-462B-AC3C-78C6C760741F} - {440580F4-D746-49BB-AE8E-9F898483EA75} = {5B60F564-4AD7-4B70-A887-7D91496799A2} - {E102632D-EC30-474F-B2EB-6EB07ED45F27} = {440580F4-D746-49BB-AE8E-9F898483EA75} - {6778F3D4-C6C2-4882-9F86-54FCD44B078A} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED} - {8586B5E5-6AE9-35C5-01FA-0A02D6D5B2B5} = {92463391-81BE-462B-AC3C-78C6C760741F} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0035341D-175A-4D05-95E6-F1C2785A1E26} - EndGlobalSection - GlobalSection(SharedMSBuildProjectFiles) = preSolution - src\Shared\Microsoft.AspNetCore.Razor.Serialization.Json\Microsoft.AspNetCore.Razor.Serialization.Json.projitems*{078aef36-f319-4ce2-baa2-5b58a6536b46}*SharedItemsImports = 5 - src\Razor\src\Microsoft.CodeAnalysis.Razor.CohostingShared\Microsoft.CodeAnalysis.Razor.CohostingShared.projitems*{2223b8fd-d98a-47be-94a9-6a3a6b8557b8}*SharedItemsImports = 5 - src\Shared\Microsoft.AspNetCore.Razor.Serialization.Json\Microsoft.AspNetCore.Razor.Serialization.Json.projitems*{6205467f-e381-4c42-aeec-763bd62b3d5e}*SharedItemsImports = 5 - src\Razor\src\Microsoft.CodeAnalysis.Razor.CohostingShared\Microsoft.CodeAnalysis.Razor.CohostingShared.projitems*{6778f3d4-c6c2-4882-9f86-54fcd44b078a}*SharedItemsImports = 13 - src\Shared\Microsoft.AspNetCore.Razor.Serialization.Json\Microsoft.AspNetCore.Razor.Serialization.Json.projitems*{7b1c5668-b4bc-45d9-ae4c-9c2382fc47a9}*SharedItemsImports = 5 - src\Shared\Microsoft.AspNetCore.Razor.Serialization.Json\Microsoft.AspNetCore.Razor.Serialization.Json.projitems*{cd6913f3-ec47-4470-9c45-f5f898615e9d}*SharedItemsImports = 13 - src\Razor\src\Microsoft.CodeAnalysis.Razor.CohostingShared\Microsoft.CodeAnalysis.Razor.CohostingShared.projitems*{e5d92db7-5cbf-410a-9685-ff76f71ec96f}*SharedItemsImports = 5 - src\Shared\Microsoft.AspNetCore.Razor.Serialization.Json\Microsoft.AspNetCore.Razor.Serialization.Json.projitems*{e5d92db7-5cbf-410a-9685-ff76f71ec96f}*SharedItemsImports = 5 - EndGlobalSection -EndGlobal diff --git a/Razor.slnx b/Razor.slnx new file mode 100644 index 00000000000..efd4f3a3bf6 --- /dev/null +++ b/Razor.slnx @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SpellingExclusions.dic b/SpellingExclusions.dic index 74cf1b2bf18..bed2046dde9 100644 --- a/SpellingExclusions.dic +++ b/SpellingExclusions.dic @@ -7,3 +7,4 @@ microsoft vsls Blazor Metacode +Poolable diff --git a/activate.ps1 b/activate.ps1 index 728b8003ef6..2d8f677b886 100644 --- a/activate.ps1 +++ b/activate.ps1 @@ -25,7 +25,6 @@ function deactivate ([switch]$init) { } Remove-Item env:DOTNET_ROOT -ea ignore - Remove-Item env:DOTNET_MULTILEVEL_LOOKUP -ea ignore if (-not $init) { # Remove the deactivate function Remove-Item function:deactivate @@ -39,8 +38,6 @@ $_OLD_PATH = $env:PATH # Tell dotnet where to find itself $env:DOTNET_ROOT = "$PSScriptRoot\.dotnet" ${env:DOTNET_ROOT(x86)} = "$PSScriptRoot\.dotnet\x86" -# Tell dotnet not to look beyond the DOTNET_ROOT folder for more dotnet things -$env:DOTNET_MULTILEVEL_LOOKUP = 0 # Put dotnet first on PATH $env:PATH = "${env:DOTNET_ROOT};${env:PATH}" diff --git a/activate.sh b/activate.sh index 4986e1b297f..8108b9849db 100755 --- a/activate.sh +++ b/activate.sh @@ -53,7 +53,6 @@ deactivate () { fi unset DOTNET_ROOT - unset DOTNET_MULTILEVEL_LOOKUP if [ ! "${1:-}" = "init" ] ; then # Remove the deactivate function unset -f deactivate @@ -67,8 +66,6 @@ DIR="$( cd "$( dirname "$THIS_SCRIPT" )" && pwd )" _OLD_PATH="$PATH" # Tell dotnet where to find itself export DOTNET_ROOT="$DIR/.dotnet" -# Tell dotnet not to look beyond the DOTNET_ROOT folder for more dotnet things -export DOTNET_MULTILEVEL_LOOKUP=0 # Put dotnet first on PATH export PATH="$DOTNET_ROOT:$PATH" diff --git a/azure-pipelines-conditional-integration.yml b/azure-pipelines-conditional-integration.yml deleted file mode 100644 index 72194970581..00000000000 --- a/azure-pipelines-conditional-integration.yml +++ /dev/null @@ -1,162 +0,0 @@ -# -# See https://docs.microsoft.com/azure/devops/pipelines/yaml-schema for reference. -# - -variables: -- template: /eng/common/templates/variables/pool-providers.yml -- name: Build.Repository.Clean - value: true -- name: _TeamName - value: AspNetCore -- name: DOTNET_SKIP_FIRST_TIME_EXPERIENCE - value: true -- name: LogLevel - value: 'All' -- name: RAZOR_RUN_CONDITIONAL_IDE_TESTS - value: 'true' -- name: Codeql.Enabled - value: false -- name: Codeql.SkipTaskAutoInjection - value: true -- name: _IntegrationTestsRunningInCI - value: true - -trigger: none - -pr: none - -schedules: -- cron: '0 */12 * * *' - displayName: Every 12 hours - branches: - include: - - main - always: true # run the pipeline even if there are no code changes - -- cron: '0 */24 * * *' - displayName: FeatureFlags - ForceRuntimeCodeGeneration - branches: - include: - - main - always: true # run the pipeline even if there are no code changes - -- cron: '0 */24 * * *' - displayName: FeatureFlags - ForceRuntimeCodeGeneration,UseRazorCohostServer - branches: - include: - - main - always: true # run the pipeline even if there are no code changes - -stages: -- stage: build - displayName: Build - jobs: - # Windows based jobs. This needs to be separate from Unix based jobs because it generates - # TRX files. That can only be toggled at the top level template level, not at the individual - # job. - - template: /eng/common/templates/jobs/jobs.yml - parameters: - enablePublishBuildArtifacts: false - enablePublishTestResults: true - enableTelemetry: true - helixRepo: dotnet/razor - helixType: build.product/ - - jobs: - - job: Windows - timeoutInMinutes: 120 - pool: - name: $(DncEngPublicBuildPool) - demands: ImageOverride -equals windows.vs2022preview.scout.amd64.open - strategy: - matrix: - debug: - _BuildConfig: Debug - _PublishArgs: '' - release: - _BuildConfig: Release - _PublishArgs: '' - - variables: - - _BuildArgs: '' - - XUNIT_LOGS: '$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)' - - __VSNeverShowWhatsNew: 1 - - steps: - - task: NuGetCommand@2 - displayName: 'Clear NuGet caches' - condition: succeeded() - inputs: - command: custom - arguments: 'locals all -clear' - - - powershell: ./eng/scripts/InstallProcDump.ps1 - displayName: Install ProcDump - - - powershell: ./eng/scripts/StartDumpCollectionForHangingBuilds.ps1 - $(ProcDumpPath)procdump.exe artifacts/log/$(_BuildConfig) - (Get-Date).AddMinutes(60) - devenv, xunit.console, xunit.console.x86 - displayName: Start background dump collection - - # Don't create a binary log until we can customize the name - # https://github.com/dotnet/arcade/pull/12988 - - script: eng\cibuild.cmd - -configuration $(_BuildConfig) - -msbuildEngine vs - -prepareMachine - -restore - -nobl - name: Restore - displayName: Restore - condition: succeeded() - - - powershell: eng\SetupVSHive.ps1 - displayName: Setup VS Hive - - - script: eng\cibuild.cmd - -configuration $(_BuildConfig) - -msbuildEngine vs - -prepareMachine - -build - -pack - -publish - -sign - $(_BuildArgs) - $(_PublishArgs) - $(_InternalRuntimeDownloadArgs) - name: Build - displayName: Build and Deploy - condition: succeeded() - - - script: eng\CIBuild.cmd - -configuration $(_BuildConfig) - -prepareMachine - -test - -nobl - name: Run_Unit_Tests - displayName: Run Unit Tests - condition: succeeded() - - - script: eng\CIBuild.cmd - -configuration $(_BuildConfig) - -prepareMachine - -integrationTest - name: Run_Integration_Tests - displayName: Run Integration Tests - condition: succeeded() - - - powershell: ./eng/scripts/FinishDumpCollectionForHangingBuilds.ps1 artifacts/log/$(_BuildConfig) - displayName: Finish background dump collection - continueOnError: true - condition: always() - - - publish: artifacts/log/$(_BuildConfig) - artifact: $(Agent.Os)_$(Agent.JobName) Attempt $(System.JobAttempt) Logs - displayName: Publish Build Artifacts - condition: always() - - - publish: artifacts/TestResults/$(_BuildConfig) - artifact: $(Agent.Os)_$(Agent.JobName) Attempt $(System.JobAttempt) TestResults - displayName: Publish Test Artifacts - condition: always() \ No newline at end of file diff --git a/azure-pipelines-official.yml b/azure-pipelines-official.yml index 2bd8f2406f0..a381583b6c5 100644 --- a/azure-pipelines-official.yml +++ b/azure-pipelines-official.yml @@ -3,10 +3,9 @@ # variables: -# Hard-coding DncEngInternalBuildPool to avoid broken NetCore1ESPool-Svc-Internal temporarily -# - template: /eng/common/templates-official/variables/pool-providers.yml@self -- name: DncEngInternalBuildPool - value: NetCore1ESPool-Internal +# Defines $(DncEngInternalBuildPool) +- template: /eng/common/templates-official/variables/pool-providers.yml@self + - name: Build.Repository.Clean value: true - name: _TeamName @@ -108,7 +107,7 @@ extends: enablePublishBuildArtifacts: false enablePublishTestResults: false enablePublishUsingPipelines: false - enableSourcebuild: false + enableSourcebuild: true jobs: # Code check - ${{ if in(variables['Build.Reason'], 'PullRequest') }}: @@ -212,10 +211,12 @@ extends: - powershell: eng\SetupVSHive.ps1 displayName: Setup VS Hive + # We additionally restore during the build because the Microsoft.DotNet.Build.Tasks.Feed package only restores when we pass `-publish`. See https://github.com/dotnet/arcade/blob/37ccfd66358af6a37a0ec385ec31d1d71bdd8723/src/Microsoft.DotNet.Arcade.Sdk/tools/Tools.proj#L61-L66 - script: eng\cibuild.cmd -configuration $(_BuildConfig) -msbuildEngine vs -prepareMachine + -restore -build -pack -publish @@ -319,6 +320,8 @@ extends: - ${{ if notin(variables['Build.Reason'], 'PullRequest') }}: - _BuildArgs: /p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(Build.BuildNumber) + - ${{ if in(variables['Build.Reason'], 'PullRequest') }}: + - _BuildArgs: -test steps: - task: Bash@3 @@ -334,10 +337,8 @@ extends: --restore --build --pack - --publish --configuration $(_BuildConfig) --prepareMachine - --test $(_BuildArgs) name: Build displayName: Restore, Build and Test @@ -348,7 +349,7 @@ extends: targetPath: artifacts/TestResults/$(_BuildConfig) artifact: $(Agent.Os)_$(Agent.JobName) Attempt $(System.JobAttempt) TestResults displayName: Publish Test Results - condition: always() + condition: in(variables['Build.Reason'], 'PullRequest') - job: Linux pool: @@ -366,6 +367,8 @@ extends: - LANG: 'en_US.UTF-8' - LANGUAGE: 'en_US.UTF-8' - _BuildArgs: '' + - ${{ if in(variables['Build.Reason'], 'PullRequest') }}: + - _BuildArgs: -test # Variables for internal Official builds - ${{ if notin(variables['Build.Reason'], 'PullRequest') }}: @@ -378,10 +381,8 @@ extends: --restore --build --pack - --publish --configuration $(_BuildConfig) --prepareMachine - --test $(_BuildArgs) name: Build displayName: Restore, Build and Test @@ -392,7 +393,7 @@ extends: targetPath: artifacts/TestResults/$(_BuildConfig)/ artifact: $(Agent.Os)_$(Agent.JobName) Attempt $(System.JobAttempt) TestResults displayName: Publish Test Results - condition: always() + condition: in(variables['Build.Reason'], 'PullRequest') - ${{ if notin(variables['Build.Reason'], 'PullRequest') }}: - template: /eng/common/templates-official/post-build/post-build.yml@self diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2bd257f1a7d..023207fb2f9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -128,10 +128,12 @@ stages: - powershell: eng\SetupVSHive.ps1 displayName: Setup VS Hive + # We additionally restore during the build because the Microsoft.DotNet.Build.Tasks.Feed package only restores when we pass `-publish`. See https://github.com/dotnet/arcade/blob/37ccfd66358af6a37a0ec385ec31d1d71bdd8723/src/Microsoft.DotNet.Arcade.Sdk/tools/Tools.proj#L61-L66 - script: eng\cibuild.cmd -configuration $(_BuildConfig) -msbuildEngine vs -prepareMachine + -restore -build -pack -publish @@ -214,7 +216,6 @@ stages: --restore --build --pack - --publish --configuration $(_BuildConfig) --prepareMachine --test @@ -240,7 +241,7 @@ stages: options: --init # This ensures all the stray defunct processes are reaped. pool: name: NetCore-Public - demands: ImageOverride -equals Build.Ubuntu.2004.Amd64.Open + demands: ImageOverride -equals Build.Ubuntu.2204.Amd64.Open strategy: matrix: @@ -260,7 +261,6 @@ stages: --restore --build --pack - --publish --configuration $(_BuildConfig) --prepareMachine --test diff --git a/docs/contributing/BuildFromSource.md b/docs/contributing/BuildFromSource.md index 8ea11d49f09..8c3d1cc86d7 100644 --- a/docs/contributing/BuildFromSource.md +++ b/docs/contributing/BuildFromSource.md @@ -39,7 +39,7 @@ Building Razor on macOS or Linux requires: ## Building in Visual Studio -Before opening the `Razor.sln` file in Visual Studio or VS Code, you need to perform the following actions. +Before opening the `Razor.slnx` file in Visual Studio or VS Code, you need to perform the following actions. 1. Executing the following on command-line: diff --git a/eng/Build.props b/eng/Build.props index f6ae12aa45f..27cbef9f72a 100644 --- a/eng/Build.props +++ b/eng/Build.props @@ -2,13 +2,13 @@ - + diff --git a/eng/Publishing.props b/eng/Publishing.props index d55b35ea7db..44504d2535e 100644 --- a/eng/Publishing.props +++ b/eng/Publishing.props @@ -10,7 +10,7 @@ <_ItemsToPublish Include="$(ArtifactsDir)LanguageServer\**\*.zip" /> <_ItemsToPublish Include="$(ArtifactsDir)DevKitTelemetry\**\*.zip" /> - + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index b4cfb7e1ebc..8bd3866a02a 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -6,29 +6,30 @@ This file should be imported by eng/Versions.props - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 - 5.0.0-2.25461.22 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 + 5.3.0-2.25630.5 - 9.0.0-beta.25462.4 + 10.0.0-beta.25626.5 8.0.0 @@ -59,6 +60,7 @@ This file should be imported by eng/Versions.props $(MicrosoftCommonLanguageServerProtocolFrameworkPackageVersion) $(MicrosoftNetCompilersToolsetPackageVersion) $(MicrosoftVisualStudioLanguageServicesPackageVersion) + $(RoslynDiagnosticsAnalyzersPackageVersion) $(MicrosoftDotNetArcadeSdkPackageVersion) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0a2a1a85b47..d9726ed4b05 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,96 +1,100 @@ - + - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/roslyn - e3cf188c71ec62089866f0e99bd535cd47878659 + 635d2b812121ef9fafe0de223b09be64e5a4a291 + + + https://github.com/dotnet/roslyn + 635d2b812121ef9fafe0de223b09be64e5a4a291 - + https://github.com/dotnet/arcade - e0fa67027049e9c3f1a0f2f50f47d50a0a3aaa92 + d8dca0b41b903e7182e64543773390b969dab96b + + + + + true 17.3.2094 1.1.33 true true - - - true + 10 0 0 preview - - false - release + + + - 18.3.1 + 18.3.2 18.3 $(AddinMajorVersion) $(AddinVersion).$(OfficialBuildId) $(AddinVersion).42424242.42 - - - + + 6.0.0-alpha.1.21072.5 6.1.0 @@ -59,4 +55,5 @@ 6.1.3 4.6.3 + diff --git a/eng/common/CIBuild.cmd b/eng/common/CIBuild.cmd index 56c2f25ac22..ac1f72bf94e 100644 --- a/eng/common/CIBuild.cmd +++ b/eng/common/CIBuild.cmd @@ -1,2 +1,2 @@ @echo off -powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0Build.ps1""" -restore -build -test -sign -pack -publish -ci %*" \ No newline at end of file +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0Build.ps1""" -restore -build -test -sign -pack -publish -ci %*" diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1 index 792b60b49d4..65ed3a8adef 100644 --- a/eng/common/SetupNugetSources.ps1 +++ b/eng/common/SetupNugetSources.ps1 @@ -1,13 +1,14 @@ # This script adds internal feeds required to build commits that depend on internal package sources. For instance, -# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables -# disabled internal Maestro (darc-int*) feeds. +# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. Similarly, +# dotnet-eng-internal and dotnet-tools-internal are added if dotnet-eng and dotnet-tools are present. +# In addition, this script also enables disabled internal Maestro (darc-int*) feeds. # # Optionally, this script also adds a credential entry for each of the internal feeds if supplied. # # See example call for this script below. # # - task: PowerShell@2 -# displayName: Setup Private Feeds Credentials +# displayName: Setup internal Feeds Credentials # condition: eq(variables['Agent.OS'], 'Windows_NT') # inputs: # filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1 @@ -34,19 +35,28 @@ Set-StrictMode -Version 2.0 . $PSScriptRoot\tools.ps1 +# Adds or enables the package source with the given name +function AddOrEnablePackageSource($sources, $disabledPackageSources, $SourceName, $SourceEndPoint, $creds, $Username, $pwd) { + if ($disabledPackageSources -eq $null -or -not (EnableInternalPackageSource -DisabledPackageSources $disabledPackageSources -Creds $creds -PackageSourceName $SourceName)) { + AddPackageSource -Sources $sources -SourceName $SourceName -SourceEndPoint $SourceEndPoint -Creds $creds -Username $userName -pwd $Password + } +} + # Add source entry to PackageSources function AddPackageSource($sources, $SourceName, $SourceEndPoint, $creds, $Username, $pwd) { $packageSource = $sources.SelectSingleNode("add[@key='$SourceName']") if ($packageSource -eq $null) { + Write-Host "Adding package source $SourceName" + $packageSource = $doc.CreateElement("add") $packageSource.SetAttribute("key", $SourceName) $packageSource.SetAttribute("value", $SourceEndPoint) $sources.AppendChild($packageSource) | Out-Null } else { - Write-Host "Package source $SourceName already present." + Write-Host "Package source $SourceName already present and enabled." } AddCredential -Creds $creds -Source $SourceName -Username $Username -pwd $pwd @@ -59,6 +69,8 @@ function AddCredential($creds, $source, $username, $pwd) { return; } + Write-Host "Inserting credential for feed: " $source + # Looks for credential configuration for the given SourceName. Create it if none is found. $sourceElement = $creds.SelectSingleNode($Source) if ($sourceElement -eq $null) @@ -91,24 +103,27 @@ function AddCredential($creds, $source, $username, $pwd) { $passwordElement.SetAttribute("value", $pwd) } -function InsertMaestroPrivateFeedCredentials($Sources, $Creds, $Username, $pwd) { - $maestroPrivateSources = $Sources.SelectNodes("add[contains(@key,'darc-int')]") - - Write-Host "Inserting credentials for $($maestroPrivateSources.Count) Maestro's private feeds." - - ForEach ($PackageSource in $maestroPrivateSources) { - Write-Host "`tInserting credential for Maestro's feed:" $PackageSource.Key - AddCredential -Creds $creds -Source $PackageSource.Key -Username $Username -pwd $pwd +# Enable all darc-int package sources. +function EnableMaestroInternalPackageSources($DisabledPackageSources, $Creds) { + $maestroInternalSources = $DisabledPackageSources.SelectNodes("add[contains(@key,'darc-int')]") + ForEach ($DisabledPackageSource in $maestroInternalSources) { + EnableInternalPackageSource -DisabledPackageSources $DisabledPackageSources -Creds $Creds -PackageSourceName $DisabledPackageSource.key } } -function EnablePrivatePackageSources($DisabledPackageSources) { - $maestroPrivateSources = $DisabledPackageSources.SelectNodes("add[contains(@key,'darc-int')]") - ForEach ($DisabledPackageSource in $maestroPrivateSources) { - Write-Host "`tEnsuring private source '$($DisabledPackageSource.key)' is enabled by deleting it from disabledPackageSource" +# Enables an internal package source by name, if found. Returns true if the package source was found and enabled, false otherwise. +function EnableInternalPackageSource($DisabledPackageSources, $Creds, $PackageSourceName) { + $DisabledPackageSource = $DisabledPackageSources.SelectSingleNode("add[@key='$PackageSourceName']") + if ($DisabledPackageSource) { + Write-Host "Enabling internal source '$($DisabledPackageSource.key)'." + # Due to https://github.com/NuGet/Home/issues/10291, we must actually remove the disabled entries $DisabledPackageSources.RemoveChild($DisabledPackageSource) + + AddCredential -Creds $creds -Source $DisabledPackageSource.Key -Username $userName -pwd $Password + return $true } + return $false } if (!(Test-Path $ConfigFile -PathType Leaf)) { @@ -121,15 +136,17 @@ $doc = New-Object System.Xml.XmlDocument $filename = (Get-Item $ConfigFile).FullName $doc.Load($filename) -# Get reference to or create one if none exist already +# Get reference to - fail if none exist $sources = $doc.DocumentElement.SelectSingleNode("packageSources") if ($sources -eq $null) { - $sources = $doc.CreateElement("packageSources") - $doc.DocumentElement.AppendChild($sources) | Out-Null + Write-PipelineTelemetryError -Category 'Build' -Message "Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. NuGet config file must contain a packageSources section: $ConfigFile" + ExitWithExitCode 1 } $creds = $null +$feedSuffix = "v3/index.json" if ($Password) { + $feedSuffix = "v2" # Looks for a node. Create it if none is found. $creds = $doc.DocumentElement.SelectSingleNode("packageSourceCredentials") if ($creds -eq $null) { @@ -138,34 +155,35 @@ if ($Password) { } } +$userName = "dn-bot" + # Check for disabledPackageSources; we'll enable any darc-int ones we find there $disabledSources = $doc.DocumentElement.SelectSingleNode("disabledPackageSources") if ($disabledSources -ne $null) { Write-Host "Checking for any darc-int disabled package sources in the disabledPackageSources node" - EnablePrivatePackageSources -DisabledPackageSources $disabledSources + EnableMaestroInternalPackageSources -DisabledPackageSources $disabledSources -Creds $creds } - -$userName = "dn-bot" - -# Insert credential nodes for Maestro's private feeds -InsertMaestroPrivateFeedCredentials -Sources $sources -Creds $creds -Username $userName -pwd $Password - -# 3.1 uses a different feed url format so it's handled differently here -$dotnet31Source = $sources.SelectSingleNode("add[@key='dotnet3.1']") -if ($dotnet31Source -ne $null) { - AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v2" -Creds $creds -Username $userName -pwd $Password - AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v2" -Creds $creds -Username $userName -pwd $Password -} - -$dotnetVersions = @('5','6','7','8','9') +$dotnetVersions = @('5','6','7','8','9','10') foreach ($dotnetVersion in $dotnetVersions) { $feedPrefix = "dotnet" + $dotnetVersion; $dotnetSource = $sources.SelectSingleNode("add[@key='$feedPrefix']") if ($dotnetSource -ne $null) { - AddPackageSource -Sources $sources -SourceName "$feedPrefix-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal/nuget/v2" -Creds $creds -Username $userName -pwd $Password - AddPackageSource -Sources $sources -SourceName "$feedPrefix-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal-transport/nuget/v2" -Creds $creds -Username $userName -pwd $Password + AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "$feedPrefix-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password + AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "$feedPrefix-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal-transport/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password } } +# Check for dotnet-eng and add dotnet-eng-internal if present +$dotnetEngSource = $sources.SelectSingleNode("add[@key='dotnet-eng']") +if ($dotnetEngSource -ne $null) { + AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "dotnet-eng-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-eng-internal/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password +} + +# Check for dotnet-tools and add dotnet-tools-internal if present +$dotnetToolsSource = $sources.SelectSingleNode("add[@key='dotnet-tools']") +if ($dotnetToolsSource -ne $null) { + AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "dotnet-tools-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password +} + $doc.Save($filename) diff --git a/eng/common/SetupNugetSources.sh b/eng/common/SetupNugetSources.sh index facb415ca6f..b2163abbe71 100644 --- a/eng/common/SetupNugetSources.sh +++ b/eng/common/SetupNugetSources.sh @@ -1,8 +1,9 @@ #!/usr/bin/env bash # This script adds internal feeds required to build commits that depend on internal package sources. For instance, -# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables -# disabled internal Maestro (darc-int*) feeds. +# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. Similarly, +# dotnet-eng-internal and dotnet-tools-internal are added if dotnet-eng and dotnet-tools are present. +# In addition, this script also enables disabled internal Maestro (darc-int*) feeds. # # Optionally, this script also adds a credential entry for each of the internal feeds if supplied. # @@ -52,81 +53,139 @@ if [[ `uname -s` == "Darwin" ]]; then TB='' fi -# Ensure there is a ... section. -grep -i "" $ConfigFile -if [ "$?" != "0" ]; then - echo "Adding ... section." - ConfigNodeHeader="" - PackageSourcesTemplate="${TB}${NL}${TB}" +# Enables an internal package source by name, if found. Returns 0 if found and enabled, 1 if not found. +EnableInternalPackageSource() { + local PackageSourceName="$1" + + # Check if disabledPackageSources section exists + grep -i "" "$ConfigFile" > /dev/null + if [ "$?" != "0" ]; then + return 1 # No disabled sources section + fi + + # Check if this source name is disabled + grep -i " /dev/null + if [ "$?" == "0" ]; then + echo "Enabling internal source '$PackageSourceName'." + # Remove the disabled entry (including any surrounding comments or whitespace on the same line) + sed -i.bak "//d" "$ConfigFile" + + # Add the source name to PackageSources for credential handling + PackageSources+=("$PackageSourceName") + return 0 # Found and enabled + fi + + return 1 # Not found in disabled sources +} + +# Add source entry to PackageSources +AddPackageSource() { + local SourceName="$1" + local SourceEndPoint="$2" + + # Check if source already exists + grep -i " /dev/null + if [ "$?" == "0" ]; then + echo "Package source $SourceName already present and enabled." + PackageSources+=("$SourceName") + return + fi + + echo "Adding package source $SourceName" + PackageSourcesNodeFooter="" + PackageSourceTemplate="${TB}" + + sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" "$ConfigFile" + PackageSources+=("$SourceName") +} + +# Adds or enables the package source with the given name +AddOrEnablePackageSource() { + local SourceName="$1" + local SourceEndPoint="$2" + + # Try to enable if disabled, if not found then add new source + EnableInternalPackageSource "$SourceName" + if [ "$?" != "0" ]; then + AddPackageSource "$SourceName" "$SourceEndPoint" + fi +} - sed -i.bak "s|$ConfigNodeHeader|$ConfigNodeHeader${NL}$PackageSourcesTemplate|" $ConfigFile -fi +# Enable all darc-int package sources +EnableMaestroInternalPackageSources() { + # Check if disabledPackageSources section exists + grep -i "" "$ConfigFile" > /dev/null + if [ "$?" != "0" ]; then + return # No disabled sources section + fi + + # Find all darc-int disabled sources + local DisabledDarcIntSources=() + DisabledDarcIntSources+=$(grep -oh '"darc-int-[^"]*" value="true"' "$ConfigFile" | tr -d '"') + + for DisabledSourceName in ${DisabledDarcIntSources[@]} ; do + if [[ $DisabledSourceName == darc-int* ]]; then + EnableInternalPackageSource "$DisabledSourceName" + fi + done +} -# Ensure there is a ... section. -grep -i "" $ConfigFile +# Ensure there is a ... section. +grep -i "" $ConfigFile if [ "$?" != "0" ]; then - echo "Adding ... section." - - PackageSourcesNodeFooter="" - PackageSourceCredentialsTemplate="${TB}${NL}${TB}" - - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourcesNodeFooter${NL}$PackageSourceCredentialsTemplate|" $ConfigFile + Write-PipelineTelemetryError -Category 'Build' "Error: Eng/common/SetupNugetSources.sh returned a non-zero exit code. NuGet config file must contain a packageSources section: $ConfigFile" + ExitWithExitCode 1 fi PackageSources=() -# Ensure dotnet3.1-internal and dotnet3.1-internal-transport are in the packageSources if the public dotnet3.1 feeds are present -grep -i "... section. + grep -i "" $ConfigFile if [ "$?" != "0" ]; then - echo "Adding dotnet3.1-internal to the packageSources." - PackageSourcesNodeFooter="" - PackageSourceTemplate="${TB}" + echo "Adding ... section." - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=('dotnet3.1-internal') - - grep -i "" $ConfigFile - if [ "$?" != "0" ]; then - echo "Adding dotnet3.1-internal-transport to the packageSources." PackageSourcesNodeFooter="" - PackageSourceTemplate="${TB}" + PackageSourceCredentialsTemplate="${TB}${NL}${TB}" - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile + sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourcesNodeFooter${NL}$PackageSourceCredentialsTemplate|" $ConfigFile fi - PackageSources+=('dotnet3.1-internal-transport') fi -DotNetVersions=('5' '6' '7' '8' '9') +# Check for disabledPackageSources; we'll enable any darc-int ones we find there +grep -i "" $ConfigFile > /dev/null +if [ "$?" == "0" ]; then + echo "Checking for any darc-int disabled package sources in the disabledPackageSources node" + EnableMaestroInternalPackageSources +fi + +DotNetVersions=('5' '6' '7' '8' '9' '10') for DotNetVersion in ${DotNetVersions[@]} ; do FeedPrefix="dotnet${DotNetVersion}"; - grep -i " /dev/null if [ "$?" == "0" ]; then - grep -i "" - - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=("$FeedPrefix-internal") - - grep -i "" $ConfigFile - if [ "$?" != "0" ]; then - echo "Adding $FeedPrefix-internal-transport to the packageSources." - PackageSourcesNodeFooter="" - PackageSourceTemplate="${TB}" - - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=("$FeedPrefix-internal-transport") + AddOrEnablePackageSource "$FeedPrefix-internal" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$FeedPrefix-internal/nuget/$FeedSuffix" + AddOrEnablePackageSource "$FeedPrefix-internal-transport" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$FeedPrefix-internal-transport/nuget/$FeedSuffix" fi done +# Check for dotnet-eng and add dotnet-eng-internal if present +grep -i " /dev/null +if [ "$?" == "0" ]; then + AddOrEnablePackageSource "dotnet-eng-internal" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-eng-internal/nuget/$FeedSuffix" +fi + +# Check for dotnet-tools and add dotnet-tools-internal if present +grep -i " /dev/null +if [ "$?" == "0" ]; then + AddOrEnablePackageSource "dotnet-tools-internal" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/$FeedSuffix" +fi + # I want things split line by line PrevIFS=$IFS IFS=$'\n' @@ -139,29 +198,12 @@ if [ "$CredToken" ]; then # Check if there is no existing credential for this FeedName grep -i "<$FeedName>" $ConfigFile if [ "$?" != "0" ]; then - echo "Adding credentials for $FeedName." + echo " Inserting credential for feed: $FeedName" PackageSourceCredentialsNodeFooter="" - NewCredential="${TB}${TB}<$FeedName>${NL}${NL}${NL}" + NewCredential="${TB}${TB}<$FeedName>${NL}${TB}${NL}${TB}${TB}${NL}${TB}${TB}" sed -i.bak "s|$PackageSourceCredentialsNodeFooter|$NewCredential${NL}$PackageSourceCredentialsNodeFooter|" $ConfigFile fi done fi - -# Re-enable any entries in disabledPackageSources where the feed name contains darc-int -grep -i "" $ConfigFile -if [ "$?" == "0" ]; then - DisabledDarcIntSources=() - echo "Re-enabling any disabled \"darc-int\" package sources in $ConfigFile" - DisabledDarcIntSources+=$(grep -oh '"darc-int-[^"]*" value="true"' $ConfigFile | tr -d '"') - for DisabledSourceName in ${DisabledDarcIntSources[@]} ; do - if [[ $DisabledSourceName == darc-int* ]] - then - OldDisableValue="" - NewDisableValue="" - sed -i.bak "s|$OldDisableValue|$NewDisableValue|" $ConfigFile - echo "Neutralized disablePackageSources entry for '$DisabledSourceName'" - fi - done -fi diff --git a/eng/common/build.ps1 b/eng/common/build.ps1 index 438f9920c43..8cfee107e7a 100644 --- a/eng/common/build.ps1 +++ b/eng/common/build.ps1 @@ -7,6 +7,7 @@ Param( [string] $msbuildEngine = $null, [bool] $warnAsError = $true, [bool] $nodeReuse = $true, + [switch] $buildCheck = $false, [switch][Alias('r')]$restore, [switch] $deployDeps, [switch][Alias('b')]$build, @@ -20,6 +21,7 @@ Param( [switch] $publish, [switch] $clean, [switch][Alias('pb')]$productBuild, + [switch]$fromVMR, [switch][Alias('bl')]$binaryLog, [switch][Alias('nobl')]$excludeCIBinarylog, [switch] $ci, @@ -71,6 +73,9 @@ function Print-Usage() { Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." Write-Host " -excludePrereleaseVS Set to exclude build engines in prerelease versions of Visual Studio" Write-Host " -nativeToolsOnMachine Sets the native tools on machine environment variable (indicating that the script should use native tools on machine)" + Write-Host " -nodeReuse Sets nodereuse msbuild parameter ('true' or 'false')" + Write-Host " -buildCheck Sets /check msbuild parameter" + Write-Host " -fromVMR Set when building from within the VMR" Write-Host "" Write-Host "Command line arguments not listed above are passed thru to msbuild." @@ -97,6 +102,7 @@ function Build { $bl = if ($binaryLog) { '/bl:' + (Join-Path $LogDir 'Build.binlog') } else { '' } $platformArg = if ($platform) { "/p:Platform=$platform" } else { '' } + $check = if ($buildCheck) { '/check' } else { '' } if ($projects) { # Re-assign properties to a new variable because PowerShell doesn't let us append properties directly for unclear reasons. @@ -113,6 +119,7 @@ function Build { MSBuild $toolsetBuildProj ` $bl ` $platformArg ` + $check ` /p:Configuration=$configuration ` /p:RepoRoot=$RepoRoot ` /p:Restore=$restore ` @@ -122,11 +129,13 @@ function Build { /p:Deploy=$deploy ` /p:Test=$test ` /p:Pack=$pack ` - /p:DotNetBuildRepo=$productBuild ` + /p:DotNetBuild=$productBuild ` + /p:DotNetBuildFromVMR=$fromVMR ` /p:IntegrationTest=$integrationTest ` /p:PerformanceTest=$performanceTest ` /p:Sign=$sign ` /p:Publish=$publish ` + /p:RestoreStaticGraphEnableBinaryLogger=$binaryLog ` @properties } diff --git a/eng/common/build.sh b/eng/common/build.sh index ac1ee8620cd..9767bb411a4 100755 --- a/eng/common/build.sh +++ b/eng/common/build.sh @@ -42,6 +42,8 @@ usage() echo " --prepareMachine Prepare machine for CI run, clean up processes after build" echo " --nodeReuse Sets nodereuse msbuild parameter ('true' or 'false')" echo " --warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" + echo " --buildCheck Sets /check msbuild parameter" + echo " --fromVMR Set when building from within the VMR" echo "" echo "Command line arguments not listed above are passed thru to msbuild." echo "Arguments can also be passed in with a single hyphen." @@ -63,6 +65,7 @@ restore=false build=false source_build=false product_build=false +from_vmr=false rebuild=false test=false integration_test=false @@ -76,6 +79,7 @@ clean=false warn_as_error=true node_reuse=true +build_check=false binary_log=false exclude_ci_binary_log=false pipelines_log=false @@ -87,7 +91,7 @@ verbosity='minimal' runtime_source_feed='' runtime_source_feed_key='' -properties='' +properties=() while [[ $# > 0 ]]; do opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")" case "$opt" in @@ -127,19 +131,22 @@ while [[ $# > 0 ]]; do -pack) pack=true ;; - -sourcebuild|-sb) + -sourcebuild|-source-build|-sb) build=true source_build=true product_build=true restore=true pack=true ;; - -productBuild|-pb) + -productbuild|-product-build|-pb) build=true product_build=true restore=true pack=true ;; + -fromvmr|-from-vmr) + from_vmr=true + ;; -test|-t) test=true ;; @@ -173,6 +180,9 @@ while [[ $# > 0 ]]; do node_reuse=$2 shift ;; + -buildcheck) + build_check=true + ;; -runtimesourcefeed) runtime_source_feed=$2 shift @@ -182,7 +192,7 @@ while [[ $# > 0 ]]; do shift ;; *) - properties="$properties $1" + properties+=("$1") ;; esac @@ -216,7 +226,7 @@ function Build { InitializeCustomToolset if [[ ! -z "$projects" ]]; then - properties="$properties /p:Projects=$projects" + properties+=("/p:Projects=$projects") fi local bl="" @@ -224,15 +234,21 @@ function Build { bl="/bl:\"$log_dir/Build.binlog\"" fi + local check="" + if [[ "$build_check" == true ]]; then + check="/check" + fi + MSBuild $_InitializeToolset \ $bl \ + $check \ /p:Configuration=$configuration \ /p:RepoRoot="$repo_root" \ /p:Restore=$restore \ /p:Build=$build \ - /p:DotNetBuildRepo=$product_build \ - /p:ArcadeBuildFromSource=$source_build \ + /p:DotNetBuild=$product_build \ /p:DotNetBuildSourceOnly=$source_build \ + /p:DotNetBuildFromVMR=$from_vmr \ /p:Rebuild=$rebuild \ /p:Test=$test \ /p:Pack=$pack \ @@ -240,7 +256,8 @@ function Build { /p:PerformanceTest=$performance_test \ /p:Sign=$sign \ /p:Publish=$publish \ - $properties + /p:RestoreStaticGraphEnableBinaryLogger=$binary_log \ + ${properties[@]+"${properties[@]}"} ExitWithExitCode 0 } diff --git a/eng/common/cibuild.sh b/eng/common/cibuild.sh index 1a02c0dec8f..66e3b0ac61c 100755 --- a/eng/common/cibuild.sh +++ b/eng/common/cibuild.sh @@ -13,4 +13,4 @@ while [[ -h $source ]]; do done scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" -. "$scriptroot/build.sh" --restore --build --test --pack --publish --ci $@ \ No newline at end of file +. "$scriptroot/build.sh" --restore --build --test --pack --publish --ci $@ diff --git a/eng/common/core-templates/job/job.yml b/eng/common/core-templates/job/job.yml index 8da43d3b583..5ce51840619 100644 --- a/eng/common/core-templates/job/job.yml +++ b/eng/common/core-templates/job/job.yml @@ -19,11 +19,11 @@ parameters: # publishing defaults artifacts: '' enableMicrobuild: false + enableMicrobuildForMacAndLinux: false microbuildUseESRP: true enablePublishBuildArtifacts: false enablePublishBuildAssets: false enablePublishTestResults: false - enablePublishUsingPipelines: false enableBuildRetry: false mergeTestResults: false testRunTitle: '' @@ -74,9 +74,6 @@ jobs: - ${{ if ne(parameters.enableTelemetry, 'false') }}: - name: DOTNET_CLI_TELEMETRY_PROFILE value: '$(Build.Repository.Uri)' - - ${{ if eq(parameters.enableRichCodeNavigation, 'true') }}: - - name: EnableRichCodeNavigation - value: 'true' # Retry signature validation up to three times, waiting 2 seconds between attempts. # See https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3028#retry-untrusted-root-failures - name: NUGET_EXPERIMENTAL_CHAIN_BUILD_RETRY_POLICY @@ -128,23 +125,12 @@ jobs: - ${{ preStep }} - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - - task: MicroBuildSigningPlugin@4 - displayName: Install MicroBuild plugin - inputs: - signType: $(_SignType) - zipSources: false - feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json - ${{ if eq(parameters.microbuildUseESRP, true) }}: - ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: - ConnectedPMEServiceName: 6cc74545-d7b9-4050-9dfa-ebefcc8961ea - ${{ else }}: - ConnectedPMEServiceName: 248d384a-b39b-46e3-8ad5-c2c210d5e7ca - env: - TeamName: $(_TeamName) - MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)' + - template: /eng/common/core-templates/steps/install-microbuild.yml + parameters: + enableMicrobuild: ${{ parameters.enableMicrobuild }} + enableMicrobuildForMacAndLinux: ${{ parameters.enableMicrobuildForMacAndLinux }} + microbuildUseESRP: ${{ parameters.microbuildUseESRP }} continueOnError: ${{ parameters.continueOnError }} - condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) - ${{ if and(eq(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'internal')) }}: - task: NuGetAuthenticate@1 @@ -160,27 +146,15 @@ jobs: - ${{ each step in parameters.steps }}: - ${{ step }} - - ${{ if eq(parameters.enableRichCodeNavigation, true) }}: - - task: RichCodeNavIndexer@0 - displayName: RichCodeNav Upload - inputs: - languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }} - environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'internal') }} - richNavLogOutputDirectory: $(System.DefaultWorkingDirectory)/artifacts/bin - uploadRichNavArtifacts: ${{ coalesce(parameters.richCodeNavigationUploadArtifacts, false) }} - continueOnError: true - - ${{ each step in parameters.componentGovernanceSteps }}: - ${{ step }} - - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - task: MicroBuildCleanup@1 - displayName: Execute Microbuild cleanup tasks - condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - template: /eng/common/core-templates/steps/cleanup-microbuild.yml + parameters: + enableMicrobuild: ${{ parameters.enableMicrobuild }} + enableMicrobuildForMacAndLinux: ${{ parameters.enableMicrobuildForMacAndLinux }} continueOnError: ${{ parameters.continueOnError }} - env: - TeamName: $(_TeamName) # Publish test results - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'xunit')) }}: diff --git a/eng/common/core-templates/job/onelocbuild.yml b/eng/common/core-templates/job/onelocbuild.yml index edefa789d36..c5788829a87 100644 --- a/eng/common/core-templates/job/onelocbuild.yml +++ b/eng/common/core-templates/job/onelocbuild.yml @@ -4,7 +4,7 @@ parameters: # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool pool: '' - + CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex GithubPat: $(BotAccount-dotnet-bot-repo-PAT) @@ -27,7 +27,7 @@ parameters: is1ESPipeline: '' jobs: - job: OneLocBuild${{ parameters.JobNameSuffix }} - + dependsOn: ${{ parameters.dependsOn }} displayName: OneLocBuild${{ parameters.JobNameSuffix }} @@ -86,8 +86,7 @@ jobs: isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }} ${{ if eq(parameters.CreatePr, true) }}: isUseLfLineEndingsSelected: ${{ parameters.UseLfLineEndings }} - ${{ if eq(parameters.RepoType, 'gitHub') }}: - isShouldReusePrSelected: ${{ parameters.ReusePr }} + isShouldReusePrSelected: ${{ parameters.ReusePr }} packageSourceAuth: patAuth patVariable: ${{ parameters.CeapexPat }} ${{ if eq(parameters.RepoType, 'gitHub') }}: @@ -100,22 +99,20 @@ jobs: mirrorBranch: ${{ parameters.MirrorBranch }} condition: ${{ parameters.condition }} - - template: /eng/common/core-templates/steps/publish-build-artifacts.yml - parameters: - is1ESPipeline: ${{ parameters.is1ESPipeline }} - args: - displayName: Publish Localization Files - pathToPublish: '$(Build.ArtifactStagingDirectory)/loc' - publishLocation: Container - artifactName: Loc - condition: ${{ parameters.condition }} + # Copy the locProject.json to the root of the Loc directory, then publish a pipeline artifact + - task: CopyFiles@2 + displayName: Copy LocProject.json + inputs: + SourceFolder: '$(System.DefaultWorkingDirectory)/eng/Localize/' + Contents: 'LocProject.json' + TargetFolder: '$(Build.ArtifactStagingDirectory)/loc' + condition: ${{ parameters.condition }} - - template: /eng/common/core-templates/steps/publish-build-artifacts.yml + - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} args: - displayName: Publish LocProject.json - pathToPublish: '$(System.DefaultWorkingDirectory)/eng/Localize/' - publishLocation: Container - artifactName: Loc - condition: ${{ parameters.condition }} \ No newline at end of file + targetPath: '$(Build.ArtifactStagingDirectory)/loc' + artifactName: 'Loc' + displayName: 'Publish Localization Files' + condition: ${{ parameters.condition }} diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml index a58c8a418e8..3437087c80f 100644 --- a/eng/common/core-templates/job/publish-build-assets.yml +++ b/eng/common/core-templates/job/publish-build-assets.yml @@ -20,9 +20,6 @@ parameters: # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. runAsPublic: false - # Optional: whether the build's artifacts will be published using release pipelines or direct feed publishing - publishUsingPipelines: false - # Optional: whether the build's artifacts will be published using release pipelines or direct feed publishing publishAssetsImmediately: false @@ -32,6 +29,15 @@ parameters: is1ESPipeline: '' + # Optional: 🌤️ or not the build has assets it wants to publish to BAR + isAssetlessBuild: false + + # Optional, publishing version + publishingVersion: 3 + + # Optional: A minimatch pattern for the asset manifests to publish to BAR + assetManifestsPattern: '*/manifests/**/*.xml' + repositoryAlias: self officialBuildId: '' @@ -84,18 +90,44 @@ jobs: - checkout: ${{ parameters.repositoryAlias }} fetchDepth: 3 clean: true - - - task: DownloadBuildArtifacts@0 - displayName: Download artifact - inputs: - artifactName: AssetManifests - downloadPath: '$(Build.StagingDirectory)/Download' - checkDownloadedFiles: true - condition: ${{ parameters.condition }} - continueOnError: ${{ parameters.continueOnError }} + + - ${{ if eq(parameters.isAssetlessBuild, 'false') }}: + - ${{ if eq(parameters.publishingVersion, 3) }}: + - task: DownloadPipelineArtifact@2 + displayName: Download Asset Manifests + inputs: + artifactName: AssetManifests + targetPath: '$(Build.StagingDirectory)/AssetManifests' + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - ${{ if eq(parameters.publishingVersion, 4) }}: + - task: DownloadPipelineArtifact@2 + displayName: Download V4 asset manifests + inputs: + itemPattern: '*/manifests/**/*.xml' + targetPath: '$(Build.StagingDirectory)/AllAssetManifests' + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - task: CopyFiles@2 + displayName: Copy V4 asset manifests to AssetManifests + inputs: + SourceFolder: '$(Build.StagingDirectory)/AllAssetManifests' + Contents: ${{ parameters.assetManifestsPattern }} + TargetFolder: '$(Build.StagingDirectory)/AssetManifests' + flattenFolders: true + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} - task: NuGetAuthenticate@1 + # Populate internal runtime variables. + - template: /eng/common/templates/steps/enable-internal-sources.yml + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + parameters: + legacyCredential: $(dn-bot-dnceng-artifact-feeds-rw) + + - template: /eng/common/templates/steps/enable-internal-runtimes.yml + - task: AzureCLI@2 displayName: Publish Build Assets inputs: @@ -104,10 +136,13 @@ jobs: scriptLocation: scriptPath scriptPath: $(System.DefaultWorkingDirectory)/eng/common/sdk-task.ps1 arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet - /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' + /p:ManifestsPath='$(Build.StagingDirectory)/AssetManifests' + /p:IsAssetlessBuild=${{ parameters.isAssetlessBuild }} /p:MaestroApiEndpoint=https://maestro.dot.net - /p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }} /p:OfficialBuildId=$(OfficialBuildId) + -runtimeSourceFeed https://ci.dot.net/internal + -runtimeSourceFeedKey '$(dotnetbuilds-internal-container-read-token-base64)' + condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} @@ -129,6 +164,17 @@ jobs: Copy-Item -Path $symbolExclusionfile -Destination "$(Build.StagingDirectory)/ReleaseConfigs" } + - ${{ if eq(parameters.publishingVersion, 4) }}: + - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + args: + targetPath: '$(Build.ArtifactStagingDirectory)/MergedManifest.xml' + artifactName: AssetManifests + displayName: 'Publish Merged Manifest' + retryCountOnTaskFailure: 10 # for any logs being locked + sbomEnabled: false # we don't need SBOM for logs + - template: /eng/common/core-templates/steps/publish-build-artifacts.yml parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} @@ -138,13 +184,18 @@ jobs: publishLocation: Container artifactName: ReleaseConfigs - - ${{ if eq(parameters.publishAssetsImmediately, 'true') }}: + - ${{ if or(eq(parameters.publishAssetsImmediately, 'true'), eq(parameters.isAssetlessBuild, 'true')) }}: - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml parameters: BARBuildId: ${{ parameters.BARBuildId }} PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} is1ESPipeline: ${{ parameters.is1ESPipeline }} + # Darc is targeting 8.0, so make sure it's installed + - task: UseDotNet@2 + inputs: + version: 8.0.x + - task: AzureCLI@2 displayName: Publish Using Darc inputs: @@ -159,6 +210,9 @@ jobs: -WaitPublishingFinish true -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}' -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}' + -SkipAssetsPublishing '${{ parameters.isAssetlessBuild }}' + -runtimeSourceFeed https://ci.dot.net/internal + -runtimeSourceFeedKey '$(dotnetbuilds-internal-container-read-token-base64)' - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: - template: /eng/common/core-templates/steps/publish-logs.yml diff --git a/eng/common/core-templates/job/source-build.yml b/eng/common/core-templates/job/source-build.yml index 5baedac1e03..d805d5faeb9 100644 --- a/eng/common/core-templates/job/source-build.yml +++ b/eng/common/core-templates/job/source-build.yml @@ -12,9 +12,10 @@ parameters: # The name of the job. This is included in the job ID. # targetRID: '' # The name of the target RID to use, instead of the one auto-detected by Arcade. - # nonPortable: false + # portableBuild: false # Enables non-portable mode. This means a more specific RID (e.g. fedora.32-x64 rather than - # linux-x64), and compiling against distro-provided packages rather than portable ones. + # linux-x64), and compiling against distro-provided packages rather than portable ones. The + # default is portable mode. # skipPublishValidation: false # Disables publishing validation. By default, a check is performed to ensure no packages are # published by source-build. @@ -33,9 +34,6 @@ parameters: # container and pool. platform: {} - # Optional list of directories to ignore for component governance scans. - componentGovernanceIgnoreDirectories: [] - is1ESPipeline: '' # If set to true and running on a non-public project, @@ -96,4 +94,3 @@ jobs: parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} platform: ${{ parameters.platform }} - componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }} diff --git a/eng/common/core-templates/job/source-index-stage1.yml b/eng/common/core-templates/job/source-index-stage1.yml index 662b9fcce15..76baf5c2725 100644 --- a/eng/common/core-templates/job/source-index-stage1.yml +++ b/eng/common/core-templates/job/source-index-stage1.yml @@ -1,12 +1,9 @@ parameters: runAsPublic: false - sourceIndexUploadPackageVersion: 2.0.0-20250425.2 - sourceIndexProcessBinlogPackageVersion: 1.0.1-20250425.2 - sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci" preSteps: [] binlogPath: artifacts/log/Debug/Build.binlog - condition: '' + condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') dependsOn: '' pool: '' is1ESPipeline: '' @@ -16,12 +13,6 @@ jobs: dependsOn: ${{ parameters.dependsOn }} condition: ${{ parameters.condition }} variables: - - name: SourceIndexUploadPackageVersion - value: ${{ parameters.sourceIndexUploadPackageVersion }} - - name: SourceIndexProcessBinlogPackageVersion - value: ${{ parameters.sourceIndexProcessBinlogPackageVersion }} - - name: SourceIndexPackageSource - value: ${{ parameters.sourceIndexPackageSource }} - name: BinlogPath value: ${{ parameters.binlogPath }} - template: /eng/common/core-templates/variables/pool-providers.yml @@ -34,12 +25,10 @@ jobs: pool: ${{ if eq(variables['System.TeamProject'], 'public') }}: name: $(DncEngPublicBuildPool) - image: 1es-windows-2022-open - os: windows + image: windows.vs2026preview.scout.amd64.open ${{ if eq(variables['System.TeamProject'], 'internal') }}: name: $(DncEngInternalBuildPool) - image: 1es-windows-2022 - os: windows + image: windows.vs2026preview.scout.amd64 steps: - ${{ if eq(parameters.is1ESPipeline, '') }}: @@ -47,35 +36,9 @@ jobs: - ${{ each preStep in parameters.preSteps }}: - ${{ preStep }} - - - task: UseDotNet@2 - displayName: Use .NET 8 SDK - inputs: - packageType: sdk - version: 8.0.x - installationPath: $(Agent.TempDirectory)/dotnet - workingDirectory: $(Agent.TempDirectory) - - - script: | - $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version $(sourceIndexProcessBinlogPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools - $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version $(sourceIndexUploadPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools - displayName: Download Tools - # Set working directory to temp directory so 'dotnet' doesn't try to use global.json and use the repo's sdk. - workingDirectory: $(Agent.TempDirectory) - - script: ${{ parameters.sourceIndexBuildCommand }} displayName: Build Repository - - script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i $(BinlogPath) -r $(System.DefaultWorkingDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output - displayName: Process Binlog into indexable sln - - - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - task: AzureCLI@2 - displayName: Log in to Azure and upload stage1 artifacts to source index - inputs: - azureSubscription: 'SourceDotNet Stage1 Publish' - addSpnToEnvironment: true - scriptType: 'ps' - scriptLocation: 'inlineScript' - inlineScript: | - $(Agent.TempDirectory)/.source-index/tools/UploadIndexStage1 -i .source-index/stage1output -n $(Build.Repository.Name) -s netsourceindexstage1 -b stage1 + - template: /eng/common/core-templates/steps/source-index-stage1-publish.yml + parameters: + binLogPath: ${{ parameters.binLogPath }} diff --git a/eng/common/core-templates/jobs/codeql-build.yml b/eng/common/core-templates/jobs/codeql-build.yml index 4571a7864df..dbc14ac580a 100644 --- a/eng/common/core-templates/jobs/codeql-build.yml +++ b/eng/common/core-templates/jobs/codeql-build.yml @@ -15,7 +15,6 @@ jobs: enablePublishBuildArtifacts: false enablePublishTestResults: false enablePublishBuildAssets: false - enablePublishUsingPipelines: false enableTelemetry: true variables: diff --git a/eng/common/core-templates/jobs/jobs.yml b/eng/common/core-templates/jobs/jobs.yml index bf33cdc2cc7..01ada747665 100644 --- a/eng/common/core-templates/jobs/jobs.yml +++ b/eng/common/core-templates/jobs/jobs.yml @@ -5,9 +5,6 @@ parameters: # Optional: Include PublishBuildArtifacts task enablePublishBuildArtifacts: false - # Optional: Enable publishing using release pipelines - enablePublishUsingPipelines: false - # Optional: Enable running the source-build jobs to build repo from source enableSourceBuild: false @@ -30,6 +27,9 @@ parameters: # Optional: Publish the assets as soon as the publish to BAR stage is complete, rather doing so in a separate stage. publishAssetsImmediately: false + # Optional: 🌤️ or not the build has assets it wants to publish to BAR + isAssetlessBuild: false + # Optional: If using publishAssetsImmediately and additional parameters are needed, can be used to send along additional parameters (normally sent to post-build.yml) artifactsPublishingAdditionalParameters: '' signingValidationAdditionalParameters: '' @@ -85,7 +85,6 @@ jobs: - template: /eng/common/core-templates/jobs/source-build.yml parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} - allCompletedJobId: Source_Build_Complete ${{ each parameter in parameters.sourceBuildParameters }}: ${{ parameter.key }}: ${{ parameter.value }} @@ -98,7 +97,7 @@ jobs: ${{ parameter.key }}: ${{ parameter.value }} - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - ${{ if or(eq(parameters.enablePublishBuildAssets, true), eq(parameters.artifacts.publish.manifests, 'true'), ne(parameters.artifacts.publish.manifests, '')) }}: + - ${{ if or(eq(parameters.enablePublishBuildAssets, true), eq(parameters.artifacts.publish.manifests, 'true'), ne(parameters.artifacts.publish.manifests, ''), eq(parameters.isAssetlessBuild, true)) }}: - template: ../job/publish-build-assets.yml parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} @@ -110,12 +109,10 @@ jobs: - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}: - ${{ each job in parameters.jobs }}: - ${{ job.job }} - - ${{ if eq(parameters.enableSourceBuild, true) }}: - - Source_Build_Complete runAsPublic: ${{ parameters.runAsPublic }} - publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }} - publishAssetsImmediately: ${{ parameters.publishAssetsImmediately }} + publishAssetsImmediately: ${{ or(parameters.publishAssetsImmediately, parameters.isAssetlessBuild) }} + isAssetlessBuild: ${{ parameters.isAssetlessBuild }} enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }} artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} signingValidationAdditionalParameters: ${{ parameters.signingValidationAdditionalParameters }} diff --git a/eng/common/core-templates/jobs/source-build.yml b/eng/common/core-templates/jobs/source-build.yml index 0b408a67bd5..d92860cba20 100644 --- a/eng/common/core-templates/jobs/source-build.yml +++ b/eng/common/core-templates/jobs/source-build.yml @@ -2,28 +2,19 @@ parameters: # This template adds arcade-powered source-build to CI. A job is created for each platform, as # well as an optional server job that completes when all platform jobs complete. - # The name of the "join" job for all source-build platforms. If set to empty string, the job is - # not included. Existing repo pipelines can use this job depend on all source-build jobs - # completing without maintaining a separate list of every single job ID: just depend on this one - # server job. By default, not included. Recommended name if used: 'Source_Build_Complete'. - allCompletedJobId: '' - # See /eng/common/core-templates/job/source-build.yml jobNamePrefix: 'Source_Build' # This is the default platform provided by Arcade, intended for use by a managed-only repo. defaultManagedPlatform: name: 'Managed' - container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9' + container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream-10-amd64' # Defines the platforms on which to run build jobs. One job is created for each platform, and the # object in this array is sent to the job template as 'platform'. If no platforms are specified, # one job runs on 'defaultManagedPlatform'. platforms: [] - # Optional list of directories to ignore for component governance scans. - componentGovernanceIgnoreDirectories: [] - is1ESPipeline: '' # If set to true and running on a non-public project, @@ -34,23 +25,12 @@ parameters: jobs: -- ${{ if ne(parameters.allCompletedJobId, '') }}: - - job: ${{ parameters.allCompletedJobId }} - displayName: Source-Build Complete - pool: server - dependsOn: - - ${{ each platform in parameters.platforms }}: - - ${{ parameters.jobNamePrefix }}_${{ platform.name }} - - ${{ if eq(length(parameters.platforms), 0) }}: - - ${{ parameters.jobNamePrefix }}_${{ parameters.defaultManagedPlatform.name }} - - ${{ each platform in parameters.platforms }}: - template: /eng/common/core-templates/job/source-build.yml parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} jobNamePrefix: ${{ parameters.jobNamePrefix }} platform: ${{ platform }} - componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }} enableInternalSources: ${{ parameters.enableInternalSources }} - ${{ if eq(length(parameters.platforms), 0) }}: @@ -59,5 +39,4 @@ jobs: is1ESPipeline: ${{ parameters.is1ESPipeline }} jobNamePrefix: ${{ parameters.jobNamePrefix }} platform: ${{ parameters.defaultManagedPlatform }} - componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }} enableInternalSources: ${{ parameters.enableInternalSources }} diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml index 2ee8bbfff54..9423d71ca3a 100644 --- a/eng/common/core-templates/post-build/post-build.yml +++ b/eng/common/core-templates/post-build/post-build.yml @@ -60,6 +60,11 @@ parameters: artifactNames: '' downloadArtifacts: true + - name: isAssetlessBuild + type: boolean + displayName: Is Assetless Build + default: false + # These parameters let the user customize the call to sdk-task.ps1 for publishing # symbols & general artifacts as well as for signing validation - name: symbolPublishingAdditionalParameters @@ -122,11 +127,11 @@ stages: ${{ else }}: ${{ if eq(parameters.is1ESPipeline, true) }}: name: $(DncEngInternalBuildPool) - image: windows.vs2022.amd64 + image: windows.vs2026preview.scout.amd64 os: windows ${{ else }}: name: $(DncEngInternalBuildPool) - demands: ImageOverride -equals windows.vs2022.amd64 + demands: ImageOverride -equals windows.vs2026preview.scout.amd64 steps: - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml @@ -170,7 +175,7 @@ stages: os: windows ${{ else }}: name: $(DncEngInternalBuildPool) - demands: ImageOverride -equals windows.vs2022.amd64 + demands: ImageOverride -equals windows.vs2026preview.scout.amd64 steps: - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml parameters: @@ -188,9 +193,6 @@ stages: buildId: $(AzDOBuildId) artifactName: PackageArtifacts checkDownloadedFiles: true - itemPattern: | - ** - !**/Microsoft.SourceBuild.Intermediate.*.nupkg # This is necessary whenever we want to publish/restore to an AzDO private feed # Since sdk-task.ps1 tries to restore packages we need to do this authentication here @@ -234,7 +236,7 @@ stages: os: windows ${{ else }}: name: $(DncEngInternalBuildPool) - demands: ImageOverride -equals windows.vs2022.amd64 + demands: ImageOverride -equals windows.vs2026preview.scout.amd64 steps: - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml parameters: @@ -305,6 +307,18 @@ stages: - task: NuGetAuthenticate@1 + # Populate internal runtime variables. + - template: /eng/common/templates/steps/enable-internal-sources.yml + parameters: + legacyCredential: $(dn-bot-dnceng-artifact-feeds-rw) + + - template: /eng/common/templates/steps/enable-internal-runtimes.yml + + # Darc is targeting 8.0, so make sure it's installed + - task: UseDotNet@2 + inputs: + version: 8.0.x + - task: AzureCLI@2 displayName: Publish Using Darc inputs: @@ -320,3 +334,6 @@ stages: -RequireDefaultChannels ${{ parameters.requireDefaultChannels }} -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}' -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}' + -SkipAssetsPublishing '${{ parameters.isAssetlessBuild }}' + -runtimeSourceFeed https://ci.dot.net/internal + -runtimeSourceFeedKey '$(dotnetbuilds-internal-container-read-token-base64)' diff --git a/eng/common/core-templates/steps/cleanup-microbuild.yml b/eng/common/core-templates/steps/cleanup-microbuild.yml new file mode 100644 index 00000000000..c0fdcd3379d --- /dev/null +++ b/eng/common/core-templates/steps/cleanup-microbuild.yml @@ -0,0 +1,28 @@ +parameters: + # Enable cleanup tasks for MicroBuild + enableMicrobuild: false + # Enable cleanup tasks for MicroBuild on Mac and Linux + # Will be ignored if 'enableMicrobuild' is false or 'Agent.Os' is 'Windows_NT' + enableMicrobuildForMacAndLinux: false + continueOnError: false + +steps: + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + - task: MicroBuildCleanup@1 + displayName: Execute Microbuild cleanup tasks + condition: and( + always(), + or( + and( + eq(variables['Agent.Os'], 'Windows_NT'), + in(variables['_SignType'], 'real', 'test') + ), + and( + ${{ eq(parameters.enableMicrobuildForMacAndLinux, true) }}, + ne(variables['Agent.Os'], 'Windows_NT'), + eq(variables['_SignType'], 'real') + ) + )) + continueOnError: ${{ parameters.continueOnError }} + env: + TeamName: $(_TeamName) diff --git a/eng/common/core-templates/steps/generate-sbom.yml b/eng/common/core-templates/steps/generate-sbom.yml index 7f5b84c4cb8..c05f6502797 100644 --- a/eng/common/core-templates/steps/generate-sbom.yml +++ b/eng/common/core-templates/steps/generate-sbom.yml @@ -5,7 +5,7 @@ # IgnoreDirectories - Directories to ignore for SBOM generation. This will be passed through to the CG component detector. parameters: - PackageVersion: 9.0.0 + PackageVersion: 10.0.0 BuildDropPath: '$(System.DefaultWorkingDirectory)/artifacts' PackageName: '.NET' ManifestDirPath: $(Build.ArtifactStagingDirectory)/sbom diff --git a/eng/common/core-templates/steps/get-delegation-sas.yml b/eng/common/core-templates/steps/get-delegation-sas.yml index 9db5617ea7d..d2901470a7f 100644 --- a/eng/common/core-templates/steps/get-delegation-sas.yml +++ b/eng/common/core-templates/steps/get-delegation-sas.yml @@ -31,16 +31,7 @@ steps: # Calculate the expiration of the SAS token and convert to UTC $expiry = (Get-Date).AddHours(${{ parameters.expiryInHours }}).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") - # Temporarily work around a helix issue where SAS tokens with / in them will cause incorrect downloads - # of correlation payloads. https://github.com/dotnet/dnceng/issues/3484 - $sas = "" - do { - $sas = az storage container generate-sas --account-name ${{ parameters.storageAccount }} --name ${{ parameters.container }} --permissions ${{ parameters.permissions }} --expiry $expiry --auth-mode login --as-user -o tsv - if ($LASTEXITCODE -ne 0) { - Write-Error "Failed to generate SAS token." - exit 1 - } - } while($sas.IndexOf('/') -ne -1) + $sas = az storage container generate-sas --account-name ${{ parameters.storageAccount }} --name ${{ parameters.container }} --permissions ${{ parameters.permissions }} --expiry $expiry --auth-mode login --as-user -o tsv if ($LASTEXITCODE -ne 0) { Write-Error "Failed to generate SAS token." diff --git a/eng/common/core-templates/steps/install-microbuild.yml b/eng/common/core-templates/steps/install-microbuild.yml new file mode 100644 index 00000000000..553fce66b94 --- /dev/null +++ b/eng/common/core-templates/steps/install-microbuild.yml @@ -0,0 +1,110 @@ +parameters: + # Enable install tasks for MicroBuild + enableMicrobuild: false + # Enable install tasks for MicroBuild on Mac and Linux + # Will be ignored if 'enableMicrobuild' is false or 'Agent.Os' is 'Windows_NT' + enableMicrobuildForMacAndLinux: false + # Determines whether the ESRP service connection information should be passed to the signing plugin. + # This overlaps with _SignType to some degree. We only need the service connection for real signing. + # It's important that the service connection not be passed to the MicroBuildSigningPlugin task in this place. + # Doing so will cause the service connection to be authorized for the pipeline, which isn't allowed and won't work for non-prod. + # Unfortunately, _SignType can't be used to exclude the use of the service connection in non-real sign scenarios. The + # variable is not available in template expression. _SignType has a very large proliferation across .NET, so replacing it is tough. + microbuildUseESRP: true + # Microbuild installation directory + microBuildOutputFolder: $(Agent.TempDirectory)/MicroBuild + + continueOnError: false + +steps: + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + - ${{ if eq(parameters.enableMicrobuildForMacAndLinux, 'true') }}: + # Needed to download the MicroBuild plugin nupkgs on Mac and Linux when nuget.exe is unavailable + - task: UseDotNet@2 + displayName: Install .NET 8.0 SDK for MicroBuild Plugin + inputs: + packageType: sdk + version: 8.0.x + installationPath: ${{ parameters.microBuildOutputFolder }}/.dotnet-microbuild + condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT')) + + - script: | + set -euo pipefail + + # UseDotNet@2 prepends the dotnet executable path to the PATH variable, so we can call dotnet directly + version=$(dotnet --version) + cat << 'EOF' > ${{ parameters.microBuildOutputFolder }}/global.json + { + "sdk": { + "version": "$version", + "paths": [ + "${{ parameters.microBuildOutputFolder }}/.dotnet-microbuild" + ], + "errorMessage": "The .NET SDK version $version is required to install the MicroBuild signing plugin." + } + } + EOF + displayName: 'Add global.json to MicroBuild Installation path' + workingDirectory: ${{ parameters.microBuildOutputFolder }} + condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT')) + + - script: | + REM Check if ESRP is disabled while SignType is real + if /I "${{ parameters.microbuildUseESRP }}"=="false" if /I "$(_SignType)"=="real" ( + echo Error: ESRP must be enabled when SignType is real. + exit /b 1 + ) + displayName: 'Validate ESRP usage (Windows)' + condition: and(succeeded(), eq(variables['Agent.Os'], 'Windows_NT')) + - script: | + # Check if ESRP is disabled while SignType is real + if [ "${{ parameters.microbuildUseESRP }}" = "false" ] && [ "$(_SignType)" = "real" ]; then + echo "Error: ESRP must be enabled when SignType is real." + exit 1 + fi + displayName: 'Validate ESRP usage (Non-Windows)' + condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT')) + + # Two different MB install steps. This is due to not being able to use the agent OS during + # YAML expansion, and Windows vs. Linux/Mac uses different service connections. However, + # we can avoid including the MB install step if not enabled at all. This avoids a bunch of + # extra pipeline authorizations, since most pipelines do not sign on non-Windows. + - task: MicroBuildSigningPlugin@4 + displayName: Install MicroBuild plugin (Windows) + inputs: + signType: $(_SignType) + zipSources: false + feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + ${{ if eq(parameters.microbuildUseESRP, true) }}: + ConnectedServiceName: 'MicroBuild Signing Task (DevDiv)' + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + ConnectedPMEServiceName: 6cc74545-d7b9-4050-9dfa-ebefcc8961ea + ${{ else }}: + ConnectedPMEServiceName: 248d384a-b39b-46e3-8ad5-c2c210d5e7ca + env: + TeamName: $(_TeamName) + MicroBuildOutputFolderOverride: ${{ parameters.microBuildOutputFolder }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), eq(variables['Agent.Os'], 'Windows_NT'), in(variables['_SignType'], 'real', 'test')) + + - ${{ if eq(parameters.enableMicrobuildForMacAndLinux, true) }}: + - task: MicroBuildSigningPlugin@4 + displayName: Install MicroBuild plugin (non-Windows) + inputs: + signType: $(_SignType) + zipSources: false + feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + workingDirectory: ${{ parameters.microBuildOutputFolder }} + ${{ if eq(parameters.microbuildUseESRP, true) }}: + ConnectedServiceName: 'MicroBuild Signing Task (DevDiv)' + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + ConnectedPMEServiceName: beb8cb23-b303-4c95-ab26-9e44bc958d39 + ${{ else }}: + ConnectedPMEServiceName: c24de2a5-cc7a-493d-95e4-8e5ff5cad2bc + env: + TeamName: $(_TeamName) + MicroBuildOutputFolderOverride: ${{ parameters.microBuildOutputFolder }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT'), eq(variables['_SignType'], 'real')) diff --git a/eng/common/core-templates/steps/publish-logs.yml b/eng/common/core-templates/steps/publish-logs.yml index 0623ac6e112..5a927b4c7bc 100644 --- a/eng/common/core-templates/steps/publish-logs.yml +++ b/eng/common/core-templates/steps/publish-logs.yml @@ -26,15 +26,19 @@ steps: # If the file exists - sensitive data for redaction will be sourced from it # (single entry per line, lines starting with '# ' are considered comments and skipped) arguments: -InputPath '$(System.DefaultWorkingDirectory)/PostBuildLogs' - -BinlogToolVersion ${{parameters.BinlogToolVersion}} + -BinlogToolVersion '${{parameters.BinlogToolVersion}}' -TokensFilePath '$(System.DefaultWorkingDirectory)/eng/BinlogSecretsRedactionFile.txt' + -runtimeSourceFeed https://ci.dot.net/internal + -runtimeSourceFeedKey '$(dotnetbuilds-internal-container-read-token-base64)' '$(publishing-dnceng-devdiv-code-r-build-re)' '$(MaestroAccessToken)' '$(dn-bot-all-orgs-artifact-feeds-rw)' '$(akams-client-id)' '$(microsoft-symbol-server-pat)' '$(symweb-symbol-server-pat)' + '$(dnceng-symbol-server-pat)' '$(dn-bot-all-orgs-build-rw-code-rw)' + '$(System.AccessToken)' ${{parameters.CustomSensitiveDataList}} continueOnError: true condition: always() @@ -45,6 +49,7 @@ steps: SourceFolder: '$(System.DefaultWorkingDirectory)/PostBuildLogs' Contents: '**' TargetFolder: '$(Build.ArtifactStagingDirectory)/PostBuildLogs' + condition: always() - template: /eng/common/core-templates/steps/publish-build-artifacts.yml parameters: diff --git a/eng/common/core-templates/steps/source-build.yml b/eng/common/core-templates/steps/source-build.yml index 0718e4ba902..b9c86c18ae4 100644 --- a/eng/common/core-templates/steps/source-build.yml +++ b/eng/common/core-templates/steps/source-build.yml @@ -11,10 +11,6 @@ parameters: # for details. The entire object is described in the 'job' template for simplicity, even though # the usage of the properties on this object is split between the 'job' and 'steps' templates. platform: {} - - # Optional list of directories to ignore for component governance scans. - componentGovernanceIgnoreDirectories: [] - is1ESPipeline: false steps: @@ -23,25 +19,12 @@ steps: set -x df -h - # If file changes are detected, set CopyWipIntoInnerSourceBuildRepo to copy the WIP changes into the inner source build repo. - internalRestoreArgs= - if ! git diff --quiet; then - internalRestoreArgs='/p:CopyWipIntoInnerSourceBuildRepo=true' - # The 'Copy WIP' feature of source build uses git stash to apply changes from the original repo. - # This only works if there is a username/email configured, which won't be the case in most CI runs. - git config --get user.email - if [ $? -ne 0 ]; then - git config user.email dn-bot@microsoft.com - git config user.name dn-bot - fi - fi - # If building on the internal project, the internal storage variable may be available (usually only if needed) # In that case, add variables to allow the download of internal runtimes if the specified versions are not found # in the default public locations. internalRuntimeDownloadArgs= if [ '$(dotnetbuilds-internal-container-read-token-base64)' != '$''(dotnetbuilds-internal-container-read-token-base64)' ]; then - internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://dotnetbuilds.blob.core.windows.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://dotnetbuilds.blob.core.windows.net/internal --runtimesourcefeedkey $(dotnetbuilds-internal-container-read-token-base64)' + internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://ci.dot.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://ci.dot.net/internal --runtimesourcefeedkey '$(dotnetbuilds-internal-container-read-token-base64)'' fi buildConfig=Release @@ -50,88 +33,33 @@ steps: buildConfig='$(_BuildConfig)' fi - officialBuildArgs= - if [ '${{ and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}' = 'True' ]; then - officialBuildArgs='/p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(BUILD.BUILDNUMBER)' - fi - targetRidArgs= if [ '${{ parameters.platform.targetRID }}' != '' ]; then targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}' fi - runtimeOsArgs= - if [ '${{ parameters.platform.runtimeOS }}' != '' ]; then - runtimeOsArgs='/p:RuntimeOS=${{ parameters.platform.runtimeOS }}' - fi - - baseOsArgs= - if [ '${{ parameters.platform.baseOS }}' != '' ]; then - baseOsArgs='/p:BaseOS=${{ parameters.platform.baseOS }}' - fi - - publishArgs= - if [ '${{ parameters.platform.skipPublishValidation }}' != 'true' ]; then - publishArgs='--publish' - fi - - assetManifestFileName=SourceBuild_RidSpecific.xml - if [ '${{ parameters.platform.name }}' != '' ]; then - assetManifestFileName=SourceBuild_${{ parameters.platform.name }}.xml + portableBuildArgs= + if [ '${{ parameters.platform.portableBuild }}' != '' ]; then + portableBuildArgs='/p:PortableBuild=${{ parameters.platform.portableBuild }}' fi ${{ coalesce(parameters.platform.buildScript, './build.sh') }} --ci \ --configuration $buildConfig \ - --restore --build --pack $publishArgs -bl \ + --restore --build --pack -bl \ + --source-build \ ${{ parameters.platform.buildArguments }} \ - $officialBuildArgs \ $internalRuntimeDownloadArgs \ - $internalRestoreArgs \ $targetRidArgs \ - $runtimeOsArgs \ - $baseOsArgs \ - /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \ - /p:ArcadeBuildFromSource=true \ - /p:DotNetBuildSourceOnly=true \ - /p:DotNetBuildRepo=true \ - /p:AssetManifestFileName=$assetManifestFileName + $portableBuildArgs \ displayName: Build -# Upload build logs for diagnosis. -- task: CopyFiles@2 - displayName: Prepare BuildLogs staging directory - inputs: - SourceFolder: '$(System.DefaultWorkingDirectory)' - Contents: | - **/*.log - **/*.binlog - artifacts/sb/prebuilt-report/** - TargetFolder: '$(Build.StagingDirectory)/BuildLogs' - CleanTargetFolder: true - continueOnError: true - condition: succeededOrFailed() - - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} args: displayName: Publish BuildLogs - targetPath: '$(Build.StagingDirectory)/BuildLogs' + targetPath: artifacts/log/${{ coalesce(variables._BuildConfig, 'Release') }} artifactName: BuildLogs_SourceBuild_${{ parameters.platform.name }}_Attempt$(System.JobAttempt) continueOnError: true condition: succeededOrFailed() sbomEnabled: false # we don't need SBOM for logs - -# Manually inject component detection so that we can ignore the source build upstream cache, which contains -# a nupkg cache of input packages (a local feed). -# This path must match the upstream cache path in property 'CurrentRepoSourceBuiltNupkgCacheDir' -# in src\Microsoft.DotNet.Arcade.Sdk\tools\SourceBuild\SourceBuildArcade.targets -- template: /eng/common/core-templates/steps/component-governance.yml - parameters: - displayName: Component Detection (Exclude upstream cache) - is1ESPipeline: ${{ parameters.is1ESPipeline }} - ${{ if eq(length(parameters.componentGovernanceIgnoreDirectories), 0) }}: - componentGovernanceIgnoreDirectories: '$(System.DefaultWorkingDirectory)/artifacts/sb/src/artifacts/obj/source-built-upstream-cache' - ${{ else }}: - componentGovernanceIgnoreDirectories: ${{ join(',', parameters.componentGovernanceIgnoreDirectories) }} - disableComponentGovernance: ${{ eq(variables['System.TeamProject'], 'public') }} diff --git a/eng/common/core-templates/steps/source-index-stage1-publish.yml b/eng/common/core-templates/steps/source-index-stage1-publish.yml new file mode 100644 index 00000000000..e9a694afa58 --- /dev/null +++ b/eng/common/core-templates/steps/source-index-stage1-publish.yml @@ -0,0 +1,35 @@ +parameters: + sourceIndexUploadPackageVersion: 2.0.0-20250818.1 + sourceIndexProcessBinlogPackageVersion: 1.0.1-20250818.1 + sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json + binlogPath: artifacts/log/Debug/Build.binlog + +steps: +- task: UseDotNet@2 + displayName: "Source Index: Use .NET 9 SDK" + inputs: + packageType: sdk + version: 9.0.x + installationPath: $(Agent.TempDirectory)/dotnet + workingDirectory: $(Agent.TempDirectory) + +- script: | + $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version ${{parameters.sourceIndexProcessBinlogPackageVersion}} --add-source ${{parameters.SourceIndexPackageSource}} --tool-path $(Agent.TempDirectory)/.source-index/tools + $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version ${{parameters.sourceIndexUploadPackageVersion}} --add-source ${{parameters.SourceIndexPackageSource}} --tool-path $(Agent.TempDirectory)/.source-index/tools + displayName: "Source Index: Download netsourceindex Tools" + # Set working directory to temp directory so 'dotnet' doesn't try to use global.json and use the repo's sdk. + workingDirectory: $(Agent.TempDirectory) + +- script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i ${{parameters.BinlogPath}} -r $(System.DefaultWorkingDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output + displayName: "Source Index: Process Binlog into indexable sln" + +- ${{ if and(ne(parameters.runAsPublic, 'true'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: AzureCLI@2 + displayName: "Source Index: Upload Source Index stage1 artifacts to Azure" + inputs: + azureSubscription: 'SourceDotNet Stage1 Publish' + addSpnToEnvironment: true + scriptType: 'ps' + scriptLocation: 'inlineScript' + inlineScript: | + $(Agent.TempDirectory)/.source-index/tools/UploadIndexStage1 -i .source-index/stage1output -n $(Build.Repository.Name) -s netsourceindexstage1 -b stage1 diff --git a/eng/common/cross/arm64/tizen/tizen.patch b/eng/common/cross/arm64/tizen/tizen.patch index af7c8be0590..2cebc547382 100644 --- a/eng/common/cross/arm64/tizen/tizen.patch +++ b/eng/common/cross/arm64/tizen/tizen.patch @@ -5,5 +5,5 @@ diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf64-littleaarch64) --GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib/ld-linux-aarch64.so.1 ) ) +-GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-aarch64.so.1 ) ) +GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-aarch64.so.1 ) ) diff --git a/eng/common/cross/armel/armel.jessie.patch b/eng/common/cross/armel/armel.jessie.patch deleted file mode 100644 index 2d261561935..00000000000 --- a/eng/common/cross/armel/armel.jessie.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff -u -r a/usr/include/urcu/uatomic/generic.h b/usr/include/urcu/uatomic/generic.h ---- a/usr/include/urcu/uatomic/generic.h 2014-10-22 15:00:58.000000000 -0700 -+++ b/usr/include/urcu/uatomic/generic.h 2020-10-30 21:38:28.550000000 -0700 -@@ -69,10 +69,10 @@ - #endif - #ifdef UATOMIC_HAS_ATOMIC_SHORT - case 2: -- return __sync_val_compare_and_swap_2(addr, old, _new); -+ return __sync_val_compare_and_swap_2((uint16_t*) addr, old, _new); - #endif - case 4: -- return __sync_val_compare_and_swap_4(addr, old, _new); -+ return __sync_val_compare_and_swap_4((uint32_t*) addr, old, _new); - #if (CAA_BITS_PER_LONG == 64) - case 8: - return __sync_val_compare_and_swap_8(addr, old, _new); -@@ -109,7 +109,7 @@ - return; - #endif - case 4: -- __sync_and_and_fetch_4(addr, val); -+ __sync_and_and_fetch_4((uint32_t*) addr, val); - return; - #if (CAA_BITS_PER_LONG == 64) - case 8: -@@ -148,7 +148,7 @@ - return; - #endif - case 4: -- __sync_or_and_fetch_4(addr, val); -+ __sync_or_and_fetch_4((uint32_t*) addr, val); - return; - #if (CAA_BITS_PER_LONG == 64) - case 8: -@@ -187,7 +187,7 @@ - return __sync_add_and_fetch_2(addr, val); - #endif - case 4: -- return __sync_add_and_fetch_4(addr, val); -+ return __sync_add_and_fetch_4((uint32_t*) addr, val); - #if (CAA_BITS_PER_LONG == 64) - case 8: - return __sync_add_and_fetch_8(addr, val); diff --git a/eng/common/cross/build-android-rootfs.sh b/eng/common/cross/build-android-rootfs.sh index 7e9ba2b75ed..fbd8d80848a 100755 --- a/eng/common/cross/build-android-rootfs.sh +++ b/eng/common/cross/build-android-rootfs.sh @@ -6,10 +6,11 @@ usage() { echo "Creates a toolchain and sysroot used for cross-compiling for Android." echo - echo "Usage: $0 [BuildArch] [ApiLevel]" + echo "Usage: $0 [BuildArch] [ApiLevel] [--ndk NDKVersion]" echo echo "BuildArch is the target architecture of Android. Currently only arm64 is supported." echo "ApiLevel is the target Android API level. API levels usually match to Android releases. See https://source.android.com/source/build-numbers.html" + echo "NDKVersion is the version of Android NDK. The default is r21. See https://developer.android.com/ndk/downloads/revision_history" echo echo "By default, the toolchain and sysroot will be generated in cross/android-rootfs/toolchain/[BuildArch]. You can change this behavior" echo "by setting the TOOLCHAIN_DIR environment variable" @@ -25,10 +26,15 @@ __BuildArch=arm64 __AndroidArch=aarch64 __AndroidToolchain=aarch64-linux-android -for i in "$@" - do - lowerI="$(echo $i | tr "[:upper:]" "[:lower:]")" - case $lowerI in +while :; do + if [[ "$#" -le 0 ]]; then + break + fi + + i=$1 + + lowerI="$(echo $i | tr "[:upper:]" "[:lower:]")" + case $lowerI in -?|-h|--help) usage exit 1 @@ -43,6 +49,10 @@ for i in "$@" __AndroidArch=arm __AndroidToolchain=arm-linux-androideabi ;; + --ndk) + shift + __NDK_Version=$1 + ;; *[0-9]) __ApiLevel=$i ;; @@ -50,8 +60,17 @@ for i in "$@" __UnprocessedBuildArgs="$__UnprocessedBuildArgs $i" ;; esac + shift done +if [[ "$__NDK_Version" == "r21" ]] || [[ "$__NDK_Version" == "r22" ]]; then + __NDK_File_Arch_Spec=-x86_64 + __SysRoot=sysroot +else + __NDK_File_Arch_Spec= + __SysRoot=toolchains/llvm/prebuilt/linux-x86_64/sysroot +fi + # Obtain the location of the bash script to figure out where the root of the repo is. __ScriptBaseDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" @@ -78,6 +97,7 @@ fi echo "Target API level: $__ApiLevel" echo "Target architecture: $__BuildArch" +echo "NDK version: $__NDK_Version" echo "NDK location: $__NDK_Dir" echo "Target Toolchain location: $__ToolchainDir" @@ -85,8 +105,8 @@ echo "Target Toolchain location: $__ToolchainDir" if [ ! -d $__NDK_Dir ]; then echo Downloading the NDK into $__NDK_Dir mkdir -p $__NDK_Dir - wget -q --progress=bar:force:noscroll --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux-x86_64.zip -O $__CrossDir/android-ndk-$__NDK_Version-linux-x86_64.zip - unzip -q $__CrossDir/android-ndk-$__NDK_Version-linux-x86_64.zip -d $__CrossDir + wget -q --progress=bar:force:noscroll --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux$__NDK_File_Arch_Spec.zip -O $__CrossDir/android-ndk-$__NDK_Version-linux.zip + unzip -q $__CrossDir/android-ndk-$__NDK_Version-linux.zip -d $__CrossDir fi if [ ! -d $__lldb_Dir ]; then @@ -116,16 +136,11 @@ for path in $(wget -qO- https://packages.termux.dev/termux-main-21/dists/stable/ fi done -cp -R "$__TmpDir/data/data/com.termux/files/usr/"* "$__ToolchainDir/sysroot/usr/" +cp -R "$__TmpDir/data/data/com.termux/files/usr/"* "$__ToolchainDir/$__SysRoot/usr/" # Generate platform file for build.sh script to assign to __DistroRid echo "Generating platform file..." -echo "RID=android.${__ApiLevel}-${__BuildArch}" > $__ToolchainDir/sysroot/android_platform - -echo "Now to build coreclr, libraries and installers; run:" -echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ - --subsetCategory coreclr -echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ - --subsetCategory libraries -echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ - --subsetCategory installer +echo "RID=android.${__ApiLevel}-${__BuildArch}" > $__ToolchainDir/$__SysRoot/android_platform + +echo "Now to build coreclr, libraries and host; run:" +echo ROOTFS_DIR=$(realpath $__ToolchainDir/$__SysRoot) ./build.sh clr+libs+host --cross --arch $__BuildArch diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index 4b5e8d7166b..8abfb71f727 100755 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -5,7 +5,7 @@ set -e usage() { echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [llvmx[.y]] [--skipunmount] --rootfsdir ]" - echo "BuildArch can be: arm(default), arm64, armel, armv6, ppc64le, riscv64, s390x, x64, x86" + echo "BuildArch can be: arm(default), arm64, armel, armv6, loongarch64, ppc64le, riscv64, s390x, x64, x86" echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine" echo " for alpine can be specified with version: alpineX.YY or alpineedge" echo " for FreeBSD can be: freebsd13, freebsd14" @@ -15,6 +15,7 @@ usage() echo "llvmx[.y] - optional, LLVM version for LLVM related packages." echo "--skipunmount - optional, will skip the unmount of rootfs folder." echo "--skipsigcheck - optional, will skip package signature checks (allowing untrusted packages)." + echo "--skipemulation - optional, will skip qemu and debootstrap requirement when building environment for debian based systems." echo "--use-mirror - optional, use mirror URL to fetch resources, when available." echo "--jobs N - optional, restrict to N jobs." exit 1 @@ -52,28 +53,27 @@ __UbuntuPackages+=" symlinks" __UbuntuPackages+=" libicu-dev" __UbuntuPackages+=" liblttng-ust-dev" __UbuntuPackages+=" libunwind8-dev" -__UbuntuPackages+=" libnuma-dev" __AlpinePackages+=" gettext-dev" __AlpinePackages+=" icu-dev" __AlpinePackages+=" libunwind-dev" __AlpinePackages+=" lttng-ust-dev" __AlpinePackages+=" compiler-rt" -__AlpinePackages+=" numactl-dev" # runtime libraries' dependencies __UbuntuPackages+=" libcurl4-openssl-dev" __UbuntuPackages+=" libkrb5-dev" __UbuntuPackages+=" libssl-dev" __UbuntuPackages+=" zlib1g-dev" +__UbuntuPackages+=" libbrotli-dev" __AlpinePackages+=" curl-dev" __AlpinePackages+=" krb5-dev" __AlpinePackages+=" openssl-dev" __AlpinePackages+=" zlib-dev" -__FreeBSDBase="13.3-RELEASE" -__FreeBSDPkg="1.17.0" +__FreeBSDBase="13.4-RELEASE" +__FreeBSDPkg="1.21.3" __FreeBSDABI="13" __FreeBSDPackages="libunwind" __FreeBSDPackages+=" icu" @@ -91,18 +91,18 @@ __HaikuPackages="gcc_syslibs" __HaikuPackages+=" gcc_syslibs_devel" __HaikuPackages+=" gmp" __HaikuPackages+=" gmp_devel" -__HaikuPackages+=" icu66" -__HaikuPackages+=" icu66_devel" +__HaikuPackages+=" icu[0-9]+" +__HaikuPackages+=" icu[0-9]*_devel" __HaikuPackages+=" krb5" __HaikuPackages+=" krb5_devel" __HaikuPackages+=" libiconv" __HaikuPackages+=" libiconv_devel" -__HaikuPackages+=" llvm12_libunwind" -__HaikuPackages+=" llvm12_libunwind_devel" +__HaikuPackages+=" llvm[0-9]*_libunwind" +__HaikuPackages+=" llvm[0-9]*_libunwind_devel" __HaikuPackages+=" mpfr" __HaikuPackages+=" mpfr_devel" -__HaikuPackages+=" openssl" -__HaikuPackages+=" openssl_devel" +__HaikuPackages+=" openssl3" +__HaikuPackages+=" openssl3_devel" __HaikuPackages+=" zlib" __HaikuPackages+=" zlib_devel" @@ -128,10 +128,12 @@ __AlpineKeys=' 616adfeb:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq0BFD1D4lIxQcsqEpQzU\npNCYM3aP1V/fxxVdT4DWvSI53JHTwHQamKdMWtEXetWVbP5zSROniYKFXd/xrD9X\n0jiGHey3lEtylXRIPxe5s+wXoCmNLcJVnvTcDtwx/ne2NLHxp76lyc25At+6RgE6\nADjLVuoD7M4IFDkAsd8UQ8zM0Dww9SylIk/wgV3ZkifecvgUQRagrNUdUjR56EBZ\nraQrev4hhzOgwelT0kXCu3snbUuNY/lU53CoTzfBJ5UfEJ5pMw1ij6X0r5S9IVsy\nKLWH1hiO0NzU2c8ViUYCly4Fe9xMTFc6u2dy/dxf6FwERfGzETQxqZvSfrRX+GLj\n/QZAXiPg5178hT/m0Y3z5IGenIC/80Z9NCi+byF1WuJlzKjDcF/TU72zk0+PNM/H\nKuppf3JT4DyjiVzNC5YoWJT2QRMS9KLP5iKCSThwVceEEg5HfhQBRT9M6KIcFLSs\nmFjx9kNEEmc1E8hl5IR3+3Ry8G5/bTIIruz14jgeY9u5jhL8Vyyvo41jgt9sLHR1\n/J1TxKfkgksYev7PoX6/ZzJ1ksWKZY5NFoDXTNYUgzFUTOoEaOg3BAQKadb3Qbbq\nXIrxmPBdgrn9QI7NCgfnAY3Tb4EEjs3ON/BNyEhUENcXOH6I1NbcuBQ7g9P73kE4\nVORdoc8MdJ5eoKBpO8Ww8HECAwEAAQ== 616ae350:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyduVzi1mWm+lYo2Tqt/0\nXkCIWrDNP1QBMVPrE0/ZlU2bCGSoo2Z9FHQKz/mTyMRlhNqTfhJ5qU3U9XlyGOPJ\npiM+b91g26pnpXJ2Q2kOypSgOMOPA4cQ42PkHBEqhuzssfj9t7x47ppS94bboh46\nxLSDRff/NAbtwTpvhStV3URYkxFG++cKGGa5MPXBrxIp+iZf9GnuxVdST5PGiVGP\nODL/b69sPJQNbJHVquqUTOh5Ry8uuD2WZuXfKf7/C0jC/ie9m2+0CttNu9tMciGM\nEyKG1/Xhk5iIWO43m4SrrT2WkFlcZ1z2JSf9Pjm4C2+HovYpihwwdM/OdP8Xmsnr\nDzVB4YvQiW+IHBjStHVuyiZWc+JsgEPJzisNY0Wyc/kNyNtqVKpX6dRhMLanLmy+\nf53cCSI05KPQAcGj6tdL+D60uKDkt+FsDa0BTAobZ31OsFVid0vCXtsbplNhW1IF\nHwsGXBTVcfXg44RLyL8Lk/2dQxDHNHzAUslJXzPxaHBLmt++2COa2EI1iWlvtznk\nOk9WP8SOAIj+xdqoiHcC4j72BOVVgiITIJNHrbppZCq6qPR+fgXmXa+sDcGh30m6\n9Wpbr28kLMSHiENCWTdsFij+NQTd5S47H7XTROHnalYDuF1RpS+DpQidT5tUimaT\nJZDr++FjKrnnijbyNF8b98UCAwEAAQ== 616db30d:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnpUpyWDWjlUk3smlWeA0\nlIMW+oJ38t92CRLHH3IqRhyECBRW0d0aRGtq7TY8PmxjjvBZrxTNDpJT6KUk4LRm\na6A6IuAI7QnNK8SJqM0DLzlpygd7GJf8ZL9SoHSH+gFsYF67Cpooz/YDqWrlN7Vw\ntO00s0B+eXy+PCXYU7VSfuWFGK8TGEv6HfGMALLjhqMManyvfp8hz3ubN1rK3c8C\nUS/ilRh1qckdbtPvoDPhSbTDmfU1g/EfRSIEXBrIMLg9ka/XB9PvWRrekrppnQzP\nhP9YE3x/wbFc5QqQWiRCYyQl/rgIMOXvIxhkfe8H5n1Et4VAorkpEAXdsfN8KSVv\nLSMazVlLp9GYq5SUpqYX3KnxdWBgN7BJoZ4sltsTpHQ/34SXWfu3UmyUveWj7wp0\nx9hwsPirVI00EEea9AbP7NM2rAyu6ukcm4m6ATd2DZJIViq2es6m60AE6SMCmrQF\nwmk4H/kdQgeAELVfGOm2VyJ3z69fQuywz7xu27S6zTKi05Qlnohxol4wVb6OB7qG\nLPRtK9ObgzRo/OPumyXqlzAi/Yvyd1ZQk8labZps3e16bQp8+pVPiumWioMFJDWV\nGZjCmyMSU8V6MB6njbgLHoyg2LCukCAeSjbPGGGYhnKLm1AKSoJh3IpZuqcKCk5C\n8CM1S15HxV78s9dFntEqIokCAwEAAQ== +66ba20fe:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtfB12w4ZgqsXWZDfUAV/\n6Y4aHUKIu3q4SXrNZ7CXF9nXoAVYrS7NAxJdAodsY3vPCN0g5O8DFXR+390LdOuQ\n+HsGKCc1k5tX5ZXld37EZNTNSbR0k+NKhd9h6X3u6wqPOx7SIKxwAQR8qeeFq4pP\nrt9GAGlxtuYgzIIcKJPwE0dZlcBCg+GnptCUZXp/38BP1eYC+xTXSL6Muq1etYfg\nodXdb7Yl+2h1IHuOwo5rjgY5kpY7GcAs8AjGk3lDD/av60OTYccknH0NCVSmPoXK\nvrxDBOn0LQRNBLcAfnTKgHrzy0Q5h4TNkkyTgxkoQw5ObDk9nnabTxql732yy9BY\ns+hM9+dSFO1HKeVXreYSA2n1ndF18YAvAumzgyqzB7I4pMHXq1kC/8bONMJxwSkS\nYm6CoXKyavp7RqGMyeVpRC7tV+blkrrUml0BwNkxE+XnwDRB3xDV6hqgWe0XrifD\nYTfvd9ScZQP83ip0r4IKlq4GMv/R5shcCRJSkSZ6QSGshH40JYSoiwJf5FHbj9ND\n7do0UAqebWo4yNx63j/wb2ULorW3AClv0BCFSdPsIrCStiGdpgJDBR2P2NZOCob3\nG9uMj+wJD6JJg2nWqNJxkANXX37Qf8plgzssrhrgOvB0fjjS7GYhfkfmZTJ0wPOw\nA8+KzFseBh4UFGgue78KwgkCAwEAAQ== ' __Keyring= __KeyringFile="/usr/share/keyrings/ubuntu-archive-keyring.gpg" __SkipSigCheck=0 +__SkipEmulation=0 __UseMirror=0 __UnprocessedBuildArgs= @@ -162,9 +164,13 @@ while :; do armel) __BuildArch=armel __UbuntuArch=armel - __UbuntuRepo="http://ftp.debian.org/debian/" - __CodeName=jessie + __UbuntuRepo="http://archive.debian.org/debian/" + __CodeName=buster __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + __LLDB_Package="liblldb-6.0-dev" + __UbuntuPackages="${__UbuntuPackages// libomp-dev/}" + __UbuntuPackages="${__UbuntuPackages// libomp5/}" + __UbuntuSuites= ;; armv6) __BuildArch=armv6 @@ -180,6 +186,18 @@ while :; do __Keyring="--keyring $__KeyringFile" fi ;; + loongarch64) + __BuildArch=loongarch64 + __AlpineArch=loongarch64 + __QEMUArch=loongarch64 + __UbuntuArch=loong64 + __UbuntuSuites=unreleased + __LLDB_Package="liblldb-19-dev" + + if [[ "$__CodeName" == "sid" ]]; then + __UbuntuRepo="http://ftp.ports.debian.org/debian-ports/" + fi + ;; riscv64) __BuildArch=riscv64 __AlpineArch=riscv64 @@ -264,44 +282,21 @@ while :; do ;; xenial) # Ubuntu 16.04 - if [[ "$__CodeName" != "jessie" ]]; then - __CodeName=xenial - fi - ;; - zesty) # Ubuntu 17.04 - if [[ "$__CodeName" != "jessie" ]]; then - __CodeName=zesty - fi + __CodeName=xenial ;; bionic) # Ubuntu 18.04 - if [[ "$__CodeName" != "jessie" ]]; then - __CodeName=bionic - fi + __CodeName=bionic ;; focal) # Ubuntu 20.04 - if [[ "$__CodeName" != "jessie" ]]; then - __CodeName=focal - fi + __CodeName=focal ;; jammy) # Ubuntu 22.04 - if [[ "$__CodeName" != "jessie" ]]; then - __CodeName=jammy - fi + __CodeName=jammy ;; noble) # Ubuntu 24.04 - if [[ "$__CodeName" != "jessie" ]]; then - __CodeName=noble - fi - if [[ -n "$__LLDB_Package" ]]; then - __LLDB_Package="liblldb-18-dev" - fi - ;; - jessie) # Debian 8 - __CodeName=jessie - __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" - - if [[ -z "$__UbuntuRepo" ]]; then - __UbuntuRepo="http://ftp.debian.org/debian/" + __CodeName=noble + if [[ -z "$__LLDB_Package" ]]; then + __LLDB_Package="liblldb-19-dev" fi ;; stretch) # Debian 9 @@ -319,7 +314,7 @@ while :; do __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" if [[ -z "$__UbuntuRepo" ]]; then - __UbuntuRepo="http://ftp.debian.org/debian/" + __UbuntuRepo="http://archive.debian.org/debian/" fi ;; bullseye) # Debian 11 @@ -340,10 +335,28 @@ while :; do ;; sid) # Debian sid __CodeName=sid - __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + __UbuntuSuites= - if [[ -z "$__UbuntuRepo" ]]; then - __UbuntuRepo="http://ftp.debian.org/debian/" + # Debian-Ports architectures need different values + case "$__UbuntuArch" in + amd64|arm64|armel|armhf|i386|mips64el|ppc64el|riscv64|s390x) + __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + + if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ftp.debian.org/debian/" + fi + ;; + *) + __KeyringFile="/usr/share/keyrings/debian-ports-archive-keyring.gpg" + + if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ftp.ports.debian.org/debian-ports/" + fi + ;; + esac + + if [[ -e "$__KeyringFile" ]]; then + __Keyring="--keyring $__KeyringFile" fi ;; tizen) @@ -370,7 +383,7 @@ while :; do ;; freebsd14) __CodeName=freebsd - __FreeBSDBase="14.0-RELEASE" + __FreeBSDBase="14.2-RELEASE" __FreeBSDABI="14" __SkipUnmount=1 ;; @@ -388,6 +401,9 @@ while :; do --skipsigcheck) __SkipSigCheck=1 ;; + --skipemulation) + __SkipEmulation=1 + ;; --rootfsdir|-rootfsdir) shift __RootfsDir="$1" @@ -420,16 +436,15 @@ case "$__AlpineVersion" in elif [[ "$__AlpineArch" == "x86" ]]; then __AlpineVersion=3.17 # minimum version that supports lldb-dev __AlpinePackages+=" llvm15-libs" - elif [[ "$__AlpineArch" == "riscv64" ]]; then + elif [[ "$__AlpineArch" == "riscv64" || "$__AlpineArch" == "loongarch64" ]]; then + __AlpineVersion=3.21 # minimum version that supports lldb-dev + __AlpinePackages+=" llvm19-libs" + elif [[ -n "$__AlpineMajorVersion" ]]; then + # use whichever alpine version is provided and select the latest toolchain libs __AlpineLlvmLibsLookup=1 - __AlpineVersion=edge # minimum version with APKINDEX.tar.gz (packages archive) else __AlpineVersion=3.13 # 3.13 to maximize compatibility __AlpinePackages+=" llvm10-libs" - - if [[ "$__AlpineArch" == "armv7" ]]; then - __AlpinePackages="${__AlpinePackages//numactl-dev/}" - fi fi esac @@ -439,15 +454,6 @@ if [[ "$__AlpineVersion" =~ 3\.1[345] ]]; then __AlpinePackages="${__AlpinePackages/compiler-rt/compiler-rt-static}" fi -if [[ "$__BuildArch" == "armel" ]]; then - __LLDB_Package="lldb-3.5-dev" -fi - -if [[ "$__CodeName" == "xenial" && "$__UbuntuArch" == "armhf" ]]; then - # libnuma-dev is not available on armhf for xenial - __UbuntuPackages="${__UbuntuPackages//libnuma-dev/}" -fi - __UbuntuPackages+=" ${__LLDB_Package:-}" if [[ -z "$__UbuntuRepo" ]]; then @@ -496,7 +502,7 @@ if [[ "$__CodeName" == "alpine" ]]; then arch="$(uname -m)" ensureDownloadTool - + if [[ "$__hasWget" == 1 ]]; then wget -P "$__ApkToolsDir" "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v$__ApkToolsVersion/$arch/apk.static" else @@ -512,11 +518,6 @@ if [[ "$__CodeName" == "alpine" ]]; then echo "$__ApkToolsSHA512SUM $__ApkToolsDir/apk.static" | sha512sum -c chmod +x "$__ApkToolsDir/apk.static" - if [[ -f "/usr/bin/qemu-$__QEMUArch-static" ]]; then - mkdir -p "$__RootfsDir"/usr/bin - cp -v "/usr/bin/qemu-$__QEMUArch-static" "$__RootfsDir/usr/bin" - fi - if [[ "$__AlpineVersion" == "edge" ]]; then version=edge else @@ -536,6 +537,10 @@ if [[ "$__CodeName" == "alpine" ]]; then __ApkSignatureArg="--keys-dir $__ApkKeysDir" fi + if [[ "$__SkipEmulation" == "1" ]]; then + __NoEmulationArg="--no-scripts" + fi + # initialize DB # shellcheck disable=SC2086 "$__ApkToolsDir/apk.static" \ @@ -557,7 +562,7 @@ if [[ "$__CodeName" == "alpine" ]]; then "$__ApkToolsDir/apk.static" \ -X "http://dl-cdn.alpinelinux.org/alpine/$version/main" \ -X "http://dl-cdn.alpinelinux.org/alpine/$version/community" \ - -U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" \ + -U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" $__NoEmulationArg \ add $__AlpinePackages rm -r "$__ApkToolsDir" @@ -573,7 +578,7 @@ elif [[ "$__CodeName" == "freebsd" ]]; then curl -SL "https://download.freebsd.org/ftp/releases/${__FreeBSDArch}/${__FreeBSDMachineArch}/${__FreeBSDBase}/base.txz" | tar -C "$__RootfsDir" -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version fi echo "ABI = \"FreeBSD:${__FreeBSDABI}:${__FreeBSDMachineArch}\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > "${__RootfsDir}"/usr/local/etc/pkg.conf - echo "FreeBSD: { url: \"pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly\", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"${__RootfsDir}/usr/share/keys/pkg\", enabled: yes }" > "${__RootfsDir}"/etc/pkg/FreeBSD.conf + echo "FreeBSD: { url: \"pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly\", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"/usr/share/keys/pkg\", enabled: yes }" > "${__RootfsDir}"/etc/pkg/FreeBSD.conf mkdir -p "$__RootfsDir"/tmp # get and build package manager if [[ "$__hasWget" == 1 ]]; then @@ -681,7 +686,7 @@ elif [[ "$__CodeName" == "haiku" ]]; then ensureDownloadTool - echo "Downloading Haiku package tool" + echo "Downloading Haiku package tools" git clone https://github.com/haiku/haiku-toolchains-ubuntu --depth 1 "$__RootfsDir/tmp/script" if [[ "$__hasWget" == 1 ]]; then wget -O "$__RootfsDir/tmp/download/hosttools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --hosttools)" @@ -691,34 +696,42 @@ elif [[ "$__CodeName" == "haiku" ]]; then unzip -o "$__RootfsDir/tmp/download/hosttools.zip" -d "$__RootfsDir/tmp/bin" - DepotBaseUrl="https://depot.haiku-os.org/__api/v2/pkg/get-pkg" - HpkgBaseUrl="https://eu.hpkg.haiku-os.org/haiku/master/$__HaikuArch/current" + HaikuBaseUrl="https://eu.hpkg.haiku-os.org/haiku/master/$__HaikuArch/current" + HaikuPortsBaseUrl="https://eu.hpkg.haiku-os.org/haikuports/master/$__HaikuArch/current" + + echo "Downloading HaikuPorts package repository index..." + if [[ "$__hasWget" == 1 ]]; then + wget -P "$__RootfsDir/tmp/download" "$HaikuPortsBaseUrl/repo" + else + curl -SLO --create-dirs --output-dir "$__RootfsDir/tmp/download" "$HaikuPortsBaseUrl/repo" + fi - # Download Haiku packages echo "Downloading Haiku packages" read -ra array <<<"$__HaikuPackages" for package in "${array[@]}"; do echo "Downloading $package..." - # API documented here: https://github.com/haiku/haikudepotserver/blob/master/haikudepotserver-api2/src/main/resources/api2/pkg.yaml#L60 - # The schema here: https://github.com/haiku/haikudepotserver/blob/master/haikudepotserver-api2/src/main/resources/api2/pkg.yaml#L598 + hpkgFilename="$(LD_LIBRARY_PATH="$__RootfsDir/tmp/bin" "$__RootfsDir/tmp/bin/package_repo" list -f "$__RootfsDir/tmp/download/repo" | + grep -E "${package}-" | sort -V | tail -n 1 | xargs)" + if [ -z "$hpkgFilename" ]; then + >&2 echo "ERROR: package $package missing." + exit 1 + fi + echo "Resolved filename: $hpkgFilename..." + hpkgDownloadUrl="$HaikuPortsBaseUrl/packages/$hpkgFilename" if [[ "$__hasWget" == 1 ]]; then - hpkgDownloadUrl="$(wget -qO- --post-data '{"name":"'"$package"'","repositorySourceCode":"haikuports_'$__HaikuArch'","versionType":"LATEST","naturalLanguageCode":"en"}' \ - --header 'Content-Type:application/json' "$DepotBaseUrl" | jq -r '.result.versions[].hpkgDownloadURL')" wget -P "$__RootfsDir/tmp/download" "$hpkgDownloadUrl" else - hpkgDownloadUrl="$(curl -sSL -XPOST --data '{"name":"'"$package"'","repositorySourceCode":"haikuports_'$__HaikuArch'","versionType":"LATEST","naturalLanguageCode":"en"}' \ - --header 'Content-Type:application/json' "$DepotBaseUrl" | jq -r '.result.versions[].hpkgDownloadURL')" curl -SLO --create-dirs --output-dir "$__RootfsDir/tmp/download" "$hpkgDownloadUrl" fi done for package in haiku haiku_devel; do echo "Downloading $package..." if [[ "$__hasWget" == 1 ]]; then - hpkgVersion="$(wget -qO- "$HpkgBaseUrl" | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')" - wget -P "$__RootfsDir/tmp/download" "$HpkgBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg" + hpkgVersion="$(wget -qO- "$HaikuBaseUrl" | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')" + wget -P "$__RootfsDir/tmp/download" "$HaikuBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg" else - hpkgVersion="$(curl -sSL "$HpkgBaseUrl" | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')" - curl -SLO --create-dirs --output-dir "$__RootfsDir/tmp/download" "$HpkgBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg" + hpkgVersion="$(curl -sSL "$HaikuBaseUrl" | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')" + curl -SLO --create-dirs --output-dir "$__RootfsDir/tmp/download" "$HaikuBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg" fi done @@ -744,25 +757,67 @@ elif [[ "$__CodeName" == "haiku" ]]; then popd rm -rf "$__RootfsDir/tmp" elif [[ -n "$__CodeName" ]]; then + __Suites="$__CodeName $(for suite in $__UbuntuSuites; do echo -n "$__CodeName-$suite "; done)" + + if [[ "$__SkipEmulation" == "1" ]]; then + if [[ -z "$AR" ]]; then + if command -v ar &>/dev/null; then + AR="$(command -v ar)" + elif command -v llvm-ar &>/dev/null; then + AR="$(command -v llvm-ar)" + else + echo "Unable to find ar or llvm-ar on PATH, add them to PATH or set AR environment variable pointing to the available AR tool" + exit 1 + fi + fi + + PYTHON=${PYTHON_EXECUTABLE:-python3} + + # shellcheck disable=SC2086,SC2046 + echo running "$PYTHON" "$__CrossDir/install-debs.py" --arch "$__UbuntuArch" --mirror "$__UbuntuRepo" --rootfsdir "$__RootfsDir" --artool "$AR" \ + $(for suite in $__Suites; do echo -n "--suite $suite "; done) \ + $__UbuntuPackages + + # shellcheck disable=SC2086,SC2046 + "$PYTHON" "$__CrossDir/install-debs.py" --arch "$__UbuntuArch" --mirror "$__UbuntuRepo" --rootfsdir "$__RootfsDir" --artool "$AR" \ + $(for suite in $__Suites; do echo -n "--suite $suite "; done) \ + $__UbuntuPackages + exit 0 + fi + + __UpdateOptions= if [[ "$__SkipSigCheck" == "0" ]]; then __Keyring="$__Keyring --force-check-gpg" + else + __Keyring= + __UpdateOptions="--allow-unauthenticated --allow-insecure-repositories" fi # shellcheck disable=SC2086 echo running debootstrap "--variant=minbase" $__Keyring --arch "$__UbuntuArch" "$__CodeName" "$__RootfsDir" "$__UbuntuRepo" - debootstrap "--variant=minbase" $__Keyring --arch "$__UbuntuArch" "$__CodeName" "$__RootfsDir" "$__UbuntuRepo" + # shellcheck disable=SC2086 + if ! debootstrap "--variant=minbase" $__Keyring --arch "$__UbuntuArch" "$__CodeName" "$__RootfsDir" "$__UbuntuRepo"; then + echo "debootstrap failed! dumping debootstrap.log" + cat "$__RootfsDir/debootstrap/debootstrap.log" + exit 1 + fi + + rm -rf "$__RootfsDir"/etc/apt/*.{sources,list} "$__RootfsDir"/etc/apt/sources.list.d mkdir -p "$__RootfsDir/etc/apt/sources.list.d/" + + # shellcheck disable=SC2086 cat > "$__RootfsDir/etc/apt/sources.list.d/$__CodeName.sources" < token2) - (token1 < token2) + else: + return -1 if isinstance(token1, str) else 1 + + return len(tokens1) - len(tokens2) + +def compare_debian_versions(version1, version2): + """Compare two Debian package versions.""" + epoch1, upstream1, revision1 = parse_debian_version(version1) + epoch2, upstream2, revision2 = parse_debian_version(version2) + + if epoch1 != epoch2: + return epoch1 - epoch2 + + result = compare_upstream_version(upstream1, upstream2) + if result != 0: + return result + + return compare_upstream_version(revision1, revision2) + +def resolve_dependencies(packages, aliases, desired_packages): + """Recursively resolves dependencies for the desired packages.""" + resolved = [] + to_process = deque(desired_packages) + + while to_process: + current = to_process.popleft() + resolved_package = current if current in packages else aliases.get(current, [None])[0] + + if not resolved_package: + print(f"Error: Package '{current}' was not found in the available packages.") + sys.exit(1) + + if resolved_package not in resolved: + resolved.append(resolved_package) + + deps = packages.get(resolved_package, {}).get("Depends", "") + if deps: + deps = [dep.split(' ')[0] for dep in deps.split(', ') if dep] + for dep in deps: + if dep not in resolved and dep not in to_process and dep in packages: + to_process.append(dep) + + return resolved + +def parse_package_index(content): + """Parses the Packages.gz file and returns package information.""" + packages = {} + aliases = {} + entries = re.split(r'\n\n+', content) + + for entry in entries: + fields = dict(re.findall(r'^(\S+): (.+)$', entry, re.MULTILINE)) + if "Package" in fields: + package_name = fields["Package"] + version = fields.get("Version") + filename = fields.get("Filename") + depends = fields.get("Depends") + provides = fields.get("Provides", None) + + # Only update if package_name is not in packages or if the new version is higher + if package_name not in packages or compare_debian_versions(version, packages[package_name]["Version"]) > 0: + packages[package_name] = { + "Version": version, + "Filename": filename, + "Depends": depends + } + + # Update aliases if package provides any alternatives + if provides: + provides_list = [x.strip() for x in provides.split(",")] + for alias in provides_list: + # Strip version specifiers + alias_name = re.sub(r'\s*\(=.*\)', '', alias) + if alias_name not in aliases: + aliases[alias_name] = [] + if package_name not in aliases[alias_name]: + aliases[alias_name].append(package_name) + + return packages, aliases + +def install_packages(mirror, packages_info, aliases, tmp_dir, extract_dir, ar_tool, desired_packages): + """Downloads .deb files and extracts them.""" + resolved_packages = resolve_dependencies(packages_info, aliases, desired_packages) + print(f"Resolved packages (including dependencies): {resolved_packages}") + + packages_to_download = {} + + for pkg in resolved_packages: + if pkg in packages_info: + packages_to_download[pkg] = packages_info[pkg] + + if pkg in aliases: + for alias in aliases[pkg]: + if alias in packages_info: + packages_to_download[alias] = packages_info[alias] + + asyncio.run(download_deb_files_parallel(mirror, packages_to_download, tmp_dir)) + + package_to_deb_file_map = {} + for pkg in resolved_packages: + pkg_info = packages_info.get(pkg) + if pkg_info: + deb_filename = pkg_info.get("Filename") + if deb_filename: + deb_file_path = os.path.join(tmp_dir, os.path.basename(deb_filename)) + package_to_deb_file_map[pkg] = deb_file_path + + for pkg in reversed(resolved_packages): + deb_file = package_to_deb_file_map.get(pkg) + if deb_file and os.path.exists(deb_file): + extract_deb_file(deb_file, tmp_dir, extract_dir, ar_tool) + + print("All done!") + +def extract_deb_file(deb_file, tmp_dir, extract_dir, ar_tool): + """Extract .deb file contents""" + + os.makedirs(extract_dir, exist_ok=True) + + with tempfile.TemporaryDirectory(dir=tmp_dir) as tmp_subdir: + result = subprocess.run(f"{ar_tool} t {os.path.abspath(deb_file)}", cwd=tmp_subdir, check=True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + tar_filename = None + for line in result.stdout.decode().splitlines(): + if line.startswith("data.tar"): + tar_filename = line.strip() + break + + if not tar_filename: + raise FileNotFoundError(f"Could not find 'data.tar.*' in {deb_file}.") + + tar_file_path = os.path.join(tmp_subdir, tar_filename) + print(f"Extracting {tar_filename} from {deb_file}..") + + subprocess.run(f"{ar_tool} p {os.path.abspath(deb_file)} {tar_filename} > {tar_file_path}", check=True, shell=True) + + file_extension = os.path.splitext(tar_file_path)[1].lower() + + if file_extension == ".xz": + mode = "r:xz" + elif file_extension == ".gz": + mode = "r:gz" + elif file_extension == ".zst": + # zstd is not supported by standard library yet + decompressed_tar_path = tar_file_path.replace(".zst", "") + with open(tar_file_path, "rb") as zst_file, open(decompressed_tar_path, "wb") as decompressed_file: + dctx = zstandard.ZstdDecompressor() + dctx.copy_stream(zst_file, decompressed_file) + + tar_file_path = decompressed_tar_path + mode = "r" + else: + raise ValueError(f"Unsupported compression format: {file_extension}") + + with tarfile.open(tar_file_path, mode) as tar: + tar.extractall(path=extract_dir, filter='fully_trusted') + +def finalize_setup(rootfsdir): + lib_dir = os.path.join(rootfsdir, 'lib') + usr_lib_dir = os.path.join(rootfsdir, 'usr', 'lib') + + if os.path.exists(lib_dir): + if os.path.islink(lib_dir): + os.remove(lib_dir) + else: + os.makedirs(usr_lib_dir, exist_ok=True) + + for item in os.listdir(lib_dir): + src = os.path.join(lib_dir, item) + dest = os.path.join(usr_lib_dir, item) + + if os.path.isdir(src): + shutil.copytree(src, dest, dirs_exist_ok=True) + else: + shutil.copy2(src, dest) + + shutil.rmtree(lib_dir) + + os.symlink(usr_lib_dir, lib_dir) + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Generate rootfs for .NET runtime on Debian-like OS") + parser.add_argument("--distro", required=False, help="Distro name (e.g., debian, ubuntu, etc.)") + parser.add_argument("--arch", required=True, help="Architecture (e.g., amd64, loong64, etc.)") + parser.add_argument("--rootfsdir", required=True, help="Destination directory.") + parser.add_argument('--suite', required=True, action='append', help='Specify one or more repository suites to collect index data.') + parser.add_argument("--mirror", required=False, help="Mirror (e.g., http://ftp.debian.org/debian-ports etc.)") + parser.add_argument("--artool", required=False, default="ar", help="ar tool to extract debs (e.g., ar, llvm-ar etc.)") + parser.add_argument("packages", nargs="+", help="List of package names to be installed.") + + args = parser.parse_args() + + if args.mirror is None: + if args.distro == "ubuntu": + args.mirror = "http://archive.ubuntu.com/ubuntu" if args.arch in ["amd64", "i386"] else "http://ports.ubuntu.com/ubuntu-ports" + elif args.distro == "debian": + args.mirror = "http://ftp.debian.org/debian-ports" + else: + raise Exception("Unsupported distro") + + DESIRED_PACKAGES = args.packages + [ # base packages + "dpkg", + "busybox", + "libc-bin", + "base-files", + "base-passwd", + "debianutils" + ] + + print(f"Creating rootfs. rootfsdir: {args.rootfsdir}, distro: {args.distro}, arch: {args.arch}, suites: {args.suite}, mirror: {args.mirror}") + + package_index_content = asyncio.run(download_package_index_parallel(args.mirror, args.arch, args.suite)) + + packages_info, aliases = parse_package_index(package_index_content) + + with tempfile.TemporaryDirectory() as tmp_dir: + install_packages(args.mirror, packages_info, aliases, tmp_dir, args.rootfsdir, args.artool, DESIRED_PACKAGES) + + finalize_setup(args.rootfsdir) diff --git a/eng/common/cross/tizen-fetch.sh b/eng/common/cross/tizen-fetch.sh index 28936ceef3a..37c3a61f1de 100644 --- a/eng/common/cross/tizen-fetch.sh +++ b/eng/common/cross/tizen-fetch.sh @@ -156,13 +156,8 @@ fetch_tizen_pkgs() done } -if [ "$TIZEN_ARCH" == "riscv64" ]; then - BASE="Tizen-Base-RISCV" - UNIFIED="Tizen-Unified-RISCV" -else - BASE="Tizen-Base" - UNIFIED="Tizen-Unified" -fi +BASE="Tizen-Base" +UNIFIED="Tizen-Unified" Inform "Initialize ${TIZEN_ARCH} base" fetch_tizen_pkgs_init standard $BASE diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index 9a7ecfbd42c..0ff85cf0367 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -67,6 +67,13 @@ elseif(TARGET_ARCH_NAME STREQUAL "armv6") else() set(TOOLCHAIN "arm-linux-gnueabihf") endif() +elseif(TARGET_ARCH_NAME STREQUAL "loongarch64") + set(CMAKE_SYSTEM_PROCESSOR "loongarch64") + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/loongarch64-alpine-linux-musl) + set(TOOLCHAIN "loongarch64-alpine-linux-musl") + else() + set(TOOLCHAIN "loongarch64-linux-gnu") + endif() elseif(TARGET_ARCH_NAME STREQUAL "ppc64le") set(CMAKE_SYSTEM_PROCESSOR ppc64le) if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/powerpc64le-alpine-linux-musl) @@ -118,7 +125,7 @@ elseif(TARGET_ARCH_NAME STREQUAL "x86") set(TIZEN_TOOLCHAIN "i586-tizen-linux-gnu") endif() else() - message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only arm, arm64, armel, armv6, ppc64le, riscv64, s390x, x64 and x86 are supported!") + message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only arm, arm64, armel, armv6, loongarch64, ppc64le, riscv64, s390x, x64 and x86 are supported!") endif() if(DEFINED ENV{TOOLCHAIN}) @@ -148,6 +155,25 @@ if(TIZEN) include_directories(SYSTEM ${TIZEN_TOOLCHAIN_PATH}/include/c++/${TIZEN_TOOLCHAIN}) endif() +function(locate_toolchain_exec exec var) + set(TOOLSET_PREFIX ${TOOLCHAIN}-) + string(TOUPPER ${exec} EXEC_UPPERCASE) + if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "") + set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE) + return() + endif() + + find_program(EXEC_LOCATION_${exec} + NAMES + "${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}" + "${TOOLSET_PREFIX}${exec}") + + if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND") + message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.") + endif() + set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE) +endfunction() + if(ANDROID) if(TARGET_ARCH_NAME STREQUAL "arm") set(ANDROID_ABI armeabi-v7a) @@ -178,66 +204,24 @@ elseif(FREEBSD) set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=lld") elseif(ILLUMOS) set(CMAKE_SYSROOT "${CROSS_ROOTFS}") + set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}") + set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp") + set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp") include_directories(SYSTEM ${CROSS_ROOTFS}/include) - set(TOOLSET_PREFIX ${TOOLCHAIN}-) - function(locate_toolchain_exec exec var) - string(TOUPPER ${exec} EXEC_UPPERCASE) - if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "") - set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE) - return() - endif() - - find_program(EXEC_LOCATION_${exec} - NAMES - "${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}" - "${TOOLSET_PREFIX}${exec}") - - if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND") - message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.") - endif() - set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE) - endfunction() - - set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}") - locate_toolchain_exec(gcc CMAKE_C_COMPILER) locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) - - set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp") - set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp") elseif(HAIKU) set(CMAKE_SYSROOT "${CROSS_ROOTFS}") set(CMAKE_PROGRAM_PATH "${CMAKE_PROGRAM_PATH};${CROSS_ROOTFS}/cross-tools-x86_64/bin") - - set(TOOLSET_PREFIX ${TOOLCHAIN}-) - function(locate_toolchain_exec exec var) - string(TOUPPER ${exec} EXEC_UPPERCASE) - if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "") - set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE) - return() - endif() - - find_program(EXEC_LOCATION_${exec} - NAMES - "${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}" - "${TOOLSET_PREFIX}${exec}") - - if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND") - message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.") - endif() - set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE) - endfunction() - set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}") + set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp") + set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp") locate_toolchain_exec(gcc CMAKE_C_COMPILER) locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) - set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp") - set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp") - # let CMake set up the correct search paths include(Platform/Haiku) else() @@ -307,7 +291,7 @@ endif() # Specify compile options -if((TARGET_ARCH_NAME MATCHES "^(arm|arm64|armel|armv6|ppc64le|riscv64|s390x|x64|x86)$" AND NOT ANDROID AND NOT FREEBSD) OR ILLUMOS OR HAIKU) +if((TARGET_ARCH_NAME MATCHES "^(arm|arm64|armel|armv6|loongarch64|ppc64le|riscv64|s390x|x64|x86)$" AND NOT ANDROID AND NOT FREEBSD) OR ILLUMOS OR HAIKU) set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN}) set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN}) set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN}) diff --git a/eng/common/cross/x64/tizen/tizen.patch b/eng/common/cross/x64/tizen/tizen.patch new file mode 100644 index 00000000000..56fbc881095 --- /dev/null +++ b/eng/common/cross/x64/tizen/tizen.patch @@ -0,0 +1,9 @@ +diff -u -r a/usr/lib64/libc.so b/usr/lib64/libc.so +--- a/usr/lib64/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib64/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf64-x86-64) +-GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-x86-64.so.2 ) ) diff --git a/eng/common/darc-init.sh b/eng/common/darc-init.sh index 36dbd45e1ce..e889f439b8d 100755 --- a/eng/common/darc-init.sh +++ b/eng/common/darc-init.sh @@ -68,7 +68,7 @@ function InstallDarcCli { fi fi - local arcadeServicesSource="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" + local arcadeServicesSource="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" echo "Installing Darc CLI version $darcVersion..." echo "You may need to restart your command shell if this is the first dotnet tool you have installed." diff --git a/eng/common/dotnet.cmd b/eng/common/dotnet.cmd new file mode 100644 index 00000000000..527fa4bb38f --- /dev/null +++ b/eng/common/dotnet.cmd @@ -0,0 +1,7 @@ +@echo off + +:: This script is used to install the .NET SDK. +:: It will also invoke the SDK with any provided arguments. + +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0dotnet.ps1""" %*" +exit /b %ErrorLevel% diff --git a/eng/common/dotnet.ps1 b/eng/common/dotnet.ps1 new file mode 100644 index 00000000000..45e5676c9eb --- /dev/null +++ b/eng/common/dotnet.ps1 @@ -0,0 +1,11 @@ +# This script is used to install the .NET SDK. +# It will also invoke the SDK with any provided arguments. + +. $PSScriptRoot\tools.ps1 +$dotnetRoot = InitializeDotNetCli -install:$true + +# Invoke acquired SDK with args if they are provided +if ($args.count -gt 0) { + $env:DOTNET_NOLOGO=1 + & "$dotnetRoot\dotnet.exe" $args +} diff --git a/eng/common/dotnet.sh b/eng/common/dotnet.sh new file mode 100644 index 00000000000..2ef68235675 --- /dev/null +++ b/eng/common/dotnet.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# This script is used to install the .NET SDK. +# It will also invoke the SDK with any provided arguments. + +source="${BASH_SOURCE[0]}" +# resolve $SOURCE until the file is no longer a symlink +while [[ -h $source ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +source $scriptroot/tools.sh +InitializeDotNetCli true # install + +# Invoke acquired SDK with args if they are provided +if [[ $# > 0 ]]; then + __dotnetDir=${_InitializeDotNetCli} + dotnetPath=${__dotnetDir}/dotnet + ${dotnetPath} "$@" +fi diff --git a/eng/common/generate-locproject.ps1 b/eng/common/generate-locproject.ps1 index 524aaa57f2b..fa1cdc2b300 100644 --- a/eng/common/generate-locproject.ps1 +++ b/eng/common/generate-locproject.ps1 @@ -33,15 +33,27 @@ $jsonTemplateFiles | ForEach-Object { $jsonWinformsTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern +$wxlFilesV3 = @() +$wxlFilesV5 = @() $wxlFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\\.+\.wxl" -And -Not( $_.Directory.Name -Match "\d{4}" ) } # localized files live in four digit lang ID directories; this excludes them if (-not $wxlFiles) { $wxlEnFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\\1033\\.+\.wxl" } # pick up en files (1033 = en) specifically so we can copy them to use as the neutral xlf files if ($wxlEnFiles) { - $wxlFiles = @() - $wxlEnFiles | ForEach-Object { - $destinationFile = "$($_.Directory.Parent.FullName)\$($_.Name)" - $wxlFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru - } + $wxlFiles = @() + $wxlEnFiles | ForEach-Object { + $destinationFile = "$($_.Directory.Parent.FullName)\$($_.Name)" + $content = Get-Content $_.FullName -Raw + + # Split files on schema to select different parser settings in the generated project. + if ($content -like "*http://wixtoolset.org/schemas/v4/wxl*") + { + $wxlFilesV5 += Copy-Item $_.FullName -Destination $destinationFile -PassThru + } + elseif ($content -like "*http://schemas.microsoft.com/wix/2006/localization*") + { + $wxlFilesV3 += Copy-Item $_.FullName -Destination $destinationFile -PassThru + } + } } } @@ -114,7 +126,32 @@ $locJson = @{ CloneLanguageSet = "WiX_CloneLanguages" LssFiles = @( "wxl_loc.lss" ) LocItems = @( - $wxlFiles | ForEach-Object { + $wxlFilesV3 | ForEach-Object { + $outputPath = "$($_.Directory.FullName | Resolve-Path -Relative)\" + $continue = $true + foreach ($exclusion in $exclusions.Exclusions) { + if ($_.FullName.Contains($exclusion)) { + $continue = $false + } + } + $sourceFile = ($_.FullName | Resolve-Path -Relative) + if ($continue) + { + return @{ + SourceFile = $sourceFile + CopyOption = "LangIDOnPath" + OutputPath = $outputPath + } + } + } + ) + }, + @{ + LanguageSet = $LanguageSet + CloneLanguageSet = "WiX_CloneLanguages" + LssFiles = @( "P210WxlSchemaV4.lss" ) + LocItems = @( + $wxlFilesV5 | ForEach-Object { $outputPath = "$($_.Directory.FullName | Resolve-Path -Relative)\" $continue = $true foreach ($exclusion in $exclusions.Exclusions) { diff --git a/eng/common/internal-feed-operations.ps1 b/eng/common/internal-feed-operations.ps1 index 92b77347d99..c282d3ae403 100644 --- a/eng/common/internal-feed-operations.ps1 +++ b/eng/common/internal-feed-operations.ps1 @@ -26,7 +26,7 @@ function SetupCredProvider { $url = 'https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1' Write-Host "Writing the contents of 'installcredprovider.ps1' locally..." - Invoke-WebRequest $url -OutFile installcredprovider.ps1 + Invoke-WebRequest $url -UseBasicParsing -OutFile installcredprovider.ps1 Write-Host 'Installing plugin...' .\installcredprovider.ps1 -Force diff --git a/eng/common/native/install-dependencies.sh b/eng/common/native/install-dependencies.sh new file mode 100644 index 00000000000..477a44f335b --- /dev/null +++ b/eng/common/native/install-dependencies.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +set -e + +# This is a simple script primarily used for CI to install necessary dependencies +# +# Usage: +# +# ./install-dependencies.sh + +os="$(echo "$1" | tr "[:upper:]" "[:lower:]")" + +if [ -z "$os" ]; then + . "$(dirname "$0")"/init-os-and-arch.sh +fi + +case "$os" in + linux) + if [ -e /etc/os-release ]; then + . /etc/os-release + fi + + if [ "$ID" = "debian" ] || [ "$ID_LIKE" = "debian" ]; then + apt update + + apt install -y build-essential gettext locales cmake llvm clang lld lldb liblldb-dev libunwind8-dev libicu-dev liblttng-ust-dev \ + libssl-dev libkrb5-dev pigz cpio + + localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 + elif [ "$ID" = "fedora" ] || [ "$ID" = "rhel" ] || [ "$ID" = "azurelinux" ]; then + pkg_mgr="$(command -v tdnf 2>/dev/null || command -v dnf)" + $pkg_mgr install -y cmake llvm lld lldb clang python curl libicu-devel openssl-devel krb5-devel lttng-ust-devel pigz cpio + elif [ "$ID" = "alpine" ]; then + apk add build-base cmake bash curl clang llvm-dev lld lldb krb5-dev lttng-ust-dev icu-dev openssl-dev pigz cpio + else + echo "Unsupported distro. distro: $ID" + exit 1 + fi + ;; + + osx|maccatalyst|ios|iossimulator|tvos|tvossimulator) + echo "Installed xcode version: $(xcode-select -p)" + + export HOMEBREW_NO_INSTALL_CLEANUP=1 + export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 + # Skip brew update for now, see https://github.com/actions/setup-python/issues/577 + # brew update --preinstall + brew bundle --no-upgrade --file=- < Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host " -excludeCIBinaryLog When running on CI, allow no binary log (short: -nobl)" Write-Host "" Write-Host "Command line arguments not listed above are passed thru to msbuild." } @@ -34,10 +39,11 @@ function Print-Usage() { function Build([string]$target) { $logSuffix = if ($target -eq 'Execute') { '' } else { ".$target" } $log = Join-Path $LogDir "$task$logSuffix.binlog" + $binaryLogArg = if ($binaryLog) { "/bl:$log" } else { "" } $outputPath = Join-Path $ToolsetDir "$task\" MSBuild $taskProject ` - /bl:$log ` + $binaryLogArg ` /t:$target ` /p:Configuration=$configuration ` /p:RepoRoot=$RepoRoot ` @@ -64,7 +70,7 @@ try { $GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty } if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) { - $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.12.0" -MemberType NoteProperty + $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "18.0.0" -MemberType NoteProperty } if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") { $xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true diff --git a/eng/common/sdk-task.sh b/eng/common/sdk-task.sh new file mode 100644 index 00000000000..3270f83fa9a --- /dev/null +++ b/eng/common/sdk-task.sh @@ -0,0 +1,121 @@ +#!/usr/bin/env bash + +show_usage() { + echo "Common settings:" + echo " --task Name of Arcade task (name of a project in SdkTasks directory of the Arcade SDK package)" + echo " --restore Restore dependencies" + echo " --verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" + echo " --help Print help and exit" + echo "" + + echo "Advanced settings:" + echo " --excludeCIBinarylog Don't output binary log (short: -nobl)" + echo " --noWarnAsError Do not warn as error" + echo "" + echo "Command line arguments not listed above are passed thru to msbuild." +} + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +Build() { + local target=$1 + local log_suffix="" + [[ "$target" != "Execute" ]] && log_suffix=".$target" + local log="$log_dir/$task$log_suffix.binlog" + local binaryLogArg="" + [[ $binary_log == true ]] && binaryLogArg="/bl:$log" + local output_path="$toolset_dir/$task/" + + MSBuild "$taskProject" \ + $binaryLogArg \ + /t:"$target" \ + /p:Configuration="$configuration" \ + /p:RepoRoot="$repo_root" \ + /p:BaseIntermediateOutputPath="$output_path" \ + /v:"$verbosity" \ + $properties +} + +binary_log=true +configuration="Debug" +verbosity="minimal" +exclude_ci_binary_log=false +restore=false +help=false +properties='' +warnAsError=true + +while (($# > 0)); do + lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")" + case $lowerI in + --task) + task=$2 + shift 2 + ;; + --restore) + restore=true + shift 1 + ;; + --verbosity) + verbosity=$2 + shift 2 + ;; + --excludecibinarylog|--nobl) + binary_log=false + exclude_ci_binary_log=true + shift 1 + ;; + --noWarnAsError) + warnAsError=false + shift 1 + ;; + --help) + help=true + shift 1 + ;; + *) + properties="$properties $1" + shift 1 + ;; + esac +done + +ci=true + +if $help; then + show_usage + exit 0 +fi + +. "$scriptroot/tools.sh" +InitializeToolset + +if [[ -z "$task" ]]; then + Write-PipelineTelemetryError -Category 'Task' -Name 'MissingTask' -Message "Missing required parameter '-task '" + ExitWithExitCode 1 +fi + +taskProject=$(GetSdkTaskProject "$task") +if [[ ! -e "$taskProject" ]]; then + Write-PipelineTelemetryError -Category 'Task' -Name 'UnknownTask' -Message "Unknown task: $task" + ExitWithExitCode 1 +fi + +if $restore; then + Build "Restore" +fi + +Build "Execute" + + +ExitWithExitCode 0 diff --git a/eng/common/sdl/packages.config b/eng/common/sdl/packages.config index 4585cfd6bba..e5f543ea68c 100644 --- a/eng/common/sdl/packages.config +++ b/eng/common/sdl/packages.config @@ -1,4 +1,4 @@ - + diff --git a/eng/common/templates-official/job/job.yml b/eng/common/templates-official/job/job.yml index 81ea7a261f2..92a0664f564 100644 --- a/eng/common/templates-official/job/job.yml +++ b/eng/common/templates-official/job/job.yml @@ -31,6 +31,7 @@ jobs: PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' ArtifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }} condition: always() + retryCountOnTaskFailure: 10 # for any logs being locked continueOnError: true - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}: - output: pipelineArtifact @@ -39,6 +40,7 @@ jobs: displayName: 'Publish logs' continueOnError: true condition: always() + retryCountOnTaskFailure: 10 # for any logs being locked sbomEnabled: false # we don't need SBOM for logs - ${{ if eq(parameters.enablePublishBuildArtifacts, true) }}: @@ -46,7 +48,7 @@ jobs: displayName: Publish Logs PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts/log/$(_BuildConfig)' publishLocation: Container - ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }} + ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)_Attempt$(System.JobAttempt)' ) }} continueOnError: true condition: always() sbomEnabled: false # we don't need SBOM for logs diff --git a/eng/common/templates-official/steps/publish-build-artifacts.yml b/eng/common/templates-official/steps/publish-build-artifacts.yml index 100a3fc9849..fcf6637b2eb 100644 --- a/eng/common/templates-official/steps/publish-build-artifacts.yml +++ b/eng/common/templates-official/steps/publish-build-artifacts.yml @@ -24,6 +24,10 @@ parameters: - name: is1ESPipeline type: boolean default: true + +- name: retryCountOnTaskFailure + type: string + default: 10 steps: - ${{ if ne(parameters.is1ESPipeline, true) }}: @@ -38,4 +42,5 @@ steps: PathtoPublish: ${{ parameters.pathToPublish }} ${{ if parameters.artifactName }}: ArtifactName: ${{ parameters.artifactName }} - + ${{ if parameters.retryCountOnTaskFailure }}: + retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }} diff --git a/eng/common/templates-official/steps/source-index-stage1-publish.yml b/eng/common/templates-official/steps/source-index-stage1-publish.yml new file mode 100644 index 00000000000..9b8b80942b5 --- /dev/null +++ b/eng/common/templates-official/steps/source-index-stage1-publish.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/source-index-stage1-publish.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml index 5bdd3dd85fd..238fa0818f7 100644 --- a/eng/common/templates/job/job.yml +++ b/eng/common/templates/job/job.yml @@ -46,6 +46,7 @@ jobs: artifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }} continueOnError: true condition: always() + retryCountOnTaskFailure: 10 # for any logs being locked - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}: - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml parameters: @@ -56,6 +57,7 @@ jobs: displayName: 'Publish logs' continueOnError: true condition: always() + retryCountOnTaskFailure: 10 # for any logs being locked sbomEnabled: false # we don't need SBOM for logs - ${{ if ne(parameters.enablePublishBuildArtifacts, 'false') }}: @@ -66,7 +68,7 @@ jobs: displayName: Publish Logs pathToPublish: '$(Build.ArtifactStagingDirectory)/artifacts/log/$(_BuildConfig)' publishLocation: Container - artifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }} + artifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)_Attempt$(System.JobAttempt)' ) }} continueOnError: true condition: always() diff --git a/eng/common/templates/steps/publish-build-artifacts.yml b/eng/common/templates/steps/publish-build-artifacts.yml index 6428a98dfef..605e602e94d 100644 --- a/eng/common/templates/steps/publish-build-artifacts.yml +++ b/eng/common/templates/steps/publish-build-artifacts.yml @@ -25,6 +25,10 @@ parameters: type: string default: 'Container' +- name: retryCountOnTaskFailure + type: string + default: 10 + steps: - ${{ if eq(parameters.is1ESPipeline, true) }}: - 'eng/common/templates cannot be referenced from a 1ES managed template': error @@ -37,4 +41,6 @@ steps: PublishLocation: ${{ parameters.publishLocation }} PathtoPublish: ${{ parameters.pathToPublish }} ${{ if parameters.artifactName }}: - ArtifactName: ${{ parameters.artifactName }} \ No newline at end of file + ArtifactName: ${{ parameters.artifactName }} + ${{ if parameters.retryCountOnTaskFailure }}: + retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }} diff --git a/eng/common/templates/steps/source-index-stage1-publish.yml b/eng/common/templates/steps/source-index-stage1-publish.yml new file mode 100644 index 00000000000..182cec33a7b --- /dev/null +++ b/eng/common/templates/steps/source-index-stage1-publish.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/source-index-stage1-publish.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/steps/vmr-sync.yml b/eng/common/templates/steps/vmr-sync.yml new file mode 100644 index 00000000000..599afb6186b --- /dev/null +++ b/eng/common/templates/steps/vmr-sync.yml @@ -0,0 +1,207 @@ +### These steps synchronize new code from product repositories into the VMR (https://github.com/dotnet/dotnet). +### They initialize the darc CLI and pull the new updates. +### Changes are applied locally onto the already cloned VMR (located in $vmrPath). + +parameters: +- name: targetRef + displayName: Target revision in dotnet/ to synchronize + type: string + default: $(Build.SourceVersion) + +- name: vmrPath + displayName: Path where the dotnet/dotnet is checked out to + type: string + default: $(Agent.BuildDirectory)/vmr + +- name: additionalSyncs + displayName: Optional list of package names whose repo's source will also be synchronized in the local VMR, e.g. NuGet.Protocol + type: object + default: [] + +steps: +- checkout: vmr + displayName: Clone dotnet/dotnet + path: vmr + clean: true + +- checkout: self + displayName: Clone $(Build.Repository.Name) + path: repo + fetchDepth: 0 + +# This step is needed so that when we get a detached HEAD / shallow clone, +# we still pull the commit into the temporary repo clone to use it during the sync. +# Also unshallow the clone so that forwardflow command would work. +- script: | + git branch repo-head + git rev-parse HEAD + displayName: Label PR commit + workingDirectory: $(Agent.BuildDirectory)/repo + +- script: | + vmr_sha=$(grep -oP '(?<=Sha=")[^"]*' $(Agent.BuildDirectory)/repo/eng/Version.Details.xml) + echo "##vso[task.setvariable variable=vmr_sha]$vmr_sha" + displayName: Obtain the vmr sha from Version.Details.xml (Unix) + condition: ne(variables['Agent.OS'], 'Windows_NT') + workingDirectory: $(Agent.BuildDirectory)/repo + +- powershell: | + [xml]$xml = Get-Content -Path $(Agent.BuildDirectory)/repo/eng/Version.Details.xml + $vmr_sha = $xml.SelectSingleNode("//Source").Sha + Write-Output "##vso[task.setvariable variable=vmr_sha]$vmr_sha" + displayName: Obtain the vmr sha from Version.Details.xml (Windows) + condition: eq(variables['Agent.OS'], 'Windows_NT') + workingDirectory: $(Agent.BuildDirectory)/repo + +- script: | + git fetch --all + git checkout $(vmr_sha) + displayName: Checkout VMR at correct sha for repo flow + workingDirectory: ${{ parameters.vmrPath }} + +- script: | + git config --global user.name "dotnet-maestro[bot]" + git config --global user.email "dotnet-maestro[bot]@users.noreply.github.com" + displayName: Set git author to dotnet-maestro[bot] + workingDirectory: ${{ parameters.vmrPath }} + +- script: | + ./eng/common/vmr-sync.sh \ + --vmr ${{ parameters.vmrPath }} \ + --tmp $(Agent.TempDirectory) \ + --azdev-pat '$(dn-bot-all-orgs-code-r)' \ + --ci \ + --debug + + if [ "$?" -ne 0 ]; then + echo "##vso[task.logissue type=error]Failed to synchronize the VMR" + exit 1 + fi + displayName: Sync repo into VMR (Unix) + condition: ne(variables['Agent.OS'], 'Windows_NT') + workingDirectory: $(Agent.BuildDirectory)/repo + +- script: | + git config --global diff.astextplain.textconv echo + git config --system core.longpaths true + displayName: Configure Windows git (longpaths, astextplain) + condition: eq(variables['Agent.OS'], 'Windows_NT') + +- powershell: | + ./eng/common/vmr-sync.ps1 ` + -vmr ${{ parameters.vmrPath }} ` + -tmp $(Agent.TempDirectory) ` + -azdevPat '$(dn-bot-all-orgs-code-r)' ` + -ci ` + -debugOutput + + if ($LASTEXITCODE -ne 0) { + echo "##vso[task.logissue type=error]Failed to synchronize the VMR" + exit 1 + } + displayName: Sync repo into VMR (Windows) + condition: eq(variables['Agent.OS'], 'Windows_NT') + workingDirectory: $(Agent.BuildDirectory)/repo + +- ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: + - task: CopyFiles@2 + displayName: Collect failed patches + condition: failed() + inputs: + SourceFolder: '$(Agent.TempDirectory)' + Contents: '*.patch' + TargetFolder: '$(Build.ArtifactStagingDirectory)/FailedPatches' + + - publish: '$(Build.ArtifactStagingDirectory)/FailedPatches' + artifact: $(System.JobDisplayName)_FailedPatches + displayName: Upload failed patches + condition: failed() + +- ${{ each assetName in parameters.additionalSyncs }}: + # The vmr-sync script ends up staging files in the local VMR so we have to commit those + - script: + git commit --allow-empty -am "Forward-flow $(Build.Repository.Name)" + displayName: Commit local VMR changes + workingDirectory: ${{ parameters.vmrPath }} + + - script: | + set -ex + + echo "Searching for details of asset ${{ assetName }}..." + + # Use darc to get dependencies information + dependencies=$(./.dotnet/dotnet darc get-dependencies --name '${{ assetName }}' --ci) + + # Extract repository URL and commit hash + repository=$(echo "$dependencies" | grep 'Repo:' | sed 's/Repo:[[:space:]]*//' | head -1) + + if [ -z "$repository" ]; then + echo "##vso[task.logissue type=error]Asset ${{ assetName }} not found in the dependency list" + exit 1 + fi + + commit=$(echo "$dependencies" | grep 'Commit:' | sed 's/Commit:[[:space:]]*//' | head -1) + + echo "Updating the VMR from $repository / $commit..." + cd .. + git clone $repository ${{ assetName }} + cd ${{ assetName }} + git checkout $commit + git branch "sync/$commit" + + ./eng/common/vmr-sync.sh \ + --vmr ${{ parameters.vmrPath }} \ + --tmp $(Agent.TempDirectory) \ + --azdev-pat '$(dn-bot-all-orgs-code-r)' \ + --ci \ + --debug + + if [ "$?" -ne 0 ]; then + echo "##vso[task.logissue type=error]Failed to synchronize the VMR" + exit 1 + fi + displayName: Sync ${{ assetName }} into (Unix) + condition: ne(variables['Agent.OS'], 'Windows_NT') + workingDirectory: $(Agent.BuildDirectory)/repo + + - powershell: | + $ErrorActionPreference = 'Stop' + + Write-Host "Searching for details of asset ${{ assetName }}..." + + $dependencies = .\.dotnet\dotnet darc get-dependencies --name '${{ assetName }}' --ci + + $repository = $dependencies | Select-String -Pattern 'Repo:\s+([^\s]+)' | Select-Object -First 1 + $repository -match 'Repo:\s+([^\s]+)' | Out-Null + $repository = $matches[1] + + if ($repository -eq $null) { + Write-Error "Asset ${{ assetName }} not found in the dependency list" + exit 1 + } + + $commit = $dependencies | Select-String -Pattern 'Commit:\s+([^\s]+)' | Select-Object -First 1 + $commit -match 'Commit:\s+([^\s]+)' | Out-Null + $commit = $matches[1] + + Write-Host "Updating the VMR from $repository / $commit..." + cd .. + git clone $repository ${{ assetName }} + cd ${{ assetName }} + git checkout $commit + git branch "sync/$commit" + + .\eng\common\vmr-sync.ps1 ` + -vmr ${{ parameters.vmrPath }} ` + -tmp $(Agent.TempDirectory) ` + -azdevPat '$(dn-bot-all-orgs-code-r)' ` + -ci ` + -debugOutput + + if ($LASTEXITCODE -ne 0) { + echo "##vso[task.logissue type=error]Failed to synchronize the VMR" + exit 1 + } + displayName: Sync ${{ assetName }} into (Windows) + condition: ne(variables['Agent.OS'], 'Windows_NT') + workingDirectory: $(Agent.BuildDirectory)/repo diff --git a/eng/common/templates/vmr-build-pr.yml b/eng/common/templates/vmr-build-pr.yml new file mode 100644 index 00000000000..ce3c29a62fa --- /dev/null +++ b/eng/common/templates/vmr-build-pr.yml @@ -0,0 +1,42 @@ +# This pipeline is used for running the VMR verification of the PR changes in repo-level PRs. +# +# It will run a full set of verification jobs defined in: +# https://github.com/dotnet/dotnet/blob/10060d128e3f470e77265f8490f5e4f72dae738e/eng/pipelines/templates/stages/vmr-build.yml#L27-L38 +# +# For repos that do not need to run the full set, you would do the following: +# +# 1. Copy this YML file to a repo-specific location, i.e. outside of eng/common. +# +# 2. Add `verifications` parameter to VMR template reference +# +# Examples: +# - For source-build stage 1 verification, add the following: +# verifications: [ "source-build-stage1" ] +# +# - For Windows only verifications, add the following: +# verifications: [ "unified-build-windows-x64", "unified-build-windows-x86" ] + +trigger: none +pr: none + +variables: +- template: /eng/common/templates/variables/pool-providers.yml@self + +- name: skipComponentGovernanceDetection # we run CG on internal builds only + value: true + +- name: Codeql.Enabled # we run CodeQL on internal builds only + value: false + +resources: + repositories: + - repository: vmr + type: github + name: dotnet/dotnet + endpoint: dotnet + +stages: +- template: /eng/pipelines/templates/stages/vmr-build.yml@vmr + parameters: + isBuiltFromVmr: false + scope: lite diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 9b3ad8840fd..049fe6db994 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -65,10 +65,8 @@ $ErrorActionPreference = 'Stop' # Base-64 encoded SAS token that has permission to storage container described by $runtimeSourceFeed [string]$runtimeSourceFeedKey = if (Test-Path variable:runtimeSourceFeedKey) { $runtimeSourceFeedKey } else { $null } -# True if the build is a product build -[bool]$productBuild = if (Test-Path variable:productBuild) { $productBuild } else { $false } - -[String[]]$properties = if (Test-Path variable:properties) { $properties } else { @() } +# True when the build is running within the VMR. +[bool]$fromVMR = if (Test-Path variable:fromVMR) { $fromVMR } else { $false } function Create-Directory ([string[]] $path) { New-Item -Path $path -Force -ItemType 'Directory' | Out-Null @@ -259,14 +257,27 @@ function Retry($downloadBlock, $maxRetries = 5) { function GetDotNetInstallScript([string] $dotnetRoot) { $installScript = Join-Path $dotnetRoot 'dotnet-install.ps1' + $shouldDownload = $false + if (!(Test-Path $installScript)) { + $shouldDownload = $true + } else { + # Check if the script is older than 30 days + $fileAge = (Get-Date) - (Get-Item $installScript).LastWriteTime + if ($fileAge.Days -gt 30) { + Write-Host "Existing install script is too old, re-downloading..." + $shouldDownload = $true + } + } + + if ($shouldDownload) { Create-Directory $dotnetRoot $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit $uri = "https://builds.dotnet.microsoft.com/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.ps1" Retry({ Write-Host "GET $uri" - Invoke-WebRequest $uri -OutFile $installScript + Invoke-WebRequest $uri -UseBasicParsing -OutFile $installScript }) } @@ -383,8 +394,8 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = # If the version of msbuild is going to be xcopied, # use this version. Version matches a package here: - # https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/Microsoft.DotNet.Arcade.MSBuild.Xcopy/versions/17.12.0 - $defaultXCopyMSBuildVersion = '17.12.0' + # https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/Microsoft.DotNet.Arcade.MSBuild.Xcopy/versions/18.0.0 + $defaultXCopyMSBuildVersion = '18.0.0' if (!$vsRequirements) { if (Get-Member -InputObject $GlobalJson.tools -Name 'vs') { @@ -499,7 +510,7 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { Write-Host "Downloading $packageName $packageVersion" $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit Retry({ - Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -OutFile $packagePath + Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -UseBasicParsing -OutFile $packagePath }) if (!(Test-Path $packagePath)) { @@ -533,7 +544,8 @@ function LocateVisualStudio([object]$vsRequirements = $null){ if (Get-Member -InputObject $GlobalJson.tools -Name 'vswhere') { $vswhereVersion = $GlobalJson.tools.vswhere } else { - $vswhereVersion = '2.5.2' + # keep this in sync with the VSWhereVersion in DefaultVersions.props + $vswhereVersion = '3.1.7' } $vsWhereDir = Join-Path $ToolsDir "vswhere\$vswhereVersion" @@ -541,25 +553,33 @@ function LocateVisualStudio([object]$vsRequirements = $null){ if (!(Test-Path $vsWhereExe)) { Create-Directory $vsWhereDir - Write-Host 'Downloading vswhere' + Write-Host "Downloading vswhere $vswhereVersion" + $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit Retry({ - Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe + Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -UseBasicParsing -OutFile $vswhereExe }) } - if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } + if (!$vsRequirements) { + if (Get-Member -InputObject $GlobalJson.tools -Name 'vs' -ErrorAction SilentlyContinue) { + $vsRequirements = $GlobalJson.tools.vs + } else { + $vsRequirements = $null + } + } + $args = @('-latest', '-format', 'json', '-requires', 'Microsoft.Component.MSBuild', '-products', '*') if (!$excludePrereleaseVS) { $args += '-prerelease' } - if (Get-Member -InputObject $vsRequirements -Name 'version') { + if ($vsRequirements -and (Get-Member -InputObject $vsRequirements -Name 'version' -ErrorAction SilentlyContinue)) { $args += '-version' $args += $vsRequirements.version } - if (Get-Member -InputObject $vsRequirements -Name 'components') { + if ($vsRequirements -and (Get-Member -InputObject $vsRequirements -Name 'components' -ErrorAction SilentlyContinue)) { foreach ($component in $vsRequirements.components) { $args += '-requires' $args += $component @@ -604,14 +624,7 @@ function InitializeBuildTool() { } $dotnetPath = Join-Path $dotnetRoot (GetExecutableFileName 'dotnet') - # Use override if it exists - commonly set by source-build - if ($null -eq $env:_OverrideArcadeInitializeBuildToolFramework) { - $initializeBuildToolFramework="net9.0" - } else { - $initializeBuildToolFramework=$env:_OverrideArcadeInitializeBuildToolFramework - } - - $buildTool = @{ Path = $dotnetPath; Command = 'msbuild'; Tool = 'dotnet'; Framework = $initializeBuildToolFramework } + $buildTool = @{ Path = $dotnetPath; Command = 'msbuild'; Tool = 'dotnet'; Framework = 'net' } } elseif ($msbuildEngine -eq "vs") { try { $msbuildPath = InitializeVisualStudioMSBuild -install:$restore @@ -620,7 +633,7 @@ function InitializeBuildTool() { ExitWithExitCode 1 } - $buildTool = @{ Path = $msbuildPath; Command = ""; Tool = "vs"; Framework = "net472"; ExcludePrereleaseVS = $excludePrereleaseVS } + $buildTool = @{ Path = $msbuildPath; Command = ""; Tool = "vs"; Framework = "netframework"; ExcludePrereleaseVS = $excludePrereleaseVS } } else { Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unexpected value of -msbuildEngine: '$msbuildEngine'." ExitWithExitCode 1 @@ -653,7 +666,6 @@ function GetNuGetPackageCachePath() { $env:NUGET_PACKAGES = Join-Path $env:UserProfile '.nuget\packages\' } else { $env:NUGET_PACKAGES = Join-Path $RepoRoot '.packages\' - $env:RESTORENOHTTPCACHE = $true } } @@ -775,26 +787,13 @@ function MSBuild() { $toolsetBuildProject = InitializeToolset $basePath = Split-Path -parent $toolsetBuildProject - $possiblePaths = @( - # new scripts need to work with old packages, so we need to look for the old names/versions - (Join-Path $basePath (Join-Path $buildTool.Framework 'Microsoft.DotNet.ArcadeLogging.dll')), - (Join-Path $basePath (Join-Path $buildTool.Framework 'Microsoft.DotNet.Arcade.Sdk.dll')), - (Join-Path $basePath (Join-Path net7.0 'Microsoft.DotNet.ArcadeLogging.dll')), - (Join-Path $basePath (Join-Path net7.0 'Microsoft.DotNet.Arcade.Sdk.dll')), - (Join-Path $basePath (Join-Path net8.0 'Microsoft.DotNet.ArcadeLogging.dll')), - (Join-Path $basePath (Join-Path net8.0 'Microsoft.DotNet.Arcade.Sdk.dll')) - ) - $selectedPath = $null - foreach ($path in $possiblePaths) { - if (Test-Path $path -PathType Leaf) { - $selectedPath = $path - break - } - } + $selectedPath = Join-Path $basePath (Join-Path $buildTool.Framework 'Microsoft.DotNet.ArcadeLogging.dll') + if (-not $selectedPath) { - Write-PipelineTelemetryError -Category 'Build' -Message 'Unable to find arcade sdk logger assembly.' + Write-PipelineTelemetryError -Category 'Build' -Message "Unable to find arcade sdk logger assembly: $selectedPath" ExitWithExitCode 1 } + $args += "/logger:$selectedPath" } @@ -857,8 +856,8 @@ function MSBuild-Core() { } # When running on Azure Pipelines, override the returned exit code to avoid double logging. - # Skip this when the build is a child of the VMR orchestrator build. - if ($ci -and $env:SYSTEM_TEAMPROJECT -ne $null -and !$productBuild -and -not($properties -like "*DotNetBuildRepo=true*")) { + # Skip this when the build is a child of the VMR build. + if ($ci -and $env:SYSTEM_TEAMPROJECT -ne $null -and !$fromVMR) { Write-PipelineSetResult -Result "Failed" -Message "msbuild execution failed." # Exiting with an exit code causes the azure pipelines task to log yet another "noise" error # The above Write-PipelineSetResult will cause the task to be marked as failure without adding yet another error diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 01b09b65796..c1841c9dfd0 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -5,6 +5,9 @@ # CI mode - set to true on CI server for PR validation build or official build. ci=${ci:-false} +# Build mode +source_build=${source_build:-false} + # Set to true to use the pipelines logger which will enable Azure logging output. # https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/authoring/commands.md # This flag is meant as a temporary opt-opt for the feature while validate it across @@ -58,7 +61,8 @@ use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} dotnetInstallScriptVersion=${dotnetInstallScriptVersion:-'v1'} # True to use global NuGet cache instead of restoring packages to repository-local directory. -if [[ "$ci" == true ]]; then +# Keep in sync with NuGetPackageroot in Arcade SDK's RepositoryLayout.props. +if [[ "$ci" == true || "$source_build" == true ]]; then use_global_nuget_cache=${use_global_nuget_cache:-false} else use_global_nuget_cache=${use_global_nuget_cache:-true} @@ -68,8 +72,8 @@ fi runtime_source_feed=${runtime_source_feed:-''} runtime_source_feed_key=${runtime_source_feed_key:-''} -# True if the build is a product build -product_build=${product_build:-false} +# True when the build is running within the VMR. +from_vmr=${from_vmr:-false} # Resolve any symlinks in the given path. function ResolvePath { @@ -296,8 +300,29 @@ function GetDotNetInstallScript { local root=$1 local install_script="$root/dotnet-install.sh" local install_script_url="https://builds.dotnet.microsoft.com/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.sh" + local timestamp_file="$root/.dotnet-install.timestamp" + local should_download=false if [[ ! -a "$install_script" ]]; then + should_download=true + elif [[ -f "$timestamp_file" ]]; then + # Check if the script is older than 30 days using timestamp file + local download_time=$(cat "$timestamp_file" 2>/dev/null || echo "0") + local current_time=$(date +%s) + local age_seconds=$((current_time - download_time)) + + # 30 days = 30 * 24 * 60 * 60 = 2592000 seconds + if [[ $age_seconds -gt 2592000 ]]; then + echo "Existing install script is too old, re-downloading..." + should_download=true + fi + else + # No timestamp file exists, assume script is old and re-download + echo "No timestamp found for existing install script, re-downloading..." + should_download=true + fi + + if [[ "$should_download" == true ]]; then mkdir -p "$root" echo "Downloading '$install_script_url'" @@ -324,6 +349,9 @@ function GetDotNetInstallScript { ExitWithExitCode $exit_code } fi + + # Create timestamp file to track download time in seconds from epoch + date +%s > "$timestamp_file" fi # return value _GetDotNetInstallScript="$install_script" @@ -339,22 +367,14 @@ function InitializeBuildTool { # return values _InitializeBuildTool="$_InitializeDotNetCli/dotnet" _InitializeBuildToolCommand="msbuild" - # use override if it exists - commonly set by source-build - if [[ "${_OverrideArcadeInitializeBuildToolFramework:-x}" == "x" ]]; then - _InitializeBuildToolFramework="net9.0" - else - _InitializeBuildToolFramework="${_OverrideArcadeInitializeBuildToolFramework}" - fi } -# Set RestoreNoHttpCache as a workaround for https://github.com/NuGet/Home/issues/3116 function GetNuGetPackageCachePath { if [[ -z ${NUGET_PACKAGES:-} ]]; then if [[ "$use_global_nuget_cache" == true ]]; then export NUGET_PACKAGES="$HOME/.nuget/packages/" else export NUGET_PACKAGES="$repo_root/.packages/" - export RESTORENOHTTPCACHE=true fi fi @@ -451,25 +471,13 @@ function MSBuild { fi local toolset_dir="${_InitializeToolset%/*}" - # new scripts need to work with old packages, so we need to look for the old names/versions - local selectedPath= - local possiblePaths=() - possiblePaths+=( "$toolset_dir/$_InitializeBuildToolFramework/Microsoft.DotNet.ArcadeLogging.dll" ) - possiblePaths+=( "$toolset_dir/$_InitializeBuildToolFramework/Microsoft.DotNet.Arcade.Sdk.dll" ) - possiblePaths+=( "$toolset_dir/net7.0/Microsoft.DotNet.ArcadeLogging.dll" ) - possiblePaths+=( "$toolset_dir/net7.0/Microsoft.DotNet.Arcade.Sdk.dll" ) - possiblePaths+=( "$toolset_dir/net8.0/Microsoft.DotNet.ArcadeLogging.dll" ) - possiblePaths+=( "$toolset_dir/net8.0/Microsoft.DotNet.Arcade.Sdk.dll" ) - for path in "${possiblePaths[@]}"; do - if [[ -f $path ]]; then - selectedPath=$path - break - fi - done + local selectedPath="$toolset_dir/net/Microsoft.DotNet.ArcadeLogging.dll" + if [[ -z "$selectedPath" ]]; then - Write-PipelineTelemetryError -category 'Build' "Unable to find arcade sdk logger assembly." + Write-PipelineTelemetryError -category 'Build' "Unable to find arcade sdk logger assembly: $selectedPath" ExitWithExitCode 1 fi + args+=( "-logger:$selectedPath" ) fi @@ -506,8 +514,8 @@ function MSBuild-Core { echo "Build failed with exit code $exit_code. Check errors above." # When running on Azure Pipelines, override the returned exit code to avoid double logging. - # Skip this when the build is a child of the VMR orchestrator build. - if [[ "$ci" == true && -n ${SYSTEM_TEAMPROJECT:-} && "$product_build" != true && "$properties" != *"DotNetBuildRepo=true"* ]]; then + # Skip this when the build is a child of the VMR build. + if [[ "$ci" == true && -n ${SYSTEM_TEAMPROJECT:-} && "$from_vmr" != true ]]; then Write-PipelineSetResult -result "Failed" -message "msbuild execution failed." # Exiting with an exit code causes the azure pipelines task to log yet another "noise" error # The above Write-PipelineSetResult will cause the task to be marked as failure without adding yet another error @@ -530,6 +538,13 @@ function GetDarc { fi "$eng_root/common/darc-init.sh" --toolpath "$darc_path" $version + darc_tool="$darc_path/darc" +} + +# Returns a full path to an Arcade SDK task project file. +function GetSdkTaskProject { + taskName=$1 + echo "$(dirname $_InitializeToolset)/SdkTasks/$taskName.proj" } ResolvePath "${BASH_SOURCE[0]}" diff --git a/eng/common/vmr-sync.ps1 b/eng/common/vmr-sync.ps1 new file mode 100644 index 00000000000..97302f3205b --- /dev/null +++ b/eng/common/vmr-sync.ps1 @@ -0,0 +1,138 @@ +<# +.SYNOPSIS + +This script is used for synchronizing the current repository into a local VMR. +It pulls the current repository's code into the specified VMR directory for local testing or +Source-Build validation. + +.DESCRIPTION + +The tooling used for synchronization will clone the VMR repository into a temporary folder if +it does not already exist. These clones can be reused in future synchronizations, so it is +recommended to dedicate a folder for this to speed up re-runs. + +.EXAMPLE + Synchronize current repository into a local VMR: + ./vmr-sync.ps1 -vmrDir "$HOME/repos/dotnet" -tmpDir "$HOME/repos/tmp" + +.PARAMETER tmpDir +Required. Path to the temporary folder where repositories will be cloned + +.PARAMETER vmrBranch +Optional. Branch of the 'dotnet/dotnet' repo to synchronize. The VMR will be checked out to this branch + +.PARAMETER azdevPat +Optional. Azure DevOps PAT to use for cloning private repositories. + +.PARAMETER vmrDir +Optional. Path to the dotnet/dotnet repository. When null, gets cloned to the temporary folder + +.PARAMETER debugOutput +Optional. Enables debug logging in the darc vmr command. + +.PARAMETER ci +Optional. Denotes that the script is running in a CI environment. +#> +param ( + [Parameter(Mandatory=$true, HelpMessage="Path to the temporary folder where repositories will be cloned")] + [string][Alias('t', 'tmp')]$tmpDir, + [string][Alias('b', 'branch')]$vmrBranch, + [string]$remote, + [string]$azdevPat, + [string][Alias('v', 'vmr')]$vmrDir, + [switch]$ci, + [switch]$debugOutput +) + +function Fail { + Write-Host "> $($args[0])" -ForegroundColor 'Red' +} + +function Highlight { + Write-Host "> $($args[0])" -ForegroundColor 'Cyan' +} + +$verbosity = 'verbose' +if ($debugOutput) { + $verbosity = 'debug' +} +# Validation + +if (-not $tmpDir) { + Fail "Missing -tmpDir argument. Please specify the path to the temporary folder where the repositories will be cloned" + exit 1 +} + +# Sanitize the input + +if (-not $vmrDir) { + $vmrDir = Join-Path $tmpDir 'dotnet' +} + +if (-not (Test-Path -Path $tmpDir -PathType Container)) { + New-Item -ItemType Directory -Path $tmpDir | Out-Null +} + +# Prepare the VMR + +if (-not (Test-Path -Path $vmrDir -PathType Container)) { + Highlight "Cloning 'dotnet/dotnet' into $vmrDir.." + git clone https://github.com/dotnet/dotnet $vmrDir + + if ($vmrBranch) { + git -C $vmrDir switch -c $vmrBranch + } +} +else { + if ((git -C $vmrDir diff --quiet) -eq $false) { + Fail "There are changes in the working tree of $vmrDir. Please commit or stash your changes" + exit 1 + } + + if ($vmrBranch) { + Highlight "Preparing $vmrDir" + git -C $vmrDir checkout $vmrBranch + git -C $vmrDir pull + } +} + +Set-StrictMode -Version Latest + +# Prepare darc + +Highlight 'Installing .NET, preparing the tooling..' +. .\eng\common\tools.ps1 +$dotnetRoot = InitializeDotNetCli -install:$true +$darc = Get-Darc +$dotnet = "$dotnetRoot\dotnet.exe" + +Highlight "Starting the synchronization of VMR.." + +# Synchronize the VMR +$darcArgs = ( + "vmr", "forwardflow", + "--tmp", $tmpDir, + "--$verbosity", + $vmrDir +) + +if ($ci) { + $darcArgs += ("--ci") +} + +if ($azdevPat) { + $darcArgs += ("--azdev-pat", $azdevPat) +} + +& "$darc" $darcArgs + +if ($LASTEXITCODE -eq 0) { + Highlight "Synchronization succeeded" +} +else { + Fail "Synchronization of repo to VMR failed!" + Fail "'$vmrDir' is left in its last state (re-run of this script will reset it)." + Fail "Please inspect the logs which contain path to the failing patch file (use -debugOutput to get all the details)." + Fail "Once you make changes to the conflicting VMR patch, commit it locally and re-run this script." + exit 1 +} diff --git a/eng/common/vmr-sync.sh b/eng/common/vmr-sync.sh new file mode 100644 index 00000000000..44239e331c0 --- /dev/null +++ b/eng/common/vmr-sync.sh @@ -0,0 +1,207 @@ +#!/bin/bash + +### This script is used for synchronizing the current repository into a local VMR. +### It pulls the current repository's code into the specified VMR directory for local testing or +### Source-Build validation. +### +### The tooling used for synchronization will clone the VMR repository into a temporary folder if +### it does not already exist. These clones can be reused in future synchronizations, so it is +### recommended to dedicate a folder for this to speed up re-runs. +### +### USAGE: +### Synchronize current repository into a local VMR: +### ./vmr-sync.sh --tmp "$HOME/repos/tmp" "$HOME/repos/dotnet" +### +### Options: +### -t, --tmp, --tmp-dir PATH +### Required. Path to the temporary folder where repositories will be cloned +### +### -b, --branch, --vmr-branch BRANCH_NAME +### Optional. Branch of the 'dotnet/dotnet' repo to synchronize. The VMR will be checked out to this branch +### +### --debug +### Optional. Turns on the most verbose logging for the VMR tooling +### +### --remote name:URI +### Optional. Additional remote to use during the synchronization +### This can be used to synchronize to a commit from a fork of the repository +### Example: 'runtime:https://github.com/yourfork/runtime' +### +### --azdev-pat +### Optional. Azure DevOps PAT to use for cloning private repositories. +### +### -v, --vmr, --vmr-dir PATH +### Optional. Path to the dotnet/dotnet repository. When null, gets cloned to the temporary folder + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +function print_help () { + sed -n '/^### /,/^$/p' "$source" | cut -b 5- +} + +COLOR_RED=$(tput setaf 1 2>/dev/null || true) +COLOR_CYAN=$(tput setaf 6 2>/dev/null || true) +COLOR_CLEAR=$(tput sgr0 2>/dev/null || true) +COLOR_RESET=uniquesearchablestring +FAILURE_PREFIX='> ' + +function fail () { + echo "${COLOR_RED}$FAILURE_PREFIX${1//${COLOR_RESET}/${COLOR_RED}}${COLOR_CLEAR}" >&2 +} + +function highlight () { + echo "${COLOR_CYAN}$FAILURE_PREFIX${1//${COLOR_RESET}/${COLOR_CYAN}}${COLOR_CLEAR}" +} + +tmp_dir='' +vmr_dir='' +vmr_branch='' +additional_remotes='' +verbosity=verbose +azdev_pat='' +ci=false + +while [[ $# -gt 0 ]]; do + opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" + case "$opt" in + -t|--tmp|--tmp-dir) + tmp_dir=$2 + shift + ;; + -v|--vmr|--vmr-dir) + vmr_dir=$2 + shift + ;; + -b|--branch|--vmr-branch) + vmr_branch=$2 + shift + ;; + --remote) + additional_remotes="$additional_remotes $2" + shift + ;; + --azdev-pat) + azdev_pat=$2 + shift + ;; + --ci) + ci=true + ;; + -d|--debug) + verbosity=debug + ;; + -h|--help) + print_help + exit 0 + ;; + *) + fail "Invalid argument: $1" + print_help + exit 1 + ;; + esac + + shift +done + +# Validation + +if [[ -z "$tmp_dir" ]]; then + fail "Missing --tmp-dir argument. Please specify the path to the temporary folder where the repositories will be cloned" + exit 1 +fi + +# Sanitize the input + +if [[ -z "$vmr_dir" ]]; then + vmr_dir="$tmp_dir/dotnet" +fi + +if [[ ! -d "$tmp_dir" ]]; then + mkdir -p "$tmp_dir" +fi + +if [[ "$verbosity" == "debug" ]]; then + set -x +fi + +# Prepare the VMR + +if [[ ! -d "$vmr_dir" ]]; then + highlight "Cloning 'dotnet/dotnet' into $vmr_dir.." + git clone https://github.com/dotnet/dotnet "$vmr_dir" + + if [[ -n "$vmr_branch" ]]; then + git -C "$vmr_dir" switch -c "$vmr_branch" + fi +else + if ! git -C "$vmr_dir" diff --quiet; then + fail "There are changes in the working tree of $vmr_dir. Please commit or stash your changes" + exit 1 + fi + + if [[ -n "$vmr_branch" ]]; then + highlight "Preparing $vmr_dir" + git -C "$vmr_dir" checkout "$vmr_branch" + git -C "$vmr_dir" pull + fi +fi + +set -e + +# Prepare darc + +highlight 'Installing .NET, preparing the tooling..' +source "./eng/common/tools.sh" +InitializeDotNetCli true +GetDarc +dotnetDir=$( cd ./.dotnet/; pwd -P ) +dotnet=$dotnetDir/dotnet + +highlight "Starting the synchronization of VMR.." +set +e + +if [[ -n "$additional_remotes" ]]; then + additional_remotes="--additional-remotes $additional_remotes" +fi + +if [[ -n "$azdev_pat" ]]; then + azdev_pat="--azdev-pat $azdev_pat" +fi + +ci_arg='' +if [[ "$ci" == "true" ]]; then + ci_arg="--ci" +fi + +# Synchronize the VMR + +export DOTNET_ROOT="$dotnetDir" + +"$darc_tool" vmr forwardflow \ + --tmp "$tmp_dir" \ + $azdev_pat \ + --$verbosity \ + $ci_arg \ + $additional_remotes \ + "$vmr_dir" + +if [[ $? == 0 ]]; then + highlight "Synchronization succeeded" +else + fail "Synchronization of repo to VMR failed!" + fail "'$vmr_dir' is left in its last state (re-run of this script will reset it)." + fail "Please inspect the logs which contain path to the failing patch file (use --debug to get all the details)." + fail "Once you make changes to the conflicting VMR patch, commit it locally and re-run this script." + exit 1 +fi diff --git a/eng/config/PublishData.json b/eng/config/PublishData.json index e84cd863d6c..90226108cda 100644 --- a/eng/config/PublishData.json +++ b/eng/config/PublishData.json @@ -4,20 +4,6 @@ }, "packages": { "default": { - "rzls": "vs-impl", - "rzls.alpine-arm64": "vs-impl", - "rzls.alpine-x64": "vs-impl", - "rzls.linux-arm64": "vs-impl", - "rzls.linux-x64": "vs-impl", - "rzls.linux-musl-x64": "vs-impl", - "rzls.linux-musl-arm64": "vs-impl", - "rzls.neutral": "vs-impl", - "rzls.osx-arm64": "vs-impl", - "rzls.osx-x64": "vs-impl", - "rzls.win-arm64": "vs-impl", - "rzls.win-x64": "vs-impl", - "rzls.win-x86": "vs-impl", - "Microsoft.VisualStudio.DevKit.Razor": "vs-impl", "Microsoft.VisualStudioCode.RazorExtension": "vs-impl" } }, @@ -27,7 +13,7 @@ "Shipping", "NonShipping" ], - "vsBranch": "rel/d18.3", + "vsBranch": "main", "insertionCreateDraftPR": false, "insertionTitlePrefix": "[d18.3]" } diff --git a/eng/pipelines/test-integration-job.yml b/eng/pipelines/test-integration-job.yml index fc006cecb9e..29feafdd32e 100644 --- a/eng/pipelines/test-integration-job.yml +++ b/eng/pipelines/test-integration-job.yml @@ -139,11 +139,11 @@ steps: continueOnError: true condition: always() - - task: PublishBuildArtifacts@1 + - task: PublishPipelineArtifact@1 displayName: Publish Logs inputs: - PathtoPublish: '$(Build.SourcesDirectory)\artifacts\log\${{ parameters.configuration }}' + targetPath: '$(Build.SourcesDirectory)\artifacts\log\${{ parameters.configuration }}' + publishLocation: 'pipeline' ArtifactName: '$(System.JobAttempt)-Logs ${{ parameters.configuration }} $(Build.BuildNumber)' - publishLocation: Container continueOnError: true condition: always() diff --git a/eng/scripts/PublicApi/README.md b/eng/scripts/PublicApi/README.md new file mode 100644 index 00000000000..1c9e514178b --- /dev/null +++ b/eng/scripts/PublicApi/README.md @@ -0,0 +1,12 @@ +Mark Shipped Tool +======== + +This tool should be run after every supported release that has API changes. It will +merge the collection of PublicApi.Shipped.txt files with the PublicApi.Unshipped.txt +versions. This will take into account `*REMOVED*` elements when updating the files. + +Usage: + +``` cmd +mark-shipped.cmd +``` diff --git a/eng/scripts/PublicApi/mark-shipped.cmd b/eng/scripts/PublicApi/mark-shipped.cmd new file mode 100644 index 00000000000..b14abba2781 --- /dev/null +++ b/eng/scripts/PublicApi/mark-shipped.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -noprofile -executionPolicy RemoteSigned -file "%~dp0\mark-shipped.ps1" diff --git a/eng/scripts/PublicApi/mark-shipped.ps1 b/eng/scripts/PublicApi/mark-shipped.ps1 new file mode 100644 index 00000000000..19a3e1c5b7f --- /dev/null +++ b/eng/scripts/PublicApi/mark-shipped.ps1 @@ -0,0 +1,51 @@ +[CmdletBinding(PositionalBinding=$false)] +param () + +Set-StrictMode -version 2.0 +$ErrorActionPreference = "Stop" + +function MarkShipped([string]$dir) { + $shippedFilePath = Join-Path $dir "PublicAPI.Shipped.txt" + $shipped = Get-Content $shippedFilePath + if ($null -eq $shipped) { + $shipped = @() + } + + $unshippedFilePath = Join-Path $dir "PublicAPI.Unshipped.txt" + $unshipped = Get-Content $unshippedFilePath + $removed = @() + $removedPrefix = "*REMOVED*"; + Write-Host "Processing $dir" + + foreach ($item in $unshipped) { + if ($item.Length -gt 0) { + if ($item.StartsWith($removedPrefix)) { + $item = $item.Substring($removedPrefix.Length) + $removed += $item + } + else { + $shipped += $item + } + } + } + + $shipped | Sort-Object | ?{ -not $removed.Contains($_) } | Out-File $shippedFilePath -Encoding Ascii + "" | Out-File $unshippedFilePath -Encoding Ascii +} + +try { + Push-Location (Join-Path $PSScriptRoot "..\..\..\") + + foreach ($file in Get-ChildItem -re -in "PublicApi.Shipped.txt") { + $dir = Split-Path -parent $file + MarkShipped $dir + } +} +catch { + Write-Host $_ + Write-Host $_.Exception + exit 1 +} +finally { + Pop-Location +} diff --git a/eng/targets/Services.props b/eng/targets/Services.props index f9ece639103..bcc456f3a5e 100644 --- a/eng/targets/Services.props +++ b/eng/targets/Services.props @@ -44,5 +44,6 @@ + diff --git a/global.json b/global.json index 3707d029d4a..1367f812001 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "tools": { - "dotnet": "9.0.111", + "dotnet": "10.0.101", "runtimes": { "dotnet": [ "2.1.30", @@ -16,12 +16,12 @@ } }, "sdk": { - "version": "9.0.111", + "version": "10.0.101", "allowPrerelease": false, "rollForward": "latestPatch" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.25462.4", + "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25626.5", "Microsoft.Build.NoTargets": "3.7.0" } } diff --git a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ViewComponentTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ViewComponentTagHelperProducerTest.cs similarity index 81% rename from src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ViewComponentTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ViewComponentTagHelperProducerTest.cs index 36326fbd5f2..d75bf5e6e1b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ViewComponentTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ViewComponentTagHelperProducerTest.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X; // This is just a basic integration test. There are detailed tests for the VCTH visitor and descriptor factory. -public class ViewComponentTagHelperDescriptorProviderTest +public class ViewComponentTagHelperProducerTest { [Fact] public void DescriptorProvider_FindsVCTH() @@ -24,12 +24,13 @@ public class StringParameterViewComponent var compilation = MvcShim.BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(code)); - var context = new TagHelperDescriptorProviderContext(compilation); - - var provider = new ViewComponentTagHelperDescriptorProvider() + var projectEngine = RazorProjectEngine.CreateEmpty(static b => { - Engine = RazorProjectEngine.CreateEmpty().Engine, - }; + b.Features.Add(new ViewComponentTagHelperProducer.Factory()); + b.Features.Add(new TagHelperDiscoveryService()); + }); + + Assert.True(projectEngine.Engine.TryGetFeature(out ITagHelperDiscoveryService? service)); var expectedDescriptor = TagHelperDescriptorBuilder.CreateViewComponent("__Generated__StringParameterViewComponentTagHelper", TestCompilation.AssemblyName) .TypeName("__Generated__StringParameterViewComponentTagHelper") @@ -55,9 +56,9 @@ public class StringParameterViewComponent .Build(); // Act - provider.Execute(context); + var result = service.GetTagHelpers(compilation); // Assert - Assert.Single(context.Results, d => d.Equals(expectedDescriptor)); + Assert.Single(result, d => d.Equals(expectedDescriptor)); } } diff --git a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/IntegrationTests/InstrumentationPassIntegrationTest.cs b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/IntegrationTests/InstrumentationPassIntegrationTest.cs index 77a5e4f75a1..322997c72f2 100644 --- a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/IntegrationTests/InstrumentationPassIntegrationTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/IntegrationTests/InstrumentationPassIntegrationTest.cs @@ -31,36 +31,36 @@ public InstrumentationPassIntegrationTest() public void BasicTest() { // Arrange - var descriptors = new[] - { - CreateTagHelperDescriptor( - tagName: "p", - typeName: "PTagHelper", - assemblyName: "TestAssembly"), - CreateTagHelperDescriptor( - tagName: "form", - typeName: "FormTagHelper", - assemblyName: "TestAssembly"), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "InputTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => builder - .Name("value") - .PropertyName("FooProp") - .TypeName("System.String"), // Gets preallocated - builder => builder - .Name("date") - .PropertyName("BarProp") - .TypeName("System.DateTime"), // Doesn't get preallocated - }) - }; + TagHelperCollection tagHelpers = + [ + CreateTagHelperDescriptor( + tagName: "p", + typeName: "PTagHelper", + assemblyName: "TestAssembly"), + CreateTagHelperDescriptor( + tagName: "form", + typeName: "FormTagHelper", + assemblyName: "TestAssembly"), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "InputTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => builder + .Name("value") + .PropertyName("FooProp") + .TypeName("System.String"), // Gets preallocated + builder => builder + .Name("date") + .PropertyName("BarProp") + .TypeName("System.DateTime"), // Doesn't get preallocated + ]) + ]; var engine = CreateProjectEngine(b => { - b.AddTagHelpers(descriptors); + b.SetTagHelpers(tagHelpers); b.Features.Add(new InstrumentationPass()); // This test includes templates diff --git a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/ViewComponentTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/ViewComponentTagHelperProducerTest.cs similarity index 81% rename from src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/ViewComponentTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/ViewComponentTagHelperProducerTest.cs index b2be4c917f8..e0e351794eb 100644 --- a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/ViewComponentTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/ViewComponentTagHelperProducerTest.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X; // This is just a basic integration test. There are detailed tests for the VCTH visitor and descriptor factory. -public class ViewComponentTagHelperDescriptorProviderTest +public class ViewComponentTagHelperProducerTest { [Fact] public void DescriptorProvider_FindsVCTH() @@ -24,12 +24,13 @@ public class StringParameterViewComponent var compilation = MvcShim.BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(code)); - var context = new TagHelperDescriptorProviderContext(compilation); - - var provider = new ViewComponentTagHelperDescriptorProvider() + var projectEngine = RazorProjectEngine.CreateEmpty(static b => { - Engine = RazorProjectEngine.CreateEmpty().Engine, - }; + b.Features.Add(new ViewComponentTagHelperProducer.Factory()); + b.Features.Add(new TagHelperDiscoveryService()); + }); + + Assert.True(projectEngine.Engine.TryGetFeature(out ITagHelperDiscoveryService? service)); var expectedDescriptor = TagHelperDescriptorBuilder.CreateViewComponent("__Generated__StringParameterViewComponentTagHelper", TestCompilation.AssemblyName) .TypeName("__Generated__StringParameterViewComponentTagHelper") @@ -55,9 +56,9 @@ public class StringParameterViewComponent .Build(); // Act - provider.Execute(context); + var result = service.GetTagHelpers(compilation); // Assert - Assert.Single(context.Results, d => d.Equals(expectedDescriptor)); + Assert.Single(result, d => d.Equals(expectedDescriptor)); } } diff --git a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/IntegrationTests/CodeGenerationIntegrationTest.cs b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/IntegrationTests/CodeGenerationIntegrationTest.cs index ed1b48402d4..01c1f17d866 100644 --- a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/IntegrationTests/CodeGenerationIntegrationTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/IntegrationTests/CodeGenerationIntegrationTest.cs @@ -941,7 +941,7 @@ public void UsingDirectives_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -961,7 +961,7 @@ public void InvalidNamespaceAtEOF_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -989,7 +989,7 @@ public class MyService // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1028,7 +1028,7 @@ public class MyModel // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1066,7 +1066,7 @@ public class MyModel // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1088,7 +1088,7 @@ @attribute [Serializable] // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1108,7 +1108,7 @@ public void MalformedPageDirective_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1128,7 +1128,7 @@ public void Basic_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1145,7 +1145,7 @@ public void BasicComponent_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1171,7 +1171,7 @@ public class InputTestTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelpe // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1188,7 +1188,7 @@ public void _ViewImports_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1214,7 +1214,7 @@ public class MyApp // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1249,7 +1249,7 @@ public class MyApp // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1285,7 +1285,7 @@ public class MyService // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1302,7 +1302,7 @@ public void Model_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1327,7 +1327,7 @@ public class ThisShouldBeGenerated // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1356,7 +1356,7 @@ public class InputTestTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelpe // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1380,7 +1380,7 @@ public class DivTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1397,7 +1397,7 @@ public void RazorPagesWithRouteTemplate_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1421,7 +1421,7 @@ public class DivTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1438,7 +1438,7 @@ public void PageWithNamespace_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1455,7 +1455,7 @@ public void ViewWithNamespace_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1488,7 +1488,7 @@ public class AllTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1505,7 +1505,7 @@ public void RazorPageWithNoLeadingPageDirective_DesignTime() // Assert AssertDocumentNodeMatchesBaseline(compiled.CodeDocument.GetDocumentNode()); - AssertHtmlDocumentMatchesBaseline(compiled.CodeDocument.GetHtmlDocument()); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(compiled.CodeDocument)); AssertCSharpDocumentMatchesBaseline(compiled.CodeDocument.GetCSharpDocument()); AssertLinePragmas(compiled.CodeDocument); AssertSourceMappingsMatchBaseline(compiled.CodeDocument); @@ -1604,7 +1604,7 @@ @using TestNamespace // Assert AssertDocumentNodeMatchesBaseline(generated.CodeDocument.GetDocumentNode(), testName: testName); - AssertHtmlDocumentMatchesBaseline(generated.CodeDocument.GetHtmlDocument(), testName: testName); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(generated.CodeDocument), testName: testName); AssertCSharpDocumentMatchesBaseline(generated.CodeDocument.GetCSharpDocument(), testName: testName); AssertLinePragmas(generated.CodeDocument); AssertSourceMappingsMatchBaseline(generated.CodeDocument, testName: testName); diff --git a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/ViewComponentTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/ViewComponentTagHelperProducerTest.cs similarity index 81% rename from src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/ViewComponentTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/ViewComponentTagHelperProducerTest.cs index d3698f54345..b51e057fcf7 100644 --- a/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/ViewComponentTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/ViewComponentTagHelperProducerTest.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions; // This is just a basic integration test. There are detailed tests for the VCTH visitor and descriptor factory. -public class ViewComponentTagHelperDescriptorProviderTest +public class ViewComponentTagHelperProducerTest { [Fact] public void DescriptorProvider_FindsVCTH() @@ -24,12 +24,13 @@ public class StringParameterViewComponent var compilation = TestCompilation.Create().AddSyntaxTrees(CSharpSyntaxTree.ParseText(code)); - var context = new TagHelperDescriptorProviderContext(compilation); - - var provider = new ViewComponentTagHelperDescriptorProvider() + var projectEngine = RazorProjectEngine.CreateEmpty(static b => { - Engine = RazorProjectEngine.CreateEmpty().Engine, - }; + b.Features.Add(new ViewComponentTagHelperProducer.Factory()); + b.Features.Add(new TagHelperDiscoveryService()); + }); + + Assert.True(projectEngine.Engine.TryGetFeature(out ITagHelperDiscoveryService? service)); var expectedDescriptor = TagHelperDescriptorBuilder.CreateViewComponent("__Generated__StringParameterViewComponentTagHelper", TestCompilation.AssemblyName) .TypeName("__Generated__StringParameterViewComponentTagHelper") @@ -55,9 +56,9 @@ public class StringParameterViewComponent .Build(); // Act - provider.Execute(context); + var result = service.GetTagHelpers(compilation); // Assert - Assert.Single(context.Results, d => d.Equals(expectedDescriptor)); + Assert.Single(result, d => d.Equals(expectedDescriptor)); } } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperBlockRewriterTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperBlockRewriterTest.cs index 0f8aaf1d83e..6ffcfd2aa46 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperBlockRewriterTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperBlockRewriterTest.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Globalization; using Microsoft.AspNetCore.Razor.Language.Components; using Xunit; @@ -12,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy; public class TagHelperBlockRewriterTest : TagHelperRewritingTestBase { - public static ImmutableArray SymbolBoundAttributes_Descriptors = + public static readonly TagHelperCollection SymbolBoundAttributes_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("CatchAllTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -48,46 +47,46 @@ public class TagHelperBlockRewriterTest : TagHelperRewritingTestBase [Fact] public void CanHandleSymbolBoundAttributes1() { - EvaluateData(SymbolBoundAttributes_Descriptors, "
    "); + EvaluateData(SymbolBoundAttributes_TagHelpers, "
      "); } [Fact] public void CanHandleSymbolBoundAttributes2() { - EvaluateData(SymbolBoundAttributes_Descriptors, "
        "); + EvaluateData(SymbolBoundAttributes_TagHelpers, "
          "); } [Fact] public void CanHandleSymbolBoundAttributes3() { - EvaluateData(SymbolBoundAttributes_Descriptors, ""); + EvaluateData(SymbolBoundAttributes_TagHelpers, ""); } [Fact] public void CanHandleSymbolBoundAttributes4() { - EvaluateData(SymbolBoundAttributes_Descriptors, ""); + EvaluateData(SymbolBoundAttributes_TagHelpers, ""); } [Fact] public void CanHandleSymbolBoundAttributes5() { - EvaluateData(SymbolBoundAttributes_Descriptors, ""); + EvaluateData(SymbolBoundAttributes_TagHelpers, ""); } [Fact] public void CanHandleSymbolBoundAttributes6() { - EvaluateData(SymbolBoundAttributes_Descriptors, "
          "); + EvaluateData(SymbolBoundAttributes_TagHelpers, "
          "); } [Fact] public void CanHandleSymbolBoundAttributes7() { - EvaluateData(SymbolBoundAttributes_Descriptors, "
          "); + EvaluateData(SymbolBoundAttributes_TagHelpers, "
          "); } - public static ImmutableArray WithoutEndTag_Descriptors = + public static readonly TagHelperCollection WithoutEndTag_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -99,34 +98,34 @@ public void CanHandleSymbolBoundAttributes7() [Fact] public void CanHandleWithoutEndTagTagStructure1() { - EvaluateData(WithoutEndTag_Descriptors, ""); + EvaluateData(WithoutEndTag_TagHelpers, ""); } [Fact] public void CanHandleWithoutEndTagTagStructure2() { - EvaluateData(WithoutEndTag_Descriptors, ""); + EvaluateData(WithoutEndTag_TagHelpers, ""); } [Fact] public void CanHandleWithoutEndTagTagStructure3() { - EvaluateData(WithoutEndTag_Descriptors, ""); + EvaluateData(WithoutEndTag_TagHelpers, ""); } [Fact] public void CanHandleWithoutEndTagTagStructure4() { - EvaluateData(WithoutEndTag_Descriptors, ""); + EvaluateData(WithoutEndTag_TagHelpers, ""); } [Fact] public void CanHandleWithoutEndTagTagStructure5() { - EvaluateData(WithoutEndTag_Descriptors, "
          "); + EvaluateData(WithoutEndTag_TagHelpers, "
          "); } - public static ImmutableArray GetTagStructureCompatibilityDescriptors(TagStructure structure1, TagStructure structure2) + public static TagHelperCollection GetTagStructureCompatibilityTagHelpers(TagStructure structure1, TagStructure structure2) { return [ @@ -147,87 +146,87 @@ public static ImmutableArray GetTagStructureCompatibilityDe public void AllowsCompatibleTagStructures1() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.Unspecified); + var tagHelpers = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.Unspecified); // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures2() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.Unspecified); + var tagHelpers = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.Unspecified); // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures3() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.WithoutEndTag); + var tagHelpers = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.WithoutEndTag); // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures4() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.WithoutEndTag, TagStructure.WithoutEndTag); + var tagHelpers = GetTagStructureCompatibilityTagHelpers(TagStructure.WithoutEndTag, TagStructure.WithoutEndTag); // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures5() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.NormalOrSelfClosing); + var tagHelpers = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.NormalOrSelfClosing); // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures6() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.WithoutEndTag); + var tagHelpers = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.WithoutEndTag); // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures7() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.NormalOrSelfClosing, TagStructure.Unspecified); + var tagHelpers = GetTagStructureCompatibilityTagHelpers(TagStructure.NormalOrSelfClosing, TagStructure.Unspecified); // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures8() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.WithoutEndTag, TagStructure.Unspecified); + var tagHelpers = GetTagStructureCompatibilityTagHelpers(TagStructure.WithoutEndTag, TagStructure.Unspecified); // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures_DirectiveAttribute_SelfClosing() { // Arrange - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateEventHandler("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -239,14 +238,14 @@ public void AllowsCompatibleTagStructures_DirectiveAttribute_SelfClosing() ]; // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] public void AllowsCompatibleTagStructures_DirectiveAttribute_Void() { // Arrange - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateEventHandler("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -258,7 +257,7 @@ public void AllowsCompatibleTagStructures_DirectiveAttribute_Void() ]; // Act & Assert - EvaluateData(descriptors, ""); + EvaluateData(tagHelpers, ""); } [Fact] @@ -429,7 +428,7 @@ public void CreatesErrorForMalformedTagHelper8() RunParseTreeRewriterTest("

          ", "strong", "p"); } - public static ImmutableArray CodeTagHelperAttributes_Descriptors = + public static readonly TagHelperCollection CodeTagHelperAttributes_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PersonTagHelper", "personAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("person")) @@ -451,79 +450,79 @@ public void CreatesErrorForMalformedTagHelper8() [Fact] public void UnderstandsMultipartNonStringTagHelperAttributes() { - EvaluateData(CodeTagHelperAttributes_Descriptors, " 123)()\" />"); + EvaluateData(CodeTagHelperAttributes_TagHelpers, " 123)()\" />"); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes1() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes2() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes3() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes4() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes5() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes6() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes7() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes8() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes9() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes10() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes11() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes12() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] @@ -838,7 +837,7 @@ public void UnderstandsEmptyAttributeTagHelpers5() RunParseTreeRewriterTest("

          ", "p"); } - public static ImmutableArray EmptyTagHelperBoundAttribute_Descriptors = + public static readonly TagHelperCollection EmptyTagHelperBoundAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("mythTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("myth")) @@ -856,85 +855,85 @@ public void UnderstandsEmptyAttributeTagHelpers5() [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes1() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes2() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes3() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes4() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes5() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes6() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes7() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes8() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes9() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes10() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes11() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes12() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes13() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes14() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] @@ -1250,7 +1249,7 @@ public void GeneratesExpectedOutputForUnboundDataDashAttributes_Block7() RunParseTreeRewriterTest(document, "input"); } - public static ImmutableArray MinimizedAttribute_Descriptors = + public static readonly TagHelperCollection MinimizedAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -1306,7 +1305,7 @@ public void UnderstandsMinimizedAttributes_Document1() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1316,7 +1315,7 @@ public void UnderstandsMinimizedAttributes_Document2() var document = "

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1326,7 +1325,7 @@ public void UnderstandsMinimizedAttributes_Document3() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1336,7 +1335,7 @@ public void UnderstandsMinimizedAttributes_Document4() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1346,7 +1345,7 @@ public void UnderstandsMinimizedAttributes_Document5() var document = "

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1356,7 +1355,7 @@ public void UnderstandsMinimizedAttributes_Document6() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1366,7 +1365,7 @@ public void UnderstandsMinimizedAttributes_Document7() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1376,7 +1375,7 @@ public void UnderstandsMinimizedAttributes_Document8() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1386,7 +1385,7 @@ public void UnderstandsMinimizedAttributes_Document9() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1396,7 +1395,7 @@ public void UnderstandsMinimizedAttributes_Document10() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1406,7 +1405,7 @@ public void UnderstandsMinimizedAttributes_Document11() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1416,7 +1415,7 @@ public void UnderstandsMinimizedAttributes_Document12() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1426,7 +1425,7 @@ public void UnderstandsMinimizedAttributes_Document13() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1436,7 +1435,7 @@ public void UnderstandsMinimizedAttributes_Document14() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1446,7 +1445,7 @@ public void UnderstandsMinimizedAttributes_Document15() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1456,7 +1455,7 @@ public void UnderstandsMinimizedAttributes_Document16() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1466,7 +1465,7 @@ public void UnderstandsMinimizedAttributes_Document17() var document = "

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1476,7 +1475,7 @@ public void UnderstandsMinimizedAttributes_Document18() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1486,7 +1485,7 @@ public void UnderstandsMinimizedAttributes_Document19() var document = "

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1496,7 +1495,7 @@ public void UnderstandsMinimizedAttributes_Document20() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1506,7 +1505,7 @@ public void UnderstandsMinimizedAttributes_Document21() var document = "

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1516,7 +1515,7 @@ public void UnderstandsMinimizedAttributes_Document22() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1526,7 +1525,7 @@ public void UnderstandsMinimizedAttributes_Document23() var document = "

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1536,7 +1535,7 @@ public void UnderstandsMinimizedAttributes_Document24() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1546,7 +1545,7 @@ public void UnderstandsMinimizedAttributes_Document25() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1556,7 +1555,7 @@ public void UnderstandsMinimizedAttributes_Document26() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1566,7 +1565,7 @@ public void UnderstandsMinimizedAttributes_Document27() var document = "

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1576,7 +1575,7 @@ public void UnderstandsMinimizedAttributes_Document28() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1586,7 +1585,7 @@ public void UnderstandsMinimizedAttributes_Document29() var document = "

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1597,7 +1596,7 @@ public void UnderstandsMinimizedAttributes_Document30() var document = $""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1608,7 +1607,7 @@ public void UnderstandsMinimizedAttributes_Document31() var document = $"

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1619,7 +1618,7 @@ public void UnderstandsMinimizedAttributes_Document32() var document = $""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1630,7 +1629,7 @@ public void UnderstandsMinimizedAttributes_Document33() var document = $"

          "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1643,7 +1642,7 @@ public void UnderstandsMinimizedAttributes_Block1() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1656,7 +1655,7 @@ public void UnderstandsMinimizedAttributes_Block2() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1669,7 +1668,7 @@ public void UnderstandsMinimizedAttributes_Block3() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1682,7 +1681,7 @@ public void UnderstandsMinimizedAttributes_Block4() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1695,7 +1694,7 @@ public void UnderstandsMinimizedAttributes_Block5() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1708,7 +1707,7 @@ public void UnderstandsMinimizedAttributes_Block6() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1721,7 +1720,7 @@ public void UnderstandsMinimizedAttributes_Block7() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1734,7 +1733,7 @@ public void UnderstandsMinimizedAttributes_Block8() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1747,7 +1746,7 @@ public void UnderstandsMinimizedAttributes_Block9() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1760,7 +1759,7 @@ public void UnderstandsMinimizedAttributes_Block10() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1773,7 +1772,7 @@ public void UnderstandsMinimizedAttributes_Block11() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1786,7 +1785,7 @@ public void UnderstandsMinimizedAttributes_Block12() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1799,7 +1798,7 @@ public void UnderstandsMinimizedAttributes_Block13() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1812,7 +1811,7 @@ public void UnderstandsMinimizedAttributes_Block14() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1825,7 +1824,7 @@ public void UnderstandsMinimizedAttributes_Block15() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1838,7 +1837,7 @@ public void UnderstandsMinimizedAttributes_Block16() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1851,7 +1850,7 @@ public void UnderstandsMinimizedAttributes_Block17() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1864,7 +1863,7 @@ public void UnderstandsMinimizedAttributes_Block18() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1877,7 +1876,7 @@ public void UnderstandsMinimizedAttributes_Block19() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1890,7 +1889,7 @@ public void UnderstandsMinimizedAttributes_Block20() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1903,7 +1902,7 @@ public void UnderstandsMinimizedAttributes_Block21() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1916,7 +1915,7 @@ public void UnderstandsMinimizedAttributes_Block22() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1929,7 +1928,7 @@ public void UnderstandsMinimizedAttributes_Block23() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1942,7 +1941,7 @@ public void UnderstandsMinimizedAttributes_Block24() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1955,7 +1954,7 @@ public void UnderstandsMinimizedAttributes_Block25() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1968,7 +1967,7 @@ public void UnderstandsMinimizedAttributes_Block26() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1981,7 +1980,7 @@ public void UnderstandsMinimizedAttributes_Block27() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1994,7 +1993,7 @@ public void UnderstandsMinimizedAttributes_Block28() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2007,7 +2006,7 @@ public void UnderstandsMinimizedAttributes_Block29() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2021,7 +2020,7 @@ public void UnderstandsMinimizedAttributes_Block30() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2035,7 +2034,7 @@ public void UnderstandsMinimizedAttributes_Block31() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2049,7 +2048,7 @@ public void UnderstandsMinimizedAttributes_Block32() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2063,55 +2062,55 @@ public void UnderstandsMinimizedAttributes_Block33() document = $$"""@{{{document}}}"""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] public void UnderstandsMinimizedAttributes_PartialTags1() { - EvaluateData(MinimizedAttribute_Descriptors, " descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -2137,7 +2136,7 @@ public void UnderstandsMinimizedBooleanBoundAttributes() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -2145,7 +2144,7 @@ public void FeatureDisabled_AddsErrorForMinimizedBooleanBoundAttributes() { // Arrange var document = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -2163,7 +2162,7 @@ public void FeatureDisabled_AddsErrorForMinimizedBooleanBoundAttributes() ]; // Act & Assert - EvaluateData(descriptors, document, languageVersion: RazorLanguageVersion.Version_2_0, fileKind: RazorFileKind.Legacy); + EvaluateData(tagHelpers, document, languageVersion: RazorLanguageVersion.Version_2_0, fileKind: RazorFileKind.Legacy); } [Fact] @@ -2171,7 +2170,7 @@ public void Rewrites_ComponentDirectiveAttributes() { // Arrange var document = @""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.Create(TagHelperKind.Bind, "Bind", ComponentsApi.AssemblyName) .TypeName( @@ -2204,7 +2203,7 @@ public void Rewrites_ComponentDirectiveAttributes() ]; // Act & Assert - EvaluateData(descriptors, document, configureParserOptions: builder => + EvaluateData(tagHelpers, document, configureParserOptions: builder => { builder.AllowCSharpInMarkupAttributeArea = false; }); @@ -2215,7 +2214,7 @@ public void Rewrites_MinimizedComponentDirectiveAttributes() { // Arrange var document = @""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.Create(TagHelperKind.Bind, "Bind", ComponentsApi.AssemblyName) .TypeName( @@ -2248,7 +2247,7 @@ public void Rewrites_MinimizedComponentDirectiveAttributes() ]; // Act & Assert - EvaluateData(descriptors, document, configureParserOptions: builder => + EvaluateData(tagHelpers, document, configureParserOptions: builder => { builder.AllowCSharpInMarkupAttributeArea = false; }); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperParseTreeRewriterTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperParseTreeRewriterTest.cs index b93f0cadbd5..bb03a301559 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperParseTreeRewriterTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperParseTreeRewriterTest.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; using Microsoft.AspNetCore.Razor.Language.Syntax; using Xunit; @@ -66,7 +65,7 @@ public void GetAttributeNameValuePairs_ParsesPairsCorrectly( Assert.Equal(expectedPairs, pairs); } - public static ImmutableArray PartialRequiredParentTags_Descriptors = + public static readonly TagHelperCollection PartialRequiredParentTags_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("StrongTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("strong")) @@ -84,45 +83,45 @@ public void GetAttributeNameValuePairs_ParsesPairsCorrectly( public void UnderstandsPartialRequiredParentTags1() { var document = "

          "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags2() { var document = "

          "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags3() { var document = "

          "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags4() { var document = "<

          <

          "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags5() { var document = "<

          <

          "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags6() { var document = "<

          <

          "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } - public static ImmutableArray NestedVoidSelfClosingRequiredParent_Descriptors = + public static readonly TagHelperCollection NestedVoidSelfClosingRequiredParent_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -142,7 +141,7 @@ public void UnderstandsPartialRequiredParentTags6() .Build(), ]; - public static ImmutableArray CatchAllAttribute_Descriptors = + public static readonly TagHelperCollection CatchAllAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateEventHandler("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -158,66 +157,66 @@ public void UnderstandsPartialRequiredParentTags6() public void UnderstandsInvalidHtml() { var document = @" {}"">Miscolored!"; - EvaluateData(CatchAllAttribute_Descriptors, document); + EvaluateData(CatchAllAttribute_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent1() { var document = ""; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent2() { var document = "

          "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent3() { var document = "


          "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent4() { var document = "


          "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent5() { var document = ""; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent6() { var document = "

          "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent7() { var document = "


          "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent8() { var document = "


          "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } - public static ImmutableArray NestedRequiredParent_Descriptors = + public static readonly TagHelperCollection NestedRequiredParent_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("StrongTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -238,35 +237,35 @@ public void UnderstandsNestedVoidSelfClosingRequiredParent8() public void UnderstandsNestedRequiredParent1() { var document = ""; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedRequiredParent2() { var document = "

          "; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedRequiredParent3() { var document = "
          "; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedRequiredParent4() { var document = ""; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedRequiredParent5() { var document = "

          "; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] @@ -274,7 +273,7 @@ public void UnderstandsTagHelperPrefixAndAllowedChildren() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -287,7 +286,7 @@ public void UnderstandsTagHelperPrefixAndAllowedChildren() // Act & Assert EvaluateData( - descriptors, + tagHelpers, documentContent, tagHelperPrefix: "th:"); } @@ -297,7 +296,7 @@ public void UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -310,7 +309,7 @@ public void UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent() // Act & Assert EvaluateData( - descriptors, + tagHelpers, documentContent, tagHelperPrefix: "th:"); } @@ -321,7 +320,7 @@ public void InvalidStructure_UnderstandsTHPrefixAndAllowedChildrenAndRequirePare // Rewrite_InvalidStructure_UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -334,7 +333,7 @@ public void InvalidStructure_UnderstandsTHPrefixAndAllowedChildrenAndRequirePare // Act & Assert EvaluateData( - descriptors, + tagHelpers, documentContent, tagHelperPrefix: "th:"); } @@ -344,7 +343,7 @@ public void NonTagHelperChild_UnderstandsTagHelperPrefixAndAllowedChildren() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -354,7 +353,7 @@ public void NonTagHelperChild_UnderstandsTagHelperPrefixAndAllowedChildren() // Act & Assert EvaluateData( - descriptors, + tagHelpers, documentContent, tagHelperPrefix: "th:"); } @@ -426,7 +425,7 @@ public void CanHandleInvalidChildrenWithWhitespace()

          """; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -435,7 +434,7 @@ public void CanHandleInvalidChildrenWithWhitespace() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -443,7 +442,7 @@ public void RecoversWhenRequiredAttributeMismatchAndRestrictedChildren() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("StrongTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -455,7 +454,7 @@ public void RecoversWhenRequiredAttributeMismatchAndRestrictedChildren() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -463,7 +462,7 @@ public void CanHandleMultipleTagHelpersWithAllowedChildren_OneNull() { // Arrange var documentContent = "

          Hello World

          "; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -485,7 +484,7 @@ public void CanHandleMultipleTagHelpersWithAllowedChildren_OneNull() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -493,7 +492,7 @@ public void CanHandleMultipleTagHelpersWithAllowedChildren() { // Arrange var documentContent = "

          Hello World

          "; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -515,7 +514,7 @@ public void CanHandleMultipleTagHelpersWithAllowedChildren() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -523,10 +522,10 @@ public void UnderstandsAllowedChildren1() { // Arrange var documentContent = "


          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["br"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["br"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -538,10 +537,10 @@ public void UnderstandsAllowedChildren2()

          """; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["br"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["br"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -549,10 +548,10 @@ public void UnderstandsAllowedChildren3() { // Arrange var documentContent = "


          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -560,10 +559,10 @@ public void UnderstandsAllowedChildren4() { // Arrange var documentContent = "

          Hello

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -571,10 +570,10 @@ public void UnderstandsAllowedChildren5() { // Arrange var documentContent = "


          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["br", "strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["br", "strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -582,10 +581,10 @@ public void UnderstandsAllowedChildren6() { // Arrange var documentContent = "


          Hello

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -593,10 +592,10 @@ public void UnderstandsAllowedChildren7() { // Arrange var documentContent = "

          Title:
          Something

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -604,10 +603,10 @@ public void UnderstandsAllowedChildren8() { // Arrange var documentContent = "

          Title:
          Something

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong", "br"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong", "br"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -615,10 +614,10 @@ public void UnderstandsAllowedChildren9() { // Arrange var documentContent = "

          Title:
          Something

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong", "br"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong", "br"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -626,10 +625,10 @@ public void UnderstandsAllowedChildren10() { // Arrange var documentContent = "

          Title:
          A Very Cool

          Something

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -637,10 +636,10 @@ public void UnderstandsAllowedChildren11() { // Arrange var documentContent = "

          Title:
          A Very Cool

          Something

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["custom"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["custom"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -648,10 +647,10 @@ public void UnderstandsAllowedChildren12() { // Arrange var documentContent = "

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["custom"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["custom"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -659,10 +658,10 @@ public void UnderstandsAllowedChildren13() { // Arrange var documentContent = "

          <

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["custom"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["custom"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -670,13 +669,13 @@ public void UnderstandsAllowedChildren14() { // Arrange var documentContent = "


          :Hello:

          "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["custom", "strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["custom", "strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } - private static ImmutableArray GetAllowedChildrenTagHelperDescriptors(string[] allowedChildren) + private static TagHelperCollection GetAllowedChildrenTagHelpers(string[] allowedChildren) { var pTagHelperBuilder = TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")); @@ -718,13 +717,13 @@ public void AllowsSimpleHtmlCommentsAsChildren() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -742,14 +741,14 @@ public void DoesntAllowSimpleHtmlCommentsAsChildrenWhenFeatureFlagIsOff() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert EvaluateData( - descriptors, + tagHelpers, document, languageVersion: RazorLanguageVersion.Version_2_0, fileKind: RazorFileKind.Legacy); @@ -772,13 +771,13 @@ public void FailsForContentWithCommentsAsChildren() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -797,13 +796,13 @@ public void AllowsRazorCommentsAsChildren() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -825,13 +824,13 @@ public void AllowsRazorMarkupInHtmlComment() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -839,7 +838,7 @@ public void UnderstandsNullTagNameWithAllowedChildrenForCatchAll() { // Arrange var documentContent = "

          "; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -851,7 +850,7 @@ public void UnderstandsNullTagNameWithAllowedChildrenForCatchAll() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -859,7 +858,7 @@ public void UnderstandsNullTagNameWithAllowedChildrenForCatchAllWithPrefix() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -871,7 +870,7 @@ public void UnderstandsNullTagNameWithAllowedChildrenForCatchAllWithPrefix() ]; // Act & Assert - EvaluateData(descriptors, documentContent, "th:"); + EvaluateData(tagHelpers, documentContent, "th:"); } [Fact] @@ -879,7 +878,7 @@ public void CanHandleStartTagOnlyTagTagMode() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -890,7 +889,7 @@ public void CanHandleStartTagOnlyTagTagMode() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -898,7 +897,7 @@ public void CreatesErrorForWithoutEndTagTagStructureForEndTags() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -909,7 +908,7 @@ public void CreatesErrorForWithoutEndTagTagStructureForEndTags() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -917,7 +916,7 @@ public void CreatesErrorForInconsistentTagStructures() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -934,10 +933,10 @@ public void CreatesErrorForInconsistentTagStructures() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } - public static ImmutableArray RequiredAttribute_Descriptors = + public static readonly TagHelperCollection RequiredAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("pTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -963,184 +962,184 @@ public void CreatesErrorForInconsistentTagStructures() [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1() { - EvaluateData(RequiredAttribute_Descriptors, "

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2() { - EvaluateData(RequiredAttribute_Descriptors, "

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3() { - EvaluateData(RequiredAttribute_Descriptors, "
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4() { - EvaluateData(RequiredAttribute_Descriptors, "
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5() { - EvaluateData(RequiredAttribute_Descriptors, "

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6() { - EvaluateData(RequiredAttribute_Descriptors, "

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7() { - EvaluateData(RequiredAttribute_Descriptors, "

          words and spaces

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          words and spaces

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8() { - EvaluateData(RequiredAttribute_Descriptors, "

          words and spaces

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          words and spaces

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9() { - EvaluateData(RequiredAttribute_Descriptors, "

          wordsandspaces

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          wordsandspaces

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10() { - EvaluateData(RequiredAttribute_Descriptors, ""); + EvaluateData(RequiredAttribute_TagHelpers, ""); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly11() { - EvaluateData(RequiredAttribute_Descriptors, ""); + EvaluateData(RequiredAttribute_TagHelpers, ""); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly12() { - EvaluateData(RequiredAttribute_Descriptors, "words and spaces"); + EvaluateData(RequiredAttribute_TagHelpers, "words and spaces"); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly13() { - EvaluateData(RequiredAttribute_Descriptors, "words and spaces"); + EvaluateData(RequiredAttribute_TagHelpers, "words and spaces"); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly14() { - EvaluateData(RequiredAttribute_Descriptors, "
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly15() { - EvaluateData(RequiredAttribute_Descriptors, "
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly16() { - EvaluateData(RequiredAttribute_Descriptors, "

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly17() { - EvaluateData(RequiredAttribute_Descriptors, "

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly18() { - EvaluateData(RequiredAttribute_Descriptors, "

          words and spaces

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          words and spaces

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19() { - EvaluateData(RequiredAttribute_Descriptors, "
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly20() { - EvaluateData(RequiredAttribute_Descriptors, "
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21() { - EvaluateData(RequiredAttribute_Descriptors, "
          words and spaces
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          words and spaces
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly22() { - EvaluateData(RequiredAttribute_Descriptors, "
          words and spaces
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          words and spaces
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23() { - EvaluateData(RequiredAttribute_Descriptors, "
          wordsandspaces
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          wordsandspaces
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly24() { - EvaluateData(RequiredAttribute_Descriptors, "

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly25() { - EvaluateData(RequiredAttribute_Descriptors, "

          words and spaces

          "); + EvaluateData(RequiredAttribute_TagHelpers, "

          words and spaces

          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26() { - EvaluateData(RequiredAttribute_Descriptors, "
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27() { - EvaluateData(RequiredAttribute_Descriptors, "
          words and spaces
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          words and spaces
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28() { - EvaluateData(RequiredAttribute_Descriptors, "
          words and spaces
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          words and spaces
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly29() { - EvaluateData(RequiredAttribute_Descriptors, "
          words and spaces
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          words and spaces
          "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30() { - EvaluateData(RequiredAttribute_Descriptors, "
          wordsandspaces
          "); + EvaluateData(RequiredAttribute_TagHelpers, "
          wordsandspaces
          "); } - public static ImmutableArray NestedRequiredAttribute_Descriptors = + public static readonly TagHelperCollection NestedRequiredAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("pTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -1159,64 +1158,64 @@ public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30() [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

          "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2() { - EvaluateData(NestedRequiredAttribute_Descriptors, ""); + EvaluateData(NestedRequiredAttribute_TagHelpers, ""); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

          "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

          "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

          "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

          "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

          "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8() { - EvaluateData(NestedRequiredAttribute_Descriptors, ""); + EvaluateData(NestedRequiredAttribute_TagHelpers, ""); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

          "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10() { - EvaluateData(NestedRequiredAttribute_Descriptors, ""); + EvaluateData(NestedRequiredAttribute_TagHelpers, ""); } - public static ImmutableArray MalformedRequiredAttribute_Descriptors = + public static readonly TagHelperCollection MalformedRequiredAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("pTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -1229,71 +1228,71 @@ public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10() [Fact] public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1() { - EvaluateData(MalformedRequiredAttribute_Descriptors, ""); + EvaluateData(MalformedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly8() { - EvaluateData(MalformedRequiredAttribute_Descriptors, "

          "); + EvaluateData(MalformedRequiredAttribute_TagHelpers, "

          "); } [Fact] public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly9() { - EvaluateData(MalformedRequiredAttribute_Descriptors, "

          PrefixedTagHelperColon_Descriptors = + public static readonly TagHelperCollection PrefixedTagHelperColon_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("mythTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("myth")) @@ -1308,7 +1307,7 @@ public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1 .Build() ]; - public static ImmutableArray PrefixedTagHelperCatchAll_Descriptors = + public static readonly TagHelperCollection PrefixedTagHelperCatchAll_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("mythTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) @@ -1318,67 +1317,67 @@ public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1 [Fact] public void AllowsPrefixedTagHelpers1() { - EvaluateData(PrefixedTagHelperCatchAll_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperCatchAll_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers2() { - EvaluateData(PrefixedTagHelperCatchAll_Descriptors, "words and spaces", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperCatchAll_TagHelpers, "words and spaces", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers3() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers4() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers5() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers6() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers7() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers8() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers9() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers10() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "words and spaces", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "words and spaces", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers11() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] @@ -1903,7 +1902,7 @@ public void HandlesNonTagHelperStartAndEndVoidTags_Correctly() RunParseTreeRewriterTest("Foo"); } - public static ImmutableArray CaseSensitive_Descriptors = + public static readonly TagHelperCollection CaseSensitive_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("pTagHelper", "SomeAssembly") .SetCaseSensitive() @@ -1928,30 +1927,30 @@ public void HandlesNonTagHelperStartAndEndVoidTags_Correctly() [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly1() { - EvaluateData(CaseSensitive_Descriptors, "

          "); + EvaluateData(CaseSensitive_TagHelpers, "

          "); } [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly2() { - EvaluateData(CaseSensitive_Descriptors, "

          "); + EvaluateData(CaseSensitive_TagHelpers, "

          "); } [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly3() { - EvaluateData(CaseSensitive_Descriptors, "

          "); + EvaluateData(CaseSensitive_TagHelpers, "

          "); } [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly4() { - EvaluateData(CaseSensitive_Descriptors, "

          "); + EvaluateData(CaseSensitive_TagHelpers, "

          "); } [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly5() { - EvaluateData(CaseSensitive_Descriptors, "

          "); + EvaluateData(CaseSensitive_TagHelpers, "

          "); } } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperRewritingTestBase.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperRewritingTestBase.cs index 84b85331014..06dc27ec4d4 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperRewritingTestBase.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/TagHelperRewritingTestBase.cs @@ -1,10 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - using System; -using System.Collections.Generic; using System.Collections.Immutable; using Xunit; @@ -12,39 +9,38 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy; public class TagHelperRewritingTestBase() : ParserTestBase(layer: TestProject.Layer.Compiler, validateSpanEditHandlers: true, useLegacyTokenizer: true) { - internal void RunParseTreeRewriterTest(string documentContent, params string[] tagNames) + internal void RunParseTreeRewriterTest(string documentContent, params ImmutableArray tagNames) { - var descriptors = BuildDescriptors(tagNames); + var tagHelpers = BuildTagHelpers(tagNames); - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } - internal ImmutableArray BuildDescriptors(params string[] tagNames) + internal static TagHelperCollection BuildTagHelpers(params ImmutableArray tagNames) { - var descriptors = new List(); - - foreach (var tagName in tagNames) + return TagHelperCollection.Build(tagNames, (ref builder, tagNames) => { - var descriptor = TagHelperDescriptorBuilder.CreateTagHelper(tagName + "taghelper", "SomeAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName(tagName)) - .Build(); - descriptors.Add(descriptor); - } - - return descriptors.ToImmutableArray(); + foreach (var tagName in tagNames) + { + var tagHelper = TagHelperDescriptorBuilder.CreateTagHelper(tagName + "taghelper", "SomeAssembly") + .TagMatchingRuleDescriptor(rule => rule.RequireTagName(tagName)) + .Build(); + builder.Add(tagHelper); + } + }); } internal void EvaluateData( - ImmutableArray descriptors, + TagHelperCollection tagHelpers, string documentContent, - string tagHelperPrefix = null, - RazorLanguageVersion languageVersion = null, + string? tagHelperPrefix = null, + RazorLanguageVersion? languageVersion = null, RazorFileKind? fileKind = null, - Action configureParserOptions = null) + Action? configureParserOptions = null) { var syntaxTree = ParseDocument(languageVersion, documentContent, directives: default, fileKind: fileKind, configureParserOptions: configureParserOptions); - var binder = new TagHelperBinder(tagHelperPrefix, descriptors); + var binder = new TagHelperBinder(tagHelperPrefix, tagHelpers); var rewrittenTree = TagHelperParseTreeRewriter.Rewrite(syntaxTree, binder); Assert.Equal(syntaxTree.Root.Width, rewrittenTree.Root.Width); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentDuplicateAttributeDiagnosticPassTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentDuplicateAttributeDiagnosticPassTest.cs index 8867cfad58c..ec71075998b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentDuplicateAttributeDiagnosticPassTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentDuplicateAttributeDiagnosticPassTest.cs @@ -174,7 +174,7 @@ private DocumentIntermediateNode Lower(RazorCodeDocument codeDocument) break; } - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); } var document = codeDocument.GetRequiredDocumentNode(); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupBlockPassTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupBlockPassTest.cs index f3eeade48f5..e3ec33177d9 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupBlockPassTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupBlockPassTest.cs @@ -462,7 +462,7 @@ private DocumentIntermediateNode Lower(RazorCodeDocument codeDocument) break; } - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); } var document = codeDocument.GetRequiredDocumentNode(); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupEncodingPassTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupEncodingPassTest.cs index 891454248fb..deff81dad5f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupEncodingPassTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupEncodingPassTest.cs @@ -220,7 +220,7 @@ private DocumentIntermediateNode Lower(RazorCodeDocument codeDocument) break; } - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); } var document = codeDocument.GetRequiredDocumentNode(); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentWhitespacePassTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentWhitespacePassTest.cs index ba7cdc1ca91..09f49a3e9c3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentWhitespacePassTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentWhitespacePassTest.cs @@ -175,7 +175,7 @@ private DocumentIntermediateNode Lower(RazorCodeDocument codeDocument) break; } - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); } return codeDocument.GetRequiredDocumentNode(); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorCSharpLoweringPhaseTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorCSharpLoweringPhaseTest.cs index 8ad96515257..02cfcca205f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorCSharpLoweringPhaseTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorCSharpLoweringPhaseTest.cs @@ -19,7 +19,7 @@ public void Execute_ThrowsForMissingDependency_IRDocument() { // Arrange var codeDocument = ProjectEngine.CreateEmptyCodeDocument(); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source)); // Act & Assert var exception = Assert.Throws(() => @@ -36,14 +36,14 @@ public void Execute_ThrowsForMissingDependency_CodeTarget() { // Arrange var codeDocument = ProjectEngine.CreateEmptyCodeDocument(); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source)); var documentNode = new DocumentIntermediateNode() { DocumentKind = "test", }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); // Act & Assert var exception = Assert.Throws(() => @@ -59,7 +59,7 @@ public void Execute_CollatesIRDocumentDiagnosticsFromSourceDocument() { // Arrange var codeDocument = ProjectEngine.CreateCodeDocument("

          (codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); // Assert var csharpDocument = codeDocument.GetRequiredCSharpDocument(); @@ -95,10 +95,10 @@ public void Execute_EndToEnd_WritesChecksumAndMarksAutoGenerated() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -127,10 +127,10 @@ public void Execute_SHA1_WritesChecksumAndMarksAutoGenerated() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -159,10 +159,10 @@ public void WriteDocument_SHA256_WritesChecksumAndMarksAutoGenerated() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -197,10 +197,10 @@ public void Execute_Empty_SuppressChecksumTrue_DoesnotWriteChecksum() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); // Act - projectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -224,7 +224,7 @@ public void Execute_WritesNamespace() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); var builder = IntermediateNodeBuilder.Create(documentNode); builder.Add(new NamespaceDeclarationIntermediateNode() @@ -233,7 +233,7 @@ public void Execute_WritesNamespace() }); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -264,7 +264,7 @@ public void Execute_WritesClass() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); var builder = IntermediateNodeBuilder.Create(documentNode); builder.Add(new ClassDeclarationIntermediateNode() @@ -280,7 +280,7 @@ public void Execute_WritesClass() }); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -310,7 +310,7 @@ public void Execute_WithNullableContext_WritesClass() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); var builder = IntermediateNodeBuilder.Create(documentNode); builder.Add(new ClassDeclarationIntermediateNode() @@ -327,7 +327,7 @@ public void Execute_WithNullableContext_WritesClass() }); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -359,7 +359,7 @@ public void Execute_WritesClass_ConstrainedGenericTypeParameters() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); var builder = IntermediateNodeBuilder.Create(documentNode); builder.Add(new ClassDeclarationIntermediateNode() @@ -375,7 +375,7 @@ public void Execute_WritesClass_ConstrainedGenericTypeParameters() }); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -407,7 +407,7 @@ public void Execute_WritesMethod() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); var builder = IntermediateNodeBuilder.Create(documentNode); builder.Add(new MethodDeclarationIntermediateNode() @@ -422,7 +422,7 @@ public void Execute_WritesMethod() }); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -454,7 +454,7 @@ public void Execute_WritesField() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); var builder = IntermediateNodeBuilder.Create(documentNode); builder.Add(new FieldDeclarationIntermediateNode() @@ -465,7 +465,7 @@ public void Execute_WritesField() }); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert @@ -493,7 +493,7 @@ public void Execute_WritesProperty() Target = CodeTarget.CreateDefault(codeDocument) }; - codeDocument.SetDocumentNode(documentNode); + codeDocument = codeDocument.WithDocumentNode(documentNode); var builder = IntermediateNodeBuilder.Create(documentNode); builder.Add(new PropertyDeclarationIntermediateNode() @@ -505,7 +505,7 @@ public void Execute_WritesProperty() }); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); var result = codeDocument.GetRequiredCSharpDocument(); // Assert diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorDirectiveClassifierPhaseTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorDirectiveClassifierPhaseTest.cs index 21d03ac3524..118ecdf92c6 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorDirectiveClassifierPhaseTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorDirectiveClassifierPhaseTest.cs @@ -66,7 +66,7 @@ public void Execute_ExecutesPhasesInOrder() var originalNode = new DocumentIntermediateNode(); var firstPassNode = new DocumentIntermediateNode(); var secondPassNode = new DocumentIntermediateNode(); - codeDocument.SetDocumentNode(originalNode); + codeDocument = codeDocument.WithDocumentNode(originalNode); var firstPass = new Mock(MockBehavior.Strict); firstPass.SetupGet(m => m.Order).Returns(0); @@ -112,7 +112,7 @@ public void Execute_ExecutesPhasesInOrder() }); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert Assert.Same(secondPassNode, codeDocument.GetRequiredDocumentNode().Children[0].Children[0]); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorDocumentClassifierPhaseTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorDocumentClassifierPhaseTest.cs index 486e6095c31..85b25412a56 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorDocumentClassifierPhaseTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorDocumentClassifierPhaseTest.cs @@ -67,7 +67,7 @@ public void Execute_ExecutesPhasesInOrder() var originalNode = new DocumentIntermediateNode(); var firstPassNode = new DocumentIntermediateNode(); var secondPassNode = new DocumentIntermediateNode(); - codeDocument.SetDocumentNode(originalNode); + codeDocument = codeDocument.WithDocumentNode(originalNode); var firstPass = new Mock(MockBehavior.Strict); firstPass.SetupGet(m => m.Order).Returns(0); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorIntermediateNodeLoweringPhaseTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorIntermediateNodeLoweringPhaseTest.cs index 1dd835e54c9..ed41f35cf7b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorIntermediateNodeLoweringPhaseTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorIntermediateNodeLoweringPhaseTest.cs @@ -35,11 +35,11 @@ public void Execute_AutomaticallyImportsSingleLineSinglyOccurringDirective() var importSource = TestRazorSourceDocument.Create("@custom \"hello\"", filePath: "import.cshtml"); var codeDocument = TestRazorCodeDocument.Create("

          NonDirective

          "); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); - codeDocument.SetImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); + codeDocument = codeDocument.WithImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert var documentNode = codeDocument.GetRequiredDocumentNode(); @@ -73,11 +73,11 @@ public void Execute_AutomaticallyOverridesImportedSingleLineSinglyOccurringDirec var importSource = TestRazorSourceDocument.Create("@custom \"hello\"", filePath: "import.cshtml"); var codeDocument = TestRazorCodeDocument.Create("@custom \"world\""); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); - codeDocument.SetImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); + codeDocument = codeDocument.WithImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert var documentNode = codeDocument.GetRequiredDocumentNode(); @@ -112,11 +112,11 @@ public void Execute_AutomaticallyOverridesImportedSingleLineSinglyOccurringDirec var importSource1 = TestRazorSourceDocument.Create("@custom \"hello\"", filePath: "import1.cshtml"); var importSource2 = TestRazorSourceDocument.Create("@custom \"world\"", filePath: "import2.cshtml"); var codeDocument = TestRazorCodeDocument.Create("

          NonDirective

          "); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); - codeDocument.SetImportSyntaxTrees([RazorSyntaxTree.Parse(importSource1, options), RazorSyntaxTree.Parse(importSource2, options)]); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); + codeDocument = codeDocument.WithImportSyntaxTrees([RazorSyntaxTree.Parse(importSource1, options), RazorSyntaxTree.Parse(importSource2, options)]); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert var documentNode = codeDocument.GetRequiredDocumentNode(); @@ -149,11 +149,11 @@ public void Execute_DoesNotImportNonFileScopedSinglyOccurringDirectives_Block() @razor ""razor block"" { }", filePath: "testImports.cshtml"); var codeDocument = TestRazorCodeDocument.Create("

          NonDirective

          "); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); - codeDocument.SetImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); + codeDocument = codeDocument.WithImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert var documentNode = codeDocument.GetRequiredDocumentNode(); @@ -179,12 +179,12 @@ public void Execute_ErrorsForCodeBlockFileScopedSinglyOccurringDirectives() var importSource = TestRazorSourceDocument.Create("@custom { }", filePath: "import.cshtml"); var codeDocument = TestRazorCodeDocument.Create("

          NonDirective

          "); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); - codeDocument.SetImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); + codeDocument = codeDocument.WithImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); var expectedDiagnostic = RazorDiagnosticFactory.CreateDirective_BlockDirectiveCannotBeImported("custom"); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert var documentNode = codeDocument.GetRequiredDocumentNode(); @@ -212,12 +212,12 @@ public void Execute_ErrorsForRazorBlockFileScopedSinglyOccurringDirectives() var importSource = TestRazorSourceDocument.Create("@custom { }", filePath: "import.cshtml"); var codeDocument = TestRazorCodeDocument.Create("

          NonDirective

          "); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); - codeDocument.SetImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options)); + codeDocument = codeDocument.WithImportSyntaxTrees([RazorSyntaxTree.Parse(importSource, options)]); var expectedDiagnostic = RazorDiagnosticFactory.CreateDirective_BlockDirectiveCannotBeImported("custom"); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert var documentNode = codeDocument.GetRequiredDocumentNode(); @@ -263,10 +263,10 @@ public void Execute_CollatesSyntaxDiagnosticsFromSourceDocument() .WithFlags(useRoslynTokenizer: true); var codeDocument = TestRazorCodeDocument.Create("

          (MockBehavior.Strict); firstPass.SetupGet(m => m.Order).Returns(0); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorParsingPhaseTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorParsingPhaseTest.cs index 8fe8f99b019..02349a499d7 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorParsingPhaseTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorParsingPhaseTest.cs @@ -22,7 +22,7 @@ public void Execute_AddsSyntaxTree() var codeDocument = projectEngine.CreateEmptyCodeDocument(); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert Assert.NotNull(codeDocument.GetSyntaxTree()); @@ -43,7 +43,7 @@ public void Execute_UsesConfigureParserFeatures() var codeDocument = projectEngine.CreateEmptyCodeDocument(); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert Assert.True(codeDocument.TryGetSyntaxTree(out var syntaxTree)); @@ -71,7 +71,7 @@ public void Execute_ParsesImports() var codeDocument = projectEngine.CreateCodeDocument(source, importSources); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert Assert.True(codeDocument.TryGetImportSyntaxTrees(out var importSyntaxTrees)); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorProjectEngineIntegrationTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorProjectEngineIntegrationTest.cs index d9952f763f7..bd32906760a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorProjectEngineIntegrationTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorProjectEngineIntegrationTest.cs @@ -124,11 +124,11 @@ public void Process_WithImportsAndTagHelpers_SetsOnCodeDocument() var projectItem = new TestRazorProjectItem("Index.cshtml"); var importItem = new TestRazorProjectItem("_import.cshtml"); var expectedImports = ImmutableArray.Create(RazorSourceDocument.ReadFrom(importItem)); - var expectedTagHelpers = new[] - { + TagHelperCollection expectedTagHelpers = + [ TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "TestAssembly").Build(), TagHelperDescriptorBuilder.CreateTagHelper("Test2TagHelper", "TestAssembly").Build(), - }; + ]; var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, TestRazorProjectFileSystem.Empty); @@ -243,11 +243,11 @@ public void ProcessDesignTime_WithImportsAndTagHelpers_SetsOnCodeDocument() var projectItem = new TestRazorProjectItem("Index.cshtml"); var importItem = new TestRazorProjectItem("_import.cshtml"); var expectedImports = ImmutableArray.Create(RazorSourceDocument.ReadFrom(importItem)); - var expectedTagHelpers = new[] - { + TagHelperCollection expectedTagHelpers = + [ TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "TestAssembly").Build(), TagHelperDescriptorBuilder.CreateTagHelper("Test2TagHelper", "TestAssembly").Build(), - }; + ]; var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, TestRazorProjectFileSystem.Empty); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorSyntaxTreePhaseTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorSyntaxTreePhaseTest.cs index 0abb545fbfb..a1a7f0fc174 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorSyntaxTreePhaseTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorSyntaxTreePhaseTest.cs @@ -65,7 +65,7 @@ public void Execute_ExecutesPhasesInOrder() var originalSyntaxTree = RazorSyntaxTree.Parse(codeDocument.Source); var firstPassSyntaxTree = RazorSyntaxTree.Parse(codeDocument.Source); var secondPassSyntaxTree = RazorSyntaxTree.Parse(codeDocument.Source); - codeDocument.SetSyntaxTree(originalSyntaxTree); + codeDocument = codeDocument.WithSyntaxTree(originalSyntaxTree); var firstPass = new Mock(MockBehavior.Strict); firstPass.SetupGet(m => m.Order).Returns(0); @@ -104,7 +104,7 @@ public void Execute_ExecutesPhasesInOrder() }); // Act - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); // Assert Assert.Same(secondPassSyntaxTree, codeDocument.GetSyntaxTree()); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorTagHelperBinderPhaseTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorTagHelperBinderPhaseTest.cs index b6cd1878a71..290a00d062f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorTagHelperBinderPhaseTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DefaultRazorTagHelperBinderPhaseTest.cs @@ -36,7 +36,7 @@ public void Execute_CanHandleSingleLengthAddTagHelperDirective() var source = TestRazorSourceDocument.Create(content, filePath: null); var codeDocument = ProjectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act ProjectEngine.ExecutePhase(codeDocument); @@ -66,7 +66,7 @@ public void Execute_CanHandleSingleLengthRemoveTagHelperDirective() var source = TestRazorSourceDocument.Create(content, filePath: null); var codeDocument = ProjectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act ProjectEngine.ExecutePhase(codeDocument); @@ -96,7 +96,7 @@ public void Execute_CanHandleSingleLengthTagHelperPrefix() var source = TestRazorSourceDocument.Create(content, filePath: null); var codeDocument = ProjectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act ProjectEngine.ExecutePhase(codeDocument); @@ -124,17 +124,17 @@ public void Execute_RewritesTagHelpers() var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(tagHelper1, tagHelper2); + builder.SetTagHelpers(tagHelper1, tagHelper2); }); var source = CreateTestSourceDocument(); var codeDocument = projectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act - projectEngine.ExecutePhase(codeDocument); - projectEngine.ExecutePhase(codeDocument); + codeDocument = projectEngine.ExecutePhase(codeDocument); + codeDocument = projectEngine.ExecutePhase(codeDocument); // Assert var rewrittenTree = codeDocument.GetSyntaxTree(); @@ -162,12 +162,12 @@ public void Execute_WithTagHelperDescriptorsFromCodeDocument_RewritesTagHelpers( var sourceDocument = CreateTestSourceDocument(); var codeDocument = ProjectEngine.CreateCodeDocument(sourceDocument); var originalTree = RazorSyntaxTree.Parse(sourceDocument); - codeDocument.SetSyntaxTree(originalTree); - codeDocument.SetTagHelpers([tagHelper1, tagHelper2]); + codeDocument = codeDocument.WithSyntaxTree(originalTree); + codeDocument = codeDocument.WithTagHelpers([tagHelper1, tagHelper2]); // Act - ProjectEngine.ExecutePhase(codeDocument); - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); // Assert var rewrittenTree = codeDocument.GetSyntaxTree(); @@ -194,18 +194,18 @@ public void Execute_NullTagHelperDescriptorsFromCodeDocument_FallsBackToTagHelpe var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(tagHelper1, tagHelper2); + builder.SetTagHelpers(tagHelper1, tagHelper2); }); var source = CreateTestSourceDocument(); var codeDocument = projectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); - codeDocument.SetTagHelpers(value: null); + codeDocument = codeDocument.WithSyntaxTree(originalTree); + codeDocument = codeDocument.WithTagHelpers(value: null); // Act - projectEngine.ExecutePhase(codeDocument); - projectEngine.ExecutePhase(codeDocument); + codeDocument = projectEngine.ExecutePhase(codeDocument); + codeDocument = projectEngine.ExecutePhase(codeDocument); // Assert var rewrittenTree = codeDocument.GetSyntaxTree(); @@ -232,14 +232,14 @@ public void Execute_EmptyTagHelperDescriptorsFromCodeDocument_DoesNotFallbackToT var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(tagHelper1, tagHelper2); + builder.SetTagHelpers(tagHelper1, tagHelper2); }); var source = CreateTestSourceDocument(); var codeDocument = projectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); - codeDocument.SetTagHelpers(value: []); + codeDocument = codeDocument.WithSyntaxTree(originalTree); + codeDocument = codeDocument.WithTagHelpers(value: []); // Act projectEngine.ExecutePhase(codeDocument); @@ -278,11 +278,11 @@ public void Execute_DirectiveWithoutQuotes_RewritesTagHelpers_TagHelperMatchesEl var source = TestRazorSourceDocument.Create(content); var codeDocument = ProjectEngine.CreateCodeDocument(source, [tagHelper]); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act - ProjectEngine.ExecutePhase(codeDocument); - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); // Assert var rewrittenTree = codeDocument.GetSyntaxTree(); @@ -320,11 +320,11 @@ public void Execute_DirectiveWithQuotes_RewritesTagHelpers_TagHelperMatchesEleme var source = TestRazorSourceDocument.Create(content); var codeDocument = ProjectEngine.CreateCodeDocument(source, [tagHelper]); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act - ProjectEngine.ExecutePhase(codeDocument); - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); // Assert var rewrittenTree = codeDocument.GetSyntaxTree(); @@ -347,24 +347,24 @@ public void Execute_TagHelpersFromCodeDocumentAndFeature_PrefersCodeDocument() var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(featureTagHelper); + builder.SetTagHelpers(featureTagHelper); }); var source = CreateTestSourceDocument(); var codeDocument = ProjectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); var codeDocumentTagHelper = CreateTagHelperDescriptor( tagName: "form", typeName: "TestFormTagHelper", assemblyName: "TestAssembly"); - codeDocument.SetTagHelpers([codeDocumentTagHelper]); + codeDocument = codeDocument.WithTagHelpers([codeDocumentTagHelper]); // Act - ProjectEngine.ExecutePhase(codeDocument); - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); // Assert var rewrittenTree = codeDocument.GetSyntaxTree(); @@ -382,10 +382,10 @@ public void Execute_NoopsWhenNoTagHelpersFromCodeDocumentOrFeature() var source = CreateTestSourceDocument(); var codeDocument = ProjectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); // Assert var outputTree = codeDocument.GetSyntaxTree(); @@ -402,10 +402,10 @@ public void Execute_NoopsWhenNoTagHelperDescriptorsAreResolved() var source = TestRazorSourceDocument.Create("Hello, world"); var codeDocument = ProjectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act - ProjectEngine.ExecutePhase(codeDocument); + codeDocument = ProjectEngine.ExecutePhase(codeDocument); // Assert var outputTree = codeDocument.GetSyntaxTree(); @@ -426,10 +426,10 @@ public void Execute_SetsTagHelperDocumentContext() var source = TestRazorSourceDocument.Create("Hello, world"); var codeDocument = projectEngine.CreateCodeDocument(source); var originalTree = RazorSyntaxTree.Parse(source); - codeDocument.SetSyntaxTree(originalTree); + codeDocument = codeDocument.WithSyntaxTree(originalTree); // Act - projectEngine.ExecutePhase(codeDocument); + codeDocument = projectEngine.ExecutePhase(codeDocument); // Assert var context = codeDocument.GetTagHelperContext(); @@ -454,7 +454,7 @@ public void Execute_CombinesErrorsOnRewritingErrors() var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(tagHelper1, tagHelper2); + builder.SetTagHelpers(tagHelper1, tagHelper2); }); var content = @@ -474,11 +474,11 @@ public void Execute_CombinesErrorsOnRewritingErrors() new SourceSpan(new SourceLocation((Environment.NewLine.Length * 2) + 30, 2, 1), contentLength: 4), "form"); var erroredOriginalTree = new RazorSyntaxTree(originalTree.Root, originalTree.Source, [initialError], originalTree.Options); - codeDocument.SetSyntaxTree(erroredOriginalTree); + codeDocument = codeDocument.WithSyntaxTree(erroredOriginalTree); // Act - projectEngine.ExecutePhase(codeDocument); - projectEngine.ExecutePhase(codeDocument); + codeDocument = projectEngine.ExecutePhase(codeDocument); + codeDocument = projectEngine.ExecutePhase(codeDocument); // Assert var outputTree = codeDocument.GetSyntaxTree(); @@ -594,7 +594,7 @@ public void DirectiveVisitor_ExtractsPrefixFromSyntaxTree( var parser = new RazorParser(); var syntaxTree = parser.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.TagHelperDirectiveVisitor(); - visitor.Initialize(descriptors: [], sourceDocument.FilePath); + visitor.Initialize(tagHelpers: [], sourceDocument.FilePath); // Act visitor.Visit(syntaxTree.Root); @@ -603,157 +603,142 @@ public void DirectiveVisitor_ExtractsPrefixFromSyntaxTree( Assert.Equal(expectedPrefix, visitor.TagHelperPrefix); } - public static TheoryData ProcessTagHelperMatchesData - { - get + public static TheoryData ProcessTagHelperMatchesData + // source, taghelpers, expected descriptors + => new() { - // source, taghelpers, expected descriptors - return new TheoryData { - { - $@" + $@" @addTagHelper *, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, }, - new [] { Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor], + [Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyB}", - new [] { Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor }, - new [] { Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor], + [Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @removeTagHelper *, {AssemblyB}", - new [] { Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor }, - new [] { Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor], + [Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyB} @removeTagHelper *, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor }, - new [] { String_TagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor], + [String_TagHelperDescriptor] + }, + { + $@" @addTagHelper {Valid_PlainTagHelperDescriptor.Name}, {AssemblyA} @addTagHelper *, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, }, - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor], + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @removeTagHelper {Valid_PlainTagHelperDescriptor.Name}, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, }, - new [] { Valid_InheritedTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor], + [Valid_InheritedTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @removeTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, }, - new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor], + [Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, }, - new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor], + [Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper Microsoft.AspNetCore.Razor.TagHelpers.ValidPlain*, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, }, - new [] { Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor], + [Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper Microsoft.AspNetCore.Razor.TagHelpers.*, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, }, - new [] { Valid_PlainTagHelperDescriptor, Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor], + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @removeTagHelper Microsoft.AspNetCore.Razor.TagHelpers.ValidP*, {AssemblyA} @addTagHelper *, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, }, - new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor], + [Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @removeTagHelper Str*, {AssemblyB}", - new [] { Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor, }, - new [] { Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor], + [Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @removeTagHelper *, {AssemblyB}", - new [] { Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor, }, - new [] { Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor], + [Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper System.{String_TagHelperDescriptor.Name}, {AssemblyB}", - new [] { Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor, }, - new [] { Valid_PlainTagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor], + [Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyB} @removeTagHelper Microsoft.*, {AssemblyA}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor }, - new [] { String_TagHelperDescriptor } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor], + [String_TagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyB} @removeTagHelper ?Microsoft*, {AssemblyA} @removeTagHelper System.{String_TagHelperDescriptor.Name}, {AssemblyB}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor }, - new [] - { - Valid_InheritedTagHelperDescriptor, - Valid_PlainTagHelperDescriptor, - String_TagHelperDescriptor - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor], + [Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyB} @removeTagHelper TagHelper*, {AssemblyA} @removeTagHelper System.{String_TagHelperDescriptor.Name}, {AssemblyB}", - new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor }, - new [] - { - Valid_InheritedTagHelperDescriptor, - Valid_PlainTagHelperDescriptor, - String_TagHelperDescriptor - } - }, - }; - } - } + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor], + [Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor, String_TagHelperDescriptor] + } + }; [Theory] [MemberData(nameof(ProcessTagHelperMatchesData))] public void DirectiveVisitor_FiltersTagHelpersByDirectives( string source, - TagHelperDescriptor[] tagHelpers, - TagHelperDescriptor[] expectedTagHelpers) + TagHelperCollection tagHelpers, + TagHelperCollection expectedTagHelpers) { // Arrange var sourceDocument = TestRazorSourceDocument.Create(source, filePath: "TestFile"); @@ -767,7 +752,7 @@ public void DirectiveVisitor_FiltersTagHelpersByDirectives( var results = visitor.GetResults(); // Assert - Assert.Equal(expectedTagHelpers.Length, results.Length); + Assert.Equal(expectedTagHelpers.Count, results.Count); foreach (var expectedTagHelper in expectedTagHelpers) { @@ -775,131 +760,88 @@ public void DirectiveVisitor_FiltersTagHelpersByDirectives( } } - public static TheoryData> ProcessTagHelperMatches_EmptyResultData - { - get + public static TheoryData ProcessTagHelperMatches_EmptyResultData + // source, taghelpers + => new() { - // source, taghelpers - return new TheoryData> { - { - $@" + $@" @addTagHelper *, {AssemblyA} @removeTagHelper *, {AssemblyA}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @removeTagHelper {Valid_PlainTagHelperDescriptor.Name}, {AssemblyA} @removeTagHelper {Valid_InheritedTagHelperDescriptor.Name}, {AssemblyA}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, - Valid_InheritedTagHelperDescriptor, - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyB} @removeTagHelper *, {AssemblyA} @removeTagHelper *, {AssemblyB}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, - Valid_InheritedTagHelperDescriptor, - String_TagHelperDescriptor, - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor] + }, + { + $@" @addTagHelper *, {AssemblyA} @addTagHelper *, {AssemblyB} @removeTagHelper {Valid_PlainTagHelperDescriptor.Name}, {AssemblyA} @removeTagHelper {Valid_InheritedTagHelperDescriptor.Name}, {AssemblyA} @removeTagHelper {String_TagHelperDescriptor.Name}, {AssemblyB}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, - Valid_InheritedTagHelperDescriptor, - String_TagHelperDescriptor, - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor] + }, + { + $@" @removeTagHelper *, {AssemblyA} @removeTagHelper {Valid_PlainTagHelperDescriptor.Name}, {AssemblyA}", - new TagHelperDescriptor[0] - }, - { - $@" + [] + }, + { + $@" @addTagHelper *, {AssemblyA} @removeTagHelper Mic*, {AssemblyA}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor] + }, + { + $@" @addTagHelper Mic*, {AssemblyA} @removeTagHelper {Valid_PlainTagHelperDescriptor.Name}, {AssemblyA} @removeTagHelper {Valid_InheritedTagHelperDescriptor.Name}, {AssemblyA}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor] + }, + { + $@" @addTagHelper Microsoft.*, {AssemblyA} @addTagHelper System.*, {AssemblyB} @removeTagHelper Microsoft.AspNetCore.Razor.TagHelpers*, {AssemblyA} @removeTagHelper System.*, {AssemblyB}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, - Valid_InheritedTagHelperDescriptor, - String_TagHelperDescriptor, - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor] + }, + { + $@" @addTagHelper ?icrosoft.*, {AssemblyA} @addTagHelper ?ystem.*, {AssemblyB} @removeTagHelper *?????r, {AssemblyA} @removeTagHelper Sy??em.*, {AssemblyB}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, - Valid_InheritedTagHelperDescriptor, - String_TagHelperDescriptor, - } - }, - { - $@" + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor] + }, + { + $@" @addTagHelper ?i?crosoft.*, {AssemblyA} @addTagHelper ??ystem.*, {AssemblyB}", - new TagHelperDescriptor[] - { - Valid_PlainTagHelperDescriptor, - Valid_InheritedTagHelperDescriptor, - String_TagHelperDescriptor, - } - }, - }; - } - } + [Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor, String_TagHelperDescriptor] + } + }; [Theory] [MemberData(nameof(ProcessTagHelperMatches_EmptyResultData))] public void ProcessDirectives_CanReturnEmptyDescriptorsBasedOnDirectiveDescriptors( string source, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) { // Arrange var sourceDocument = TestRazorSourceDocument.Create(source, filePath: "TestFile"); @@ -922,11 +864,11 @@ public void TagHelperDirectiveVisitor_DoesNotMatch_Components() // Arrange var componentDescriptor = CreateComponentDescriptor("counter", "SomeProject.Counter", AssemblyA); var legacyDescriptor = Valid_PlainTagHelperDescriptor; - var tagHelpers = new[] - { + TagHelperCollection tagHelpers = + [ legacyDescriptor, - componentDescriptor, - }; + componentDescriptor + ]; var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.TagHelperDirectiveVisitor(); visitor.Initialize(tagHelpers, filePath: null); @@ -975,15 +917,15 @@ public void ComponentDirectiveVisitor_DoesNotMatch_LegacyTagHelpers() var currentNamespace = "SomeProject"; var componentDescriptor = CreateComponentDescriptor("counter", "SomeProject.Counter", AssemblyA); var legacyDescriptor = Valid_PlainTagHelperDescriptor; - var descriptors = new[] - { + TagHelperCollection tagHelpers = + [ legacyDescriptor, - componentDescriptor, - }; + componentDescriptor + ]; var sourceDocument = CreateComponentTestSourceDocument(@"", "C:\\SomeFolder\\SomeProject\\Counter.cshtml"); var tree = RazorSyntaxTree.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.ComponentDirectiveVisitor(); - visitor.Initialize(descriptors, sourceDocument.FilePath, currentNamespace); + visitor.Initialize(tagHelpers, sourceDocument.FilePath, currentNamespace); // Act visitor.Visit(tree); @@ -1001,11 +943,11 @@ public void ComponentDirectiveVisitor_AddsErrorOnLegacyTagHelperDirectives() var currentNamespace = "SomeProject"; var componentDescriptor = CreateComponentDescriptor("counter", "SomeProject.Counter", AssemblyA); var legacyDescriptor = Valid_PlainTagHelperDescriptor; - var descriptors = new[] - { + TagHelperCollection tagHelpers = + [ legacyDescriptor, - componentDescriptor, - }; + componentDescriptor + ]; var filePath = "C:\\SomeFolder\\SomeProject\\Counter.cshtml"; var content = @" @tagHelperPrefix th: @@ -1015,7 +957,7 @@ public void ComponentDirectiveVisitor_AddsErrorOnLegacyTagHelperDirectives() var sourceDocument = CreateComponentTestSourceDocument(content, filePath); var tree = RazorSyntaxTree.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.ComponentDirectiveVisitor(); - visitor.Initialize(descriptors, sourceDocument.FilePath, currentNamespace); + visitor.Initialize(tagHelpers, sourceDocument.FilePath, currentNamespace); // Act visitor.Visit(tree); @@ -1040,17 +982,17 @@ public void ComponentDirectiveVisitor_MatchesFullyQualifiedComponents() "SomeProject.SomeOtherFolder.Counter", AssemblyA, fullyQualified: true); - var descriptors = new[] - { - componentDescriptor, - }; + TagHelperCollection tagHelpers = + [ + componentDescriptor + ]; var filePath = "C:\\SomeFolder\\SomeProject\\Counter.cshtml"; var content = @" "; var sourceDocument = CreateComponentTestSourceDocument(content, filePath); var tree = RazorSyntaxTree.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.ComponentDirectiveVisitor(); - visitor.Initialize(descriptors, sourceDocument.FilePath, currentNamespace); + visitor.Initialize(tagHelpers, sourceDocument.FilePath, currentNamespace); // Act visitor.Visit(tree); @@ -1077,25 +1019,25 @@ public void ComponentDirectiveVisitor_ComponentInScope_MatchesChildContent() "SomeProject", "Counter", childContent: true); - var descriptors = new[] - { + TagHelperCollection tagHelpers = + [ componentDescriptor, - childContentDescriptor, - }; + childContentDescriptor + ]; var filePath = "C:\\SomeFolder\\SomeProject\\Counter.cshtml"; var content = @" "; var sourceDocument = CreateComponentTestSourceDocument(content, filePath); var tree = RazorSyntaxTree.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.ComponentDirectiveVisitor(); - visitor.Initialize(descriptors, sourceDocument.FilePath, currentNamespace); + visitor.Initialize(tagHelpers, sourceDocument.FilePath, currentNamespace); // Act visitor.Visit(tree); var results = visitor.GetResults(); // Assert - Assert.Equal(2, results.Length); + Assert.Equal(2, results.Count); } [Fact] @@ -1112,18 +1054,18 @@ public void ComponentDirectiveVisitor_NullCurrentNamespace_MatchesOnlyFullyQuali "SomeProject.SomeOtherFolder.Counter", AssemblyA, fullyQualified: true); - var descriptors = new[] - { + TagHelperCollection tagHelpers = + [ componentDescriptor, - fullyQualifiedComponent, - }; + fullyQualifiedComponent + ]; var filePath = "C:\\SomeFolder\\SomeProject\\Counter.cshtml"; var content = @" "; var sourceDocument = CreateComponentTestSourceDocument(content, filePath); var tree = RazorSyntaxTree.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.ComponentDirectiveVisitor(); - visitor.Initialize(descriptors, sourceDocument.FilePath, currentNamespace); + visitor.Initialize(tagHelpers, sourceDocument.FilePath, currentNamespace); // Act visitor.Visit(tree); @@ -1147,11 +1089,11 @@ public void ComponentDirectiveVisitor_MatchesIfNamespaceInUsing() "Foo", "SomeProject.SomeOtherFolder.Foo", AssemblyA); - var descriptors = new[] - { + TagHelperCollection tagHelpers = + [ componentDescriptor, - anotherComponentDescriptor, - }; + anotherComponentDescriptor + ]; var filePath = "C:\\SomeFolder\\SomeProject\\Counter.cshtml"; var content = @" @using SomeProject.SomeOtherFolder @@ -1159,14 +1101,14 @@ @using SomeProject.SomeOtherFolder var sourceDocument = CreateComponentTestSourceDocument(content, filePath); var tree = RazorSyntaxTree.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.ComponentDirectiveVisitor(); - visitor.Initialize(descriptors, sourceDocument.FilePath, currentNamespace); + visitor.Initialize(tagHelpers, sourceDocument.FilePath, currentNamespace); // Act visitor.Visit(tree); var results = visitor.GetResults(); // Assert - Assert.Equal(2, results.Length); + Assert.Equal(2, results.Count); } [Fact] @@ -1178,10 +1120,10 @@ public void ComponentDirectiveVisitor_MatchesIfNamespaceInUsing_GlobalPrefix() "Counter", "SomeProject.SomeOtherFolder.Counter", AssemblyA); - var descriptors = new[] - { - componentDescriptor, - }; + TagHelperCollection tagHelpers = + [ + componentDescriptor + ]; var filePath = "C:\\SomeFolder\\SomeProject\\Counter.cshtml"; var content = """ @using global::SomeProject.SomeOtherFolder @@ -1189,7 +1131,7 @@ public void ComponentDirectiveVisitor_MatchesIfNamespaceInUsing_GlobalPrefix() var sourceDocument = CreateComponentTestSourceDocument(content, filePath); var tree = RazorSyntaxTree.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.ComponentDirectiveVisitor(); - visitor.Initialize(descriptors, sourceDocument.FilePath, currentNamespace); + visitor.Initialize(tagHelpers, sourceDocument.FilePath, currentNamespace); // Act visitor.Visit(tree); @@ -1213,11 +1155,11 @@ public void ComponentDirectiveVisitor_DoesNotMatchForUsingAliasAndStaticUsings() "Foo", "SomeProject.SomeOtherFolder.Foo", AssemblyA); - var descriptors = new[] - { - componentDescriptor, - anotherComponentDescriptor, - }; + TagHelperCollection tagHelpers = + [ + componentDescriptor, + anotherComponentDescriptor + ]; var filePath = "C:\\SomeFolder\\SomeProject\\Counter.cshtml"; var content = @" @using Bar = SomeProject.SomeOtherFolder @@ -1226,7 +1168,7 @@ @using static SomeProject.SomeOtherFolder.Foo var sourceDocument = CreateComponentTestSourceDocument(content, filePath); var tree = RazorSyntaxTree.Parse(sourceDocument); var visitor = new DefaultRazorTagHelperContextDiscoveryPhase.ComponentDirectiveVisitor(); - visitor.Initialize(descriptors, sourceDocument.FilePath, currentNamespace); + visitor.Initialize(tagHelpers, sourceDocument.FilePath, currentNamespace); // Act visitor.Visit(tree); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/CodeGenerationIntegrationTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/CodeGenerationIntegrationTest.cs index c9a50288e04..22498eb52b1 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/CodeGenerationIntegrationTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/CodeGenerationIntegrationTest.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Runtime.CompilerServices; @@ -347,7 +346,7 @@ private void DesignTimeTest(string testName) // Assert AssertDocumentNodeMatchesBaseline(codeDocument.GetRequiredDocumentNode(), testName); - AssertHtmlDocumentMatchesBaseline(codeDocument.GetHtmlDocument(), testName); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(codeDocument), testName); AssertCSharpDocumentMatchesBaseline(codeDocument.GetRequiredCSharpDocument(), testName); AssertSourceMappingsMatchBaseline(codeDocument, testName); AssertLinePragmas(codeDocument); @@ -371,19 +370,19 @@ private void RunTimeTest(string testName) AssertCSharpDiagnosticsMatchBaseline(codeDocument, testName); } - private void RunTagHelpersTest(IEnumerable descriptors, [CallerMemberName] string testName = "") + private void RunTagHelpersTest(TagHelperCollection tagHelpers, [CallerMemberName] string testName = "") { if (designTime) { - RunDesignTimeTagHelpersTest(descriptors, testName); + RunDesignTimeTagHelpersTest(tagHelpers, testName); } else { - RunRuntimeTagHelpersTest(descriptors, testName); + RunRuntimeTagHelpersTest(tagHelpers, testName); } } - private void RunRuntimeTagHelpersTest(IEnumerable descriptors, string testName) + private void RunRuntimeTagHelpersTest(TagHelperCollection tagHelpers, string testName) { // Arrange var projectEngine = CreateProjectEngine(RazorExtensions.Register); @@ -391,10 +390,10 @@ private void RunRuntimeTagHelpersTest(IEnumerable descripto var projectItem = CreateProjectItemFromFile(testName: testName); var imports = GetImports(projectEngine, projectItem); - AddTagHelperStubs(descriptors); + AddTagHelperStubs(tagHelpers); // Act - var codeDocument = projectEngine.Process(RazorSourceDocument.ReadFrom(projectItem), RazorFileKind.Legacy, imports, descriptors.ToList()); + var codeDocument = projectEngine.Process(RazorSourceDocument.ReadFrom(projectItem), RazorFileKind.Legacy, imports, tagHelpers); // Assert AssertDocumentNodeMatchesBaseline(codeDocument.GetRequiredDocumentNode(), testName); @@ -402,7 +401,7 @@ private void RunRuntimeTagHelpersTest(IEnumerable descripto AssertCSharpDiagnosticsMatchBaseline(codeDocument, testName); } - private void RunDesignTimeTagHelpersTest(IEnumerable descriptors, string testName) + private void RunDesignTimeTagHelpersTest(TagHelperCollection tagHelpers, string testName) { // Arrange var projectEngine = CreateProjectEngine(RazorExtensions.Register); @@ -410,15 +409,15 @@ private void RunDesignTimeTagHelpersTest(IEnumerable descri var projectItem = CreateProjectItemFromFile(testName: testName); var imports = GetImports(projectEngine, projectItem); - AddTagHelperStubs(descriptors); + AddTagHelperStubs(tagHelpers); // Act - var codeDocument = projectEngine.ProcessDesignTime(RazorSourceDocument.ReadFrom(projectItem), RazorFileKind.Legacy, imports, descriptors.ToList()); + var codeDocument = projectEngine.ProcessDesignTime(RazorSourceDocument.ReadFrom(projectItem), RazorFileKind.Legacy, imports, tagHelpers); // Assert AssertDocumentNodeMatchesBaseline(codeDocument.GetRequiredDocumentNode(), testName); AssertCSharpDocumentMatchesBaseline(codeDocument.GetRequiredCSharpDocument(), testName); - AssertHtmlDocumentMatchesBaseline(codeDocument.GetHtmlDocument(), testName); + AssertHtmlDocumentMatchesBaseline(RazorHtmlWriter.GetHtmlDocument(codeDocument), testName); AssertSourceMappingsMatchBaseline(codeDocument, testName); AssertCSharpDiagnosticsMatchBaseline(codeDocument, testName); } @@ -435,9 +434,9 @@ private static ImmutableArray GetImports(RazorProjectEngine return result.ToImmutable(); } - private void AddTagHelperStubs(IEnumerable descriptors) + private void AddTagHelperStubs(TagHelperCollection tagHelpers) { - var tagHelperClasses = descriptors.Select(descriptor => + var tagHelperClasses = tagHelpers.Select(descriptor => { var typeName = descriptor.TypeName; var namespaceSeparatorIndex = typeName.LastIndexOf('.'); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs index 1362c42c0dd..cb969d332a5 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs @@ -12149,6 +12149,56 @@ public void LinePragma_Multiline() #region RenderMode + [IntegrationTestFact] + public void RenderMode_Directive_WithTypeParam() + { + var generated = CompileToCSharp(""" + @typeparam T + @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + """); + + // Assert + AssertDocumentNodeMatchesBaseline(generated.CodeDocument); + AssertCSharpDocumentMatchesBaseline(generated.CodeDocument); + CompileToAssembly(generated); + } + + [IntegrationTestFact] + public void RenderMode_Directive_WithTypeParam_Razor9() + { + var generated = CompileToCSharp(""" + @typeparam T + @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + """, + configuration: Configuration with { LanguageVersion = RazorLanguageVersion.Version_9_0 }, + expectedCSharpDiagnostics: + // (17,19): error CS0305: Using the generic type 'TestComponent' requires 1 type arguments + // [global::Test.TestComponent.__PrivateComponentRenderModeAttribute] + Diagnostic(ErrorCode.ERR_BadArity, "TestComponent").WithArguments("Test.TestComponent", "type", "1").WithLocation(17, 19)); + + // Assert + AssertDocumentNodeMatchesBaseline(generated.CodeDocument); + AssertCSharpDocumentMatchesBaseline(generated.CodeDocument); + CompileToAssembly(generated, + // (13,19): error CS0305: Using the generic type 'TestComponent' requires 1 type arguments + // [global::Test.TestComponent.__PrivateComponentRenderModeAttribute] + Diagnostic(ErrorCode.ERR_BadArity, "TestComponent").WithArguments("Test.TestComponent", "type", "1").WithLocation(13, 19)); + } + + [IntegrationTestFact] + public void RenderMode_Directive_WithTypeParam_First() + { + var generated = CompileToCSharp(""" + @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + @typeparam T + """); + + // Assert + AssertDocumentNodeMatchesBaseline(generated.CodeDocument); + AssertCSharpDocumentMatchesBaseline(generated.CodeDocument); + CompileToAssembly(generated); + } + [IntegrationTestFact] public void RenderMode_Directive_FullyQualified() { diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentRenderModeDirectiveIntegrationTests.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentRenderModeDirectiveIntegrationTests.cs index b53fb1e279a..bb226ab8b69 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentRenderModeDirectiveIntegrationTests.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentRenderModeDirectiveIntegrationTests.cs @@ -3,6 +3,7 @@ using System.Linq; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; using Roslyn.Test.Utilities; using Xunit; @@ -12,6 +13,70 @@ public class ComponentRenderModeDirectiveIntegrationTests : RazorIntegrationTest { internal override RazorFileKind? FileKind => RazorFileKind.Component; + [Fact] + public void RenderMode_GenericComponent_CSharp11() + { + // Arrange & Act + var component = CompileToComponent(""" + @typeparam T + + @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + """, genericArity: 1); + + // Assert + VerifyRenderModeAttribute(component, $$""" + file sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + #nullable restore + #line (3,13)-(3,77) "{{DefaultDocumentPath}}" + Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + #line default + #line hidden + #nullable disable + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } + """); + } + + [Fact] + public void RenderMode_GenericComponent_CSharp10_RazorLang9() + { + // Arrange & Act + var compilationResult = CompileToCSharp(DefaultFileName, cshtmlContent: """ + @typeparam T + + @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + """, configuration: Configuration with { LanguageVersion = RazorLanguageVersion.Version_9_0 }); + + CompileToAssembly(compilationResult, + // (13,19): error CS0305: Using the generic type 'TestComponent' requires 1 type arguments + // [global::Test.TestComponent.__PrivateComponentRenderModeAttribute] + Diagnostic(ErrorCode.ERR_BadArity, "TestComponent").WithArguments("Test.TestComponent", "type", "1").WithLocation(13, 19)); + } + + [Fact] + public void RenderMode_GenericComponent_CSharp10() + { + var csharpParseOptions = CSharpParseOptions.WithLanguageVersion(CodeAnalysis.CSharp.LanguageVersion.CSharp10); + + // Arrange & Act + var compilationResult = CompileToCSharp(DefaultFileName, csharpParseOptions: csharpParseOptions, cshtmlContent: """ + @typeparam T + + @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + """); + + CompileToAssembly(compilationResult, + // (13,19): error CS0305: Using the generic type 'TestComponent' requires 1 type arguments + // [global::Test.TestComponent.__PrivateComponentRenderModeAttribute] + Diagnostic(ErrorCode.ERR_BadArity, "TestComponent").WithArguments("Test.TestComponent", "type", "1").WithLocation(13, 19), + // (31,70): error CS8936: Feature 'generic attributes' is not available in C# 10.0. Please use language version 11.0 or greater. + // private sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion10, "global::Microsoft.AspNetCore.Components.RenderModeAttribute").WithArguments("generic attributes", "11.0").WithLocation(31, 70)); + } + [Fact] public void RenderMode_With_Fully_Qualified_Type() { @@ -21,10 +86,16 @@ @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer """); // Assert - VerifyRenderModeAttribute(component, """ + VerifyRenderModeAttribute(component, $$""" private sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute { - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + #nullable restore + #line (1,13)-(1,77) "{{DefaultDocumentPath}}" + Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + #line default + #line hidden + #nullable disable ; public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; } @@ -41,10 +112,43 @@ @rendermode InteractiveServer """); // Assert - VerifyRenderModeAttribute(component, """ + VerifyRenderModeAttribute(component, $$""" private sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute { - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => InteractiveServer + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + #nullable restore + #line (2,13)-(2,30) "{{DefaultDocumentPath}}" + InteractiveServer + #line default + #line hidden + #nullable disable + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } + """); + } + + [Fact] + public void RenderMode_With_Static_Usings_GenericComponent() + { + // Arrange & Act + var component = CompileToComponent(""" + @using static Microsoft.AspNetCore.Components.Web.RenderMode + @typeparam T + @rendermode InteractiveServer + """, genericArity: 1); + + // Assert + VerifyRenderModeAttribute(component, $$""" + file sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + #nullable restore + #line (3,13)-(3,30) "{{DefaultDocumentPath}}" + InteractiveServer + #line default + #line hidden + #nullable disable ; public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; } @@ -91,10 +195,9 @@ @rendermode NoExist Assert.Empty(compilationResult.RazorDiagnostics); CompileToAssembly(compilationResult, - // x:\dir\subdir\Test\TestComponent.cshtml(25,101): error CS0103: The name 'NoExist' does not exist in the current context - // NoExist - Diagnostic(ErrorCode.ERR_NameNotInContext, "NoExist").WithArguments("NoExist").WithLocation(25, 101) - ); + // x:\dir\subdir\Test\TestComponent.cshtml(1,13): error CS0103: The name 'NoExist' does not exist in the current context + // NoExist + Diagnostic(ErrorCode.ERR_NameNotInContext, "NoExist").WithArguments("NoExist").WithLocation(1, 13)); } [Fact] @@ -154,7 +257,6 @@ @rendermode Foo ); } - [Fact] public void RenderMode_Referencing_Instance_Code() { @@ -169,10 +271,9 @@ @rendermode myRenderMode Assert.Empty(compilationResult.RazorDiagnostics); CompileToAssembly(compilationResult, - // x:\dir\subdir\Test\TestComponent.cshtml(34, 101): error CS0120: An object reference is required for the non-static field, method, or property 'TestComponent.myRenderMode' - // myRenderMode - Diagnostic(ErrorCode.ERR_ObjectRequired, "myRenderMode").WithArguments("Test.TestComponent.myRenderMode").WithLocation(34, 101) - ); + // x:\dir\subdir\Test\TestComponent.cshtml(1,13): error CS0120: An object reference is required for the non-static field, method, or property 'TestComponent.myRenderMode' + // myRenderMode + Diagnostic(ErrorCode.ERR_ObjectRequired, "myRenderMode").WithArguments("Test.TestComponent.myRenderMode").WithLocation(1, 13)); } [Fact] @@ -369,12 +470,70 @@ private sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.A """); } + [Fact] + public void RenderMode_With_FunctionCall_Generic() + { + // Arrange & Act + var component = CompileToComponent(""" + @typeparam T + @rendermode @(TestComponent.GetRenderMode()) + + @code + { + public static Microsoft.AspNetCore.Components.IComponentRenderMode GetRenderMode() => Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer; + } + """, genericArity: 1); + + // Assert + VerifyRenderModeAttribute(component, $$""" + file sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + #nullable restore + #line (2,15)-(2,52) "{{DefaultDocumentPath}}" + TestComponent.GetRenderMode() + + #line default + #line hidden + #nullable disable + + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } + """); + } + + [Fact] + public void RenderMode_With_FunctionCall_Generic_BadRef() + { + // Arrange & Act + var compilationResult = CompileToCSharp(""" + @typeparam T + @rendermode @(TestComponent.GetRenderMode()) + + @code + { + public static Microsoft.AspNetCore.Components.IComponentRenderMode GetRenderMode() => Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer; + } + """); + + // Assert + CompileToAssembly(compilationResult, + // x:\dir\subdir\Test\TestComponent.cshtml(2,15): error CS0305: Using the generic type 'TestComponent' requires 1 type arguments + // TestComponent.GetRenderMode() + Diagnostic(ErrorCode.ERR_BadArity, "TestComponent").WithArguments("Test.TestComponent", "type", "1").WithLocation(2, 15)); + } + private static void VerifyRenderModeAttribute(INamedTypeSymbol component, string expected) { var attribute = Assert.Single(component.GetAttributes()); - AssertEx.Equal("__PrivateComponentRenderModeAttribute", attribute.AttributeClass?.Name); + Assert.NotNull(attribute.AttributeClass); + var attributeClass = attribute.AttributeClass; ; + AssertEx.Equal("__PrivateComponentRenderModeAttribute", attributeClass.Name); - var attributeType = component.ContainingAssembly.GetTypeByMetadataName("Test.TestComponent+__PrivateComponentRenderModeAttribute"); + var attributeType = attributeClass.IsFileLocal + ? component.ContainingAssembly.GetTypeByMetadataName($"Test.{attributeClass.MetadataName}") + : component.ContainingAssembly.GetTypeByMetadataName("Test.TestComponent+__PrivateComponentRenderModeAttribute"); Assert.NotNull(attributeType); expected = expected.NormalizeLineEndings(); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/TagHelpersIntegrationTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/TagHelpersIntegrationTest.cs index 7aae3295dbc..37440b08e53 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/TagHelpersIntegrationTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/TagHelpersIntegrationTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Xunit; +using static Microsoft.AspNetCore.Mvc.Razor.Extensions.ViewComponentsApi; namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests; @@ -13,15 +14,15 @@ public class TagHelpersIntegrationTest() : IntegrationTestBase(layer: TestProjec public void SimpleTagHelpers() { // Arrange - var descriptors = new[] - { + TagHelperCollection tagHelpers = + [ CreateTagHelperDescriptor( tagName: "input", typeName: "InputTagHelper", assemblyName: "TestAssembly") - }; + ]; - var projectEngine = CreateProjectEngine(builder => builder.AddTagHelpers(descriptors)); + var projectEngine = CreateProjectEngine(builder => builder.SetTagHelpers(tagHelpers)); var projectItem = CreateProjectItemFromFile(); // Act @@ -35,22 +36,22 @@ public void SimpleTagHelpers() public void TagHelpersWithBoundAttributes() { // Arrange - var descriptors = new[] - { + TagHelperCollection tagHelpers = + [ CreateTagHelperDescriptor( tagName: "input", typeName: "InputTagHelper", assemblyName: "TestAssembly", - attributes: new Action[] - { + attributes: + [ builder => builder .Name("bound") .PropertyName("FooProp") .TypeName("System.String"), - }) - }; + ]) + ]; - var projectEngine = CreateProjectEngine(builder => builder.AddTagHelpers(descriptors)); + var projectEngine = CreateProjectEngine(builder => builder.SetTagHelpers(tagHelpers)); var projectItem = CreateProjectItemFromFile(); // Act @@ -64,8 +65,8 @@ public void TagHelpersWithBoundAttributes() public void NestedTagHelpers() { // Arrange - var descriptors = new[] - { + TagHelperCollection tagHelpers = + [ CreateTagHelperDescriptor( tagName: "p", typeName: "PTagHelper", @@ -78,16 +79,16 @@ public void NestedTagHelpers() tagName: "input", typeName: "InputTagHelper", assemblyName: "TestAssembly", - attributes: new Action[] - { + attributes: + [ builder => builder .Name("value") .PropertyName("FooProp") .TypeName("System.String"), - }) - }; + ]) + ]; - var projectEngine = CreateProjectEngine(builder => builder.AddTagHelpers(descriptors)); + var projectEngine = CreateProjectEngine(builder => builder.SetTagHelpers(tagHelpers)); var projectItem = CreateProjectItemFromFile(); // Act diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/TestTagHelperDescriptors.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/TestTagHelperDescriptors.cs index eaa229621bb..85d9d549423 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/TestTagHelperDescriptors.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/TestTagHelperDescriptors.cs @@ -1,460 +1,461 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - using System; using System.Collections.Generic; using System.Reflection; +using Xunit; namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests; public class TestTagHelperDescriptors { - public static IEnumerable SimpleTagHelperDescriptors + public static TagHelperCollection SimpleTagHelperDescriptors { get { - return new[] - { - CreateTagHelperDescriptor( - tagName: "span", - typeName: "SpanTagHelper", - assemblyName: "TestAssembly"), - CreateTagHelperDescriptor( - tagName: "div", - typeName: "DivTagHelper", - assemblyName: "TestAssembly"), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "InputTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => builder - .Name("value") - .PropertyName("FooProp") - .TypeName("System.String"), - builder => builder - .Name("bound") - .PropertyName("BoundProp") - .TypeName("System.String"), - builder => builder - .Name("age") - .PropertyName("AgeProp") - .TypeName("System.Int32"), - builder => builder - .Name("alive") - .PropertyName("AliveProp") - .TypeName("System.Boolean"), - builder => builder - .Name("tag") - .PropertyName("TagProp") - .TypeName("System.Object"), - builder => builder - .Name("tuple-dictionary") - .PropertyName("DictionaryOfBoolAndStringTupleProperty") - .TypeName(typeof(IDictionary).Namespace + ".IDictionary") - .AsDictionaryAttribute("tuple-prefix-", typeof((bool, string)).FullName) - }) - }; + return + [ + CreateTagHelperDescriptor( + tagName: "span", + typeName: "SpanTagHelper", + assemblyName: "TestAssembly"), + CreateTagHelperDescriptor( + tagName: "div", + typeName: "DivTagHelper", + assemblyName: "TestAssembly"), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "InputTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => builder + .Name("value") + .PropertyName("FooProp") + .TypeName("System.String"), + builder => builder + .Name("bound") + .PropertyName("BoundProp") + .TypeName("System.String"), + builder => builder + .Name("age") + .PropertyName("AgeProp") + .TypeName("System.Int32"), + builder => builder + .Name("alive") + .PropertyName("AliveProp") + .TypeName("System.Boolean"), + builder => builder + .Name("tag") + .PropertyName("TagProp") + .TypeName("System.Object"), + builder => builder + .Name("tuple-dictionary") + .PropertyName("DictionaryOfBoolAndStringTupleProperty") + .TypeName(typeof(IDictionary).Namespace + ".IDictionary") + .AsDictionaryAttribute("tuple-prefix-", typeof((bool, string)).FullName) + ]) + ]; } } - public static IEnumerable MinimizedBooleanTagHelperDescriptors + public static TagHelperCollection MinimizedBooleanTagHelperDescriptors { get { - return new[] - { - CreateTagHelperDescriptor( - tagName: "span", - typeName: "SpanTagHelper", - assemblyName: "TestAssembly"), - CreateTagHelperDescriptor( - tagName: "div", - typeName: "DivTagHelper", - assemblyName: "TestAssembly"), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "InputTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => builder - .Name("value") - .PropertyName("FooProp") - .TypeName("System.String"), - builder => builder - .Name("bound") - .PropertyName("BoundProp") - .TypeName("System.Boolean"), - builder => builder - .Name("age") - .PropertyName("AgeProp") - .TypeName("System.Int32"), - }) - }; + return + [ + CreateTagHelperDescriptor( + tagName: "span", + typeName: "SpanTagHelper", + assemblyName: "TestAssembly"), + CreateTagHelperDescriptor( + tagName: "div", + typeName: "DivTagHelper", + assemblyName: "TestAssembly"), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "InputTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => builder + .Name("value") + .PropertyName("FooProp") + .TypeName("System.String"), + builder => builder + .Name("bound") + .PropertyName("BoundProp") + .TypeName("System.Boolean"), + builder => builder + .Name("age") + .PropertyName("AgeProp") + .TypeName("System.Int32"), + ]) + ]; } } - public static IEnumerable CssSelectorTagHelperDescriptors + public static TagHelperCollection CssSelectorTagHelperDescriptors { get { - var inputTypePropertyInfo = typeof(TestType).GetRuntimeProperty("Type"); - var inputCheckedPropertyInfo = typeof(TestType).GetRuntimeProperty("Checked"); + var inputTypePropertyInfo = GetTestTypeRuntimeProperty("Type"); + var inputCheckedPropertyInfo = GetTestTypeRuntimeProperty("Checked"); - return new[] - { - CreateTagHelperDescriptor( - tagName: "a", - typeName: "TestNamespace.ATagHelper", - assemblyName: "TestAssembly", - ruleBuilders: new Action[] - { - builder => builder - .RequireAttributeDescriptor(attribute => attribute - .Name("href", RequiredAttributeNameComparison.FullMatch) - .Value("~/", RequiredAttributeValueComparison.FullMatch)), - }), - CreateTagHelperDescriptor( - tagName: "a", - typeName: "TestNamespace.ATagHelperMultipleSelectors", - assemblyName: "TestAssembly", - ruleBuilders: new Action[] - { - builder => builder - .RequireAttributeDescriptor(attribute => attribute - .Name("href", RequiredAttributeNameComparison.FullMatch) - .Value("~/", RequiredAttributeValueComparison.PrefixMatch)) - .RequireAttributeDescriptor(attribute => attribute - .Name("href", RequiredAttributeNameComparison.FullMatch) - .Value("?hello=world", RequiredAttributeValueComparison.SuffixMatch)), - }), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "TestNamespace.InputTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), - }, - ruleBuilders: new Action[] - { - builder => builder - .RequireAttributeDescriptor(attribute => attribute - .Name("type", RequiredAttributeNameComparison.FullMatch) - .Value("text", RequiredAttributeValueComparison.FullMatch)), - }), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "TestNamespace.InputTagHelper2", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), - }, - ruleBuilders: new Action[] - { - builder => builder - .RequireAttributeDescriptor(attribute => attribute - .Name("ty", RequiredAttributeNameComparison.PrefixMatch)), - }), - CreateTagHelperDescriptor( - tagName: "*", - typeName: "TestNamespace.CatchAllTagHelper", - assemblyName: "TestAssembly", - ruleBuilders: new Action[] - { - builder => builder - .RequireAttributeDescriptor(attribute => attribute - .Name("href", RequiredAttributeNameComparison.FullMatch) - .Value("~/", RequiredAttributeValueComparison.PrefixMatch)), - }), - CreateTagHelperDescriptor( - tagName: "*", - typeName: "TestNamespace.CatchAllTagHelper2", - assemblyName: "TestAssembly", - ruleBuilders: new Action[] - { - builder => builder - .RequireAttributeDescriptor(attribute => attribute - .Name("type", RequiredAttributeNameComparison.FullMatch)), - }), - }; + return + [ + CreateTagHelperDescriptor( + tagName: "a", + typeName: "TestNamespace.ATagHelper", + assemblyName: "TestAssembly", + ruleBuilders: + [ + builder => builder + .RequireAttributeDescriptor(attribute => attribute + .Name("href", RequiredAttributeNameComparison.FullMatch) + .Value("~/", RequiredAttributeValueComparison.FullMatch)), + ]), + CreateTagHelperDescriptor( + tagName: "a", + typeName: "TestNamespace.ATagHelperMultipleSelectors", + assemblyName: "TestAssembly", + ruleBuilders: + [ + builder => builder + .RequireAttributeDescriptor(attribute => attribute + .Name("href", RequiredAttributeNameComparison.FullMatch) + .Value("~/", RequiredAttributeValueComparison.PrefixMatch)) + .RequireAttributeDescriptor(attribute => attribute + .Name("href", RequiredAttributeNameComparison.FullMatch) + .Value("?hello=world", RequiredAttributeValueComparison.SuffixMatch)), + ]), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "TestNamespace.InputTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), + ], + ruleBuilders: + [ + builder => builder + .RequireAttributeDescriptor(attribute => attribute + .Name("type", RequiredAttributeNameComparison.FullMatch) + .Value("text", RequiredAttributeValueComparison.FullMatch)), + ]), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "TestNamespace.InputTagHelper2", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), + ], + ruleBuilders: + [ + builder => builder + .RequireAttributeDescriptor(attribute => attribute + .Name("ty", RequiredAttributeNameComparison.PrefixMatch)), + ]), + CreateTagHelperDescriptor( + tagName: "*", + typeName: "TestNamespace.CatchAllTagHelper", + assemblyName: "TestAssembly", + ruleBuilders: + [ + builder => builder + .RequireAttributeDescriptor(attribute => attribute + .Name("href", RequiredAttributeNameComparison.FullMatch) + .Value("~/", RequiredAttributeValueComparison.PrefixMatch)), + ]), + CreateTagHelperDescriptor( + tagName: "*", + typeName: "TestNamespace.CatchAllTagHelper2", + assemblyName: "TestAssembly", + ruleBuilders: + [ + builder => builder + .RequireAttributeDescriptor(attribute => attribute + .Name("type", RequiredAttributeNameComparison.FullMatch)), + ]), + ]; } } - public static IEnumerable EnumTagHelperDescriptors + public static TagHelperCollection EnumTagHelperDescriptors { get { - return new[] - { + return + [ CreateTagHelperDescriptor( tagName: "*", typeName: "TestNamespace.CatchAllTagHelper", assemblyName: "TestAssembly", - attributes: new Action[] - { + attributes: + [ builder => builder .Name("catch-all") .PropertyName("CatchAll") .AsEnum() .TypeName("Microsoft.AspNetCore.Razor.Language.IntegrationTests.TestTagHelperDescriptors.MyEnum"), - }), + ]), CreateTagHelperDescriptor( tagName: "input", typeName: "TestNamespace.InputTagHelper", assemblyName: "TestAssembly", - attributes: new Action[] - { + attributes: + [ builder => builder .Name("value") .PropertyName("Value") .AsEnum() .TypeName("Microsoft.AspNetCore.Razor.Language.IntegrationTests.TestTagHelperDescriptors.MyEnum"), - }), - }; + ]), + ]; } } - public static IEnumerable SymbolBoundTagHelperDescriptors + public static TagHelperCollection SymbolBoundTagHelperDescriptors { get { - return new[] - { - CreateTagHelperDescriptor( - tagName: "*", - typeName: "TestNamespace.CatchAllTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => builder - .Name("[item]") - .PropertyName("ListItems") - .TypeName("System.Collections.Generic.List"), - builder => builder - .Name("[(item)]") - .PropertyName("ArrayItems") - .TypeName(typeof(string[]).FullName), - builder => builder - .Name("(click)") - .PropertyName("Event1") - .TypeName(typeof(Action).FullName), - builder => builder - .Name("(^click)") - .PropertyName("Event2") - .TypeName(typeof(Action).FullName), - builder => builder - .Name("*something") - .PropertyName("StringProperty1") - .TypeName(typeof(string).FullName), - builder => builder - .Name("#local") - .PropertyName("StringProperty2") - .TypeName(typeof(string).FullName), - }, - ruleBuilders: new Action[] - { - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("bound")), - }), - }; + return + [ + CreateTagHelperDescriptor( + tagName: "*", + typeName: "TestNamespace.CatchAllTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => builder + .Name("[item]") + .PropertyName("ListItems") + .TypeName("System.Collections.Generic.List"), + builder => builder + .Name("[(item)]") + .PropertyName("ArrayItems") + .TypeName(typeof(string[]).FullName), + builder => builder + .Name("(click)") + .PropertyName("Event1") + .TypeName(typeof(Action).FullName), + builder => builder + .Name("(^click)") + .PropertyName("Event2") + .TypeName(typeof(Action).FullName), + builder => builder + .Name("*something") + .PropertyName("StringProperty1") + .TypeName(typeof(string).FullName), + builder => builder + .Name("#local") + .PropertyName("StringProperty2") + .TypeName(typeof(string).FullName), + ], + ruleBuilders: + [ + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("bound")), + ]), + ]; } } - public static IEnumerable MinimizedTagHelpers_Descriptors + public static TagHelperCollection MinimizedTagHelpers_Descriptors { get { - return new[] - { - CreateTagHelperDescriptor( - tagName: "*", - typeName: "TestNamespace.CatchAllTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => builder - .Name("catchall-bound-string") - .PropertyName("BoundRequiredString") - .TypeName(typeof(string).FullName), - }, - ruleBuilders: new Action[] - { - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("catchall-unbound-required")), - }), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "TestNamespace.InputTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => builder - .Name("input-bound-required-string") - .PropertyName("BoundRequiredString") - .TypeName(typeof(string).FullName), - builder => builder - .Name("input-bound-string") - .PropertyName("BoundString") - .TypeName(typeof(string).FullName), - }, - ruleBuilders: new Action[] - { - builder => builder - .RequireAttributeDescriptor(attribute => attribute.Name("input-bound-required-string")) - .RequireAttributeDescriptor(attribute => attribute.Name("input-unbound-required")), - }), - CreateTagHelperDescriptor( - tagName: "div", - typeName: "DivTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => builder - .Name("boundbool") - .PropertyName("BoundBoolProp") - .TypeName(typeof(bool).FullName), - builder => builder - .Name("booldict") - .PropertyName("BoolDictProp") - .TypeName("System.Collections.Generic.IDictionary") - .AsDictionaryAttribute("booldict-prefix-", typeof(bool).FullName), - }), - }; + return + [ + CreateTagHelperDescriptor( + tagName: "*", + typeName: "TestNamespace.CatchAllTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => builder + .Name("catchall-bound-string") + .PropertyName("BoundRequiredString") + .TypeName(typeof(string).FullName), + ], + ruleBuilders: + [ + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("catchall-unbound-required")), + ]), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "TestNamespace.InputTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => builder + .Name("input-bound-required-string") + .PropertyName("BoundRequiredString") + .TypeName(typeof(string).FullName), + builder => builder + .Name("input-bound-string") + .PropertyName("BoundString") + .TypeName(typeof(string).FullName), + ], + ruleBuilders: + [ + builder => builder + .RequireAttributeDescriptor(attribute => attribute.Name("input-bound-required-string")) + .RequireAttributeDescriptor(attribute => attribute.Name("input-unbound-required")), + ]), + CreateTagHelperDescriptor( + tagName: "div", + typeName: "DivTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => builder + .Name("boundbool") + .PropertyName("BoundBoolProp") + .TypeName(typeof(bool).FullName), + builder => builder + .Name("booldict") + .PropertyName("BoolDictProp") + .TypeName("System.Collections.Generic.IDictionary") + .AsDictionaryAttribute("booldict-prefix-", typeof(bool).FullName), + ]), + ]; } } - public static IEnumerable DynamicAttributeTagHelpers_Descriptors + public static TagHelperCollection DynamicAttributeTagHelpers_Descriptors { get { - return new[] - { + return + [ CreateTagHelperDescriptor( tagName: "input", typeName: "TestNamespace.InputTagHelper", assemblyName: "TestAssembly", - attributes: new Action[] - { + attributes: + [ builder => builder .Name("bound") .PropertyName("Bound") .TypeName(typeof(string).FullName) - }), - }; + ]), + ]; } } - public static IEnumerable DuplicateTargetTagHelperDescriptors + public static TagHelperCollection DuplicateTargetTagHelperDescriptors { get { - var typePropertyInfo = typeof(TestType).GetRuntimeProperty("Type"); - var checkedPropertyInfo = typeof(TestType).GetRuntimeProperty("Checked"); - return new[] - { - CreateTagHelperDescriptor( - tagName: "*", - typeName: "TestNamespace.CatchAllTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", typePropertyInfo), - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "checked", checkedPropertyInfo), - }, - ruleBuilders: new Action[] - { - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("type")), - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("checked")) - }), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "TestNamespace.InputTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", typePropertyInfo), - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "checked", checkedPropertyInfo), - }, - ruleBuilders: new Action[] - { - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("type")), - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("checked")) - }) - }; + var typePropertyInfo = GetTestTypeRuntimeProperty("Type"); + var checkedPropertyInfo = GetTestTypeRuntimeProperty("Checked"); + + return + [ + CreateTagHelperDescriptor( + tagName: "*", + typeName: "TestNamespace.CatchAllTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", typePropertyInfo), + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "checked", checkedPropertyInfo), + ], + ruleBuilders: + [ + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("type")), + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("checked")) + ]), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "TestNamespace.InputTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", typePropertyInfo), + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "checked", checkedPropertyInfo), + ], + ruleBuilders: + [ + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("type")), + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("checked")) + ]) + ]; } } - public static IEnumerable AttributeTargetingTagHelperDescriptors + public static TagHelperCollection AttributeTargetingTagHelperDescriptors { get { - var inputTypePropertyInfo = typeof(TestType).GetRuntimeProperty("Type"); - var inputCheckedPropertyInfo = typeof(TestType).GetRuntimeProperty("Checked"); - return new[] - { - CreateTagHelperDescriptor( - tagName: "p", - typeName: "TestNamespace.PTagHelper", - assemblyName: "TestAssembly", - ruleBuilders: new Action[] - { - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("class")), - }), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "TestNamespace.InputTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), - }, - ruleBuilders: new Action[] - { - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("type")), - }), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "TestNamespace.InputTagHelper2", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "checked", inputCheckedPropertyInfo), - }, - ruleBuilders: new Action[] - { - builder => builder - .RequireAttributeDescriptor(attribute => attribute.Name("type")) - .RequireAttributeDescriptor(attribute => attribute.Name("checked")), - }), - CreateTagHelperDescriptor( - tagName: "*", - typeName: "TestNamespace.CatchAllTagHelper", - assemblyName: "TestAssembly", - ruleBuilders: new Action[] - { - builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("catchAll")), - }), - }; + var inputTypePropertyInfo = GetTestTypeRuntimeProperty("Type"); + var inputCheckedPropertyInfo = GetTestTypeRuntimeProperty("Checked"); + + return + [ + CreateTagHelperDescriptor( + tagName: "p", + typeName: "TestNamespace.PTagHelper", + assemblyName: "TestAssembly", + ruleBuilders: + [ + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("class")), + ]), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "TestNamespace.InputTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), + ], + ruleBuilders: + [ + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("type")), + ]), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "TestNamespace.InputTagHelper2", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "checked", inputCheckedPropertyInfo), + ], + ruleBuilders: + [ + builder => builder + .RequireAttributeDescriptor(attribute => attribute.Name("type")) + .RequireAttributeDescriptor(attribute => attribute.Name("checked")), + ]), + CreateTagHelperDescriptor( + tagName: "*", + typeName: "TestNamespace.CatchAllTagHelper", + assemblyName: "TestAssembly", + ruleBuilders: + [ + builder => builder.RequireAttributeDescriptor(attribute => attribute.Name("catchAll")), + ]), + ]; } } - public static IEnumerable PrefixedAttributeTagHelperDescriptors + public static TagHelperCollection PrefixedAttributeTagHelperDescriptors { get { - return new[] - { + return + [ CreateTagHelperDescriptor( tagName: "input", typeName: "TestNamespace.InputTagHelper1", assemblyName: "TestAssembly", - attributes: new Action[] - { + attributes: + [ builder => builder .Name("int-prefix-grabber") .PropertyName("IntProperty") @@ -473,13 +474,13 @@ public static IEnumerable PrefixedAttributeTagHelperDescrip .PropertyName("StringDictionaryProperty") .TypeName("Namespace.DictionaryWithoutParameterlessConstructor") .AsDictionaryAttribute("string-prefix-", typeof(string).FullName), - }), + ]), CreateTagHelperDescriptor( tagName: "input", typeName: "TestNamespace.InputTagHelper2", assemblyName: "TestAssembly", - attributes: new Action[] - { + attributes: + [ builder => builder .Name("int-dictionary") .PropertyName("IntDictionaryProperty") @@ -490,78 +491,79 @@ public static IEnumerable PrefixedAttributeTagHelperDescrip .PropertyName("StringDictionaryProperty") .TypeName("Namespace.DictionaryWithoutParameterlessConstructor") .AsDictionaryAttribute("string-prefix-", typeof(string).FullName), - }), - }; + ]), + ]; } } - public static IEnumerable TagHelpersInSectionDescriptors + public static TagHelperCollection TagHelpersInSectionDescriptors { get { - var propertyInfo = typeof(TestType).GetRuntimeProperty("BoundProperty"); - return new[] - { - CreateTagHelperDescriptor( - tagName: "MyTagHelper", - typeName: "TestNamespace.MyTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "BoundProperty", propertyInfo), - }), - CreateTagHelperDescriptor( - tagName: "NestedTagHelper", - typeName: "TestNamespace.NestedTagHelper", - assemblyName: "TestAssembly"), - }; + var propertyInfo = GetTestTypeRuntimeProperty("BoundProperty"); + + return + [ + CreateTagHelperDescriptor( + tagName: "MyTagHelper", + typeName: "TestNamespace.MyTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "BoundProperty", propertyInfo), + ]), + CreateTagHelperDescriptor( + tagName: "NestedTagHelper", + typeName: "TestNamespace.NestedTagHelper", + assemblyName: "TestAssembly"), + ]; } } - public static IEnumerable DefaultPAndInputTagHelperDescriptors + public static TagHelperCollection DefaultPAndInputTagHelperDescriptors { get { - var pAgePropertyInfo = typeof(TestType).GetRuntimeProperty("Age"); - var inputTypePropertyInfo = typeof(TestType).GetRuntimeProperty("Type"); - var checkedPropertyInfo = typeof(TestType).GetRuntimeProperty("Checked"); + var pAgePropertyInfo = GetTestTypeRuntimeProperty("Age"); + var inputTypePropertyInfo = GetTestTypeRuntimeProperty("Type"); + var checkedPropertyInfo = GetTestTypeRuntimeProperty("Checked"); - return new[] - { - CreateTagHelperDescriptor( - tagName: "p", - typeName: "TestNamespace.PTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "age", pAgePropertyInfo), - }, - ruleBuilders: new Action[] - { - builder => builder.RequireTagStructure(TagStructure.NormalOrSelfClosing) - }), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "TestNamespace.InputTagHelper", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), - }, - ruleBuilders: new Action[] - { - builder => builder.RequireTagStructure(TagStructure.WithoutEndTag) - }), - CreateTagHelperDescriptor( - tagName: "input", - typeName: "TestNamespace.InputTagHelper2", - assemblyName: "TestAssembly", - attributes: new Action[] - { - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), - builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "checked", checkedPropertyInfo), - }), - }; + return + [ + CreateTagHelperDescriptor( + tagName: "p", + typeName: "TestNamespace.PTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "age", pAgePropertyInfo), + ], + ruleBuilders: + [ + builder => builder.RequireTagStructure(TagStructure.NormalOrSelfClosing) + ]), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "TestNamespace.InputTagHelper", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), + ], + ruleBuilders: + [ + builder => builder.RequireTagStructure(TagStructure.WithoutEndTag) + ]), + CreateTagHelperDescriptor( + tagName: "input", + typeName: "TestNamespace.InputTagHelper2", + assemblyName: "TestAssembly", + attributes: + [ + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "type", inputTypePropertyInfo), + builder => BuildBoundAttributeDescriptorFromPropertyInfo(builder, "checked", checkedPropertyInfo), + ]), + ]; } } @@ -569,8 +571,8 @@ private static TagHelperDescriptor CreateTagHelperDescriptor( string tagName, string typeName, string assemblyName, - IEnumerable> attributes = null, - IEnumerable> ruleBuilders = null) + IEnumerable>? attributes = null, + IEnumerable>? ruleBuilders = null) { var builder = TagHelperDescriptorBuilder.CreateTagHelper(typeName, assemblyName); builder.SetTypeName(typeName, typeNamespace: null, typeNameIdentifier: null); @@ -604,6 +606,14 @@ private static TagHelperDescriptor CreateTagHelperDescriptor( return descriptor; } + private static PropertyInfo GetTestTypeRuntimeProperty(string name) + { + var result = typeof(TestType).GetRuntimeProperty(name); + Assert.NotNull(result); + + return result; + } + private static void BuildBoundAttributeDescriptorFromPropertyInfo( BoundAttributeDescriptorBuilder builder, string name, @@ -624,11 +634,11 @@ private class TestType { public int Age { get; set; } - public string Type { get; set; } + public string? Type { get; set; } public bool Checked { get; set; } - public string BoundProperty { get; set; } + public string? BoundProperty { get; set; } } public static readonly string Code = """ diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CSharpBlockTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CSharpBlockTest.cs index 6142e050d76..59dd15d9e23 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CSharpBlockTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CSharpBlockTest.cs @@ -931,6 +931,157 @@ public void CommentOnSameLineAsHtml() """); } + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + 0 => "value", + _ => "no value" + }; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithLessThan() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + < 9 => "less than 10" + }; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithGreaterThan() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + > 10 => "greater than 10" + }; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithMultipleComparisons() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + < 9 => "less than 10", + 10 => "equal to 10", + > 10 => "greater than 10" + }; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_Incomplete() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + 0 => "value" + + var val2 = "value2"; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithLessThan_Incomplete() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + < 9 => "less than 10" + + var val2 = "value2"; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithWrongKeyword() + { + ParseDocumentTest(""" + @{ + var val = 0 using + { + 0 => "value" + }; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithWrongKeyword_AndLessThan() + { + ParseDocumentTest(""" + @{ + var val = 0 using + { + < 9 => "less than 10" + }; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithMarkupInside() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + 0 => some html, + _ => "value" + }; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithMarkupInside_ViaAtSymbol() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + 0 => @zero, + _ => @one + }; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithMarkupInside_WithLessThan() + { + ParseDocumentTest(""" + @{ + var val = 0 switch + { + < 10 => @less than 10, + _ => @other + }; + } + """); + } + private void RunRazorCommentBetweenClausesTest(string preComment, string postComment, AcceptedCharactersInternal acceptedCharacters = AcceptedCharactersInternal.Any) { ParseDocumentTest(preComment + "@* Foo *@ @* Bar *@" + postComment); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CSharpExplicitExpressionTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CSharpExplicitExpressionTest.cs index 9dd2aafc484..03775950c01 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CSharpExplicitExpressionTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CSharpExplicitExpressionTest.cs @@ -4,6 +4,7 @@ #nullable disable using System; +using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.AspNetCore.Razor.Language.Legacy; @@ -76,4 +77,50 @@ public void ShouldAcceptConsecutiveEscapedQuotesInVerbatimStrings() { ParseDocumentTest("@(@\"\"\"\"\"\")"); } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression() + { + ParseDocumentTest(""" + @(value switch{ + 10 => "ten", + _ => "other" + }) + + @code{ + public int value = 10; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithLessThan() + { + ParseDocumentTest(""" + @(value switch{ + < 10 => "less than", + 10 => "ten", + _ => "other" + }) + + @code{ + public int value = 10; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/7230")] + public void SwitchExpression_WithHtml() + { + ParseDocumentTest(""" + @(value switch{ + 10 => ten, + _ => "other" + }) + + @code{ + public int value = 10; + } + """); + } } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperBlockRewriterTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperBlockRewriterTest.cs index 3bbcb7584ee..86834270801 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperBlockRewriterTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperBlockRewriterTest.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Globalization; using Microsoft.AspNetCore.Razor.Language.Components; using Roslyn.Test.Utilities; @@ -13,7 +12,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy; public class TagHelperBlockRewriterTest : TagHelperRewritingTestBase { - public static ImmutableArray SymbolBoundAttributes_Descriptors = + public static readonly TagHelperCollection SymbolBoundAttributes_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("CatchAllTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -49,46 +48,46 @@ public class TagHelperBlockRewriterTest : TagHelperRewritingTestBase [Fact] public void CanHandleSymbolBoundAttributes1() { - EvaluateData(SymbolBoundAttributes_Descriptors, "
            "); + EvaluateData(SymbolBoundAttributes_TagHelpers, "
              "); } [Fact] public void CanHandleSymbolBoundAttributes2() { - EvaluateData(SymbolBoundAttributes_Descriptors, "
                "); + EvaluateData(SymbolBoundAttributes_TagHelpers, "
                  "); } [Fact] public void CanHandleSymbolBoundAttributes3() { - EvaluateData(SymbolBoundAttributes_Descriptors, ""); + EvaluateData(SymbolBoundAttributes_TagHelpers, ""); } [Fact] public void CanHandleSymbolBoundAttributes4() { - EvaluateData(SymbolBoundAttributes_Descriptors, ""); + EvaluateData(SymbolBoundAttributes_TagHelpers, ""); } [Fact] public void CanHandleSymbolBoundAttributes5() { - EvaluateData(SymbolBoundAttributes_Descriptors, ""); + EvaluateData(SymbolBoundAttributes_TagHelpers, ""); } [Fact] public void CanHandleSymbolBoundAttributes6() { - EvaluateData(SymbolBoundAttributes_Descriptors, "
                  "); + EvaluateData(SymbolBoundAttributes_TagHelpers, "
                  "); } [Fact] public void CanHandleSymbolBoundAttributes7() { - EvaluateData(SymbolBoundAttributes_Descriptors, "
                  "); + EvaluateData(SymbolBoundAttributes_TagHelpers, "
                  "); } - public static ImmutableArray WithoutEndTag_Descriptors = + public static readonly TagHelperCollection WithoutEndTag_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -100,34 +99,34 @@ public void CanHandleSymbolBoundAttributes7() [Fact] public void CanHandleWithoutEndTagTagStructure1() { - EvaluateData(WithoutEndTag_Descriptors, ""); + EvaluateData(WithoutEndTag_TagHelpers, ""); } [Fact] public void CanHandleWithoutEndTagTagStructure2() { - EvaluateData(WithoutEndTag_Descriptors, ""); + EvaluateData(WithoutEndTag_TagHelpers, ""); } [Fact] public void CanHandleWithoutEndTagTagStructure3() { - EvaluateData(WithoutEndTag_Descriptors, ""); + EvaluateData(WithoutEndTag_TagHelpers, ""); } [Fact] public void CanHandleWithoutEndTagTagStructure4() { - EvaluateData(WithoutEndTag_Descriptors, ""); + EvaluateData(WithoutEndTag_TagHelpers, ""); } [Fact] public void CanHandleWithoutEndTagTagStructure5() { - EvaluateData(WithoutEndTag_Descriptors, "
                  "); + EvaluateData(WithoutEndTag_TagHelpers, "
                  "); } - public static ImmutableArray GetTagStructureCompatibilityDescriptors(TagStructure structure1, TagStructure structure2) + public static TagHelperCollection GetTagStructureCompatibilityTagHelpers(TagStructure structure1, TagStructure structure2) { return [ @@ -148,7 +147,7 @@ public static ImmutableArray GetTagStructureCompatibilityDe public void AllowsCompatibleTagStructures1() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.Unspecified); + var descriptors = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.Unspecified); // Act & Assert EvaluateData(descriptors, ""); @@ -158,7 +157,7 @@ public void AllowsCompatibleTagStructures1() public void AllowsCompatibleTagStructures2() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.Unspecified); + var descriptors = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.Unspecified); // Act & Assert EvaluateData(descriptors, ""); @@ -168,7 +167,7 @@ public void AllowsCompatibleTagStructures2() public void AllowsCompatibleTagStructures3() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.WithoutEndTag); + var descriptors = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.WithoutEndTag); // Act & Assert EvaluateData(descriptors, ""); @@ -178,7 +177,7 @@ public void AllowsCompatibleTagStructures3() public void AllowsCompatibleTagStructures4() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.WithoutEndTag, TagStructure.WithoutEndTag); + var descriptors = GetTagStructureCompatibilityTagHelpers(TagStructure.WithoutEndTag, TagStructure.WithoutEndTag); // Act & Assert EvaluateData(descriptors, ""); @@ -188,7 +187,7 @@ public void AllowsCompatibleTagStructures4() public void AllowsCompatibleTagStructures5() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.NormalOrSelfClosing); + var descriptors = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.NormalOrSelfClosing); // Act & Assert EvaluateData(descriptors, ""); @@ -198,7 +197,7 @@ public void AllowsCompatibleTagStructures5() public void AllowsCompatibleTagStructures6() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.Unspecified, TagStructure.WithoutEndTag); + var descriptors = GetTagStructureCompatibilityTagHelpers(TagStructure.Unspecified, TagStructure.WithoutEndTag); // Act & Assert EvaluateData(descriptors, ""); @@ -208,7 +207,7 @@ public void AllowsCompatibleTagStructures6() public void AllowsCompatibleTagStructures7() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.NormalOrSelfClosing, TagStructure.Unspecified); + var descriptors = GetTagStructureCompatibilityTagHelpers(TagStructure.NormalOrSelfClosing, TagStructure.Unspecified); // Act & Assert EvaluateData(descriptors, ""); @@ -218,7 +217,7 @@ public void AllowsCompatibleTagStructures7() public void AllowsCompatibleTagStructures8() { // Arrange - var descriptors = GetTagStructureCompatibilityDescriptors(TagStructure.WithoutEndTag, TagStructure.Unspecified); + var descriptors = GetTagStructureCompatibilityTagHelpers(TagStructure.WithoutEndTag, TagStructure.Unspecified); // Act & Assert EvaluateData(descriptors, ""); @@ -228,7 +227,7 @@ public void AllowsCompatibleTagStructures8() public void AllowsCompatibleTagStructures_DirectiveAttribute_SelfClosing() { // Arrange - ImmutableArray descriptors = + TagHelperCollection descriptors = [ TagHelperDescriptorBuilder.CreateEventHandler("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -247,7 +246,7 @@ public void AllowsCompatibleTagStructures_DirectiveAttribute_SelfClosing() public void AllowsCompatibleTagStructures_DirectiveAttribute_Void() { // Arrange - ImmutableArray descriptors = + TagHelperCollection descriptors = [ TagHelperDescriptorBuilder.CreateEventHandler("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -430,7 +429,7 @@ public void CreatesErrorForMalformedTagHelper8() RunParseTreeRewriterTest("

                  ", "strong", "p"); } - public static ImmutableArray CodeTagHelperAttributes_Descriptors = + public static TagHelperCollection CodeTagHelperAttributes_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PersonTagHelper", "personAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("person")) @@ -460,85 +459,85 @@ public void CreatesErrorForMalformedTagHelper8() [Fact] public void UnderstandsMultipartNonStringTagHelperAttributes() { - EvaluateData(CodeTagHelperAttributes_Descriptors, " 123)()\" />"); + EvaluateData(CodeTagHelperAttributes_TagHelpers, " 123)()\" />"); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes1() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes2() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes3() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes4() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes5() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes6() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes7() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes8() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes9() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes10() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes11() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes12() { - EvaluateData(CodeTagHelperAttributes_Descriptors, ""); + EvaluateData(CodeTagHelperAttributes_TagHelpers, ""); } [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes13() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var count = "1"; } @@ -549,7 +548,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes13() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes14() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var @string = "1"; } @@ -560,7 +559,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes14() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes15() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var count = "1"; } @@ -571,7 +570,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes15() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes16() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var count = "1"; } @@ -582,7 +581,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes16() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes17() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var count = 1; } @@ -593,7 +592,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes17() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes18() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var count = 1; } @@ -604,7 +603,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes18() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes19() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var count = 1; } @@ -615,7 +614,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes19() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes20() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var isAlive = true; } @@ -626,7 +625,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes20() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes21() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var obj = new { Prop = (object)1 }; } @@ -637,7 +636,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes21() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10186")] public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes22() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ @{ var obj = new { Prop = (object)1 }; } @@ -668,7 +667,7 @@ public void CreatesMarkupCodeSpansForNonStringTagHelperAttributes23() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_01() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -676,7 +675,7 @@ public void CreatesMarkupCodeSpans_EscapedExpression_01() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_02() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -684,7 +683,7 @@ public void CreatesMarkupCodeSpans_EscapedExpression_02() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_03() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -692,7 +691,7 @@ public void CreatesMarkupCodeSpans_EscapedExpression_03() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_04() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -700,7 +699,7 @@ public void CreatesMarkupCodeSpans_EscapedExpression_04() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_05() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -708,7 +707,7 @@ public void CreatesMarkupCodeSpans_EscapedExpression_05() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_06() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -716,7 +715,7 @@ public void CreatesMarkupCodeSpans_EscapedExpression_06() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_07() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -724,7 +723,7 @@ public void CreatesMarkupCodeSpans_EscapedExpression_07() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_08() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -732,7 +731,7 @@ public void CreatesMarkupCodeSpans_EscapedExpression_08() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_09() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } @@ -740,11 +739,91 @@ public void CreatesMarkupCodeSpans_EscapedExpression_09() [Fact, WorkItem("https://github.com/dotnet/razor/issues/10426")] public void CreatesMarkupCodeSpans_EscapedExpression_10() { - EvaluateData(CodeTagHelperAttributes_Descriptors, """ + EvaluateData(CodeTagHelperAttributes_TagHelpers, """ """); } + // Regression tests for SDK 9+ escaped @@ attribute bug + // Tests for attributes following escaped @@ attributes with unquoted expressions + + public static TagHelperCollection AttributeTargetingTagHelper_TagHelpers = + [ + TagHelperDescriptorBuilder.CreateTagHelper("ControlIdTagHelper", "TestAssembly") + .TagMatchingRuleDescriptor(rule => rule + .RequireTagName("*") + .RequireAttributeDescriptor(attribute => attribute.Name("control-id"))) + .BoundAttributeDescriptor(attribute => attribute + .Name("control-id") + .PropertyName("ControlId") + .TypeName(typeof(string).FullName)) + .BoundAttributeDescriptor(attribute => attribute + .Name("is-confirm-redirect") + .PropertyName("IsConfirmRedirect") + .TypeName(typeof(string).FullName)) + .Build() + ]; + + [Fact] + public void EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes() + { + // Test the exact scenario from the issue: @@click with unquoted expression followed by other attributes + EvaluateData(AttributeTargetingTagHelper_TagHelpers, """ + @{ + var functionCode = 10; + } +
                  Content
                  + """); + } + + [Fact] + public void EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes() + { + // Test with multiple attributes after the escaped @@ attribute + EvaluateData(AttributeTargetingTagHelper_TagHelpers, """ + @{ + var code = 20; + } + Text + """); + } + + [Fact] + public void EscapedAttributeWithUnquotedExpression_BoundAttributeFollows() + { + // Test specifically that bound attributes following escaped @@ are not swallowed + EvaluateData(AttributeTargetingTagHelper_TagHelpers, """ + @{ + var url = "Tasks"; + } + + """); + } + + [Fact] + public void EscapedAttributeWithUnquotedExpression_AtEnd() + { + // Test escaped @@ attribute at the end (should not affect previous attributes) + EvaluateData(AttributeTargetingTagHelper_TagHelpers, """ + @{ + var id = 5; + } +
                  Content
                  + """); + } + + [Fact] + public void EscapedAttributeWithUnquotedExpression_MiddlePosition() + { + // Test escaped @@ attribute in the middle + EvaluateData(AttributeTargetingTagHelper_TagHelpers, """ + @{ + var value = 42; + } +
                  Text
                  + """); + } + [Fact] public void TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper1() { @@ -1057,7 +1136,7 @@ public void UnderstandsEmptyAttributeTagHelpers5() RunParseTreeRewriterTest("

                  ", "p"); } - public static ImmutableArray EmptyTagHelperBoundAttribute_Descriptors = + public static TagHelperCollection EmptyTagHelperBoundAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("mythTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("myth")) @@ -1075,85 +1154,85 @@ public void UnderstandsEmptyAttributeTagHelpers5() [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes1() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes2() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes3() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes4() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes5() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes6() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes7() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes8() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes9() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes10() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes11() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes12() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes13() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] public void CreatesErrorForEmptyTagHelperBoundAttributes14() { - EvaluateData(EmptyTagHelperBoundAttribute_Descriptors, ""); + EvaluateData(EmptyTagHelperBoundAttribute_TagHelpers, ""); } [Fact] @@ -1469,7 +1548,7 @@ public void GeneratesExpectedOutputForUnboundDataDashAttributes_Block7() RunParseTreeRewriterTest(document, "input"); } - public static ImmutableArray MinimizedAttribute_Descriptors = + public static TagHelperCollection MinimizedAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -1525,7 +1604,7 @@ public void UnderstandsMinimizedAttributes_Document1() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1535,7 +1614,7 @@ public void UnderstandsMinimizedAttributes_Document2() var document = "

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1545,7 +1624,7 @@ public void UnderstandsMinimizedAttributes_Document3() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1555,7 +1634,7 @@ public void UnderstandsMinimizedAttributes_Document4() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1565,7 +1644,7 @@ public void UnderstandsMinimizedAttributes_Document5() var document = "

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1575,7 +1654,7 @@ public void UnderstandsMinimizedAttributes_Document6() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1585,7 +1664,7 @@ public void UnderstandsMinimizedAttributes_Document7() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1595,7 +1674,7 @@ public void UnderstandsMinimizedAttributes_Document8() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1605,7 +1684,7 @@ public void UnderstandsMinimizedAttributes_Document9() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1615,7 +1694,7 @@ public void UnderstandsMinimizedAttributes_Document10() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1625,7 +1704,7 @@ public void UnderstandsMinimizedAttributes_Document11() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1635,7 +1714,7 @@ public void UnderstandsMinimizedAttributes_Document12() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1645,7 +1724,7 @@ public void UnderstandsMinimizedAttributes_Document13() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1655,7 +1734,7 @@ public void UnderstandsMinimizedAttributes_Document14() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1665,7 +1744,7 @@ public void UnderstandsMinimizedAttributes_Document15() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1675,7 +1754,7 @@ public void UnderstandsMinimizedAttributes_Document16() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1685,7 +1764,7 @@ public void UnderstandsMinimizedAttributes_Document17() var document = "

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1695,7 +1774,7 @@ public void UnderstandsMinimizedAttributes_Document18() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1705,7 +1784,7 @@ public void UnderstandsMinimizedAttributes_Document19() var document = "

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1715,7 +1794,7 @@ public void UnderstandsMinimizedAttributes_Document20() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1725,7 +1804,7 @@ public void UnderstandsMinimizedAttributes_Document21() var document = "

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1735,7 +1814,7 @@ public void UnderstandsMinimizedAttributes_Document22() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1745,7 +1824,7 @@ public void UnderstandsMinimizedAttributes_Document23() var document = "

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1755,7 +1834,7 @@ public void UnderstandsMinimizedAttributes_Document24() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1765,7 +1844,7 @@ public void UnderstandsMinimizedAttributes_Document25() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1775,7 +1854,7 @@ public void UnderstandsMinimizedAttributes_Document26() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1785,7 +1864,7 @@ public void UnderstandsMinimizedAttributes_Document27() var document = "

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1795,7 +1874,7 @@ public void UnderstandsMinimizedAttributes_Document28() var document = ""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1805,7 +1884,7 @@ public void UnderstandsMinimizedAttributes_Document29() var document = "

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1816,7 +1895,7 @@ public void UnderstandsMinimizedAttributes_Document30() var document = $""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1827,7 +1906,7 @@ public void UnderstandsMinimizedAttributes_Document31() var document = $"

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1838,7 +1917,7 @@ public void UnderstandsMinimizedAttributes_Document32() var document = $""; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1849,7 +1928,7 @@ public void UnderstandsMinimizedAttributes_Document33() var document = $"

                  "; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1862,7 +1941,7 @@ public void UnderstandsMinimizedAttributes_Block1() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1875,7 +1954,7 @@ public void UnderstandsMinimizedAttributes_Block2() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1888,7 +1967,7 @@ public void UnderstandsMinimizedAttributes_Block3() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1901,7 +1980,7 @@ public void UnderstandsMinimizedAttributes_Block4() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1914,7 +1993,7 @@ public void UnderstandsMinimizedAttributes_Block5() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1927,7 +2006,7 @@ public void UnderstandsMinimizedAttributes_Block6() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1940,7 +2019,7 @@ public void UnderstandsMinimizedAttributes_Block7() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1953,7 +2032,7 @@ public void UnderstandsMinimizedAttributes_Block8() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1966,7 +2045,7 @@ public void UnderstandsMinimizedAttributes_Block9() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1979,7 +2058,7 @@ public void UnderstandsMinimizedAttributes_Block10() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -1992,7 +2071,7 @@ public void UnderstandsMinimizedAttributes_Block11() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2005,7 +2084,7 @@ public void UnderstandsMinimizedAttributes_Block12() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2018,7 +2097,7 @@ public void UnderstandsMinimizedAttributes_Block13() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2031,7 +2110,7 @@ public void UnderstandsMinimizedAttributes_Block14() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2044,7 +2123,7 @@ public void UnderstandsMinimizedAttributes_Block15() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2057,7 +2136,7 @@ public void UnderstandsMinimizedAttributes_Block16() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2070,7 +2149,7 @@ public void UnderstandsMinimizedAttributes_Block17() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2083,7 +2162,7 @@ public void UnderstandsMinimizedAttributes_Block18() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2096,7 +2175,7 @@ public void UnderstandsMinimizedAttributes_Block19() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2109,7 +2188,7 @@ public void UnderstandsMinimizedAttributes_Block20() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2122,7 +2201,7 @@ public void UnderstandsMinimizedAttributes_Block21() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2135,7 +2214,7 @@ public void UnderstandsMinimizedAttributes_Block22() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2148,7 +2227,7 @@ public void UnderstandsMinimizedAttributes_Block23() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2161,7 +2240,7 @@ public void UnderstandsMinimizedAttributes_Block24() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2174,7 +2253,7 @@ public void UnderstandsMinimizedAttributes_Block25() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2187,7 +2266,7 @@ public void UnderstandsMinimizedAttributes_Block26() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2200,7 +2279,7 @@ public void UnderstandsMinimizedAttributes_Block27() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2213,7 +2292,7 @@ public void UnderstandsMinimizedAttributes_Block28() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2226,7 +2305,7 @@ public void UnderstandsMinimizedAttributes_Block29() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2240,7 +2319,7 @@ public void UnderstandsMinimizedAttributes_Block30() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2254,7 +2333,7 @@ public void UnderstandsMinimizedAttributes_Block31() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2268,7 +2347,7 @@ public void UnderstandsMinimizedAttributes_Block32() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] @@ -2282,55 +2361,55 @@ public void UnderstandsMinimizedAttributes_Block33() document = $"@{{{document}}}"; // Act & Assert - EvaluateData(MinimizedAttribute_Descriptors, document); + EvaluateData(MinimizedAttribute_TagHelpers, document); } [Fact] public void UnderstandsMinimizedAttributes_PartialTags1() { - EvaluateData(MinimizedAttribute_Descriptors, " descriptors = + TagHelperCollection descriptors = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -2364,7 +2443,7 @@ public void FeatureDisabled_AddsErrorForMinimizedBooleanBoundAttributes() { // Arrange var document = ""; - ImmutableArray descriptors = + TagHelperCollection descriptors = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -2390,7 +2469,7 @@ public void Rewrites_ComponentDirectiveAttributes() { // Arrange var document = @""; - ImmutableArray descriptors = + TagHelperCollection descriptors = [ TagHelperDescriptorBuilder.Create(TagHelperKind.Bind, "Bind", ComponentsApi.AssemblyName) .TypeName( @@ -2434,7 +2513,7 @@ public void Rewrites_MinimizedComponentDirectiveAttributes() { // Arrange var document = @""; - ImmutableArray descriptors = + TagHelperCollection descriptors = [ TagHelperDescriptorBuilder.Create(TagHelperKind.Bind, "Bind", ComponentsApi.AssemblyName) .TypeName( @@ -2477,7 +2556,8 @@ public void Rewrites_MinimizedComponentDirectiveAttributes() public void TagHelper_AttributeAfterRazorComment() { // Arrange - var descriptors = ImmutableArray.Create( + TagHelperCollection tagHelpers = + [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "TestAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) .BoundAttributeDescriptor(attribute => attribute @@ -2488,10 +2568,11 @@ public void TagHelper_AttributeAfterRazorComment() .Name("not-visible") .PropertyName("NotVisible") .TypeName(typeof(bool).FullName)) - .Build()); + .Build() + ]; // Act & Assert - EvaluateData(descriptors, """ + EvaluateData(tagHelpers, """

                  rule.RequireTagName("p")) .BoundAttributeDescriptor(attribute => attribute @@ -2519,10 +2601,11 @@ public void TagHelper_MultipleAttributesAfterRazorComment() .Name("attr-3") .PropertyName("Attr3") .TypeName(typeof(string).FullName)) - .Build()); + .Build() + ]; // Act & Assert - EvaluateData(descriptors, """ + EvaluateData(tagHelpers, """

                  """); } @@ -2531,7 +2614,8 @@ public void TagHelper_MultipleAttributesAfterRazorComment() public void TagHelper_MultipleInterleavedRazorComments() { // Arrange - var descriptors = ImmutableArray.Create( + TagHelperCollection tagHelpers = + [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "TestAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("input")) .BoundAttributeDescriptor(attribute => attribute @@ -2542,10 +2626,11 @@ public void TagHelper_MultipleInterleavedRazorComments() .Name("value") .PropertyName("Value") .TypeName(typeof(string).FullName)) - .Build()); + .Build() + ]; // Act & Assert - EvaluateData(descriptors, """ + EvaluateData(tagHelpers, """ """); } @@ -2554,7 +2639,8 @@ public void TagHelper_MultipleInterleavedRazorComments() public void TagHelper_MinimizedAttributeAfterRazorComment() { // Arrange - var descriptors = ImmutableArray.Create( + TagHelperCollection tagHelpers = + [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "TestAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("input")) .BoundAttributeDescriptor(attribute => attribute @@ -2565,10 +2651,11 @@ public void TagHelper_MinimizedAttributeAfterRazorComment() .Name("checked") .PropertyName("Checked") .TypeName(typeof(bool).FullName)) - .Build()); + .Build() + ]; // Act & Assert - EvaluateData(descriptors, """ + EvaluateData(tagHelpers, """ """); } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperParseTreeRewriterTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperParseTreeRewriterTest.cs index 1af193083e2..5047a11285b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperParseTreeRewriterTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperParseTreeRewriterTest.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; using Microsoft.AspNetCore.Razor.Language.Syntax; using Xunit; @@ -66,7 +65,7 @@ public void GetAttributeNameValuePairs_ParsesPairsCorrectly( Assert.Equal(expectedPairs, pairs); } - public static ImmutableArray PartialRequiredParentTags_Descriptors = + public static readonly TagHelperCollection PartialRequiredParentTags_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("StrongTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("strong")) @@ -84,45 +83,45 @@ public void GetAttributeNameValuePairs_ParsesPairsCorrectly( public void UnderstandsPartialRequiredParentTags1() { var document = "

                  "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags2() { var document = "

                  "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags3() { var document = "

                  "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags4() { var document = "<

                  <

                  "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags5() { var document = "<

                  <

                  "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } [Fact] public void UnderstandsPartialRequiredParentTags6() { var document = "<

                  <

                  "; - EvaluateData(PartialRequiredParentTags_Descriptors, document); + EvaluateData(PartialRequiredParentTags_TagHelpers, document); } - public static ImmutableArray NestedVoidSelfClosingRequiredParent_Descriptors = + public static readonly TagHelperCollection NestedVoidSelfClosingRequiredParent_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -145,7 +144,7 @@ public void UnderstandsPartialRequiredParentTags6() .Build(), ]; - public static ImmutableArray CatchAllAttribute_Descriptors = + public static readonly TagHelperCollection CatchAllAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateEventHandler("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule @@ -161,66 +160,66 @@ public void UnderstandsPartialRequiredParentTags6() public void UnderstandsInvalidHtml() { var document = @" {}"">Miscolored!"; - EvaluateData(CatchAllAttribute_Descriptors, document); + EvaluateData(CatchAllAttribute_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent1() { var document = ""; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent2() { var document = "

                  "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent3() { var document = "


                  "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent4() { var document = "


                  "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent5() { var document = ""; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent6() { var document = "

                  "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent7() { var document = "


                  "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedVoidSelfClosingRequiredParent8() { var document = "


                  "; - EvaluateData(NestedVoidSelfClosingRequiredParent_Descriptors, document); + EvaluateData(NestedVoidSelfClosingRequiredParent_TagHelpers, document); } - public static ImmutableArray NestedRequiredParent_Descriptors = + public static readonly TagHelperCollection NestedRequiredParent_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("StrongTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -241,35 +240,35 @@ public void UnderstandsNestedVoidSelfClosingRequiredParent8() public void UnderstandsNestedRequiredParent1() { var document = ""; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedRequiredParent2() { var document = "

                  "; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedRequiredParent3() { var document = "
                  "; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedRequiredParent4() { var document = ""; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] public void UnderstandsNestedRequiredParent5() { var document = "

                  "; - EvaluateData(NestedRequiredParent_Descriptors, document); + EvaluateData(NestedRequiredParent_TagHelpers, document); } [Fact] @@ -277,7 +276,7 @@ public void UnderstandsTagHelperPrefixAndAllowedChildren() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -290,7 +289,7 @@ public void UnderstandsTagHelperPrefixAndAllowedChildren() // Act & Assert EvaluateData( - descriptors, + tagHelpers, documentContent, tagHelperPrefix: "th:"); } @@ -300,7 +299,7 @@ public void UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -313,7 +312,7 @@ public void UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent() // Act & Assert EvaluateData( - descriptors, + tagHelpers, documentContent, tagHelperPrefix: "th:"); } @@ -324,7 +323,7 @@ public void InvalidStructure_UnderstandsTHPrefixAndAllowedChildrenAndRequirePare // Rewrite_InvalidStructure_UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -337,7 +336,7 @@ public void InvalidStructure_UnderstandsTHPrefixAndAllowedChildrenAndRequirePare // Act & Assert EvaluateData( - descriptors, + tagHelpers, documentContent, tagHelperPrefix: "th:"); } @@ -347,7 +346,7 @@ public void NonTagHelperChild_UnderstandsTagHelperPrefixAndAllowedChildren() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -357,7 +356,7 @@ public void NonTagHelperChild_UnderstandsTagHelperPrefixAndAllowedChildren() // Act & Assert EvaluateData( - descriptors, + tagHelpers, documentContent, tagHelperPrefix: "th:"); } @@ -429,7 +428,7 @@ public void CanHandleInvalidChildrenWithWhitespace()

                  """; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -438,7 +437,7 @@ public void CanHandleInvalidChildrenWithWhitespace() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -446,7 +445,7 @@ public void RecoversWhenRequiredAttributeMismatchAndRestrictedChildren() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("StrongTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -458,7 +457,7 @@ public void RecoversWhenRequiredAttributeMismatchAndRestrictedChildren() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -466,7 +465,7 @@ public void CanHandleMultipleTagHelpersWithAllowedChildren_OneNull() { // Arrange var documentContent = "

                  Hello World

                  "; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -488,7 +487,7 @@ public void CanHandleMultipleTagHelpersWithAllowedChildren_OneNull() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -496,7 +495,7 @@ public void CanHandleMultipleTagHelpersWithAllowedChildren() { // Arrange var documentContent = "

                  Hello World

                  "; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -518,7 +517,7 @@ public void CanHandleMultipleTagHelpersWithAllowedChildren() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -526,10 +525,10 @@ public void UnderstandsAllowedChildren1() { // Arrange var documentContent = "


                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["br"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["br"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -541,10 +540,10 @@ public void UnderstandsAllowedChildren2()

                  """; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["br"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["br"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -552,10 +551,10 @@ public void UnderstandsAllowedChildren3() { // Arrange var documentContent = "


                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -563,10 +562,10 @@ public void UnderstandsAllowedChildren4() { // Arrange var documentContent = "

                  Hello

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -574,10 +573,10 @@ public void UnderstandsAllowedChildren5() { // Arrange var documentContent = "


                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["br", "strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["br", "strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -585,10 +584,10 @@ public void UnderstandsAllowedChildren6() { // Arrange var documentContent = "


                  Hello

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -596,10 +595,10 @@ public void UnderstandsAllowedChildren7() { // Arrange var documentContent = "

                  Title:
                  Something

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -607,10 +606,10 @@ public void UnderstandsAllowedChildren8() { // Arrange var documentContent = "

                  Title:
                  Something

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong", "br"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong", "br"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -618,10 +617,10 @@ public void UnderstandsAllowedChildren9() { // Arrange var documentContent = "

                  Title:
                  Something

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong", "br"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong", "br"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -629,10 +628,10 @@ public void UnderstandsAllowedChildren10() { // Arrange var documentContent = "

                  Title:
                  A Very Cool

                  Something

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -640,10 +639,10 @@ public void UnderstandsAllowedChildren11() { // Arrange var documentContent = "

                  Title:
                  A Very Cool

                  Something

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["custom"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["custom"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -651,10 +650,10 @@ public void UnderstandsAllowedChildren12() { // Arrange var documentContent = "

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["custom"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["custom"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -662,10 +661,10 @@ public void UnderstandsAllowedChildren13() { // Arrange var documentContent = "

                  <

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["custom"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["custom"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -673,13 +672,13 @@ public void UnderstandsAllowedChildren14() { // Arrange var documentContent = "


                  :Hello:

                  "; - var descriptors = GetAllowedChildrenTagHelperDescriptors(["custom", "strong"]); + var tagHelpers = GetAllowedChildrenTagHelpers(["custom", "strong"]); // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } - private static ImmutableArray GetAllowedChildrenTagHelperDescriptors(string[] allowedChildren) + private static TagHelperCollection GetAllowedChildrenTagHelpers(string[] allowedChildren) { var pTagHelperBuilder = TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")); @@ -722,13 +721,13 @@ public void AllowsSimpleHtmlCommentsAsChildren() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -747,14 +746,14 @@ public void DoesntAllowSimpleHtmlCommentsAsChildrenWhenFeatureFlagIsOff() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert EvaluateData( - descriptors, + tagHelpers, document, languageVersion: RazorLanguageVersion.Version_2_0, fileKind: RazorFileKind.Legacy); @@ -778,13 +777,13 @@ public void FailsForContentWithCommentsAsChildren() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -804,13 +803,13 @@ public void AllowsRazorCommentsAsChildren() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -833,13 +832,13 @@ public void AllowsRazorMarkupInHtmlComment() pTagHelperBuilder.AllowChildTag(childTag); } - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ pTagHelperBuilder.Build() ]; // Act & Assert - EvaluateData(descriptors, document); + EvaluateData(tagHelpers, document); } [Fact] @@ -847,7 +846,7 @@ public void UnderstandsNullTagNameWithAllowedChildrenForCatchAll() { // Arrange var documentContent = "

                  "; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -859,7 +858,7 @@ public void UnderstandsNullTagNameWithAllowedChildrenForCatchAll() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -867,7 +866,7 @@ public void UnderstandsNullTagNameWithAllowedChildrenForCatchAllWithPrefix() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) @@ -879,7 +878,7 @@ public void UnderstandsNullTagNameWithAllowedChildrenForCatchAllWithPrefix() ]; // Act & Assert - EvaluateData(descriptors, documentContent, "th:"); + EvaluateData(tagHelpers, documentContent, "th:"); } [Fact] @@ -887,7 +886,7 @@ public void CanHandleStartTagOnlyTagTagMode() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -898,7 +897,7 @@ public void CanHandleStartTagOnlyTagTagMode() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -906,7 +905,7 @@ public void CreatesErrorForWithoutEndTagTagStructureForEndTags() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -917,7 +916,7 @@ public void CreatesErrorForWithoutEndTagTagStructureForEndTags() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } [Fact] @@ -925,7 +924,7 @@ public void CreatesErrorForInconsistentTagStructures() { // Arrange var documentContent = ""; - ImmutableArray descriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("InputTagHelper1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -942,10 +941,10 @@ public void CreatesErrorForInconsistentTagStructures() ]; // Act & Assert - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } - public static ImmutableArray RequiredAttribute_Descriptors = + public static readonly TagHelperCollection RequiredAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("pTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -971,184 +970,184 @@ public void CreatesErrorForInconsistentTagStructures() [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1() { - EvaluateData(RequiredAttribute_Descriptors, "

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2() { - EvaluateData(RequiredAttribute_Descriptors, "

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3() { - EvaluateData(RequiredAttribute_Descriptors, "
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4() { - EvaluateData(RequiredAttribute_Descriptors, "
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5() { - EvaluateData(RequiredAttribute_Descriptors, "

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6() { - EvaluateData(RequiredAttribute_Descriptors, "

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7() { - EvaluateData(RequiredAttribute_Descriptors, "

                  words and spaces

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  words and spaces

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8() { - EvaluateData(RequiredAttribute_Descriptors, "

                  words and spaces

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  words and spaces

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9() { - EvaluateData(RequiredAttribute_Descriptors, "

                  wordsandspaces

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  wordsandspaces

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10() { - EvaluateData(RequiredAttribute_Descriptors, ""); + EvaluateData(RequiredAttribute_TagHelpers, ""); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly11() { - EvaluateData(RequiredAttribute_Descriptors, ""); + EvaluateData(RequiredAttribute_TagHelpers, ""); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly12() { - EvaluateData(RequiredAttribute_Descriptors, "words and spaces"); + EvaluateData(RequiredAttribute_TagHelpers, "words and spaces"); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly13() { - EvaluateData(RequiredAttribute_Descriptors, "words and spaces"); + EvaluateData(RequiredAttribute_TagHelpers, "words and spaces"); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly14() { - EvaluateData(RequiredAttribute_Descriptors, "
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly15() { - EvaluateData(RequiredAttribute_Descriptors, "
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly16() { - EvaluateData(RequiredAttribute_Descriptors, "

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly17() { - EvaluateData(RequiredAttribute_Descriptors, "

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly18() { - EvaluateData(RequiredAttribute_Descriptors, "

                  words and spaces

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  words and spaces

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19() { - EvaluateData(RequiredAttribute_Descriptors, "
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly20() { - EvaluateData(RequiredAttribute_Descriptors, "
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21() { - EvaluateData(RequiredAttribute_Descriptors, "
                  words and spaces
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  words and spaces
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly22() { - EvaluateData(RequiredAttribute_Descriptors, "
                  words and spaces
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  words and spaces
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23() { - EvaluateData(RequiredAttribute_Descriptors, "
                  wordsandspaces
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  wordsandspaces
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly24() { - EvaluateData(RequiredAttribute_Descriptors, "

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly25() { - EvaluateData(RequiredAttribute_Descriptors, "

                  words and spaces

                  "); + EvaluateData(RequiredAttribute_TagHelpers, "

                  words and spaces

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26() { - EvaluateData(RequiredAttribute_Descriptors, "
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27() { - EvaluateData(RequiredAttribute_Descriptors, "
                  words and spaces
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  words and spaces
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28() { - EvaluateData(RequiredAttribute_Descriptors, "
                  words and spaces
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  words and spaces
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly29() { - EvaluateData(RequiredAttribute_Descriptors, "
                  words and spaces
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  words and spaces
                  "); } [Fact] public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30() { - EvaluateData(RequiredAttribute_Descriptors, "
                  wordsandspaces
                  "); + EvaluateData(RequiredAttribute_TagHelpers, "
                  wordsandspaces
                  "); } - public static ImmutableArray NestedRequiredAttribute_Descriptors = + public static readonly TagHelperCollection NestedRequiredAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("pTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -1167,64 +1166,64 @@ public void RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30() [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

                  "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2() { - EvaluateData(NestedRequiredAttribute_Descriptors, ""); + EvaluateData(NestedRequiredAttribute_TagHelpers, ""); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

                  "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

                  "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

                  "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

                  "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

                  "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8() { - EvaluateData(NestedRequiredAttribute_Descriptors, ""); + EvaluateData(NestedRequiredAttribute_TagHelpers, ""); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9() { - EvaluateData(NestedRequiredAttribute_Descriptors, "

                  "); + EvaluateData(NestedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10() { - EvaluateData(NestedRequiredAttribute_Descriptors, ""); + EvaluateData(NestedRequiredAttribute_TagHelpers, ""); } - public static ImmutableArray MalformedRequiredAttribute_Descriptors = + public static readonly TagHelperCollection MalformedRequiredAttribute_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("pTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => @@ -1237,71 +1236,71 @@ public void NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10() [Fact] public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1() { - EvaluateData(MalformedRequiredAttribute_Descriptors, ""); + EvaluateData(MalformedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly8() { - EvaluateData(MalformedRequiredAttribute_Descriptors, "

                  "); + EvaluateData(MalformedRequiredAttribute_TagHelpers, "

                  "); } [Fact] public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly9() { - EvaluateData(MalformedRequiredAttribute_Descriptors, "

                  PrefixedTagHelperColon_Descriptors = + public static readonly TagHelperCollection PrefixedTagHelperColon_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("mythTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("myth")) @@ -1316,7 +1315,7 @@ public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1 .Build() ]; - public static ImmutableArray PrefixedTagHelperCatchAll_Descriptors = + public static readonly TagHelperCollection PrefixedTagHelperCatchAll_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("mythTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) @@ -1326,67 +1325,67 @@ public void RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1 [Fact] public void AllowsPrefixedTagHelpers1() { - EvaluateData(PrefixedTagHelperCatchAll_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperCatchAll_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers2() { - EvaluateData(PrefixedTagHelperCatchAll_Descriptors, "words and spaces", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperCatchAll_TagHelpers, "words and spaces", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers3() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers4() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers5() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers6() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers7() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers8() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers9() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers10() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "words and spaces", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "words and spaces", tagHelperPrefix: "th:"); } [Fact] public void AllowsPrefixedTagHelpers11() { - EvaluateData(PrefixedTagHelperColon_Descriptors, "", tagHelperPrefix: "th:"); + EvaluateData(PrefixedTagHelperColon_TagHelpers, "", tagHelperPrefix: "th:"); } [Fact] @@ -1911,7 +1910,7 @@ public void HandlesNonTagHelperStartAndEndVoidTags_Correctly() RunParseTreeRewriterTest("Foo"); } - public static ImmutableArray CaseSensitive_Descriptors = + public static readonly TagHelperCollection CaseSensitive_TagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("pTagHelper", "SomeAssembly") .SetCaseSensitive() @@ -1936,30 +1935,30 @@ public void HandlesNonTagHelperStartAndEndVoidTags_Correctly() [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly1() { - EvaluateData(CaseSensitive_Descriptors, "

                  "); + EvaluateData(CaseSensitive_TagHelpers, "

                  "); } [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly2() { - EvaluateData(CaseSensitive_Descriptors, "

                  "); + EvaluateData(CaseSensitive_TagHelpers, "

                  "); } [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly3() { - EvaluateData(CaseSensitive_Descriptors, "

                  "); + EvaluateData(CaseSensitive_TagHelpers, "

                  "); } [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly4() { - EvaluateData(CaseSensitive_Descriptors, "

                  "); + EvaluateData(CaseSensitive_TagHelpers, "

                  "); } [Fact] public void HandlesCaseSensitiveTagHelpersCorrectly5() { - EvaluateData(CaseSensitive_Descriptors, "

                  "); + EvaluateData(CaseSensitive_TagHelpers, "

                  "); } } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperRewritingTestBase.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperRewritingTestBase.cs index aca41009202..6b163169ab5 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperRewritingTestBase.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/TagHelperRewritingTestBase.cs @@ -1,10 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - using System; -using System.Collections.Generic; using System.Collections.Immutable; using Xunit; @@ -12,39 +9,38 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy; public class TagHelperRewritingTestBase() : ParserTestBase(layer: TestProject.Layer.Compiler) { - internal void RunParseTreeRewriterTest(string documentContent, params string[] tagNames) + internal void RunParseTreeRewriterTest(string documentContent, params ImmutableArray tagNames) { - var descriptors = BuildDescriptors(tagNames); + var tagHelpers = BuildTagHelpers(tagNames); - EvaluateData(descriptors, documentContent); + EvaluateData(tagHelpers, documentContent); } - internal ImmutableArray BuildDescriptors(params string[] tagNames) + internal static TagHelperCollection BuildTagHelpers(params ImmutableArray tagNames) { - var descriptors = new List(); - - foreach (var tagName in tagNames) + return TagHelperCollection.Build(tagNames, (ref builder, tagNames) => { - var descriptor = TagHelperDescriptorBuilder.CreateTagHelper(tagName + "taghelper", "SomeAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName(tagName)) - .Build(); - descriptors.Add(descriptor); - } - - return descriptors.ToImmutableArray(); + foreach (var tagName in tagNames) + { + var tagHelper = TagHelperDescriptorBuilder.CreateTagHelper(tagName + "taghelper", "SomeAssembly") + .TagMatchingRuleDescriptor(rule => rule.RequireTagName(tagName)) + .Build(); + builder.Add(tagHelper); + } + }); } internal void EvaluateData( - ImmutableArray descriptors, + TagHelperCollection tagHelpers, string documentContent, - string tagHelperPrefix = null, - RazorLanguageVersion languageVersion = null, + string? tagHelperPrefix = null, + RazorLanguageVersion? languageVersion = null, RazorFileKind? fileKind = null, - Action configureParserOptions = null) + Action? configureParserOptions = null) { var syntaxTree = ParseDocument(languageVersion, documentContent, directives: default, fileKind: fileKind, configureParserOptions: configureParserOptions); - var binder = new TagHelperBinder(tagHelperPrefix, descriptors); + var binder = new TagHelperBinder(tagHelperPrefix, tagHelpers); var rewrittenTree = TagHelperParseTreeRewriter.Rewrite(syntaxTree, binder); Assert.Equal(syntaxTree.Root.Width, rewrittenTree.Root.Width); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorCodeDocumentExtensionsTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorCodeDocumentExtensionsTest.cs index 0948fa7b0d7..906e620fb6e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorCodeDocumentExtensionsTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorCodeDocumentExtensionsTest.cs @@ -16,7 +16,7 @@ public void GetAndSetImportSyntaxTrees_ReturnsSyntaxTrees() var codeDocument = TestRazorCodeDocument.CreateEmpty(); var importSyntaxTree = RazorSyntaxTree.Parse(codeDocument.Source); - codeDocument.SetImportSyntaxTrees([importSyntaxTree]); + codeDocument = codeDocument.WithImportSyntaxTrees([importSyntaxTree]); // Act var actual = codeDocument.GetImportSyntaxTrees(); @@ -32,12 +32,12 @@ public void GetAndSetTagHelpers_ReturnsTagHelpers() // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var expected = new[] - { + TagHelperCollection expected = + [ TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "TestAssembly").Build() - }; + ]; - codeDocument.SetTagHelpers(expected); + codeDocument = codeDocument.WithTagHelpers(expected); // Act var actual = codeDocument.GetTagHelpers(); @@ -52,8 +52,8 @@ public void GetAndSetTagHelperContext_ReturnsTagHelperContext() // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var expected = TagHelperDocumentContext.Create(prefix: null, tagHelpers: []); - codeDocument.SetTagHelperContext(expected); + var expected = TagHelperDocumentContext.GetOrCreate(tagHelpers: []); + codeDocument = codeDocument.WithTagHelperContext(expected); // Act var actual = codeDocument.GetTagHelperContext(); @@ -203,7 +203,7 @@ public void TryGetNamespace_RespectsNamespaceDirective() }), codeGenerationOptions: RazorCodeGenerationOptions.Default.WithRootNamespace("Hello.World")); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); // Act codeDocument.TryGetNamespace(fallbackToRootNamespace: true, out var @namespace); @@ -228,7 +228,7 @@ public void TryGetNamespace_RespectsImportsNamespaceDirective() }), codeGenerationOptions: RazorCodeGenerationOptions.Default.WithRootNamespace("Hello.World")); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); var importSource = TestRazorSourceDocument.Create( content: "@namespace My.Custom.NS", @@ -236,7 +236,7 @@ public void TryGetNamespace_RespectsImportsNamespaceDirective() relativePath: "\\_Imports.razor"); var importSyntaxTree = RazorSyntaxTree.Parse(importSource, codeDocument.ParserOptions); - codeDocument.SetImportSyntaxTrees([importSyntaxTree]); + codeDocument = codeDocument.WithImportSyntaxTrees([importSyntaxTree]); // Act codeDocument.TryGetNamespace(fallbackToRootNamespace: true, out var @namespace); @@ -260,7 +260,7 @@ public void TryGetNamespace_IgnoresImportsNamespaceDirectiveWhenAsked() }), codeGenerationOptions: RazorCodeGenerationOptions.Default.WithRootNamespace("Hello.World")); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); var importSource = TestRazorSourceDocument.Create( content: "@namespace My.Custom.NS", @@ -268,7 +268,7 @@ public void TryGetNamespace_IgnoresImportsNamespaceDirectiveWhenAsked() relativePath: "\\_Imports.razor"); var importSyntaxTree = RazorSyntaxTree.Parse(importSource, codeDocument.ParserOptions); - codeDocument.SetImportSyntaxTrees([importSyntaxTree]); + codeDocument = codeDocument.WithImportSyntaxTrees([importSyntaxTree]); // Act codeDocument.TryGetNamespace(fallbackToRootNamespace: true, considerImports: false, out var @namespace, out _); @@ -293,7 +293,7 @@ public void TryGetNamespace_RespectsImportsNamespaceDirective_SameFolder() }), codeGenerationOptions: RazorCodeGenerationOptions.Default.WithRootNamespace("Hello.World")); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); var importSource = TestRazorSourceDocument.Create( content: "@namespace My.Custom.NS", @@ -301,7 +301,7 @@ public void TryGetNamespace_RespectsImportsNamespaceDirective_SameFolder() relativePath: "\\Components\\_Imports.razor"); var importSyntaxTree = RazorSyntaxTree.Parse(importSource, codeDocument.ParserOptions); - codeDocument.SetImportSyntaxTrees([importSyntaxTree]); + codeDocument = codeDocument.WithImportSyntaxTrees([importSyntaxTree]); // Act codeDocument.TryGetNamespace(fallbackToRootNamespace: true, out var @namespace); @@ -326,7 +326,7 @@ public void TryGetNamespace_OverrideImportsNamespaceDirective() builder.Directives = [NamespaceDirective.Directive]; })); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); var importSource = TestRazorSourceDocument.Create( content: "@namespace My.Custom.NS", @@ -334,7 +334,7 @@ public void TryGetNamespace_OverrideImportsNamespaceDirective() relativePath: "\\_Imports.razor"); var importSyntaxTree = RazorSyntaxTree.Parse(importSource, codeDocument.ParserOptions); - codeDocument.SetImportSyntaxTrees([importSyntaxTree]); + codeDocument = codeDocument.WithImportSyntaxTrees([importSyntaxTree]); // Act codeDocument.TryGetNamespace(fallbackToRootNamespace: true, out var @namespace); @@ -358,7 +358,7 @@ public void TryGetNamespace_PicksNearestImportsNamespaceDirective() builder.Directives = [NamespaceDirective.Directive]; })); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); var importSource1 = TestRazorSourceDocument.Create( content: "@namespace RazorPagesWebSite.Pages", @@ -374,7 +374,7 @@ public void TryGetNamespace_PicksNearestImportsNamespaceDirective() var importSyntaxTree2 = RazorSyntaxTree.Parse(importSource2, codeDocument.ParserOptions); - codeDocument.SetImportSyntaxTrees([importSyntaxTree1, importSyntaxTree2]); + codeDocument = codeDocument.WithImportSyntaxTrees([importSyntaxTree1, importSyntaxTree2]); // Act codeDocument.TryGetNamespace(fallbackToRootNamespace: true, out var @namespace); @@ -405,7 +405,7 @@ public void TryGetNamespace_ComputesNamespaceWithSuffix(string basePath, string source, parserOptions: RazorParserOptions.Default.WithDirectives(NamespaceDirective.Directive)); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); var importRelativePath = "_ViewImports.cshtml"; var importSource = TestRazorSourceDocument.Create( @@ -414,7 +414,7 @@ public void TryGetNamespace_ComputesNamespaceWithSuffix(string basePath, string relativePath: importRelativePath); var importSyntaxTree = RazorSyntaxTree.Parse(importSource, codeDocument.ParserOptions); - codeDocument.SetImportSyntaxTrees([importSyntaxTree]); + codeDocument = codeDocument.WithImportSyntaxTrees([importSyntaxTree]); // Act codeDocument.TryGetNamespace(fallbackToRootNamespace: true, out var @namespace); @@ -435,7 +435,7 @@ public void TryGetNamespace_ForNonRelatedFiles_UsesNamespaceVerbatim() source, parserOptions: RazorParserOptions.Default.WithDirectives(NamespaceDirective.Directive)); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(source, codeDocument.ParserOptions)); var importSource = TestRazorSourceDocument.Create( content: "@namespace Base", @@ -443,7 +443,7 @@ public void TryGetNamespace_ForNonRelatedFiles_UsesNamespaceVerbatim() relativePath: "baz\\bleh.cshtml"); var importSyntaxTree = RazorSyntaxTree.Parse(importSource, codeDocument.ParserOptions); - codeDocument.SetImportSyntaxTrees([importSyntaxTree]); + codeDocument = codeDocument.WithImportSyntaxTrees([importSyntaxTree]); // Act codeDocument.TryGetNamespace(fallbackToRootNamespace: true, out var @namespace); diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorEngineTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorEngineTest.cs index b9adf22fd5c..adca78ffa6c 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorEngineTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorEngineTest.cs @@ -70,9 +70,10 @@ private sealed class TestPhase : RazorEnginePhaseBase { public int CallCount; - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { Interlocked.Increment(ref CallCount); + return codeDocument; } } } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorLanguageVersionTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorLanguageVersionTest.cs index d52b3566337..89fb8bc8e9c 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorLanguageVersionTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorLanguageVersionTest.cs @@ -19,7 +19,7 @@ public void TryParseInvalid() var value = "not-version"; // Act - var result = RazorLanguageVersion.TryParse(value, out var _); + var result = RazorLanguageVersion.TryParse(value, out _); // Assert Assert.False(result); @@ -165,6 +165,34 @@ public void TryParse90() Assert.Same(RazorLanguageVersion.Version_9_0, version); } + [Fact] + public void TryParse100() + { + // Arrange + var value = "10.0"; + + // Act + var result = RazorLanguageVersion.TryParse(value, out var version); + + // Assert + Assert.True(result); + Assert.Same(RazorLanguageVersion.Version_10_0, version); + } + + [Fact] + public void TryParse110() + { + // Arrange + var value = "11.0"; + + // Act + var result = RazorLanguageVersion.TryParse(value, out var version); + + // Assert + Assert.True(result); + Assert.Same(RazorLanguageVersion.Version_11_0, version); + } + [Fact] public void TryParseLatest() { @@ -195,10 +223,10 @@ public void TryParseExperimental() } [Fact] - public void LatestPointsToNewestVersion() + public void PreviewPointsToNewestVersion() { // Arrange - var v = RazorLanguageVersion.Parse("latest"); + var v = RazorLanguageVersion.Parse("preview"); var versions = typeof(RazorLanguageVersion).GetFields(BindingFlags.Public | BindingFlags.Static) .Where(f => f.Name.StartsWith("Version_", StringComparison.Ordinal)) .Select(f => f.GetValue(obj: null)) @@ -208,7 +236,7 @@ public void LatestPointsToNewestVersion() Assert.NotEmpty(versions); foreach (var version in versions) { - Assert.True(version.CompareTo(v) <= 0, $"RazorLanguageVersion {version} has a higher version than RazorLanguageVersion.Latest"); + Assert.True(version.CompareTo(v) <= 0, $"RazorLanguageVersion {version} has a higher version than RazorLanguageVersion.Preview"); } } } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorProjectEngineTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorProjectEngineTest.cs index b479c94888a..6e493e2172f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorProjectEngineTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/RazorProjectEngineTest.cs @@ -89,6 +89,7 @@ private static void AssertDefaultFeatures(RazorProjectEngine engine) feature => Assert.IsType(feature), feature => Assert.IsType(feature), feature => Assert.IsType(feature), + feature => Assert.IsType(feature), feature => Assert.IsType(feature)); } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TagHelperBinderTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TagHelperBinderTest.cs index b5e72bb7d24..6c9f4738086 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TagHelperBinderTest.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TagHelperBinderTest.cs @@ -1,12 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; using Xunit; namespace Microsoft.AspNetCore.Razor.Language; @@ -20,25 +17,26 @@ public void GetBinding_ReturnsBindingWithInformation() var divTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - ImmutableArray expectedDescriptors = [divTagHelper]; + TagHelperCollection expectedTagHelpers = [divTagHelper]; var expectedAttributes = ImmutableArray.Create( new KeyValuePair("class", "something")); - var tagHelperBinder = new TagHelperBinder("th:", expectedDescriptors); + var binder = new TagHelperBinder("th:", expectedTagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "th:div", attributes: expectedAttributes, parentTagName: "body", parentIsTagHelper: false); // Assert - Assert.Equal(expectedDescriptors, bindingResult.Descriptors); - Assert.Equal("th:div", bindingResult.TagName); - Assert.Equal("body", bindingResult.ParentTagName); - Assert.Equal>(expectedAttributes, bindingResult.Attributes); - Assert.Equal("th:", bindingResult.TagNamePrefix); - Assert.Equal(divTagHelper.TagMatchingRules, bindingResult.GetBoundRules(divTagHelper)); + Assert.NotNull(binding); + Assert.Equal(expectedTagHelpers, binding.TagHelpers); + Assert.Equal("th:div", binding.TagName); + Assert.Equal("body", binding.ParentTagName); + Assert.Equal>(expectedAttributes, binding.Attributes); + Assert.Equal("th:", binding.TagNamePrefix); + Assert.Equal(divTagHelper.TagMatchingRules, binding.GetBoundRules(divTagHelper)); } [Fact] @@ -50,37 +48,37 @@ public void GetBinding_With_Multiple_TagNameRules_SingleHelper() .TagMatchingRuleDescriptor(rule => rule.RequireTagName("a")) .TagMatchingRuleDescriptor(rule => rule.RequireTagName("img")) .Build(); - ImmutableArray expectedDescriptors = [multiTagHelper]; - var tagHelperBinder = new TagHelperBinder("", expectedDescriptors); + TagHelperCollection expectedTagHelpers = [multiTagHelper]; + var binder = new TagHelperBinder("", expectedTagHelpers); TestTagName("div", multiTagHelper.TagMatchingRules[0]); TestTagName("a", multiTagHelper.TagMatchingRules[1]); TestTagName("img", multiTagHelper.TagMatchingRules[2]); TestTagName("p", null); TestTagName("*", null); - void TestTagName(string tagName, TagMatchingRuleDescriptor expectedBindingResult) + + void TestTagName(string tagName, TagMatchingRuleDescriptor? expectedBindingResult) { // Act - var bindingResult = tagHelperBinder.GetBinding( - + var binding = binder.GetBinding( tagName: tagName, - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "body", parentIsTagHelper: false); // Assert if (expectedBindingResult == null) { - Assert.Null(bindingResult); + Assert.Null(binding); return; } else { - Assert.NotNull(bindingResult); - Assert.Equal(expectedDescriptors, bindingResult.Descriptors); + Assert.NotNull(binding); + Assert.Equal(expectedTagHelpers, binding.TagHelpers); - Assert.Equal(tagName, bindingResult.TagName); - var mapping = Assert.Single(bindingResult.GetBoundRules(multiTagHelper)); + Assert.Equal(tagName, binding.TagName); + var mapping = Assert.Single(binding.GetBoundRules(multiTagHelper)); Assert.Equal(expectedBindingResult, mapping); } } @@ -102,7 +100,7 @@ public void GetBinding_With_Multiple_TagNameRules_MultipleHelpers() .TagMatchingRuleDescriptor(rule => rule.RequireTagName("table")) .Build(); - var tagHelperBinder = new TagHelperBinder("", [multiTagHelper1, multiTagHelper2]); + var binder = new TagHelperBinder("", [multiTagHelper1, multiTagHelper2]); TestTagName("div", [multiTagHelper1, multiTagHelper2], [multiTagHelper1.TagMatchingRules[0], multiTagHelper2.TagMatchingRules[0]]); TestTagName("a", [multiTagHelper1], [multiTagHelper1.TagMatchingRules[1]]); @@ -111,38 +109,38 @@ public void GetBinding_With_Multiple_TagNameRules_MultipleHelpers() TestTagName("table", [multiTagHelper2], [multiTagHelper2.TagMatchingRules[2]]); TestTagName("*", null, null); - - void TestTagName(string tagName, TagHelperDescriptor[] expectedDescriptors, TagMatchingRuleDescriptor[] expectedBindingResults) + void TestTagName(string tagName, TagHelperCollection? expectedTagHelpers, TagMatchingRuleDescriptor[]? expectedBindingResults) { // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: tagName, attributes: [], parentTagName: "body", parentIsTagHelper: false); // Assert - if (expectedDescriptors is null) + if (expectedTagHelpers is null) { - Assert.Null(bindingResult); + Assert.Null(binding); } else { - Assert.NotNull(bindingResult); - Assert.Equal(expectedDescriptors, bindingResult.Descriptors); + Assert.NotNull(binding); + Assert.Equal(expectedTagHelpers, binding.TagHelpers); + Assert.NotNull(expectedBindingResults); - Assert.Equal(tagName, bindingResult.TagName); + Assert.Equal(tagName, binding.TagName); - for (int i = 0; i < expectedDescriptors.Length; i++) + for (var i = 0; i < expectedTagHelpers.Count; i++) { - var mapping = Assert.Single(bindingResult.GetBoundRules(expectedDescriptors[i])); + var mapping = Assert.Single(binding.GetBoundRules(expectedTagHelpers[i])); Assert.Equal(expectedBindingResults[i], mapping); } } } } - public static TheoryData RequiredParentData + public static TheoryData RequiredParentData { get { @@ -163,37 +161,34 @@ public static TheoryData RequiredParentData .RequireParentTag("p")) .Build(); - return new TheoryData< - string, // tagName - string, // parentTagName - ImmutableArray, // availableDescriptors - ImmutableArray> // expectedDescriptors + // tagName, parentTagName, availableTagHelpers, expectedTagHelpers + return new() + { + { + "strong", + "p", + [strongPDivParent], + [strongPDivParent] + }, { - { - "strong", - "p", - [strongPDivParent], - [strongPDivParent] - }, - { - "strong", - "div", - [strongPDivParent, catchAllPParent], - [strongPDivParent] - }, - { - "strong", - "p", - [strongPDivParent, catchAllPParent], - [strongPDivParent, catchAllPParent] - }, - { - "custom", - "p", - [strongPDivParent, catchAllPParent], - [catchAllPParent] - }, - }; + "strong", + "div", + [strongPDivParent, catchAllPParent], + [strongPDivParent] + }, + { + "strong", + "p", + [strongPDivParent, catchAllPParent], + [strongPDivParent, catchAllPParent] + }, + { + "custom", + "p", + [strongPDivParent, catchAllPParent], + [catchAllPParent] + } + }; } } @@ -202,24 +197,25 @@ public static TheoryData RequiredParentData public void GetBinding_ReturnsBindingResultWithDescriptorsParentTags( string tagName, string parentTagName, - ImmutableArray availableDescriptors, - ImmutableArray expectedDescriptors) + TagHelperCollection availableTagHelpers, + TagHelperCollection expectedTagHelpers) { // Arrange - var tagHelperBinder = new TagHelperBinder(null, availableDescriptors); + var binder = new TagHelperBinder(null, availableTagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName, - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: parentTagName, parentIsTagHelper: false); // Assert - Assert.Equal(expectedDescriptors, bindingResult.Descriptors); + Assert.NotNull(binding); + Assert.Equal(expectedTagHelpers, binding.TagHelpers); } - public static TheoryData RequiredAttributeData + public static TheoryData>, TagHelperCollection, TagHelperCollection?> RequiredAttributeData { get { @@ -257,100 +253,97 @@ public static TheoryData RequiredAttributeData .RequireAttributeDescriptor(attribute => attribute .Name("prefix-", RequiredAttributeNameComparison.PrefixMatch))) .Build(); - ImmutableArray defaultAvailableDescriptors = + TagHelperCollection defaultAvailableDescriptors = [divDescriptor, inputDescriptor, catchAllDescriptor, catchAllDescriptor2]; - ImmutableArray defaultWildcardDescriptors = + TagHelperCollection defaultWildcardDescriptors = [inputWildcardPrefixDescriptor, catchAllWildcardPrefixDescriptor]; Func> kvp = (name) => new KeyValuePair(name, "test value"); - return new TheoryData< - string, // tagName - ImmutableArray>, // providedAttributes - ImmutableArray, // availableDescriptors - ImmutableArray> // expectedDescriptors + // tagName, providedAttributes, availableTagHelpers, expectedTagHelpers + return new() + { + { + "div", + ImmutableArray.Create(kvp("custom")), + defaultAvailableDescriptors, + default + }, + { "div", ImmutableArray.Create(kvp("style")), defaultAvailableDescriptors, [divDescriptor] }, + { "div", ImmutableArray.Create(kvp("class")), defaultAvailableDescriptors, [catchAllDescriptor] }, + { + "div", + ImmutableArray.Create(kvp("class"), kvp("style")), + defaultAvailableDescriptors, + [divDescriptor, catchAllDescriptor] + }, + { + "div", + ImmutableArray.Create(kvp("class"), kvp("style"), kvp("custom")), + defaultAvailableDescriptors, + [divDescriptor, catchAllDescriptor, catchAllDescriptor2] + }, { - { - "div", - ImmutableArray.Create(kvp("custom")), - defaultAvailableDescriptors, - default - }, - { "div", ImmutableArray.Create(kvp("style")), defaultAvailableDescriptors, [divDescriptor] }, - { "div", ImmutableArray.Create(kvp("class")), defaultAvailableDescriptors, [catchAllDescriptor] }, - { - "div", - ImmutableArray.Create(kvp("class"), kvp("style")), - defaultAvailableDescriptors, - [divDescriptor, catchAllDescriptor] - }, - { - "div", - ImmutableArray.Create(kvp("class"), kvp("style"), kvp("custom")), - defaultAvailableDescriptors, - [divDescriptor, catchAllDescriptor, catchAllDescriptor2] - }, - { - "input", - ImmutableArray.Create(kvp("class"), kvp("style")), - defaultAvailableDescriptors, - [inputDescriptor, catchAllDescriptor] - }, - { - "input", - ImmutableArray.Create(kvp("nodashprefixA")), - defaultWildcardDescriptors, - [inputWildcardPrefixDescriptor] - }, - { - "input", - ImmutableArray.Create(kvp("nodashprefix-ABC-DEF"), kvp("random")), - defaultWildcardDescriptors, - [inputWildcardPrefixDescriptor] - }, - { - "input", - ImmutableArray.Create(kvp("prefixABCnodashprefix")), - defaultWildcardDescriptors, - default - }, - { - "input", - ImmutableArray.Create(kvp("prefix-")), - defaultWildcardDescriptors, - default - }, - { - "input", - ImmutableArray.Create(kvp("nodashprefix")), - defaultWildcardDescriptors, - default - }, - { - "input", - ImmutableArray.Create(kvp("prefix-A")), - defaultWildcardDescriptors, - [catchAllWildcardPrefixDescriptor] - }, - { - "input", - ImmutableArray.Create(kvp("prefix-ABC-DEF"), kvp("random")), - defaultWildcardDescriptors, - [catchAllWildcardPrefixDescriptor] - }, - { - "input", - ImmutableArray.Create(kvp("prefix-abc"), kvp("nodashprefix-def")), - defaultWildcardDescriptors, - [inputWildcardPrefixDescriptor, catchAllWildcardPrefixDescriptor] - }, - { - "input", - ImmutableArray.Create(kvp("class"), kvp("prefix-abc"), kvp("onclick"), kvp("nodashprefix-def"), kvp("style")), - defaultWildcardDescriptors, - [inputWildcardPrefixDescriptor, catchAllWildcardPrefixDescriptor] - }, - }; + "input", + ImmutableArray.Create(kvp("class"), kvp("style")), + defaultAvailableDescriptors, + [inputDescriptor, catchAllDescriptor] + }, + { + "input", + ImmutableArray.Create(kvp("nodashprefixA")), + defaultWildcardDescriptors, + [inputWildcardPrefixDescriptor] + }, + { + "input", + ImmutableArray.Create(kvp("nodashprefix-ABC-DEF"), kvp("random")), + defaultWildcardDescriptors, + [inputWildcardPrefixDescriptor] + }, + { + "input", + ImmutableArray.Create(kvp("prefixABCnodashprefix")), + defaultWildcardDescriptors, + null + }, + { + "input", + ImmutableArray.Create(kvp("prefix-")), + defaultWildcardDescriptors, + null + }, + { + "input", + ImmutableArray.Create(kvp("nodashprefix")), + defaultWildcardDescriptors, + null + }, + { + "input", + ImmutableArray.Create(kvp("prefix-A")), + defaultWildcardDescriptors, + [catchAllWildcardPrefixDescriptor] + }, + { + "input", + ImmutableArray.Create(kvp("prefix-ABC-DEF"), kvp("random")), + defaultWildcardDescriptors, + [catchAllWildcardPrefixDescriptor] + }, + { + "input", + ImmutableArray.Create(kvp("prefix-abc"), kvp("nodashprefix-def")), + defaultWildcardDescriptors, + [inputWildcardPrefixDescriptor, catchAllWildcardPrefixDescriptor] + }, + { + "input", + ImmutableArray.Create(kvp("class"), kvp("prefix-abc"), kvp("onclick"), kvp("nodashprefix-def"), kvp("style")), + defaultWildcardDescriptors, + [inputWildcardPrefixDescriptor, catchAllWildcardPrefixDescriptor] + }, + }; } } @@ -359,24 +352,24 @@ public static TheoryData RequiredAttributeData public void GetBinding_ReturnsBindingResultDescriptorsWithRequiredAttributes( string tagName, ImmutableArray> providedAttributes, - ImmutableArray availableDescriptors, - ImmutableArray expectedDescriptors) + TagHelperCollection availableTagHelpers, + TagHelperCollection? expectedTagHelpers) { // Arrange - var tagHelperBinder = new TagHelperBinder(null, availableDescriptors); + var binder = new TagHelperBinder(null, availableTagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding(tagName, providedAttributes, parentTagName: "p", parentIsTagHelper: false); - var descriptors = bindingResult?.Descriptors ?? default; + var binding = binder.GetBinding(tagName, providedAttributes, parentTagName: "p", parentIsTagHelper: false); + var tagHelpers = binding?.TagHelpers; // Assert - if (expectedDescriptors.IsDefault) + if (expectedTagHelpers is null) { - Assert.True(descriptors.IsDefault); + Assert.Null(tagHelpers); } else { - Assert.Equal(expectedDescriptors, descriptors); + Assert.Equal(expectedTagHelpers, tagHelpers); } } @@ -384,72 +377,75 @@ public void GetBinding_ReturnsBindingResultDescriptorsWithRequiredAttributes( public void GetBinding_ReturnsNullBindingResultPrefixAsTagName() { // Arrange - var catchAllDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var catchAllTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName(TagHelperMatchingConventions.ElementCatchAllName)) .Build(); - ImmutableArray descriptors = [catchAllDescriptor]; - var tagHelperBinder = new TagHelperBinder("th", descriptors); + TagHelperCollection tagHelpers = [catchAllTagHelper]; + var tagHelperBinder = new TagHelperBinder("th", tagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = tagHelperBinder.GetBinding( tagName: "th", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - Assert.Null(bindingResult); + Assert.Null(binding); } [Fact] public void GetBinding_ReturnsBindingResultCatchAllDescriptorsForPrefixedTags() { // Arrange - var catchAllDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var catchAllTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName(TagHelperMatchingConventions.ElementCatchAllName)) .Build(); - ImmutableArray descriptors = [catchAllDescriptor]; - var tagHelperBinder = new TagHelperBinder("th:", descriptors); + TagHelperCollection tagHelpers = [catchAllTagHelper]; + var tagHelperBinder = new TagHelperBinder("th:", tagHelpers); // Act - var bindingResultDiv = tagHelperBinder.GetBinding( + var bindingDiv = tagHelperBinder.GetBinding( tagName: "th:div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); - var bindingResultSpan = tagHelperBinder.GetBinding( + var bindingSpan = tagHelperBinder.GetBinding( tagName: "th:span", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - var descriptor = Assert.Single(bindingResultDiv.Descriptors); - Assert.Same(catchAllDescriptor, descriptor); - descriptor = Assert.Single(bindingResultSpan.Descriptors); - Assert.Same(catchAllDescriptor, descriptor); + Assert.NotNull(bindingDiv); + var tagHelper = Assert.Single(bindingDiv.TagHelpers); + Assert.Same(catchAllTagHelper, tagHelper); + Assert.NotNull(bindingSpan); + tagHelper = Assert.Single(bindingSpan.TagHelpers); + Assert.Same(catchAllTagHelper, tagHelper); } [Fact] public void GetBinding_ReturnsBindingResultDescriptorsForPrefixedTags() { // Arrange - var divDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - ImmutableArray descriptors = [divDescriptor]; - var tagHelperBinder = new TagHelperBinder("th:", descriptors); + TagHelperCollection tagHelpers = [divTagHelper]; + var tagHelperBinder = new TagHelperBinder("th:", tagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = tagHelperBinder.GetBinding( tagName: "th:div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - var descriptor = Assert.Single(bindingResult.Descriptors); - Assert.Same(divDescriptor, descriptor); + Assert.NotNull(binding); + var tagHelper = Assert.Single(binding.TagHelpers); + Assert.Same(divTagHelper, tagHelper); } [Theory] @@ -458,114 +454,117 @@ public void GetBinding_ReturnsBindingResultDescriptorsForPrefixedTags() public void GetBinding_ReturnsNullForUnprefixedTags(string tagName) { // Arrange - var divDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName(tagName)) .Build(); - ImmutableArray descriptors = [divDescriptor]; - var tagHelperBinder = new TagHelperBinder("th:", descriptors); + TagHelperCollection tagHelpers = [divTagHelper]; + var binder = new TagHelperBinder("th:", tagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - Assert.Null(bindingResult); + Assert.Null(binding); } [Fact] public void GetDescriptors_ReturnsNothingForUnregisteredTags() { // Arrange - var divDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - var spanDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo2", "SomeAssembly") + var spanTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo2", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("span")) .Build(); - ImmutableArray descriptors = [divDescriptor, spanDescriptor]; - var tagHelperBinder = new TagHelperBinder(null, descriptors); + TagHelperCollection tagHelpers = [divTagHelper, spanTagHelper]; + var binder = new TagHelperBinder(null, tagHelpers); // Act - var tagHelperBinding = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "foo", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - Assert.Null(tagHelperBinding); + Assert.Null(binding); } [Fact] public void GetDescriptors_ReturnsCatchAllsWithEveryTagName() { // Arrange - var divDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - var spanDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo2", "SomeAssembly") + var spanTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo2", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("span")) .Build(); - var catchAllDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo3", "SomeAssembly") + var catchAllTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo3", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName(TagHelperMatchingConventions.ElementCatchAllName)) .Build(); - ImmutableArray descriptors = [divDescriptor, spanDescriptor, catchAllDescriptor]; - var tagHelperBinder = new TagHelperBinder(null, descriptors); + TagHelperCollection tagHelpers = [divTagHelper, spanTagHelper, catchAllTagHelper]; + var binder = new TagHelperBinder(null, tagHelpers); // Act - var divBinding = tagHelperBinder.GetBinding( + var divBinding = binder.GetBinding( tagName: "div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); - var spanBinding = tagHelperBinder.GetBinding( + var spanBinding = binder.GetBinding( tagName: "span", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert // For divs - Assert.Equal(2, divBinding.Descriptors.Count()); - Assert.Contains(divDescriptor, divBinding.Descriptors); - Assert.Contains(catchAllDescriptor, divBinding.Descriptors); + Assert.NotNull(divBinding); + Assert.Equal(2, divBinding.TagHelpers.Count); + Assert.Contains(divTagHelper, divBinding.TagHelpers); + Assert.Contains(catchAllTagHelper, divBinding.TagHelpers); // For spans - Assert.Equal(2, spanBinding.Descriptors.Count()); - Assert.Contains(spanDescriptor, spanBinding.Descriptors); - Assert.Contains(catchAllDescriptor, spanBinding.Descriptors); + Assert.NotNull(spanBinding); + Assert.Equal(2, spanBinding.TagHelpers.Count); + Assert.Contains(spanTagHelper, spanBinding.TagHelpers); + Assert.Contains(catchAllTagHelper, spanBinding.TagHelpers); } [Fact] public void GetDescriptors_DuplicateDescriptorsAreNotPartOfTagHelperDescriptorPool() { // Arrange - var divDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - ImmutableArray descriptors = [divDescriptor, divDescriptor]; - var tagHelperBinder = new TagHelperBinder(null, descriptors); + TagHelperCollection tagHelpers = [divTagHelper, divTagHelper]; + var binder = new TagHelperBinder(null, tagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - var descriptor = Assert.Single(bindingResult.Descriptors); - Assert.Same(divDescriptor, descriptor); + Assert.NotNull(binding); + var tagHelper = Assert.Single(binding.TagHelpers); + Assert.Same(divTagHelper, tagHelper); } [Fact] public void GetBinding_DescriptorWithMultipleRules_CorrectlySelectsMatchingRules() { // Arrange - var multiRuleDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo", "SomeAssembly") + var multiRuleTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule .RequireTagName(TagHelperMatchingConventions.ElementCatchAllName) .RequireParentTag("body")) @@ -574,20 +573,21 @@ public void GetBinding_DescriptorWithMultipleRules_CorrectlySelectsMatchingRules .TagMatchingRuleDescriptor(rule => rule .RequireTagName("span")) .Build(); - ImmutableArray descriptors = [multiRuleDescriptor]; - var tagHelperBinder = new TagHelperBinder(null, descriptors); + TagHelperCollection tagHelper = [multiRuleTagHelper]; + var binder = new TagHelperBinder(null, tagHelper); // Act - var binding = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - var boundDescriptor = Assert.Single(binding.Descriptors); - Assert.Same(multiRuleDescriptor, boundDescriptor); - var boundRules = binding.GetBoundRules(boundDescriptor); + Assert.NotNull(binding); + var boundTagHelper = Assert.Single(binding.TagHelpers); + Assert.Same(multiRuleTagHelper, boundTagHelper); + var boundRules = binding.GetBoundRules(boundTagHelper); var boundRule = Assert.Single(boundRules); Assert.Equal("div", boundRule.TagName); } @@ -596,26 +596,27 @@ public void GetBinding_DescriptorWithMultipleRules_CorrectlySelectsMatchingRules public void GetBinding_PrefixedParent_ReturnsBinding() { // Arrange - var divDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div").RequireParentTag("p")) .Build(); - var pDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo2", "SomeAssembly") + var pTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo2", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("p")) .Build(); - ImmutableArray descriptors = [divDescriptor, pDescriptor]; - var tagHelperBinder = new TagHelperBinder("th:", descriptors); + TagHelperCollection tagHelpers = [divTagHelper, pTagHelper]; + var binder = new TagHelperBinder("th:", tagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "th:div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "th:p", parentIsTagHelper: true); // Assert - var boundDescriptor = Assert.Single(bindingResult.Descriptors); - Assert.Same(divDescriptor, boundDescriptor); - var boundRules = bindingResult.GetBoundRules(boundDescriptor); + Assert.NotNull(binding); + var boundTagHelper = Assert.Single(binding.TagHelpers); + Assert.Same(divTagHelper, boundTagHelper); + var boundRules = binding.GetBoundRules(boundTagHelper); var boundRule = Assert.Single(boundRules); Assert.Equal("div", boundRule.TagName); Assert.Equal("p", boundRule.ParentTag); @@ -625,78 +626,81 @@ public void GetBinding_PrefixedParent_ReturnsBinding() public void GetBinding_IsAttributeMatch_SingleAttributeMatch() { // Arrange - var divDescriptor = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .ClassifyAttributesOnly(true) .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - ImmutableArray descriptors = [divDescriptor]; - var tagHelperBinder = new TagHelperBinder("", descriptors); + TagHelperCollection tagHelpers = [divTagHelper]; + var binder = new TagHelperBinder("", tagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - Assert.True(bindingResult.IsAttributeMatch); + Assert.NotNull(binding); + Assert.True(binding.IsAttributeMatch); } [Fact] public void GetBinding_IsAttributeMatch_MultipleAttributeMatches() { // Arrange - var divDescriptor1 = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper1 = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .ClassifyAttributesOnly(true) .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - var divDescriptor2 = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper2 = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .ClassifyAttributesOnly(true) .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - ImmutableArray descriptors = [divDescriptor1, divDescriptor2]; - var tagHelperBinder = new TagHelperBinder("", descriptors); + TagHelperCollection tagHelpers = [divTagHelper1, divTagHelper2]; + var binder = new TagHelperBinder("", tagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - Assert.True(bindingResult.IsAttributeMatch); + Assert.NotNull(binding); + Assert.True(binding.IsAttributeMatch); } [Fact] public void GetBinding_IsAttributeMatch_MixedAttributeMatches() { // Arrange - var divDescriptor1 = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper1 = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .ClassifyAttributesOnly(true) .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - var divDescriptor2 = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") + var divTagHelper2 = TagHelperDescriptorBuilder.CreateTagHelper("foo1", "SomeAssembly") .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .Build(); - ImmutableArray descriptors = [divDescriptor1, divDescriptor2]; - var tagHelperBinder = new TagHelperBinder("", descriptors); + TagHelperCollection tagHelpers = [divTagHelper1, divTagHelper2]; + var tagHelperBinder = new TagHelperBinder("", tagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = tagHelperBinder.GetBinding( tagName: "div", - attributes: ImmutableArray>.Empty, + attributes: [], parentTagName: "p", parentIsTagHelper: false); // Assert - Assert.False(bindingResult.IsAttributeMatch); + Assert.NotNull(binding); + Assert.False(binding.IsAttributeMatch); } [Fact] @@ -707,20 +711,20 @@ public void GetBinding_CaseSensitiveRule_CaseMismatch_ReturnsNull() .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) .SetCaseSensitive() .Build(); - ImmutableArray expectedDescriptors = [divTagHelper]; + TagHelperCollection expectedTagHelpers = [divTagHelper]; var expectedAttributes = ImmutableArray.Create( new KeyValuePair("class", "something")); - var tagHelperBinder = new TagHelperBinder("th:", expectedDescriptors); + var binder = new TagHelperBinder("th:", expectedTagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "th:Div", attributes: expectedAttributes, parentTagName: "body", parentIsTagHelper: false); // Assert - Assert.Null(bindingResult); + Assert.Null(binding); } [Fact] @@ -733,19 +737,19 @@ public void GetBinding_CaseSensitiveRequiredAttribute_CaseMismatch_ReturnsNull() .RequireAttributeDescriptor(attribute => attribute.Name("class"))) .SetCaseSensitive() .Build(); - ImmutableArray expectedDescriptors = [divTagHelper]; + TagHelperCollection expectedTagHelpers = [divTagHelper]; var expectedAttributes = ImmutableArray.Create( new KeyValuePair("CLASS", "something")); - var tagHelperBinder = new TagHelperBinder(null, expectedDescriptors); + var binder = new TagHelperBinder(null, expectedTagHelpers); // Act - var bindingResult = tagHelperBinder.GetBinding( + var binding = binder.GetBinding( tagName: "div", attributes: expectedAttributes, parentTagName: "body", parentIsTagHelper: false); // Assert - Assert.Null(bindingResult); + Assert.Null(binding); } } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TagHelperCollectionTest.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TagHelperCollectionTest.cs new file mode 100644 index 00000000000..2d1e4ce032f --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TagHelperCollectionTest.cs @@ -0,0 +1,3610 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNetCore.Razor.Language.Test; + +public class TagHelperCollectionTest +{ + private static TagHelperDescriptor CreateTagHelper(string name, string assemblyName = "TestAssembly") + { + var builder = TagHelperDescriptorBuilder.Create(name, assemblyName); + builder.TypeName = name; + builder.TagMatchingRule(rule => rule.TagName = name.ToLowerInvariant()); + return builder.Build(); + } + + private static TagHelperDescriptor[] CreateTestTagHelpers(int count, int startIndex = 0) + { + var result = new TagHelperDescriptor[count]; + + for (var i = 0; i < count; i++) + { + result[i] = CreateTagHelper($"TagHelper{startIndex + i}"); + } + + return result; + } + + [Fact] + public void Empty_ReturnsEmptyCollection() + { + // Act + var collection = TagHelperCollection.Empty; + + // Assert + Assert.NotNull(collection); + Assert.Empty(collection); + Assert.True(collection.IsEmpty); + Assert.Equal(-1, collection.IndexOf(CreateTagHelper("Test"))); + Assert.False(collection.Contains(CreateTagHelper("Test"))); + } + + [Fact] + public void Empty_Enumerator_IsEmpty() + { + // Arrange + var collection = TagHelperCollection.Empty; + + // Act & Assert + Assert.Empty(collection); + + var enumerator = collection.GetEnumerator(); + Assert.False(enumerator.MoveNext()); + } + + [Fact] + public void Empty_CopyTo_DoesNothing() + { + // Arrange + var collection = TagHelperCollection.Empty; + var destination = new TagHelperDescriptor[1]; + + // Act + collection.CopyTo(destination); + + // Assert + Assert.Null(destination[0]); + } + + [Fact] + public void Empty_Indexer_ThrowsIndexOutOfRangeException() + { + // Arrange + var collection = TagHelperCollection.Empty; + + // Act & Assert + Assert.Throws(() => collection[0]); + Assert.Throws(() => collection[-1]); + } + + [Fact] + public void Create_EmptyImmutableArray_ReturnsEmpty() + { + // Act + var empty = ImmutableArray.Empty; + var collection = TagHelperCollection.Create(empty); + + // Assert + Assert.Same(TagHelperCollection.Empty, collection); + } + + [Fact] + public void Create_SingleItemImmutableArray_ReturnsSingleItemCollection() + { + // Arrange + var tagHelper = CreateTagHelper("Test"); + var array = ImmutableArray.Create(tagHelper); + + // Act + var collection = TagHelperCollection.Create(array); + + // Assert + Assert.Single(collection); + Assert.False(collection.IsEmpty); + Assert.Same(tagHelper, collection[0]); + Assert.Equal(0, collection.IndexOf(tagHelper)); + Assert.True(collection.Contains(tagHelper)); + } + + [Fact] + public void Create_MultipleItemsImmutableArray_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var array = ImmutableArray.Create(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(array); + + // Assert + Assert.Equal(3, collection.Count); + Assert.False(collection.IsEmpty); + + for (var i = 0; i < tagHelpers.Length; i++) + { + Assert.Same(tagHelpers[i], collection[i]); + Assert.Equal(i, collection.IndexOf(tagHelpers[i])); + Assert.True(collection.Contains(tagHelpers[i])); + } + } + + [Fact] + public void Create_ImmutableArrayWithDuplicates_RemovesDuplicates() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var array = ImmutableArray.Create(tagHelper1, tagHelper2, tagHelper1); + + // Act + var collection = TagHelperCollection.Create(array); + + // Assert + Assert.SameItems([tagHelper1, tagHelper2], collection); + } + + [Fact] + public void Create_EmptyArray_ReturnsEmpty() + { + // Arrange + var array = Array.Empty(); + + // Act + var collection = TagHelperCollection.Create(array); + + // Assert + Assert.Same(TagHelperCollection.Empty, collection); + } + + [Fact] + public void Create_SingleItemArray_ReturnsSingleItemCollection() + { + // Arrange + var tagHelper = CreateTagHelper("Test"); + var array = new[] { tagHelper }; + + // Act + var collection = TagHelperCollection.Create(array); + + // Assert + Assert.Single(collection); + Assert.Same(tagHelper, collection[0]); + } + + [Fact] + public void Create_MultipleItemArray_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(4); + + // Act + var collection = TagHelperCollection.Create(tagHelpers); + + // Assert + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_ArrayWithDuplicates_RemovesDuplicates() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var array = new[] { tagHelper1, tagHelper2, tagHelper1 }; + + // Act + var collection = TagHelperCollection.Create(array); + + // Assert + Assert.SameItems([tagHelper1, tagHelper2], collection); + } + + [Fact] + public void Create_EmptyCollectionExpression_ReturnsEmpty() + { + // Act + TagHelperCollection collection = []; + + // Assert + Assert.Same(TagHelperCollection.Empty, collection); + } + + [Fact] + public void Create_SingleItemCollectionExpression_ReturnsSingleItemCollection() + { + // Arrange + var tagHelper = CreateTagHelper("Test"); + + // Act + TagHelperCollection collection = [tagHelper]; + + // Assert + Assert.Single(collection); + Assert.False(collection.IsEmpty); + Assert.Same(tagHelper, collection[0]); + Assert.Equal(0, collection.IndexOf(tagHelper)); + Assert.True(collection.Contains(tagHelper)); + } + + [Fact] + public void Create_MultipleItemsCollectionExpression_CreatesCollection() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + + // Act + TagHelperCollection collection = [tagHelper1, tagHelper2, tagHelper3]; + + // Assert + Assert.Equal(3, collection.Count); + Assert.False(collection.IsEmpty); + Assert.Same(tagHelper1, collection[0]); + Assert.Same(tagHelper2, collection[1]); + Assert.Same(tagHelper3, collection[2]); + Assert.Equal(0, collection.IndexOf(tagHelper1)); + Assert.Equal(1, collection.IndexOf(tagHelper2)); + Assert.Equal(2, collection.IndexOf(tagHelper3)); + Assert.True(collection.Contains(tagHelper1)); + Assert.True(collection.Contains(tagHelper2)); + Assert.True(collection.Contains(tagHelper3)); + } + + [Fact] + public void Create_CollectionExpressionWithDuplicates_RemovesDuplicates() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + + // Act + TagHelperCollection collection = [tagHelper1, tagHelper2, tagHelper1]; + + // Assert + Assert.SameItems([tagHelper1, tagHelper2], collection); + } + + [Fact] + public void Create_CollectionExpressionWithSpreadOperator_CreatesCollection() + { + // Arrange + var firstBatch = CreateTestTagHelpers(2); + var additionalTagHelper = CreateTagHelper("Additional"); + var lastBatch = CreateTestTagHelpers(2).Skip(2).ToArray(); // Get different helpers + + // Act + TagHelperCollection collection = [.. firstBatch, additionalTagHelper, .. lastBatch]; + + // Assert + Assert.Equal(3, collection.Count); // 2 from first batch + 1 additional (lastBatch would be empty in this case) + Assert.Same(firstBatch[0], collection[0]); + Assert.Same(firstBatch[1], collection[1]); + Assert.Same(additionalTagHelper, collection[2]); + } + + [Fact] + public void Create_CollectionExpressionFromExistingArray_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(4); + + // Act + TagHelperCollection collection = [.. tagHelpers]; + + // Assert + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_CollectionExpressionMixedSources_CreatesCollection() + { + // Arrange + var singleHelper = CreateTagHelper("Single"); + var tagHelpers = CreateTestTagHelpers(3); + TagHelperDescriptor[] arrayHelpers = [tagHelpers[0], tagHelpers[1]]; + List listHelpers = [tagHelpers[2]]; + + // Act + TagHelperCollection collection = [singleHelper, .. arrayHelpers, .. listHelpers]; + + // Assert + Assert.Equal(4, collection.Count); + Assert.Same(singleHelper, collection[0]); + Assert.Same(arrayHelpers[0], collection[1]); + Assert.Same(arrayHelpers[1], collection[2]); + Assert.Same(listHelpers[0], collection[3]); + } + + [Fact] + public void Create_IEnumerableEmpty_ReturnsEmpty() + { + // Arrange + var items = new List(); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Same(TagHelperCollection.Empty, collection); + } + + [Fact] + public void Create_IEnumerableEmptyEnumerable_ReturnsEmpty() + { + // Arrange - Use LINQ to create an enumerable without known count + var items = new[] { CreateTagHelper("Test") }.Where(x => false); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Same(TagHelperCollection.Empty, collection); + } + + [Fact] + public void Create_IEnumerableSingleItem_ReturnsSingleItemCollection() + { + // Arrange + var tagHelper = CreateTagHelper("Test"); + var items = new List { tagHelper }; + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Single(collection); + Assert.False(collection.IsEmpty); + Assert.Same(tagHelper, collection[0]); + Assert.Equal(0, collection.IndexOf(tagHelper)); + Assert.True(collection.Contains(tagHelper)); + } + + [Fact] + public void Create_IEnumerableSingleItemEnumerable_ReturnsSingleItemCollection() + { + // Arrange - Use LINQ to create an enumerable without known count + var tagHelper = CreateTagHelper("Test"); + var items = new[] { tagHelper, CreateTagHelper("Other") }.Where(x => x == tagHelper); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Single(collection); + Assert.Same(tagHelper, collection[0]); + } + + [Fact] + public void Create_IEnumerableMultipleItems_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(4); + var items = new List(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(4, collection.Count); + Assert.False(collection.IsEmpty); + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_IEnumerableMultipleItemsEnumerable_CreatesCollection() + { + // Arrange - Use LINQ to create an enumerable without known count + var tagHelpers = CreateTestTagHelpers(4); + var items = tagHelpers.Where(x => true); // Forces enumerable without known count + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(4, collection.Count); + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_IEnumerableWithDuplicates_RemovesDuplicates() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var items = new List { tagHelper1, tagHelper2, tagHelper1, tagHelper2 }; + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(2, collection.Count); + Assert.SameItems([tagHelper1, tagHelper2], collection); + } + + [Fact] + public void Create_IEnumerableEnumerableWithDuplicates_RemovesDuplicates() + { + // Arrange - Use LINQ to create an enumerable without known count + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var baseItems = new[] { tagHelper1, tagHelper2, tagHelper1, tagHelper2 }; + var items = baseItems.Where(x => true); // Forces enumerable without known count + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(2, collection.Count); + Assert.SameItems([tagHelper1, tagHelper2], collection); + } + + [Fact] + public void Create_IEnumerableHashSet_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var items = new HashSet(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(3, collection.Count); + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_IEnumerableQueue_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var items = new Queue(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(3, collection.Count); + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_IEnumerableStack_CreatesCollection() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var items = new Stack(); + items.Push(tagHelper1); + items.Push(tagHelper2); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(2, collection.Count); + // Note: Stack reverses order, so tagHelper2 comes first + Assert.Same(tagHelper2, collection[0]); + Assert.Same(tagHelper1, collection[1]); + } + + [Fact] + public void Create_IEnumerableLinkedList_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var items = new LinkedList(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(3, collection.Count); + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_IEnumerableCustomCollection_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var items = new CustomCollection(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(3, collection.Count); + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_IEnumerableCustomEnumerable_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var items = new CustomEnumerable(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(3, collection.Count); + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_IEnumerableLargeCollection_WorksCorrectly() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(1000); + var items = new List(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(1000, collection.Count); + Assert.Same(tagHelpers[0], collection[0]); + Assert.Same(tagHelpers[999], collection[999]); + } + + [Fact] + public void Create_IEnumerableLargeEnumerable_WorksCorrectly() + { + // Arrange - Use LINQ to create an enumerable without known count + var tagHelpers = CreateTestTagHelpers(1000); + var items = tagHelpers.Where(x => true); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(1000, collection.Count); + Assert.Same(tagHelpers[0], collection[0]); + Assert.Same(tagHelpers[999], collection[999]); + } + + [Fact] + public void Create_IEnumerableReadOnlyCollection_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + IReadOnlyCollection items = tagHelpers; + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(3, collection.Count); + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Create_IEnumerableYieldReturn_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + + static IEnumerable YieldItems(TagHelperDescriptor[] items) + { + foreach (var item in items) + { + yield return item; + } + } + + var items = YieldItems(tagHelpers); + + // Act + var collection = TagHelperCollection.Create(items); + + // Assert + Assert.Equal(3, collection.Count); + Assert.SameItems(tagHelpers, collection); + } + + // Helper classes for testing + private sealed class CustomCollection(IEnumerable items) : ICollection + { + private readonly List _items = [.. items]; + + public int Count => _items.Count; + public bool IsReadOnly => true; + public void Add(TagHelperDescriptor item) => throw new NotSupportedException(); + public void Clear() => throw new NotSupportedException(); + public bool Contains(TagHelperDescriptor item) => _items.Contains(item); + public void CopyTo(TagHelperDescriptor[] array, int arrayIndex) => _items.CopyTo(array, arrayIndex); + public IEnumerator GetEnumerator() => _items.GetEnumerator(); + public bool Remove(TagHelperDescriptor item) => throw new NotSupportedException(); + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } + + private sealed class CustomEnumerable(IEnumerable items) : IEnumerable + { + private readonly List _items = [.. items]; + + public IEnumerator GetEnumerator() => _items.GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } + + [Fact] + public void ConcurrentAccess_MultipleThreads_DoesNotThrow() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(100); + var collection = TagHelperCollection.Create(tagHelpers); + var exceptions = new ConcurrentBag(); + + // Act + Parallel.For(0, 100, i => + { + try + { + _ = collection[i % collection.Count]; + _ = collection.IndexOf(tagHelpers[i % tagHelpers.Length]); + _ = collection.Contains(tagHelpers[i % tagHelpers.Length]); + foreach (var item in collection) { /* enumerate */ } + } + catch (Exception ex) + { + exceptions.Add(ex); + } + }); + + // Assert + Assert.Empty(exceptions); + } + + [Fact] + public void Build_EmptyBuilder_ReturnsEmpty() + { + // Act + var collection = TagHelperCollection.Build("test", (ref builder, state) => + { + // Don't add anything + }); + + // Assert + Assert.Same(TagHelperCollection.Empty, collection); + } + + [Fact] + public void Build_WithItems_CreatesCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + + // Act + var collection = TagHelperCollection.Build(tagHelpers, (ref builder, items) => + { + foreach (var item in items) + { + builder.Add(item); + } + }); + + // Assert + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Build_WithDuplicates_RemovesDuplicates() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + + // Act + var collection = TagHelperCollection.Build((tagHelper1, tagHelper2), (ref builder, items) => + { + builder.Add(items.tagHelper1); + builder.Add(items.tagHelper2); + builder.Add(items.tagHelper1); // Duplicate + }); + + // Assert + Assert.SameItems([tagHelper1, tagHelper2], collection); + } + + [Fact] + public void Equals_SameInstance_ReturnsTrue() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(2)); + + // Act & Assert + Assert.True(collection.Equals(collection)); + Assert.True(collection.Equals((object)collection)); + } + + [Fact] + public void Equals_DifferentInstanceSameContent_ReturnsTrue() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(2); + var collection1 = TagHelperCollection.Create(tagHelpers); + var collection2 = TagHelperCollection.Create(tagHelpers); + + // Act & Assert + Assert.True(collection1.Equals(collection2)); + Assert.True(collection1.Equals((object)collection2)); + } + + [Fact] + public void Equals_DifferentContent_ReturnsFalse() + { + // Arrange + var collection1 = TagHelperCollection.Create(CreateTestTagHelpers(2)); + var collection2 = TagHelperCollection.Create(CreateTestTagHelpers(3)); + + // Act & Assert + Assert.False(collection1.Equals(collection2)); + Assert.False(collection1.Equals((object)collection2)); + } + + [Fact] + public void Equals_Null_ReturnsFalse() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(2)); + + // Act & Assert + Assert.False(collection.Equals(null)); + Assert.False(collection.Equals((object?)null)); + } + + [Fact] + public void Equals_DifferentType_ReturnsFalse() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(2)); + + // Act & Assert + Assert.False(collection.Equals("not a collection")); + } + + [Fact] + public void Equals_ArrayCreatedVsMergedCollection_SameContent_ReturnsTrue() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + var array = new[] { tagHelper1, tagHelper2, tagHelper3 }; + + // Create collection directly from array + var arrayCollection = TagHelperCollection.Create(array); + + // Create collection by merging two collections with the same content + TagHelperCollection firstPart = [tagHelper1]; + TagHelperCollection secondPart = [tagHelper2, tagHelper3]; + var mergedCollection = TagHelperCollection.Merge(firstPart, secondPart); + + // Act & Assert + Assert.Equal(arrayCollection.Count, mergedCollection.Count); + Assert.True(arrayCollection.Contains(tagHelper1)); + Assert.True(arrayCollection.Contains(tagHelper2)); + Assert.True(arrayCollection.Contains(tagHelper3)); + Assert.True(mergedCollection.Contains(tagHelper1)); + Assert.True(mergedCollection.Contains(tagHelper2)); + Assert.True(mergedCollection.Contains(tagHelper3)); + + // Verify same order + Assert.Same(tagHelper1, arrayCollection[0]); + Assert.Same(tagHelper2, arrayCollection[1]); + Assert.Same(tagHelper3, arrayCollection[2]); + Assert.Same(tagHelper1, mergedCollection[0]); + Assert.Same(tagHelper2, mergedCollection[1]); + Assert.Same(tagHelper3, mergedCollection[2]); + + // This should pass if equality works correctly regardless of construction method + Assert.True(arrayCollection.Equals(mergedCollection)); + Assert.True(mergedCollection.Equals(arrayCollection)); + Assert.Equal(arrayCollection.GetHashCode(), mergedCollection.GetHashCode()); + } + + [Fact] + public void GetHashCode_SameContent_ReturnsSameHashCode() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(2); + var collection1 = TagHelperCollection.Create(tagHelpers); + var collection2 = TagHelperCollection.Create(tagHelpers); + + // Act & Assert + Assert.Equal(collection1.GetHashCode(), collection2.GetHashCode()); + } + + [Fact] + public void GetHashCode_DifferentContent_ReturnsDifferentHashCode() + { + // Arrange + var collection1 = TagHelperCollection.Create(CreateTestTagHelpers(2)); + var collection2 = TagHelperCollection.Create(CreateTestTagHelpers(3)); + + // Act & Assert + Assert.NotEqual(collection1.GetHashCode(), collection2.GetHashCode()); + } + + [Fact] + public void GetHashCode_DifferentOrder_ReturnsDifferentChecksum() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(2); + var collection1 = TagHelperCollection.Create([tagHelpers[0], tagHelpers[1]]); + var collection2 = TagHelperCollection.Create([tagHelpers[1], tagHelpers[0]]); + + // Act & Assert + Assert.NotEqual(collection1.GetHashCode(), collection2.GetHashCode()); + } + + [Fact] + public void Checksum_DifferentOrderSameContent_DifferentChecksums() + { + // Arrange + var tagHelper1 = CreateTagHelper("A"); + var tagHelper2 = CreateTagHelper("B"); + var collection1 = TagHelperCollection.Create([tagHelper1, tagHelper2]); + var collection2 = TagHelperCollection.Create([tagHelper2, tagHelper1]); + + // Act & Assert - Order matters for checksums + Assert.NotEqual(collection1.GetHashCode(), collection2.GetHashCode()); + Assert.False(collection1.Equals(collection2)); + } + + [Fact] + public void Checksum_IdenticalContent_IdenticalChecksums() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(5); + var collection1 = TagHelperCollection.Create(tagHelpers); + var collection2 = TagHelperCollection.Create(tagHelpers); + + // Act & Assert - Same content should have same checksum + Assert.Equal(collection1.GetHashCode(), collection2.GetHashCode()); + Assert.True(collection1.Equals(collection2)); + } + + [Fact] + public void GetEnumerator_Generic_EnumeratesAllItems() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act + var enumeratedItems = new List(); + foreach (var item in collection) + { + enumeratedItems.Add(item); + } + + // Assert + Assert.SameItems(tagHelpers, enumeratedItems); + } + + [Fact] + public void GetEnumerator_NonGeneric_EnumeratesAllItems() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act + var enumeratedItems = new List(); + var enumerator = ((IEnumerable)collection).GetEnumerator(); + while (enumerator.MoveNext()) + { + enumeratedItems.Add((TagHelperDescriptor)enumerator.Current); + } + + // Assert + Assert.SameItems(tagHelpers, enumeratedItems); + } + + [Fact] + public void Enumerator_Current_BeforeMoveNext_ThrowsInvalidOperation() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(1)); + var enumerator = collection.GetEnumerator(); + + // Act & Assert + Assert.Throws(() => _ = enumerator.Current); + } + + [Fact] + public void CopyTo_ValidDestination_CopiesAllItems() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + var destination = new TagHelperDescriptor[5]; + + // Act + collection.CopyTo(destination); + + // Assert + Assert.Same(tagHelpers[0], destination[0]); + Assert.Same(tagHelpers[1], destination[1]); + Assert.Same(tagHelpers[2], destination[2]); + Assert.Null(destination[3]); + Assert.Null(destination[4]); + } + + [Fact] + public void CopyTo_DestinationTooShort_ThrowsArgumentException() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + var destination = new TagHelperDescriptor[2]; + + // Act & Assert + Assert.Throws(() => collection.CopyTo(destination)); + } + + [Fact] + public void Indexer_ValidIndex_ReturnsCorrectItem() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act & Assert + Assert.Equal(tagHelpers.Length, collection.Count); + + for (var i = 0; i < tagHelpers.Length; i++) + { + Assert.Same(tagHelpers[i], collection[i]); + } + } + + [Fact] + public void Indexer_InvalidIndex_ThrowsArgumentOutOfRangeException() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(3)); + + // Act & Assert + Assert.Throws(() => collection[-1]); + Assert.Throws(() => collection[3]); + Assert.Throws(() => collection[10]); + } + + [Fact] + public void IndexOf_ExistingItem_ReturnsCorrectIndex() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act & Assert + for (var i = 0; i < tagHelpers.Length; i++) + { + Assert.Equal(i, collection.IndexOf(tagHelpers[i])); + } + } + + [Fact] + public void IndexOf_NonExistingItem_ReturnsMinusOne() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + var nonExistingItem = CreateTagHelper("NonExisting"); + + // Act + var index = collection.IndexOf(nonExistingItem); + + // Assert + Assert.Equal(-1, index); + } + + [Fact] + public void IndexOf_LargeCollection_UsesLookupTable() + { + // Arrange - Test above the 8-item threshold + var tagHelpers = CreateTestTagHelpers(100); + var collection = TagHelperCollection.Create(tagHelpers); + var searchItem = tagHelpers[50]; + + // Act & Assert - Should find the item (testing functionality, not speed) + Assert.Equal(50, collection.IndexOf(searchItem)); + } + + [Fact] + public void IndexOf_SmallCollection_UsesLinearSearch() + { + // Arrange - Test below the 8-item threshold + var tagHelpers = CreateTestTagHelpers(5); + var collection = TagHelperCollection.Create(tagHelpers); + var searchItem = tagHelpers[3]; + + // Act & Assert - Should find the item + Assert.Equal(3, collection.IndexOf(searchItem)); + } + + [Fact] + public void Contains_ExistingItem_ReturnsTrue() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act & Assert + foreach (var tagHelper in tagHelpers) + { + Assert.True(collection.Contains(tagHelper)); + } + } + + [Fact] + public void Contains_NonExistingItem_ReturnsFalse() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + var nonExistingItem = CreateTagHelper("NonExisting"); + + // Act + var contains = collection.Contains(nonExistingItem); + + // Assert + Assert.False(contains); + } + + [Fact] + public void Create_VeryLargeCollection_WorksCorrectly() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(1000); + + // Act + var collection = TagHelperCollection.Create(tagHelpers); + + // Assert + Assert.Equal(1000, collection.Count); + Assert.Same(tagHelpers[0], collection[0]); + Assert.Same(tagHelpers[999], collection[999]); + Assert.Equal(0, collection.IndexOf(tagHelpers[0])); + Assert.Equal(999, collection.IndexOf(tagHelpers[999])); + } + + [Fact] + public void IsEmpty_EmptyCollection_ReturnsTrue() + { + // Assert + Assert.True(TagHelperCollection.Empty.IsEmpty); + } + + [Fact] + public void IsEmpty_NonEmptyCollection_ReturnsFalse() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(1)); + + // Assert + Assert.False(collection.IsEmpty); + } + + [Fact] + public void Builder_Empty_IsEmptyAndHasZeroCount() + { + // Arrange & Act + using var builder = new TagHelperCollection.Builder(); + + // Assert + Assert.True(builder.IsEmpty); + Assert.Empty(builder); + Assert.False(builder.IsReadOnly); + } + + [Fact] + public void Builder_AddSingleItem_WorksCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + + // Act + var added = builder.Add(tagHelper); + + // Assert + Assert.True(added); + Assert.False(builder.IsEmpty); + var item = Assert.Single(builder); + Assert.Same(tagHelper, item); + } + + [Fact] + public void Builder_AddDuplicateSingleItem_ReturnsFalse() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + + // Act + var firstAdd = builder.Add(tagHelper); + var secondAdd = builder.Add(tagHelper); + + // Assert + Assert.True(firstAdd); + Assert.False(secondAdd); + var item = Assert.Single(builder); + Assert.Same(tagHelper, item); + } + + [Fact] + public void Builder_AddMultipleItems_WorksCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + // Act + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Assert + Assert.False(builder.IsEmpty); + Assert.Equal(3, builder.Count); + + for (var i = 0; i < tagHelpers.Length; i++) + { + Assert.Same(tagHelpers[i], builder[i]); + } + } + + [Fact] + public void Builder_AddMultipleItemsWithDuplicates_DeduplicatesCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + + // Act + var add1 = builder.Add(tagHelper1); + var add2 = builder.Add(tagHelper2); + var add3 = builder.Add(tagHelper1); // Duplicate + + // Assert + Assert.True(add1); + Assert.True(add2); + Assert.False(add3); // Should return false for duplicate + Assert.Equal(2, builder.Count); + Assert.Same(tagHelper1, builder[0]); + Assert.Same(tagHelper2, builder[1]); + } + + [Fact] + public void Builder_IndexerValidIndex_ReturnsCorrectItem() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act & Assert + for (var i = 0; i < tagHelpers.Length; i++) + { + Assert.Same(tagHelpers[i], builder[i]); + } + } + + [Fact] + public void Builder_IndexerNegativeIndex_ThrowsArgumentOutOfRangeException() + { + // Arrange + using var builder = new TagHelperCollection.Builder + { + CreateTagHelper("Test") + }; + + // Act & Assert + Assert.Throws(() => builder[-1]); + } + + [Fact] + public void Builder_IndexerOutOfRange_ThrowsArgumentOutOfRangeException() + { + // Arrange + using var builder = new TagHelperCollection.Builder + { + CreateTagHelper("Test") + }; + + // Act & Assert + Assert.Throws(() => builder[1]); + Assert.Throws(() => builder[10]); + } + + [Fact] + public void Builder_IndexerEmptyBuilder_ThrowsArgumentOutOfRangeException() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + + // Act & Assert + Assert.Throws(() => builder[0]); + } + + [Fact] + public void Builder_ContainsSingleItem_ReturnsCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + var otherHelper = CreateTagHelper("Other"); + builder.Add(tagHelper); + + // Act & Assert + Assert.Contains(tagHelper, builder); + Assert.DoesNotContain(otherHelper, builder); + } + + [Fact] + public void Builder_ContainsMultipleItems_ReturnsCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + var otherHelper = CreateTagHelper("Other"); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act & Assert + foreach (var tagHelper in tagHelpers) + { + Assert.Contains(tagHelper, builder); + } + + Assert.DoesNotContain(otherHelper, builder); + } + + [Fact] + public void Builder_ContainsEmptyBuilder_ReturnsFalse() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + + // Act & Assert + Assert.DoesNotContain(tagHelper, builder); + } + + [Fact] + public void Builder_ClearSingleItem_MakesEmpty() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + builder.Add(tagHelper); + + // Act + builder.Clear(); + + // Assert + Assert.True(builder.IsEmpty); + Assert.Empty(builder); + } + + [Fact] + public void Builder_ClearMultipleItems_MakesEmpty() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act + builder.Clear(); + + // Assert + Assert.True(builder.IsEmpty); + Assert.Empty(builder); + } + + [Fact] + public void Builder_ClearEmptyBuilder_RemainsEmpty() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + + // Act + builder.Clear(); + + // Assert + Assert.True(builder.IsEmpty); + Assert.Empty(builder); + } + + [Fact] + public void Builder_RemoveSingleItemExists_ReturnsTrue() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + builder.Add(tagHelper); + + // Act + var removed = builder.Remove(tagHelper); + + // Assert + Assert.True(removed); + Assert.True(builder.IsEmpty); + Assert.Empty(builder); + } + + [Fact] + public void Builder_RemoveSingleItemNotExists_ReturnsFalse() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + var otherHelper = CreateTagHelper("Other"); + builder.Add(tagHelper); + + // Act + var removed = builder.Remove(otherHelper); + + // Assert + Assert.False(removed); + var item = Assert.Single(builder); + Assert.Same(tagHelper, item); + } + + [Fact] + public void Builder_RemoveFromMultipleItems_WorksCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act + var removed = builder.Remove(tagHelpers[1]); + + // Assert + Assert.True(removed); + Assert.Equal(2, builder.Count); + Assert.Same(tagHelpers[0], builder[0]); + Assert.Same(tagHelpers[2], builder[1]); + Assert.DoesNotContain(tagHelpers[1], builder); + } + + [Fact] + public void Builder_RemoveFromEmptyBuilder_ReturnsFalse() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + + // Act + var removed = builder.Remove(tagHelper); + + // Assert + Assert.False(removed); + Assert.True(builder.IsEmpty); + } + + [Fact] + public void Builder_CopyToSingleItem_CopiesCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + builder.Add(tagHelper); + var destination = new TagHelperDescriptor[3]; + + // Act + builder.CopyTo(destination, 1); + + // Assert + Assert.Null(destination[0]); + Assert.Same(tagHelper, destination[1]); + Assert.Null(destination[2]); + } + + [Fact] + public void Builder_CopyToMultipleItems_CopiesCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + var destination = new TagHelperDescriptor[5]; + + // Act + builder.CopyTo(destination, 1); + + // Assert + Assert.Null(destination[0]); + Assert.Same(tagHelpers[0], destination[1]); + Assert.Same(tagHelpers[1], destination[2]); + Assert.Same(tagHelpers[2], destination[3]); + Assert.Null(destination[4]); + } + + [Fact] + public void Builder_CopyToEmptyBuilder_DoesNothing() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var destination = new TagHelperDescriptor[3]; + + // Act + builder.CopyTo(destination, 1); + + // Assert + Assert.All(destination, item => Assert.Null(item)); + } + + [Fact] + public void Builder_ToCollectionEmpty_ReturnsEmpty() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + + // Act + var collection = builder.ToCollection(); + + // Assert + Assert.Same(TagHelperCollection.Empty, collection); + } + + [Fact] + public void Builder_ToCollectionSingleItem_ReturnsSingleItemCollection() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + builder.Add(tagHelper); + + // Act + var collection = builder.ToCollection(); + + // Assert + Assert.Single(collection); + Assert.Same(tagHelper, collection[0]); + } + + [Fact] + public void Builder_ToCollectionMultipleItems_ReturnsCollection() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act + var collection = builder.ToCollection(); + + // Assert + Assert.SameItems(tagHelpers, collection); + } + + [Fact] + public void Builder_ICollectionAdd_CallsAdd() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + ICollection collection = builder; + var tagHelper = CreateTagHelper("Test"); + + // Act + collection.Add(tagHelper); + + // Assert + var item = Assert.Single(builder); + Assert.Same(tagHelper, item); + } + + [Fact] + public void Builder_GetEnumeratorEmpty_IsEmpty() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + + // Act + using var enumerator = builder.GetEnumerator(); + + // Assert + Assert.False(enumerator.MoveNext()); + } + + [Fact] + public void Builder_GetEnumeratorSingleItem_EnumeratesCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelper = CreateTagHelper("Test"); + builder.Add(tagHelper); + + // Act + var enumerated = new List(); + using var enumerator = builder.GetEnumerator(); + while (enumerator.MoveNext()) + { + enumerated.Add(enumerator.Current); + } + + // Assert + Assert.Single(enumerated); + Assert.Same(tagHelper, enumerated[0]); + } + + [Fact] + public void Builder_GetEnumeratorMultipleItems_EnumeratesCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act + var enumerated = new List(); + using var enumerator = builder.GetEnumerator(); + while (enumerator.MoveNext()) + { + enumerated.Add(enumerator.Current); + } + + // Assert + Assert.SameItems(tagHelpers, enumerated); + } + + [Fact] + public void Builder_GenericEnumerable_EnumeratesCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act + var enumerated = new List(); + foreach (var item in (IEnumerable)builder) + { + enumerated.Add(item); + } + + // Assert + Assert.SameItems(tagHelpers, enumerated); + } + + [Fact] + public void Builder_NonGenericEnumerable_EnumeratesCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act + var enumerated = new List(); + var enumerator = ((IEnumerable)builder).GetEnumerator(); + while (enumerator.MoveNext()) + { + enumerated.Add((TagHelperDescriptor)enumerator.Current); + } + + // Assert + Assert.SameItems(tagHelpers, enumerated); + } + + [Fact] + public void Builder_DisposeTwice_DoesNotThrow() + { + // Arrange + var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(3); + + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Act & Assert - Should not throw + builder.Dispose(); + builder.Dispose(); + } + + [Fact] + public void Builder_LargeNumberOfItems_WorksCorrectly() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(100); + + // Act + foreach (var tagHelper in tagHelpers) + { + builder.Add(tagHelper); + } + + // Assert + Assert.Equal(100, builder.Count); + Assert.False(builder.IsEmpty); + + for (var i = 0; i < tagHelpers.Length; i++) + { + Assert.Same(tagHelpers[i], builder[i]); + Assert.Contains(tagHelpers[i], builder); + } + } + + [Fact] + public void Builder_ModifyAfterToCollection_DoesNotAffectCollection() + { + // Arrange + using var builder = new TagHelperCollection.Builder(); + var tagHelpers = CreateTestTagHelpers(2); + + builder.Add(tagHelpers[0]); + var collection = builder.ToCollection(); + + // Act - Modify builder after creating collection + builder.Add(tagHelpers[1]); + + // Assert - Original collection should be unchanged + Assert.Single(collection); + Assert.Same(tagHelpers[0], collection[0]); + + // Builder should have new state + Assert.Equal(2, builder.Count); + Assert.Same(tagHelpers[0], builder[0]); + Assert.Same(tagHelpers[1], builder[1]); + } + + [Fact] + public void Merge_BothEmpty_ReturnsEmpty() + { + // Act + var merged = TagHelperCollection.Merge(TagHelperCollection.Empty, TagHelperCollection.Empty); + + // Assert + Assert.Same(TagHelperCollection.Empty, merged); + } + + [Fact] + public void Merge_FirstEmpty_ReturnsSecond() + { + // Arrange + var second = TagHelperCollection.Create(CreateTestTagHelpers(2)); + + // Act + var merged = TagHelperCollection.Merge(TagHelperCollection.Empty, second); + + // Assert + Assert.Same(second, merged); + } + + [Fact] + public void Merge_SecondEmpty_ReturnsFirst() + { + // Arrange + var first = TagHelperCollection.Create(CreateTestTagHelpers(2)); + + // Act + var merged = TagHelperCollection.Merge(first, TagHelperCollection.Empty); + + // Assert + Assert.Same(first, merged); + } + + [Fact] + public void Merge_NoOverlapSingleItems_CreatesMergedCollection() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper2]; + + // Act + var merged = TagHelperCollection.Merge(first, second); + + // Assert + Assert.Equal(2, merged.Count); + Assert.False(merged.IsEmpty); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + Assert.Equal(0, merged.IndexOf(tagHelper1)); + Assert.Equal(1, merged.IndexOf(tagHelper2)); + Assert.True(merged.Contains(tagHelper1)); + Assert.True(merged.Contains(tagHelper2)); + } + + [Fact] + public void Merge_NoOverlapMultipleItems_CreatesMergedCollection() + { + // Arrange + var firstHelpers = CreateTestTagHelpers(3); + + // Create different helpers for second collection + var secondHelper1 = CreateTagHelper("Second1"); + var secondHelper2 = CreateTagHelper("Second2"); + + var first = TagHelperCollection.Create(firstHelpers); + TagHelperCollection second = [secondHelper1, secondHelper2]; + + // Act + var merged = TagHelperCollection.Merge(first, second); + + // Assert + Assert.Equal(5, merged.Count); + Assert.False(merged.IsEmpty); + + // Verify first collection items + for (var i = 0; i < firstHelpers.Length; i++) + { + Assert.Same(firstHelpers[i], merged[i]); + Assert.Equal(i, merged.IndexOf(firstHelpers[i])); + Assert.True(merged.Contains(firstHelpers[i])); + } + + // Verify second collection items + Assert.Same(secondHelper1, merged[3]); + Assert.Same(secondHelper2, merged[4]); + Assert.Equal(3, merged.IndexOf(secondHelper1)); + Assert.Equal(4, merged.IndexOf(secondHelper2)); + Assert.True(merged.Contains(secondHelper1)); + Assert.True(merged.Contains(secondHelper2)); + } + + [Fact] + public void Merge_WithOverlapSingleItems_DeduplicatesCorrectly() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper1, tagHelper2]; // Contains duplicate + + // Act + var merged = TagHelperCollection.Merge(first, second); + + // Assert + Assert.Equal(2, merged.Count); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + Assert.Equal(0, merged.IndexOf(tagHelper1)); + Assert.Equal(1, merged.IndexOf(tagHelper2)); + } + + [Fact] + public void Merge_WithOverlapMultipleItems_DeduplicatesCorrectly() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + var tagHelper4 = CreateTagHelper("Test4"); + + TagHelperCollection first = [tagHelper1, tagHelper2]; + TagHelperCollection second = [tagHelper2, tagHelper3, tagHelper4]; // tagHelper2 is duplicate + + // Act + var merged = TagHelperCollection.Merge(first, second); + + // Assert + Assert.Equal(4, merged.Count); // Should be deduplicated + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + Assert.Same(tagHelper3, merged[2]); + Assert.Same(tagHelper4, merged[3]); + + // Verify all items are findable + Assert.Equal(0, merged.IndexOf(tagHelper1)); + Assert.Equal(1, merged.IndexOf(tagHelper2)); + Assert.Equal(2, merged.IndexOf(tagHelper3)); + Assert.Equal(3, merged.IndexOf(tagHelper4)); + } + + [Fact] + public void Merge_CompleteOverlap_ReturnsDeduplicated() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var first = TagHelperCollection.Create(tagHelpers); + var second = TagHelperCollection.Create(tagHelpers); // Identical collections + + // Act + var merged = TagHelperCollection.Merge(first, second); + + // Assert + Assert.Equal(3, merged.Count); // Should not duplicate + Assert.SameItems(tagHelpers, merged); + } + + [Fact] + public void Merge_MergedCollectionIndexer_WorksCorrectly() + { + // Arrange + var firstHelper = CreateTagHelper("First"); + var secondHelper = CreateTagHelper("Second"); + TagHelperCollection first = [firstHelper]; + TagHelperCollection second = [secondHelper]; + + // Act + var merged = TagHelperCollection.Merge(first, second); + + // Assert - Test indexer edge cases + Assert.Same(firstHelper, merged[0]); + Assert.Same(secondHelper, merged[1]); + Assert.Throws(() => merged[-1]); + Assert.Throws(() => merged[2]); + } + + [Fact] + public void Merge_MergedCollectionCopyTo_WorksCorrectly() + { + // Arrange + var firstHelpers = CreateTestTagHelpers(2); + var secondHelper = CreateTagHelper("Second"); + var first = TagHelperCollection.Create(firstHelpers); + TagHelperCollection second = [secondHelper]; + var merged = TagHelperCollection.Merge(first, second); + var destination = new TagHelperDescriptor[5]; + + // Act + merged.CopyTo(destination); + + // Assert + Assert.Same(firstHelpers[0], destination[0]); + Assert.Same(firstHelpers[1], destination[1]); + Assert.Same(secondHelper, destination[2]); + Assert.Null(destination[3]); + Assert.Null(destination[4]); + } + + [Fact] + public void Merge_MergedCollectionCopyTo_DestinationTooShort_ThrowsArgumentException() + { + // Arrange + var firstHelper = CreateTagHelper("First"); + var secondHelper = CreateTagHelper("Second"); + TagHelperCollection first = [firstHelper]; + TagHelperCollection second = [secondHelper]; + var merged = TagHelperCollection.Merge(first, second); + var destination = new TagHelperDescriptor[1]; // Too short + + // Act & Assert + Assert.Throws(() => merged.CopyTo(destination)); + } + + [Fact] + public void Merge_MergedCollectionIndexOf_NonExistingItem_ReturnsMinusOne() + { + // Arrange + var firstHelper = CreateTagHelper("First"); + var secondHelper = CreateTagHelper("Second"); + var nonExistingHelper = CreateTagHelper("NonExisting"); + TagHelperCollection first = [firstHelper]; + TagHelperCollection second = [secondHelper]; + var merged = TagHelperCollection.Merge(first, second); + + // Act + var index = merged.IndexOf(nonExistingHelper); + + // Assert + Assert.Equal(-1, index); + } + + [Fact] + public void Merge_MergedCollectionGetHashCode_DifferentForDifferentOrder() + { + // Arrange + var firstHelper = CreateTagHelper("First"); + var secondHelper = CreateTagHelper("Second"); + TagHelperCollection first = [firstHelper]; + TagHelperCollection second = [secondHelper]; + + // Act + var merged1 = TagHelperCollection.Merge(first, second); + var merged2 = TagHelperCollection.Merge(second, first); // Different order + + // Assert + Assert.NotEqual(merged1.GetHashCode(), merged2.GetHashCode()); + } + + [Fact] + public void Merge_MergedCollectionEquals_SameContent_ReturnsTrue() + { + // Arrange + var firstHelper = CreateTagHelper("First"); + var secondHelper = CreateTagHelper("Second"); + TagHelperCollection first = [firstHelper]; + TagHelperCollection second = [secondHelper]; + + // Act + var merged1 = TagHelperCollection.Merge(first, second); + var merged2 = TagHelperCollection.Merge(first, second); + + // Assert + Assert.True(merged1.Equals(merged2)); + Assert.True(merged1.Equals((object)merged2)); + } + + [Fact] + public void Merge_MergedCollectionEnumeration_WorksCorrectly() + { + // Arrange + var firstHelpers = CreateTestTagHelpers(2); + var secondHelper = CreateTagHelper("Second"); + var first = TagHelperCollection.Create(firstHelpers); + TagHelperCollection second = [secondHelper]; + var merged = TagHelperCollection.Merge(first, second); + + // Act + var enumerated = new List(); + foreach (var item in merged) + { + enumerated.Add(item); + } + + // Assert + Assert.Equal(3, enumerated.Count); + Assert.Same(firstHelpers[0], enumerated[0]); + Assert.Same(firstHelpers[1], enumerated[1]); + Assert.Same(secondHelper, enumerated[2]); + } + + [Fact] + public void Merge_LargeCollections_WorksCorrectly() + { + // Arrange + var firstHelpers = CreateTestTagHelpers(500); + var secondHelpers = new TagHelperDescriptor[500]; + for (var i = 0; i < 500; i++) + { + secondHelpers[i] = CreateTagHelper($"SecondHelper{i}"); + } + + var first = TagHelperCollection.Create(firstHelpers); + var second = TagHelperCollection.Create(secondHelpers); + + // Act + var merged = TagHelperCollection.Merge(first, second); + + // Assert + Assert.Equal(1000, merged.Count); + + // Verify first collection items + for (var i = 0; i < 500; i++) + { + Assert.Same(firstHelpers[i], merged[i]); + } + + // Verify second collection items + for (var i = 0; i < 500; i++) + { + Assert.Same(secondHelpers[i], merged[500 + i]); + } + } + + [Fact] + public void Merge_WithPartialOverlap_DeduplicatesCorrectly() + { + // Arrange + var shared1 = CreateTagHelper("Shared1"); + var shared2 = CreateTagHelper("Shared2"); + var unique1 = CreateTagHelper("Unique1"); + var unique2 = CreateTagHelper("Unique2"); + var unique3 = CreateTagHelper("Unique3"); + + TagHelperCollection first = [unique1, shared1, unique2]; + TagHelperCollection second = [shared1, unique3, shared2]; + + // Act + var merged = TagHelperCollection.Merge(first, second); + + // Assert + Assert.Equal(5, merged.Count); // 3 + 3 - 1 (shared1 deduplicated) + + // Verify order: first collection items, then unique items from second collection + Assert.Same(unique1, merged[0]); + Assert.Same(shared1, merged[1]); // From first collection + Assert.Same(unique2, merged[2]); + Assert.Same(unique3, merged[3]); // From second collection (shared1 already added) + Assert.Same(shared2, merged[4]); // From second collection + + // Verify all items are findable + Assert.True(merged.Contains(unique1)); + Assert.True(merged.Contains(shared1)); + Assert.True(merged.Contains(unique2)); + Assert.True(merged.Contains(unique3)); + Assert.True(merged.Contains(shared2)); + } + + [Fact] + public void Merge_ImmutableArrayEmpty_ReturnsEmpty() + { + // Arrange + var collections = ImmutableArray.Empty; + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Same(TagHelperCollection.Empty, merged); + } + + [Fact] + public void Merge_ImmutableArraySingleCollection_ReturnsSameCollection() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(3)); + var collections = ImmutableArray.Create(collection); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Same(collection, merged); + } + + [Fact] + public void Merge_ImmutableArrayTwoCollections_UsesOptimizedTwoCollectionMerge() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper2]; + var collections = ImmutableArray.Create(first, second); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(2, merged.Count); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + } + + [Fact] + public void Merge_ImmutableArrayThreeCollections_NoOverlap_CreatesEfficientMergedCollection() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper2]; + TagHelperCollection third = [tagHelper3]; + var collections = ImmutableArray.Create(first, second, third); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(3, merged.Count); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + Assert.Same(tagHelper3, merged[2]); + Assert.Equal(0, merged.IndexOf(tagHelper1)); + Assert.Equal(1, merged.IndexOf(tagHelper2)); + Assert.Equal(2, merged.IndexOf(tagHelper3)); + Assert.True(merged.Contains(tagHelper1)); + Assert.True(merged.Contains(tagHelper2)); + Assert.True(merged.Contains(tagHelper3)); + } + + [Fact] + public void Merge_ImmutableArrayThreeCollections_WithDuplicates_DeduplicatesCorrectly() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper1, tagHelper2]; // tagHelper1 is duplicate + TagHelperCollection third = [tagHelper2, tagHelper3]; // tagHelper2 is duplicate + var collections = ImmutableArray.Create(first, second, third); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(3, merged.Count); // Should be deduplicated + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + Assert.Same(tagHelper3, merged[2]); + } + + [Fact] + public void Merge_ImmutableArrayWithEmptyCollections_FiltersEmptyCollections() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + TagHelperCollection first = [tagHelper1]; + var second = TagHelperCollection.Empty; + TagHelperCollection third = [tagHelper2]; + var fourth = TagHelperCollection.Empty; + var collections = ImmutableArray.Create(first, second, third, fourth); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(2, merged.Count); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + } + + [Fact] + public void Merge_ImmutableArrayMultipleCollections_LargeSet_WorksCorrectly() + { + // Arrange + var collections = ImmutableArray.CreateBuilder(10); + var allHelpers = new List(); + + for (var i = 0; i < 10; i++) + { + var helpers = new TagHelperDescriptor[5]; + for (var j = 0; j < 5; j++) + { + helpers[j] = CreateTagHelper($"Collection{i}Helper{j}"); + allHelpers.Add(helpers[j]); + } + collections.Add(TagHelperCollection.Create(helpers)); + } + + // Act + var merged = TagHelperCollection.Merge(collections.ToImmutable()); + + // Assert + Assert.Equal(50, merged.Count); + + // Verify all items are present in correct order + for (var i = 0; i < 50; i++) + { + Assert.Same(allHelpers[i], merged[i]); + } + } + + [Fact] + public void Merge_IEnumerableEmpty_ReturnsEmpty() + { + // Arrange + var collections = new List(); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Same(TagHelperCollection.Empty, merged); + } + + [Fact] + public void Merge_IEnumerableSingleCollection_ReturnsSameCollection() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(3)); + var collections = new List { collection }; + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Same(collection, merged); + } + + [Fact] + public void Merge_IEnumerableTwoCollections_UsesOptimizedPath() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper2]; + var collections = new List { first, second }; + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(2, merged.Count); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + } + + [Fact] + public void Merge_IEnumerableMultipleCollections_WorksCorrectly() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper2]; + TagHelperCollection third = [tagHelper3]; + var collections = new List { first, second, third }; + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(3, merged.Count); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + Assert.Same(tagHelper3, merged[2]); + } + + [Fact] + public void Merge_IEnumerableWithoutKnownCount_WorksCorrectly() + { + // Arrange - Use LINQ to create an enumerable without known count + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper2]; + var baseCollections = new[] { first, second }; + var collections = baseCollections.Where(c => !c.IsEmpty); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(2, merged.Count); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + } + + [Fact] + public void Merge_MultiCollectionMergedResult_SupportsIndexer() + { + // Arrange + var helpers = CreateTestTagHelpers(15).AsSpan(); + var first = TagHelperCollection.Create(helpers[0..5]); + var second = TagHelperCollection.Create(helpers[5..10]); + var third = TagHelperCollection.Create(helpers[10..15]); + var collections = ImmutableArray.Create(first, second, third); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(15, merged.Count); + + // Test indexer access + for (var i = 0; i < 15; i++) + { + Assert.Same(helpers[i], merged[i]); + } + + // Test boundary conditions + Assert.Throws(() => merged[-1]); + Assert.Throws(() => merged[15]); + } + + [Fact] + public void Merge_MultiCollectionMergedResult_SupportsIndexOf() + { + // Arrange + var helpers = CreateTestTagHelpers(9).AsSpan(); + var first = TagHelperCollection.Create(helpers[0..3]); + var second = TagHelperCollection.Create(helpers[3..6]); + var third = TagHelperCollection.Create(helpers[6..9]); + var collections = ImmutableArray.Create(first, second, third); + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + for (var i = 0; i < 9; i++) + { + Assert.Equal(i, merged.IndexOf(helpers[i])); + } + + var nonExistingHelper = CreateTagHelper("NonExisting"); + Assert.Equal(-1, merged.IndexOf(nonExistingHelper)); + } + + [Fact] + public void Merge_MultiCollectionMergedResult_SupportsCopyTo() + { + // Arrange + var helpers = CreateTestTagHelpers(6).AsSpan(); + var first = TagHelperCollection.Create(helpers[0..2]); + var second = TagHelperCollection.Create(helpers[2..4]); + var third = TagHelperCollection.Create(helpers[4..6]); + var collections = ImmutableArray.Create(first, second, third); + var merged = TagHelperCollection.Merge(collections); + var destination = new TagHelperDescriptor[8]; + + // Act + merged.CopyTo(destination); + + // Assert + for (var i = 0; i < 6; i++) + { + Assert.Same(helpers[i], destination[i]); + } + Assert.Null(destination[6]); + Assert.Null(destination[7]); + } + + [Fact] + public void Merge_MultiCollectionMergedResult_SupportsEnumeration() + { + // Arrange + var helpers = CreateTestTagHelpers(9).AsSpan(); + var first = TagHelperCollection.Create(helpers[0..3]); + var second = TagHelperCollection.Create(helpers[3..6]); + var third = TagHelperCollection.Create(helpers[6..9]); + var collections = ImmutableArray.Create(first, second, third); + var merged = TagHelperCollection.Merge(collections); + + // Act + var enumerated = new List(); + foreach (var item in merged) + { + enumerated.Add(item); + } + + // Assert + Assert.Equal(9, enumerated.Count); + for (var i = 0; i < 9; i++) + { + Assert.Same(helpers[i], enumerated[i]); + } + } + + [Fact] + public void Merge_MultiCollectionMergedResult_GetHashCodeIsDeterministic() + { + // Arrange + var helpers = CreateTestTagHelpers(6).AsSpan(); + var first = TagHelperCollection.Create(helpers[0..2]); + var second = TagHelperCollection.Create(helpers[2..4]); + var third = TagHelperCollection.Create(helpers[4..6]); + var collections = ImmutableArray.Create(first, second, third); + + // Act + var merged1 = TagHelperCollection.Merge(collections); + var merged2 = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(merged1.GetHashCode(), merged2.GetHashCode()); + } + + [Fact] + public void Merge_MultiCollectionMergedResult_EqualityWorksCorrectly() + { + // Arrange + var helpers = CreateTestTagHelpers(6).AsSpan(); + var first = TagHelperCollection.Create(helpers[0..2]); + var second = TagHelperCollection.Create(helpers[2..4]); + var third = TagHelperCollection.Create(helpers[4..6]); + var collections = ImmutableArray.Create(first, second, third); + + // Act + var merged1 = TagHelperCollection.Merge(collections); + var merged2 = TagHelperCollection.Merge(collections); + var arrayCreated = TagHelperCollection.Create(helpers); + + // Assert + Assert.True(merged1.Equals(merged2)); + Assert.True(merged1.Equals(arrayCreated)); + Assert.True(arrayCreated.Equals(merged1)); + } + + [Fact] + public void Merge_MultiCollectionNestedMerge_WorksCorrectly() + { + // Arrange + var helpers = CreateTestTagHelpers(12).AsSpan(); + var first = TagHelperCollection.Create(helpers[0..3]); + var second = TagHelperCollection.Create(helpers[3..6]); + var third = TagHelperCollection.Create(helpers[6..9]); + var fourth = TagHelperCollection.Create(helpers[9..12]); + + // Create nested merge structure + var merged1 = TagHelperCollection.Merge(first, second); + var merged2 = TagHelperCollection.Merge(third, fourth); + + // Act + var finalMerged = TagHelperCollection.Merge(merged1, merged2); + + // Assert + Assert.Equal(12, finalMerged.Count); + for (var i = 0; i < 12; i++) + { + Assert.Same(helpers[i], finalMerged[i]); + } + } + + [Fact] + public void Merge_ReadOnlySpanEmpty_ReturnsEmpty() + { + // Arrange + ReadOnlySpan collections = []; + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Same(TagHelperCollection.Empty, merged); + } + + [Fact] + public void Merge_ReadOnlySpanSingleCollection_ReturnsSameCollection() + { + // Arrange + var collection = TagHelperCollection.Create(CreateTestTagHelpers(3)); + ReadOnlySpan collections = [collection]; + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Same(collection, merged); + } + + [Fact] + public void Merge_ReadOnlySpanMultipleCollections_WorksCorrectly() + { + // Arrange + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + TagHelperCollection first = [tagHelper1]; + TagHelperCollection second = [tagHelper2]; + TagHelperCollection third = [tagHelper3]; + ReadOnlySpan collections = [first, second, third]; + + // Act + var merged = TagHelperCollection.Merge(collections); + + // Assert + Assert.Equal(3, merged.Count); + Assert.Same(tagHelper1, merged[0]); + Assert.Same(tagHelper2, merged[1]); + Assert.Same(tagHelper3, merged[2]); + } + + [Fact] + public void MergedCollection_EnumerationPerformance_AvoidsBinarySearchPerElement() + { + // Arrange - Create a scenario where enumeration would be slow if using indexer + var helpers1 = CreateTestTagHelpers(100); + var helpers2 = CreateTestTagHelpers(100, startIndex: 100); + var helpers3 = CreateTestTagHelpers(100, startIndex: 200); + + var collection1 = TagHelperCollection.Create(helpers1); + var collection2 = TagHelperCollection.Create(helpers2); + var collection3 = TagHelperCollection.Create(helpers3); + + var collections = ImmutableArray.Create(collection1, collection2, collection3); + var merged = TagHelperCollection.Merge(collections); + + // Act - Enumerate the entire collection + var enumerated = new List(); + foreach (var item in merged) + { + enumerated.Add(item); + } + + // Assert - Verify all items are present in correct order + Assert.Equal(300, enumerated.Count); + for (var i = 0; i < 100; i++) + { + Assert.Same(helpers1[i], enumerated[i]); + } + for (var i = 0; i < 100; i++) + { + Assert.Same(helpers2[i], enumerated[100 + i]); + } + for (var i = 0; i < 100; i++) + { + Assert.Same(helpers3[i], enumerated[200 + i]); + } + } + + [Fact] + public void MergedCollection_EnumerationState_HandlesSegmentTransitions() + { + // Arrange - Create collections of different sizes to test segment transitions + var helper1 = CreateTagHelper("Single"); + var helpers2to4 = CreateTestTagHelpers(3, startIndex: 1); + var helpers5to9 = CreateTestTagHelpers(5, startIndex: 4); + + TagHelperCollection collection1 = [helper1]; + var collection2 = TagHelperCollection.Create(helpers2to4); + var collection3 = TagHelperCollection.Create(helpers5to9); + + var merged = TagHelperCollection.Merge(ImmutableArray.Create(collection1, collection2, collection3)); + + // Act & Assert - Test enumeration crosses segment boundaries correctly + using var enumerator = merged.GetEnumerator(); + + // First segment (single item) + Assert.True(enumerator.MoveNext()); + Assert.Same(helper1, enumerator.Current); + + // Second segment (3 items) + for (var i = 0; i < 3; i++) + { + Assert.True(enumerator.MoveNext()); + Assert.Same(helpers2to4[i], enumerator.Current); + } + + // Third segment (5 items) + for (var i = 0; i < 5; i++) + { + Assert.True(enumerator.MoveNext()); + Assert.Same(helpers5to9[i], enumerator.Current); + } + + // Should be exhausted + Assert.False(enumerator.MoveNext()); + } + + [Fact] + public void MergedCollection_IndexerAccuracy_WithManySegments() + { + // Arrange - Create many small segments to stress-test binary search logic + var segments = new List(); + var allHelpers = new List(); + + for (var i = 0; i < 20; i++) + { + var helpers = CreateTestTagHelpers(3, startIndex: i * 3); + segments.Add(TagHelperCollection.Create(helpers)); + allHelpers.AddRange(helpers); + } + + var merged = TagHelperCollection.Merge(segments.ToImmutableArray()); + + // Act & Assert - Test random access to various indices + Assert.Equal(60, merged.Count); + + // Test accessing elements from different segments + var testIndices = new[] { 0, 1, 2, 5, 8, 15, 29, 35, 44, 59 }; + foreach (var index in testIndices) + { + Assert.Same(allHelpers[index], merged[index]); + Assert.Equal(index, merged.IndexOf(allHelpers[index])); + } + } + + [Fact] + public void MergedCollection_FindCollectionIndex_BinarySearchEdgeCases() + { + // Arrange - Create segments with specific sizes to test binary search edge cases + var segment1 = TagHelperCollection.Create(CreateTestTagHelpers(1)); // [0] + var segment2 = TagHelperCollection.Create(CreateTestTagHelpers(2, startIndex: 1)); // [1, 2] + var segment3 = TagHelperCollection.Create(CreateTestTagHelpers(3, startIndex: 3)); // [3, 4, 5] + var segment4 = TagHelperCollection.Create(CreateTestTagHelpers(1, startIndex: 6)); // [6] + + var merged = TagHelperCollection.Merge(ImmutableArray.Create(segment1, segment2, segment3, segment4)); + + // Act & Assert - Test edge cases in binary search logic + // Start of segments + Assert.Equal(0, merged.IndexOf(CreateTagHelper("TagHelper0"))); // Start of segment 1 + Assert.Equal(1, merged.IndexOf(CreateTagHelper("TagHelper1"))); // Start of segment 2 + Assert.Equal(3, merged.IndexOf(CreateTagHelper("TagHelper3"))); // Start of segment 3 + Assert.Equal(6, merged.IndexOf(CreateTagHelper("TagHelper6"))); // Start of segment 4 + + // End of segments + Assert.Equal(0, merged.IndexOf(CreateTagHelper("TagHelper0"))); // End of segment 1 + Assert.Equal(2, merged.IndexOf(CreateTagHelper("TagHelper2"))); // End of segment 2 + Assert.Equal(5, merged.IndexOf(CreateTagHelper("TagHelper5"))); // End of segment 3 + Assert.Equal(6, merged.IndexOf(CreateTagHelper("TagHelper6"))); // End of segment 4 + } + + [Fact] + public void MergedCollection_CopyTo_HandlesSegmentBoundaries() + { + // Arrange + var helpers1 = CreateTestTagHelpers(2); + var helpers2 = CreateTestTagHelpers(3, startIndex: 2); + var helpers3 = CreateTestTagHelpers(1, startIndex: 5); + + var collection1 = TagHelperCollection.Create(helpers1); + var collection2 = TagHelperCollection.Create(helpers2); + var collection3 = TagHelperCollection.Create(helpers3); + + var merged = TagHelperCollection.Merge(ImmutableArray.Create(collection1, collection2, collection3)); + var destination = new TagHelperDescriptor[10]; + + // Act + merged.CopyTo(destination); + + // Assert + Assert.Same(helpers1[0], destination[0]); + Assert.Same(helpers1[1], destination[1]); + Assert.Same(helpers2[0], destination[2]); + Assert.Same(helpers2[1], destination[3]); + Assert.Same(helpers2[2], destination[4]); + Assert.Same(helpers3[0], destination[5]); + + // Remaining should be null + for (var i = 6; i < 10; i++) + { + Assert.Null(destination[i]); + } + } + + [Fact] + public void MergedCollection_ComputeHashCode_IsConsistentWithContent() + { + // Arrange + var helpers = CreateTestTagHelpers(6).AsSpan(); + + // Create the same content using different merge strategies + var merged1 = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[0..2]), + TagHelperCollection.Create(helpers[2..6])); + + var merged2 = TagHelperCollection.Merge(ImmutableArray.Create( + TagHelperCollection.Create(helpers[0..3]), + TagHelperCollection.Create(helpers[3..6]))); + + var arrayBacked = TagHelperCollection.Create(helpers); + + // Act & Assert + Assert.Equal(arrayBacked.GetHashCode(), merged1.GetHashCode()); + Assert.Equal(arrayBacked.GetHashCode(), merged2.GetHashCode()); + Assert.Equal(merged1.GetHashCode(), merged2.GetHashCode()); + } + + [Fact] + public void MergedCollection_EqualsImplementation_WorksAcrossDifferentCollectionTypes() + { + // Arrange + var helpers = CreateTestTagHelpers(4).AsSpan(); + + var arrayBacked = TagHelperCollection.Create(helpers); + var twoItemMerged = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[0..2]), + TagHelperCollection.Create(helpers[2..4])); + var multiMerged = TagHelperCollection.Merge(ImmutableArray.Create( + TagHelperCollection.Create([helpers[0]]), + TagHelperCollection.Create([helpers[1]]), + TagHelperCollection.Create(helpers[2..4]))); + + // Act & Assert - All should be equal despite different internal structures + Assert.True(arrayBacked.Equals(twoItemMerged)); + Assert.True(twoItemMerged.Equals(arrayBacked)); + Assert.True(arrayBacked.Equals(multiMerged)); + Assert.True(multiMerged.Equals(arrayBacked)); + Assert.True(twoItemMerged.Equals(multiMerged)); + Assert.True(multiMerged.Equals(twoItemMerged)); + } + + [Fact] + public void MergedCollection_DifferentInternalStructure_SameContent_ReturnsTrue() + { + // Arrange - Create collections with same content but different internal merge structure + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + + // First merged collection: [tagHelper1] + [tagHelper2, tagHelper3] + TagHelperCollection firstPart1 = [tagHelper1]; + TagHelperCollection secondPart1 = [tagHelper2, tagHelper3]; + var merged1 = TagHelperCollection.Merge(firstPart1, secondPart1); + + // Second merged collection: [tagHelper1, tagHelper2] + [tagHelper3] + TagHelperCollection firstPart2 = [tagHelper1, tagHelper2]; + TagHelperCollection secondPart2 = [tagHelper3]; + var merged2 = TagHelperCollection.Merge(firstPart2, secondPart2); + + // Act & Assert - Should be equal despite different merge structure + Assert.True(merged1.Equals(merged2)); + Assert.True(merged2.Equals(merged1)); + Assert.Equal(merged1.GetHashCode(), merged2.GetHashCode()); + + // Verify content is identical + Assert.Equal(3, merged1.Count); + Assert.Equal(3, merged2.Count); + Assert.Same(tagHelper1, merged1[0]); + Assert.Same(tagHelper2, merged1[1]); + Assert.Same(tagHelper3, merged1[2]); + Assert.Same(tagHelper1, merged2[0]); + Assert.Same(tagHelper2, merged2[1]); + Assert.Same(tagHelper3, merged2[2]); + } + + [Fact] + public void TwoItemMergedCollection_DifferentInternalStructure_SameContent_ReturnsTrue() + { + // Arrange - Create two-item merged collections with same content but different internal structure + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + + // First: single + single + TagHelperCollection first1 = [tagHelper1]; + TagHelperCollection second1 = [tagHelper2]; + var merged1 = TagHelperCollection.Merge(first1, second1); + + // Second: array + single (different internal collection types) + var arrayCollection = TagHelperCollection.Create([tagHelper1]); + TagHelperCollection singleCollection = [tagHelper2]; + var merged2 = TagHelperCollection.Merge(arrayCollection, singleCollection); + + // Act & Assert - Should be equal despite different internal structure + Assert.True(merged1.Equals(merged2)); + Assert.True(merged2.Equals(merged1)); + Assert.Equal(merged1.GetHashCode(), merged2.GetHashCode()); + + // Verify content is identical + Assert.Equal(2, merged1.Count); + Assert.Equal(2, merged2.Count); + Assert.Same(tagHelper1, merged1[0]); + Assert.Same(tagHelper2, merged1[1]); + Assert.Same(tagHelper1, merged2[0]); + Assert.Same(tagHelper2, merged2[1]); + } + + [Fact] + public void MergedCollection_VsArrayCollection_SameContent_ReturnsTrue() + { + // Arrange - Create merged collection vs array-backed collection with same content + var tagHelpers = CreateTestTagHelpers(4).AsSpan(); + + // Create via merge + var part1 = TagHelperCollection.Create(tagHelpers[0..2]); + var part2 = TagHelperCollection.Create(tagHelpers[2..4]); + var merged = TagHelperCollection.Merge(part1, part2); + + // Create directly from array + var arrayBacked = TagHelperCollection.Create(tagHelpers); + + // Act & Assert - Should be equal despite different construction + Assert.True(merged.Equals(arrayBacked)); + Assert.True(arrayBacked.Equals(merged)); + Assert.Equal(merged.GetHashCode(), arrayBacked.GetHashCode()); + + // Verify content is identical + Assert.Equal(4, merged.Count); + Assert.Equal(4, arrayBacked.Count); + for (var i = 0; i < 4; i++) + { + Assert.Same(tagHelpers[i], merged[i]); + Assert.Same(tagHelpers[i], arrayBacked[i]); + } + } + + [Fact] + public void MergedCollection_VsSingleItemCollection_SameContent_ReturnsTrue() + { + // Arrange + var tagHelper = CreateTagHelper("Test"); + + // Create via merge of two empty parts (should result in single item) + TagHelperCollection part1 = [tagHelper]; + var merged = TagHelperCollection.Merge(part1, TagHelperCollection.Empty); + + // Create directly as single item + TagHelperCollection single = [tagHelper]; + + // Act & Assert - Should be equal despite different construction + Assert.True(merged.Equals(single)); + Assert.True(single.Equals(merged)); + Assert.Equal(merged.GetHashCode(), single.GetHashCode()); + + // Verify content is identical + Assert.Single(merged); + Assert.Single(single); + Assert.Same(tagHelper, merged[0]); + Assert.Same(tagHelper, single[0]); + } + + [Fact] + public void MultiLevelMergedCollection_EqualityWorks_AcrossDifferentNestingLevels() + { + // Arrange - Create the same content through different nesting levels + var helpers = CreateTestTagHelpers(8); + + // Flat merge: all 8 collections merged at once + var individualCollections = helpers.Select(h => TagHelperCollection.Create([h])).ToArray(); + var flatMerged = TagHelperCollection.Merge(individualCollections.ToImmutableArray()); + + // Two-level merge: merge pairs, then merge the pairs + var pair1 = TagHelperCollection.Merge(individualCollections[0], individualCollections[1]); + var pair2 = TagHelperCollection.Merge(individualCollections[2], individualCollections[3]); + var pair3 = TagHelperCollection.Merge(individualCollections[4], individualCollections[5]); + var pair4 = TagHelperCollection.Merge(individualCollections[6], individualCollections[7]); + var twoLevelMerged = TagHelperCollection.Merge(ImmutableArray.Create(pair1, pair2, pair3, pair4)); + + // Three-level merge: merge pairs, then pairs of pairs + var quad1 = TagHelperCollection.Merge(pair1, pair2); + var quad2 = TagHelperCollection.Merge(pair3, pair4); + var threeLevelMerged = TagHelperCollection.Merge(quad1, quad2); + + // Array-backed for comparison + var arrayBacked = TagHelperCollection.Create(helpers); + + // Act & Assert - All should be equal despite different nesting structures + Assert.True(flatMerged.Equals(twoLevelMerged)); + Assert.True(twoLevelMerged.Equals(threeLevelMerged)); + Assert.True(threeLevelMerged.Equals(arrayBacked)); + Assert.True(arrayBacked.Equals(flatMerged)); + + // Verify hash codes are equal + Assert.Equal(flatMerged.GetHashCode(), twoLevelMerged.GetHashCode()); + Assert.Equal(twoLevelMerged.GetHashCode(), threeLevelMerged.GetHashCode()); + Assert.Equal(threeLevelMerged.GetHashCode(), arrayBacked.GetHashCode()); + } + + [Fact] + public void MergedCollection_WithNestedMergedCollections_EqualityWorksCorrectly() + { + // Arrange - Create complex nested structure + var helpers = CreateTestTagHelpers(6); + + // Create nested merged collection structure + var innerMerged1 = TagHelperCollection.Merge( + TagHelperCollection.Create([helpers[0]]), + TagHelperCollection.Create([helpers[1]])); + + var innerMerged2 = TagHelperCollection.Merge( + TagHelperCollection.Create([helpers[2], helpers[3]]), + TagHelperCollection.Create([helpers[4], helpers[5]])); + + var outerMerged = TagHelperCollection.Merge(innerMerged1, innerMerged2); + + // Create equivalent flat structure + var flatMerged = TagHelperCollection.Merge(ImmutableArray.Create( + TagHelperCollection.Create([helpers[0]]), + TagHelperCollection.Create([helpers[1]]), + TagHelperCollection.Create([helpers[2], helpers[3]]), + TagHelperCollection.Create([helpers[4], helpers[5]]) + )); + + // Create array-backed equivalent + var arrayBacked = TagHelperCollection.Create(helpers); + + // Act & Assert + Assert.True(outerMerged.Equals(flatMerged)); + Assert.True(flatMerged.Equals(arrayBacked)); + Assert.True(arrayBacked.Equals(outerMerged)); + + // Verify content integrity + Assert.Equal(6, outerMerged.Count); + Assert.Equal(6, flatMerged.Count); + Assert.Equal(6, arrayBacked.Count); + + for (var i = 0; i < 6; i++) + { + Assert.Same(helpers[i], outerMerged[i]); + Assert.Same(helpers[i], flatMerged[i]); + Assert.Same(helpers[i], arrayBacked[i]); + } + } + + [Fact] + public void MergedCollection_DifferentContent_SameStructure_ReturnsFalse() + { + // Arrange - Same merge structure but different content + var helpers1 = CreateTestTagHelpers(4).AsSpan(); + var helpers2 = CreateTestTagHelpers(4, startIndex: 10).AsSpan(); // Different content + + var part1a = TagHelperCollection.Create(helpers1[0..2]); + var part2a = TagHelperCollection.Create(helpers1[2..4]); + var merged1 = TagHelperCollection.Merge(part1a, part2a); + + var part1b = TagHelperCollection.Create(helpers2[0..2]); + var part2b = TagHelperCollection.Create(helpers2[2..4]); + var merged2 = TagHelperCollection.Merge(part1b, part2b); + + // Act & Assert - Should not be equal due to different content + Assert.False(merged1.Equals(merged2)); + Assert.False(merged2.Equals(merged1)); + Assert.NotEqual(merged1.GetHashCode(), merged2.GetHashCode()); + } + + [Fact] + public void MergedCollection_SameContentDifferentOrder_ReturnsFalse() + { + // Arrange - Same items but different order + var tagHelper1 = CreateTagHelper("Test1"); + var tagHelper2 = CreateTagHelper("Test2"); + var tagHelper3 = CreateTagHelper("Test3"); + + // First order: 1, 2, 3 + var merged1 = TagHelperCollection.Merge( + TagHelperCollection.Create([tagHelper1]), + TagHelperCollection.Create([tagHelper2, tagHelper3])); + + // Second order: 3, 2, 1 + var merged2 = TagHelperCollection.Merge( + TagHelperCollection.Create([tagHelper3]), + TagHelperCollection.Create([tagHelper2, tagHelper1])); + + // Act & Assert - Should not be equal due to different order + Assert.False(merged1.Equals(merged2)); + Assert.False(merged2.Equals(merged1)); + Assert.NotEqual(merged1.GetHashCode(), merged2.GetHashCode()); + + // Verify the order is actually different + Assert.Same(tagHelper1, merged1[0]); + Assert.Same(tagHelper2, merged1[1]); + Assert.Same(tagHelper3, merged1[2]); + + Assert.Same(tagHelper3, merged2[0]); + Assert.Same(tagHelper2, merged2[1]); + Assert.Same(tagHelper1, merged2[2]); + } + + [Fact] + public void MergedCollection_ChecksumBasedEquality_WorksWithLargeCollections() + { + // Arrange - Create large collections to test checksum-based equality path + var helpers = CreateTestTagHelpers(100).AsSpan(); + + // Create via different merge strategies + var merged1 = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[0..50]), + TagHelperCollection.Create(helpers[50..100])); + + var merged2 = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[0..25]), + TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[25..75]), + TagHelperCollection.Create(helpers[75..100]))); + + var arrayBacked = TagHelperCollection.Create(helpers); + + // Act & Assert - Large collections should use checksum-based equality + Assert.True(merged1.Equals(merged2)); + Assert.True(merged2.Equals(arrayBacked)); + Assert.True(arrayBacked.Equals(merged1)); + + // Hash codes should be equal due to checksum-based computation + Assert.Equal(merged1.GetHashCode(), merged2.GetHashCode()); + Assert.Equal(merged2.GetHashCode(), arrayBacked.GetHashCode()); + } + + [Fact] + public void MergedCollection_TransitiveEquality_WorksCorrectly() + { + // Arrange - Test transitive property: if A == B and B == C, then A == C + var helpers = CreateTestTagHelpers(6).AsSpan(); + + var collectionA = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[0..2]), + TagHelperCollection.Create(helpers[2..6])); + + var collectionB = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[0..3]), + TagHelperCollection.Create(helpers[3..6])); + + var collectionC = TagHelperCollection.Create(helpers); + + // Act & Assert - Test transitivity + Assert.True(collectionA.Equals(collectionB)); // A == B + Assert.True(collectionB.Equals(collectionC)); // B == C + Assert.True(collectionA.Equals(collectionC)); // Therefore A == C + + // Test symmetry + Assert.True(collectionB.Equals(collectionA)); // B == A + Assert.True(collectionC.Equals(collectionB)); // C == B + Assert.True(collectionC.Equals(collectionA)); // C == A + + // Test reflexivity + Assert.True(collectionA.Equals(collectionA)); + Assert.True(collectionB.Equals(collectionB)); + Assert.True(collectionC.Equals(collectionC)); + } + + [Fact] + public void MergedCollection_NullEquality_WorksCorrectly() + { + // Arrange + var helpers = CreateTestTagHelpers(3).AsSpan(); + var merged = TagHelperCollection.Merge( + TagHelperCollection.Create([helpers[0]]), + TagHelperCollection.Create(helpers[1..3])); + + // Act & Assert + Assert.False(merged.Equals(null)); + Assert.False(merged.Equals((object?)null)); + } + + [Fact] + public void MergedCollection_EqualityWithDifferentTypes_WorksCorrectly() + { + // Arrange + var helpers = CreateTestTagHelpers(3).AsSpan(); + var merged = TagHelperCollection.Merge( + TagHelperCollection.Create([helpers[0]]), + TagHelperCollection.Create(helpers[1..3])); + + // Act & Assert - Should not equal different types + Assert.False(merged.Equals("not a collection")); + Assert.False(merged.Equals(42)); + } + + [Fact] + public void MergedCollection_EqualsObjectOverride_WorksCorrectly() + { + // Arrange + var helpers = CreateTestTagHelpers(3).AsSpan(); + var merged1 = TagHelperCollection.Merge( + TagHelperCollection.Create([helpers[0]]), + TagHelperCollection.Create(helpers[1..3])); + + var merged2 = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[0..2]), + TagHelperCollection.Create([helpers[2]])); + + // Act & Assert - Test object.Equals override + Assert.True(merged1.Equals((object)merged2)); + Assert.True(merged2.Equals((object)merged1)); + Assert.True(merged1.Equals((object)merged1)); // Reflexivity + } + + [Fact] + public void MergedCollection_EnumerationResetAndDispose_WorksCorrectly() + { + // Arrange + var helpers = CreateTestTagHelpers(6).AsSpan(); + var merged = TagHelperCollection.Merge(ImmutableArray.Create( + TagHelperCollection.Create(helpers[0..2]), + TagHelperCollection.Create(helpers[2..4]), + TagHelperCollection.Create(helpers[4..6]))); + + // Act & Assert - Test enumerator lifecycle + using var enumerator = merged.GetEnumerator(); + + // Enumerate first few items + Assert.True(enumerator.MoveNext()); + Assert.Same(helpers[0], enumerator.Current); + Assert.True(enumerator.MoveNext()); + Assert.Same(helpers[1], enumerator.Current); + + // Reset should work + enumerator.Reset(); + Assert.True(enumerator.MoveNext()); + Assert.Same(helpers[0], enumerator.Current); + + // Dispose should work (multiple times) + enumerator.Dispose(); + enumerator.Dispose(); // Should not throw + } + + [Fact] + public void MergedCollection_IndexOfWithNestedMergedCollections_WorksCorrectly() + { + // Arrange - Create nested merged collections to test complex scenarios + var helpers = CreateTestTagHelpers(12).AsSpan(); + + var innerMerged1 = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[0..2]), + TagHelperCollection.Create(helpers[2..4])); + var innerMerged2 = TagHelperCollection.Merge( + TagHelperCollection.Create(helpers[4..6]), + TagHelperCollection.Create(helpers[6..8])); + var regularCollection = TagHelperCollection.Create(helpers[8..12]); + + var outerMerged = TagHelperCollection.Merge(ImmutableArray.Create( + innerMerged1, innerMerged2, regularCollection)); + + // Act & Assert - Verify IndexOf works correctly for nested structure + for (var i = 0; i < 12; i++) + { + Assert.Equal(i, outerMerged.IndexOf(helpers[i])); + Assert.Same(helpers[i], outerMerged[i]); + } + + // Test non-existent item + var nonExistent = CreateTagHelper("NonExistent"); + Assert.Equal(-1, outerMerged.IndexOf(nonExistent)); + } + + [Fact] + public void MergedCollection_LargeNumberOfSmallSegments_PerformsWell() + { + // Arrange - Stress test with many small segments + var segments = new List(); + var allHelpers = new List(); + + for (var i = 0; i < 50; i++) + { + var helper = CreateTagHelper($"Helper{i}"); + segments.Add(TagHelperCollection.Create([helper])); + allHelpers.Add(helper); + } + + var merged = TagHelperCollection.Merge(segments.ToImmutableArray()); + + // Act & Assert - Verify functionality with many segments + Assert.Equal(50, merged.Count); + + // Test enumeration + var enumerated = new List(); + foreach (var item in merged) + { + enumerated.Add(item); + } + Assert.Equal(allHelpers, enumerated); + + // Test random access + for (var i = 0; i < 50; i += 5) // Test every 5th element + { + Assert.Same(allHelpers[i], merged[i]); + Assert.Equal(i, merged.IndexOf(allHelpers[i])); + } + } + + [Fact] + public void Where_EmptyCollection_ReturnsEmpty() + { + // Arrange + var collection = TagHelperCollection.Empty; + + // Act + var filtered = collection.Where(h => h.Name.StartsWith("Test", StringComparison.Ordinal)); + + // Assert + Assert.Same(TagHelperCollection.Empty, filtered); + } + + [Fact] + public void Where_NoMatches_ReturnsEmpty() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act + var filtered = collection.Where(h => h.Name.StartsWith("NonExistent", StringComparison.Ordinal)); + + // Assert + Assert.Same(TagHelperCollection.Empty, filtered); + } + + [Fact] + public void Where_AllMatch_ReturnsSameCollection() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(3); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act + var filtered = collection.Where(h => h.Name.StartsWith("TagHelper", StringComparison.Ordinal)); + + // Assert + Assert.Equal(collection.Count, filtered.Count); + Assert.SameItems(tagHelpers, filtered); + + // Verify the result has the same structure (should be optimized) + for (var i = 0; i < tagHelpers.Length; i++) + { + Assert.Same(tagHelpers[i], filtered[i]); + } + } + + [Fact] + public void Where_PartialMatch_ReturnsFilteredCollection() + { + // Arrange + var tagHelper1 = CreateTagHelper("TestHelper1"); + var tagHelper2 = CreateTagHelper("OtherHelper"); + var tagHelper3 = CreateTagHelper("TestHelper3"); + var tagHelpers = new[] { tagHelper1, tagHelper2, tagHelper3 }; + var collection = TagHelperCollection.Create(tagHelpers); + + // Act + var filtered = collection.Where(h => h.Name.StartsWith("Test", StringComparison.Ordinal)); + + // Assert + Assert.Equal(2, filtered.Count); + Assert.Same(tagHelper1, filtered[0]); + Assert.Same(tagHelper3, filtered[1]); + Assert.Equal(0, filtered.IndexOf(tagHelper1)); + Assert.Equal(1, filtered.IndexOf(tagHelper3)); + Assert.True(filtered.Contains(tagHelper1)); + Assert.True(filtered.Contains(tagHelper3)); + Assert.False(filtered.Contains(tagHelper2)); + } + + [Fact] + public void Where_SingleItem_MatchingPredicate_ReturnsSingleItemCollection() + { + // Arrange + var tagHelper = CreateTagHelper("TestHelper"); + TagHelperCollection collection = [tagHelper]; + + // Act + var filtered = collection.Where(h => h.Name.StartsWith("Test", StringComparison.Ordinal)); + + // Assert + Assert.Single(filtered); + Assert.Same(tagHelper, filtered[0]); + Assert.Equal(0, filtered.IndexOf(tagHelper)); + Assert.True(filtered.Contains(tagHelper)); + } + + [Fact] + public void Where_SingleItem_NonMatchingPredicate_ReturnsEmpty() + { + // Arrange + var tagHelper = CreateTagHelper("TestHelper"); + TagHelperCollection collection = [tagHelper]; + + // Act + var filtered = collection.Where(h => h.Name.StartsWith("Other", StringComparison.Ordinal)); + + // Assert + Assert.Same(TagHelperCollection.Empty, filtered); + } + + [Fact] + public void Where_MergedCollection_WorksCorrectly() + { + // Arrange + var firstHelpers = CreateTestTagHelpers(2); + var secondHelpers = new[] { CreateTagHelper("OtherHelper1"), CreateTagHelper("TestHelper") }; + var first = TagHelperCollection.Create(firstHelpers); + var second = TagHelperCollection.Create(secondHelpers); + var merged = TagHelperCollection.Merge(first, second); + + // Act + var filtered = merged.Where(h => h.Name.StartsWith("TagHelper", StringComparison.Ordinal)); + + // Assert + Assert.Equal(2, filtered.Count); // 2 from first, 0 from second (neither "OtherHelper1" nor "TestHelper" starts with "TagHelper") + Assert.Same(firstHelpers[0], filtered[0]); + Assert.Same(firstHelpers[1], filtered[1]); + } + + [Fact] + public void Where_LargeCollection_WorksCorrectly() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(100); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act - Filter for even-numbered helpers + var filtered = collection.Where(h => + { + var nameIndex = h.Name["TagHelper".Length..]; + return int.Parse(nameIndex) % 2 == 0; + }); + + // Assert + Assert.Equal(50, filtered.Count); // TagHelper0, TagHelper2, ..., TagHelper98 + + // Verify the filtered items are correct + for (var i = 0; i < 50; i++) + { + var expectedIndex = i * 2; + Assert.Same(tagHelpers[expectedIndex], filtered[i]); + Assert.Equal(i, filtered.IndexOf(tagHelpers[expectedIndex])); + } + } + + [Fact] + public void Where_ComplexPredicate_WorksCorrectly() + { + // Arrange + var shortHelper = CreateTagHelper("A"); + var mediumHelper1 = CreateTagHelper("Medium1"); + var mediumHelper2 = CreateTagHelper("Medium2"); + var longHelper = CreateTagHelper("VeryLongHelperName"); + var collection = TagHelperCollection.Create([shortHelper, mediumHelper1, mediumHelper2, longHelper]); + + // Act + var filtered = collection.Where(h => h.Name.Length >= 6 && h.Name.Length <= 8); + + // Assert + Assert.Equal(2, filtered.Count); + Assert.Same(mediumHelper1, filtered[0]); + Assert.Same(mediumHelper2, filtered[1]); + } + + [Fact] + public void Where_ChainedFiltering_WorksCorrectly() + { + // Arrange + var helpers = new[] + { + CreateTagHelper("TestHelper1"), + CreateTagHelper("TestHelper2"), + CreateTagHelper("OtherHelper1"), + CreateTagHelper("TestHelper3"), + CreateTagHelper("OtherHelper2") + }; + var collection = TagHelperCollection.Create(helpers); + + // Act - Chain multiple Where operations + var filtered = collection + .Where(h => h.Name.StartsWith("Test", StringComparison.Ordinal)) + .Where(h => !h.Name.EndsWith('2')); + + // Assert + Assert.Equal(2, filtered.Count); + Assert.Same(helpers[0], filtered[0]); // TestHelper1 + Assert.Same(helpers[3], filtered[1]); // TestHelper3 + } + + [Fact] + public void Where_PreservesSegmentStructure_OptimalCase() + { + // Arrange - Create a multi-segment collection where filtering preserves segment boundaries + var segment1Helpers = new[] { CreateTagHelper("Keep1"), CreateTagHelper("Keep2") }; + var segment2Helpers = new[] { CreateTagHelper("Keep3"), CreateTagHelper("Keep4") }; + var collection1 = TagHelperCollection.Create(segment1Helpers); + var collection2 = TagHelperCollection.Create(segment2Helpers); + var merged = TagHelperCollection.Merge(collection1, collection2); + + // Act + var filtered = merged.Where(h => h.Name.StartsWith("Keep", StringComparison.Ordinal)); + + // Assert + Assert.Equal(4, filtered.Count); + Assert.Same(segment1Helpers[0], filtered[0]); + Assert.Same(segment1Helpers[1], filtered[1]); + Assert.Same(segment2Helpers[0], filtered[2]); + Assert.Same(segment2Helpers[1], filtered[3]); + + // Verify filtering performance by checking all items are accessible + for (var i = 0; i < 4; i++) + { + var helper = filtered[i]; + Assert.Equal(i, filtered.IndexOf(helper)); + Assert.True(filtered.Contains(helper)); + } + } + + [Fact] + public void Where_FragmentedSegments_CreatesOptimalSegments() + { + // Arrange - Create a scenario where filtering creates fragmented segments + var helpers = new[] + { + CreateTagHelper("Keep1"), // Keep + CreateTagHelper("Remove1"), // Remove + CreateTagHelper("Keep2"), // Keep + CreateTagHelper("Keep3"), // Keep + CreateTagHelper("Remove2"), // Remove + CreateTagHelper("Keep4") // Keep + }; + var collection = TagHelperCollection.Create(helpers); + + // Act + var filtered = collection.Where(h => h.Name.StartsWith("Keep", StringComparison.Ordinal)); + + // Assert + Assert.Equal(4, filtered.Count); + Assert.Same(helpers[0], filtered[0]); // Keep1 + Assert.Same(helpers[2], filtered[1]); // Keep2 + Assert.Same(helpers[3], filtered[2]); // Keep3 + Assert.Same(helpers[5], filtered[3]); // Keep4 + + // Verify all operations work correctly on fragmented result + Assert.Equal(0, filtered.IndexOf(helpers[0])); + Assert.Equal(1, filtered.IndexOf(helpers[2])); + Assert.Equal(2, filtered.IndexOf(helpers[3])); + Assert.Equal(3, filtered.IndexOf(helpers[5])); + Assert.Equal(-1, filtered.IndexOf(helpers[1])); // Removed item + Assert.Equal(-1, filtered.IndexOf(helpers[4])); // Removed item + } + + [Fact] + public void Where_AlternatingPattern_CreatesMultipleSegments() + { + // Arrange - Create an alternating keep/remove pattern + var helpers = new TagHelperDescriptor[10]; + for (var i = 0; i < 10; i++) + { + helpers[i] = CreateTagHelper(i % 2 == 0 ? $"Keep{i}" : $"Remove{i}"); + } + var collection = TagHelperCollection.Create(helpers); + + // Act + var filtered = collection.Where(h => h.Name.StartsWith("Keep", StringComparison.Ordinal)); + + // Assert + Assert.Equal(5, filtered.Count); + for (var i = 0; i < 5; i++) + { + var expectedIndex = i * 2; + Assert.Same(helpers[expectedIndex], filtered[i]); + } + } + + [Fact] + public void Where_FilteredResult_SupportsAllOperations() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(6); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act + var filtered = collection.Where(h => + { + var nameIndex = h.Name["TagHelper".Length..]; + var index = int.Parse(nameIndex); + return index % 2 == 0; // Keep even indices: 0, 2, 4 + }); + + // Assert + Assert.Equal(3, filtered.Count); + + // Test indexer + Assert.Same(tagHelpers[0], filtered[0]); + Assert.Same(tagHelpers[2], filtered[1]); + Assert.Same(tagHelpers[4], filtered[2]); + + // Test IndexOf + Assert.Equal(0, filtered.IndexOf(tagHelpers[0])); + Assert.Equal(1, filtered.IndexOf(tagHelpers[2])); + Assert.Equal(2, filtered.IndexOf(tagHelpers[4])); + Assert.Equal(-1, filtered.IndexOf(tagHelpers[1])); // Filtered out + Assert.Equal(-1, filtered.IndexOf(tagHelpers[3])); // Filtered out + Assert.Equal(-1, filtered.IndexOf(tagHelpers[5])); // Filtered out + + // Test Contains + Assert.True(filtered.Contains(tagHelpers[0])); + Assert.True(filtered.Contains(tagHelpers[2])); + Assert.True(filtered.Contains(tagHelpers[4])); + Assert.False(filtered.Contains(tagHelpers[1])); + Assert.False(filtered.Contains(tagHelpers[3])); + Assert.False(filtered.Contains(tagHelpers[5])); + + // Test CopyTo + var destination = new TagHelperDescriptor[5]; + filtered.CopyTo(destination); + Assert.Same(tagHelpers[0], destination[0]); + Assert.Same(tagHelpers[2], destination[1]); + Assert.Same(tagHelpers[4], destination[2]); + Assert.Null(destination[3]); + Assert.Null(destination[4]); + + // Test enumeration + var enumerated = new List(); + foreach (var item in filtered) + { + enumerated.Add(item); + } + Assert.Equal(3, enumerated.Count); + Assert.Same(tagHelpers[0], enumerated[0]); + Assert.Same(tagHelpers[2], enumerated[1]); + Assert.Same(tagHelpers[4], enumerated[2]); + } + + [Fact] + public void Where_FilteredResult_SupportsEquality() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(4); + var collection1 = TagHelperCollection.Create(tagHelpers); + var collection2 = TagHelperCollection.Create(tagHelpers); + + // Act + var filtered1 = collection1.Where(h => + { + var nameIndex = h.Name["TagHelper".Length..]; + return int.Parse(nameIndex) < 2; // Keep 0, 1 + }); + var filtered2 = collection2.Where(h => + { + var nameIndex = h.Name["TagHelper".Length..]; + return int.Parse(nameIndex) < 2; // Keep 0, 1 + }); + + // Assert + Assert.True(filtered1.Equals(filtered2)); + Assert.True(filtered2.Equals(filtered1)); + Assert.Equal(filtered1.GetHashCode(), filtered2.GetHashCode()); + } + + [Fact] + public void Where_FilteredResult_DifferentContent_NotEqual() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(4); + var collection = TagHelperCollection.Create(tagHelpers); + + // Act + var filtered1 = collection.Where(h => + { + var nameIndex = h.Name["TagHelper".Length..]; + return int.Parse(nameIndex) < 2; // Keep 0, 1 + }); + var filtered2 = collection.Where(h => + { + var nameIndex = h.Name["TagHelper".Length..]; + return int.Parse(nameIndex) >= 2; // Keep 2, 3 + }); + + // Assert + Assert.False(filtered1.Equals(filtered2)); + Assert.False(filtered2.Equals(filtered1)); + Assert.NotEqual(filtered1.GetHashCode(), filtered2.GetHashCode()); + } + + [Fact] + public void Where_FilteredResult_ThrowsOnInvalidIndex() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(4); + var collection = TagHelperCollection.Create(tagHelpers); + var filtered = collection.Where(h => + { + var nameIndex = h.Name["TagHelper".Length..]; + return int.Parse(nameIndex) < 2; // Keep 0, 1 + }); + + // Act & Assert + Assert.Throws(() => filtered[-1]); + Assert.Throws(() => filtered[2]); + Assert.Throws(() => filtered[10]); + } + + [Fact] + public void Where_FilteredResult_CopyToDestinationTooShort_ThrowsArgumentException() + { + // Arrange + var tagHelpers = CreateTestTagHelpers(4); + var collection = TagHelperCollection.Create(tagHelpers); + var filtered = collection.Where(h => + { + var nameIndex = h.Name["TagHelper".Length..]; + return int.Parse(nameIndex) < 3; // Keep 0, 1, 2 + }); + var destination = new TagHelperDescriptor[2]; // Too short + + // Act & Assert + Assert.Throws(() => filtered.CopyTo(destination)); + } +} diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_DesignTime.cs-diagnostics.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_DesignTime.cs-diagnostics.txt index 17925588265..3b07e23dc6d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_DesignTime.cs-diagnostics.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_DesignTime.cs-diagnostics.txt @@ -1,7 +1,4 @@ -// TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await.cshtml(2,31): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. -// public async Task Foo() -Diagnostic(ErrorCode.WRN_AsyncLacksAwaits, "Foo").WithLocation(2, 31), -// TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await.cshtml(14,55): error CS1525: Invalid expression term ';' +// TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await.cshtml(14,55): error CS1525: Invalid expression term ';' // __o = await; Diagnostic(ErrorCode.ERR_InvalidExprTerm, ";").WithArguments(";").WithLocation(14, 55), // TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await.cshtml(19,49): error CS1501: No overload for method 'Foo' takes 2 arguments diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_Runtime.cs-diagnostics.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_Runtime.cs-diagnostics.txt index 2a1cc187c52..20f51a6d796 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_Runtime.cs-diagnostics.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_Runtime.cs-diagnostics.txt @@ -1,7 +1,4 @@ -// TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await.cshtml(2,31): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. -// public async Task Foo() -Diagnostic(ErrorCode.WRN_AsyncLacksAwaits, "Foo").WithLocation(2, 31), -// TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await.cshtml(14,55): error CS1525: Invalid expression term ')' +// TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await.cshtml(14,55): error CS1525: Invalid expression term ')' // await Diagnostic(ErrorCode.ERR_InvalidExprTerm, "").WithArguments(")").WithLocation(14, 55), // TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await.cshtml(19,49): error CS1501: No overload for method 'Foo' takes 2 arguments diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocksWithTagHelper_Runtime.cs-diagnostics.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocksWithTagHelper_Runtime.cs-diagnostics.txt index 8abdb160933..c4b1e23d5f1 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocksWithTagHelper_Runtime.cs-diagnostics.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocksWithTagHelper_Runtime.cs-diagnostics.txt @@ -4,9 +4,6 @@ Diagnostic(ErrorCode.ERR_BadAwaitWithoutVoidAsyncMethod, "await __tagHelperRunne // TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocksWithTagHelper.cshtml(81,17): error CS4033: The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'. // await __tagHelperExecutionContext.SetOutputContentAsync(); Diagnostic(ErrorCode.ERR_BadAwaitWithoutVoidAsyncMethod, "await __tagHelperExecutionContext.SetOutputContentAsync()").WithLocation(81, 17), -// TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocksWithTagHelper.cshtml(126,193): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. -// __tagHelperExecutionContext = __tagHelperScopeManager.Begin("div", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.StartTagAndEndTag, "__UniqueIdSuppressedForTesting__", async() => { -Diagnostic(ErrorCode.WRN_AsyncLacksAwaits, "=>").WithLocation(126, 193), // TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocksWithTagHelper.cshtml(142,9): error CS4032: The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'. // await __tagHelperRunner.RunAsync(__tagHelperExecutionContext); Diagnostic(ErrorCode.ERR_BadAwaitWithoutAsyncMethod, "await __tagHelperRunner.RunAsync(__tagHelperExecutionContext)").WithArguments("System.Threading.Tasks.Task").WithLocation(142, 9), diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.ir.txt index 45dc06bf2ca..de07c841928 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.ir.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.ir.txt @@ -28,7 +28,7 @@ CSharpCode - IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => CSharpCode - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - IntermediateToken - - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer IntermediateToken - - CSharp - ; CSharpCode - IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.mappings.txt index 668e0fe7fe4..18ccc635016 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.mappings.txt @@ -3,3 +3,8 @@ Generated Location: (799:22,44 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Source Location: (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (1950:51,12 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.ir.txt index 353bbbbec49..697dd51ef76 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.ir.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.ir.txt @@ -31,7 +31,7 @@ CSharpCode - IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => CSharpCode - (43:2,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - IntermediateToken - - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - (43:2,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer IntermediateToken - - CSharp - ; CSharpCode - IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.mappings.txt index 45faf716a9b..a13a0f95e58 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.mappings.txt @@ -8,3 +8,8 @@ Source Location: (43:2,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1075:32,44 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Source Location: (43:2,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (2226:61,12 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.codegen.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.codegen.cs new file mode 100644 index 00000000000..7f78810f9eb --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.codegen.cs @@ -0,0 +1,73 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line default + using global::System; + using global::System.Collections.Generic; + using global::System.Linq; + using global::System.Threading.Tasks; + using global::Microsoft.AspNetCore.Components; + #line default + #line hidden + [__PrivateComponentRenderModeAttribute] + #nullable restore + public partial class TestComponent< +#nullable restore +#line 1 "x:\dir\subdir\Test\TestComponent.cshtml" +T + +#line default +#line hidden +#nullable disable + > : global::Microsoft.AspNetCore.Components.ComponentBase + #nullable disable + { + #pragma warning disable 219 + private void __RazorDirectiveTokenHelpers__() { + ((global::System.Action)(() => { + } + ))(); + ((global::System.Action)(() => { +#nullable restore +#line 2 "x:\dir\subdir\Test\TestComponent.cshtml" +global::System.Object __typeHelper = nameof(Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer); + +#line default +#line hidden +#nullable disable + } + ))(); + } + #pragma warning restore 219 + #pragma warning disable 0414 + private static object __o = null; + #pragma warning restore 0414 + #pragma warning disable 1998 + protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + } + #pragma warning restore 1998 + } + file sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + #pragma warning disable 219 + private void __RazorDirectiveTokenHelpers__() { + } + #pragma warning restore 219 + #pragma warning disable 0414 + private static object __o = null; + #pragma warning restore 0414 + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => +#nullable restore +#line 2 "x:\dir\subdir\Test\TestComponent.cshtml" + Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + +#line default +#line hidden +#nullable disable + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } +} +#pragma warning restore 1591 diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.ir.txt new file mode 100644 index 00000000000..8b57f941b00 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.ir.txt @@ -0,0 +1,35 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [20] ) - global::System + UsingDirective - (26:2,1 [40] ) - global::System.Collections.Generic + UsingDirective - (69:3,1 [25] ) - global::System.Linq + UsingDirective - (97:4,1 [36] ) - global::System.Threading.Tasks + UsingDirective - (136:5,1 [45] ) - global::Microsoft.AspNetCore.Components + CSharpCode - + IntermediateToken - - CSharp - [__PrivateComponentRenderModeAttribute] + ClassDeclaration - - public partial - TestComponent - global::Microsoft.AspNetCore.Components.ComponentBase - - T + DesignTimeDirective - + DirectiveToken - (11:0,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) - T + DirectiveToken - (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + CSharpCode - + IntermediateToken - - CSharp - #pragma warning disable 0414 + CSharpCode - + IntermediateToken - - CSharp - private static object __o = null; + CSharpCode - + IntermediateToken - - CSharp - #pragma warning restore 0414 + MethodDeclaration - - protected override - void - BuildRenderTree + ClassDeclaration - - file sealed - __PrivateComponentRenderModeAttribute - global::Microsoft.AspNetCore.Components.RenderModeAttribute - + DesignTimeDirective - + CSharpCode - + IntermediateToken - - CSharp - #pragma warning disable 0414 + CSharpCode - + IntermediateToken - - CSharp - private static object __o = null; + CSharpCode - + IntermediateToken - - CSharp - #pragma warning restore 0414 + CSharpCode - + IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + CSharpCode - (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) + IntermediateToken - (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - - CSharp - ; + CSharpCode - + IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.mappings.txt new file mode 100644 index 00000000000..f4610091808 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.mappings.txt @@ -0,0 +1,15 @@ +Source Location: (11:0,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) +|T| +Generated Location: (507:17,0 [1] ) +|T| + +Source Location: (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (971:33,44 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + +Source Location: (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (2086:63,12 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.codegen.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.codegen.cs new file mode 100644 index 00000000000..f5e7f7bc9ee --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.codegen.cs @@ -0,0 +1,73 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line default + using global::System; + using global::System.Collections.Generic; + using global::System.Linq; + using global::System.Threading.Tasks; + using global::Microsoft.AspNetCore.Components; + #line default + #line hidden + [__PrivateComponentRenderModeAttribute] + #nullable restore + public partial class TestComponent< +#nullable restore +#line 2 "x:\dir\subdir\Test\TestComponent.cshtml" +T + +#line default +#line hidden +#nullable disable + > : global::Microsoft.AspNetCore.Components.ComponentBase + #nullable disable + { + #pragma warning disable 219 + private void __RazorDirectiveTokenHelpers__() { + ((global::System.Action)(() => { +#nullable restore +#line 1 "x:\dir\subdir\Test\TestComponent.cshtml" +global::System.Object __typeHelper = nameof(Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer); + +#line default +#line hidden +#nullable disable + } + ))(); + ((global::System.Action)(() => { + } + ))(); + } + #pragma warning restore 219 + #pragma warning disable 0414 + private static object __o = null; + #pragma warning restore 0414 + #pragma warning disable 1998 + protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + } + #pragma warning restore 1998 + } + file sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + #pragma warning disable 219 + private void __RazorDirectiveTokenHelpers__() { + } + #pragma warning restore 219 + #pragma warning disable 0414 + private static object __o = null; + #pragma warning restore 0414 + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => +#nullable restore +#line 1 "x:\dir\subdir\Test\TestComponent.cshtml" + Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + +#line default +#line hidden +#nullable disable + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } +} +#pragma warning restore 1591 diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.ir.txt new file mode 100644 index 00000000000..5fee6bcbd11 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.ir.txt @@ -0,0 +1,35 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [20] ) - global::System + UsingDirective - (26:2,1 [40] ) - global::System.Collections.Generic + UsingDirective - (69:3,1 [25] ) - global::System.Linq + UsingDirective - (97:4,1 [36] ) - global::System.Threading.Tasks + UsingDirective - (136:5,1 [45] ) - global::Microsoft.AspNetCore.Components + CSharpCode - + IntermediateToken - - CSharp - [__PrivateComponentRenderModeAttribute] + ClassDeclaration - - public partial - TestComponent - global::Microsoft.AspNetCore.Components.ComponentBase - - T + DesignTimeDirective - + DirectiveToken - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + DirectiveToken - (89:1,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) - T + CSharpCode - + IntermediateToken - - CSharp - #pragma warning disable 0414 + CSharpCode - + IntermediateToken - - CSharp - private static object __o = null; + CSharpCode - + IntermediateToken - - CSharp - #pragma warning restore 0414 + MethodDeclaration - - protected override - void - BuildRenderTree + ClassDeclaration - - file sealed - __PrivateComponentRenderModeAttribute - global::Microsoft.AspNetCore.Components.RenderModeAttribute - + DesignTimeDirective - + CSharpCode - + IntermediateToken - - CSharp - #pragma warning disable 0414 + CSharpCode - + IntermediateToken - - CSharp - private static object __o = null; + CSharpCode - + IntermediateToken - - CSharp - #pragma warning restore 0414 + CSharpCode - + IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + CSharpCode - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) + IntermediateToken - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - - CSharp - ; + CSharpCode - + IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.mappings.txt new file mode 100644 index 00000000000..354d7462dfd --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.mappings.txt @@ -0,0 +1,15 @@ +Source Location: (89:1,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) +|T| +Generated Location: (507:17,0 [1] ) +|T| + +Source Location: (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (903:30,44 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + +Source Location: (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (2086:63,12 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.codegen.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.codegen.cs new file mode 100644 index 00000000000..fca2fa9975c --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.codegen.cs @@ -0,0 +1,73 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line default + using global::System; + using global::System.Collections.Generic; + using global::System.Linq; + using global::System.Threading.Tasks; + using global::Microsoft.AspNetCore.Components; + #line default + #line hidden + [global::Test.TestComponent.__PrivateComponentRenderModeAttribute] + #nullable restore + public partial class TestComponent< +#nullable restore +#line 1 "x:\dir\subdir\Test\TestComponent.cshtml" +T + +#line default +#line hidden +#nullable disable + > : global::Microsoft.AspNetCore.Components.ComponentBase + #nullable disable + { + #pragma warning disable 219 + private void __RazorDirectiveTokenHelpers__() { + ((global::System.Action)(() => { + } + ))(); + ((global::System.Action)(() => { +#nullable restore +#line 2 "x:\dir\subdir\Test\TestComponent.cshtml" +global::System.Object __typeHelper = nameof(Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer); + +#line default +#line hidden +#nullable disable + } + ))(); + } + #pragma warning restore 219 + #pragma warning disable 0414 + private static object __o = null; + #pragma warning restore 0414 + #pragma warning disable 1998 + protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + } + #pragma warning restore 1998 + private sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + #pragma warning disable 219 + private void __RazorDirectiveTokenHelpers__() { + } + #pragma warning restore 219 + #pragma warning disable 0414 + private static object __o = null; + #pragma warning restore 0414 + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => +#nullable restore +#line 2 "x:\dir\subdir\Test\TestComponent.cshtml" + Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + +#line default +#line hidden +#nullable disable + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } + } +} +#pragma warning restore 1591 diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.ir.txt new file mode 100644 index 00000000000..a9e3d2358df --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.ir.txt @@ -0,0 +1,35 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [20] ) - global::System + UsingDirective - (26:2,1 [40] ) - global::System.Collections.Generic + UsingDirective - (69:3,1 [25] ) - global::System.Linq + UsingDirective - (97:4,1 [36] ) - global::System.Threading.Tasks + UsingDirective - (136:5,1 [45] ) - global::Microsoft.AspNetCore.Components + CSharpCode - + IntermediateToken - - CSharp - [global::Test.TestComponent.__PrivateComponentRenderModeAttribute] + ClassDeclaration - - public partial - TestComponent - global::Microsoft.AspNetCore.Components.ComponentBase - - T + DesignTimeDirective - + DirectiveToken - (11:0,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) - T + DirectiveToken - (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + CSharpCode - + IntermediateToken - - CSharp - #pragma warning disable 0414 + CSharpCode - + IntermediateToken - - CSharp - private static object __o = null; + CSharpCode - + IntermediateToken - - CSharp - #pragma warning restore 0414 + MethodDeclaration - - protected override - void - BuildRenderTree + ClassDeclaration - - private sealed - __PrivateComponentRenderModeAttribute - global::Microsoft.AspNetCore.Components.RenderModeAttribute - + DesignTimeDirective - + CSharpCode - + IntermediateToken - - CSharp - #pragma warning disable 0414 + CSharpCode - + IntermediateToken - - CSharp - private static object __o = null; + CSharpCode - + IntermediateToken - - CSharp - #pragma warning restore 0414 + CSharpCode - + IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + CSharpCode - (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) + IntermediateToken - - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - - CSharp - ; + CSharpCode - + IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.mappings.txt new file mode 100644 index 00000000000..f77b4850911 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.mappings.txt @@ -0,0 +1,10 @@ +Source Location: (11:0,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) +|T| +Generated Location: (534:17,0 [1] ) +|T| + +Source Location: (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (998:33,44 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitBooleanConversion/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitBooleanConversion/TestComponent.mappings.txt index fc326d08245..495740dafda 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitBooleanConversion/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitBooleanConversion/TestComponent.mappings.txt @@ -17,6 +17,11 @@ Generated Location: (1189:40,0 [42] ) private MyClass c = new(); | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1683:56,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |MyParameter| Generated Location: (1864:60,0 [11] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_Bind/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_Bind/TestComponent.mappings.txt index b2cf70f9ed8..97f5596e678 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_Bind/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_Bind/TestComponent.mappings.txt @@ -27,6 +27,11 @@ Generated Location: (1731:56,0 [42] ) private MyClass c = new(); | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2452:72,45 [11] ) +|MyComponent| + Source Location: (40:1,4 [13] x:\dir\subdir\Test\TestComponent.cshtml) |BoolParameter| Generated Location: (2632:76,0 [13] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_BindUnknown/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_BindUnknown/TestComponent.mappings.txt index 692b15c6aea..932f85a8306 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_BindUnknown/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_BindUnknown/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (26:0,26 [1] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (26:0,26 [1] x:\dir\subdir\Test\TestComponent.cshtml) |c| Generated Location: (861:23,0 [1] ) |c| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_BindUnknown_Assignment/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_BindUnknown_Assignment/TestComponent.mappings.txt index 8506231b90d..e6f578615b4 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_BindUnknown_Assignment/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_BindUnknown_Assignment/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (26:0,26 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (26:0,26 [7] x:\dir\subdir\Test\TestComponent.cshtml) |c1 = c2| Generated Location: (861:23,0 [7] ) |c1 = c2| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_CustomEvent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_CustomEvent/TestComponent.mappings.txt index 8c97113d5e1..959d3f6e0e5 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_CustomEvent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_CustomEvent/TestComponent.mappings.txt @@ -32,6 +32,11 @@ Generated Location: (1757:64,0 [42] ) private MyClass c = new(); | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2453:80,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |MyParameter| Generated Location: (2634:84,0 [11] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_TypeInference/TestComponent.mappings.txt index f3d9ba6e18b..398e3e9f530 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddAttribute_ImplicitStringConversion_TypeInference/TestComponent.mappings.txt @@ -27,6 +27,11 @@ Generated Location: (1518:56,0 [51] ) private readonly MyClass c = new(); | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2149:72,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |MyParameter| Generated Location: (2330:76,0 [11] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_DynamicComponentName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_DynamicComponentName/TestComponent.mappings.txt index c376d5fa3d5..72645f13861 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_DynamicComponentName/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_DynamicComponentName/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (9:0,9 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [7] x:\dir\subdir\Test\TestComponent.cshtml) +|dynamic| +Generated Location: (703:19,49 [7] ) +|dynamic| + +Source Location: (9:0,9 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (876:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_EscapedComponentName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_EscapedComponentName/TestComponent.mappings.txt index fc636663a76..1f2ebf00d52 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_EscapedComponentName/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_EscapedComponentName/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (5:0,5 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [3] x:\dir\subdir\Test\TestComponent.cshtml) +|int| +Generated Location: (704:19,50 [3] ) +|int| + +Source Location: (5:0,5 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (869:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_GlobalNamespace/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_GlobalNamespace/TestComponent.mappings.txt index 64f9a0c51f9..7a75632b2a4 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_GlobalNamespace/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_GlobalNamespace/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (698:19,44 [11] ) +|MyComponent| + +Source Location: (13:0,13 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (874:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_WithNameof/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_WithNameof/TestComponent.mappings.txt index 0e6b43d7c3a..0f37ae13914 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_WithNameof/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/AddComponentParameter_WithNameof/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression/TestComponent.mappings.txt index f02bfe1b54a..f0e794b8df0 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression_Generic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression_Generic/TestComponent.mappings.txt index ac9f7fad38c..3eb0413482f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression_Generic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression_Generic/TestComponent.mappings.txt @@ -12,6 +12,11 @@ Generated Location: (1300:32,0 [65] ) public DateTime ParentValue { get; set; } = DateTime.Now; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1916:48,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [9] x:\dir\subdir\Test\TestComponent.cshtml) |SomeParam| Generated Location: (2106:52,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression_NestedGeneric/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression_NestedGeneric/TestComponent.mappings.txt index 98be953f456..e3dc04306be 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression_NestedGeneric/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValueAndExpression_NestedGeneric/TestComponent.mappings.txt @@ -12,6 +12,11 @@ Generated Location: (1300:32,0 [89] ) public IEnumerable ParentValue { get; set; } = new [] { DateTime.Now }; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2084:48,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [9] x:\dir\subdir\Test\TestComponent.cshtml) |SomeParam| Generated Location: (2274:52,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValue_WithMatchingProperties/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValue_WithMatchingProperties/TestComponent.mappings.txt index 1fe81884eca..d303cbaa272 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValue_WithMatchingProperties/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_SpecifiesValue_WithMatchingProperties/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_TypeChecked_WithMatchingProperties/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_TypeChecked_WithMatchingProperties/TestComponent.mappings.txt index eb4a7854781..d20920e6f2f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_TypeChecked_WithMatchingProperties/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_EventCallback_TypeChecked_WithMatchingProperties/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndChangeEvent_WithMatchingProperties/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndChangeEvent_WithMatchingProperties/TestComponent.mappings.txt index ea29ab07b34..11dd0e8d183 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndChangeEvent_WithMatchingProperties/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndChangeEvent_WithMatchingProperties/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndChangeEvent_WithoutMatchingProperties/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndChangeEvent_WithoutMatchingProperties/TestComponent.mappings.txt index 01992557ddf..e89ecb1e93a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndChangeEvent_WithoutMatchingProperties/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndChangeEvent_WithoutMatchingProperties/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (26:0,26 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (26:0,26 [11] x:\dir\subdir\Test\TestComponent.cshtml) |ParentValue| Generated Location: (861:23,0 [11] ) |ParentValue| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndExpression/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndExpression/TestComponent.mappings.txt index e8d4440ec8e..287dd922777 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndExpression/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndExpression/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndExpression_Generic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndExpression_Generic/TestComponent.mappings.txt index e2a1b1b1b27..8160196ff97 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndExpression_Generic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValueAndExpression_Generic/TestComponent.mappings.txt @@ -12,6 +12,11 @@ Generated Location: (1104:32,0 [65] ) public DateTime ParentValue { get; set; } = DateTime.Now; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1688:48,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [9] x:\dir\subdir\Test\TestComponent.cshtml) |SomeParam| Generated Location: (1878:52,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties/TestComponent.mappings.txt index 3a94fce9997..7113285199d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_DynamicComponentName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_DynamicComponentName/TestComponent.mappings.txt index 0d5fcc2cce4..5dacd46daab 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_DynamicComponentName/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_DynamicComponentName/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (15:0,15 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [7] x:\dir\subdir\Test\TestComponent.cshtml) +|dynamic| +Generated Location: (703:19,49 [7] ) +|dynamic| + +Source Location: (15:0,15 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (876:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_EscapedComponentName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_EscapedComponentName/TestComponent.mappings.txt index ff86df204f7..e2b7b07ef59 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_EscapedComponentName/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_EscapedComponentName/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (11:0,11 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [3] x:\dir\subdir\Test\TestComponent.cshtml) +|int| +Generated Location: (704:19,50 [3] ) +|int| + +Source Location: (11:0,11 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (870:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_GlobalNamespaceComponent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_GlobalNamespaceComponent/TestComponent.mappings.txt index b2dabfd1ac9..3e5eccb4f8e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_GlobalNamespaceComponent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_GlobalNamespaceComponent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (698:19,44 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (874:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_WithNameof/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_WithNameof/TestComponent.mappings.txt index 7daa1a95a55..389163b2723 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_WithNameof/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithMatchingProperties_WithNameof/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithoutMatchingProperties/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithoutMatchingProperties/TestComponent.mappings.txt index 3ad1ed4ccd8..bd59285ba0d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithoutMatchingProperties/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_SpecifiesValue_WithoutMatchingProperties/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (26:0,26 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (26:0,26 [11] x:\dir\subdir\Test\TestComponent.cshtml) |ParentValue| Generated Location: (861:23,0 [11] ) |ParentValue| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_TypeChecked_WithMatchingProperties/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_TypeChecked_WithMatchingProperties/TestComponent.mappings.txt index 6391db2862a..32a66edf688 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_TypeChecked_WithMatchingProperties/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_TypeChecked_WithMatchingProperties/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_Action/TestComponent.mappings.txt index 1ae651b179d..fc49f964044 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_Action/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_ActionLambda/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_ActionLambda/TestComponent.mappings.txt index 73db4055c37..8ce067dff57 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_ActionLambda/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_ActionLambda/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_AsyncLambdaProducesError/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_AsyncLambdaProducesError/TestComponent.mappings.txt index bc78a40eef2..a14f82d40df 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_AsyncLambdaProducesError/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_AsyncLambdaProducesError/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback/TestComponent.mappings.txt index b7073694cb7..e808284674e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback_ReceivesAction/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback_ReceivesAction/TestComponent.mappings.txt index 441550dee99..df0ca974a3f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback_ReceivesAction/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback_ReceivesAction/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback_ReceivesFunction/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback_ReceivesFunction/TestComponent.mappings.txt index 6d6b59173c9..0db4700c2ee 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback_ReceivesFunction/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_EventCallback_ReceivesFunction/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_TaskReturningDelegate/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_TaskReturningDelegate/TestComponent.mappings.txt index 6ad7c6c4259..c8226d5bf34 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_TaskReturningDelegate/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_TaskReturningDelegate/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_TaskReturningLambda/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_TaskReturningLambda/TestComponent.mappings.txt index 59ca2eadbbe..d466948acae 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_TaskReturningLambda/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithAfter_TaskReturningLambda/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_Action/TestComponent.mappings.txt index 17dbb1926fe..8afaba576ed 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_Action/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_ActionLambda/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_ActionLambda/TestComponent.mappings.txt index 4869616d0f8..54496f50286 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_ActionLambda/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_ActionLambda/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback/TestComponent.mappings.txt index b87605cb8ff..596737257b8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback_ReceivesAction/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback_ReceivesAction/TestComponent.mappings.txt index 2be57a01987..caae9716bbc 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback_ReceivesAction/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback_ReceivesAction/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback_ReceivesFunction/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback_ReceivesFunction/TestComponent.mappings.txt index 5ceb247b2a0..99fd10fb269 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback_ReceivesFunction/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_EventCallback_ReceivesFunction/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_ProducesErrorOnOlderLanguageVersions/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_ProducesErrorOnOlderLanguageVersions/TestComponent.mappings.txt index 6744de090ab..700d2aec9b4 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_ProducesErrorOnOlderLanguageVersions/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_ProducesErrorOnOlderLanguageVersions/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (875:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_TaskReturningDelegate/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_TaskReturningDelegate/TestComponent.mappings.txt index f993cc40585..256fe716b15 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_TaskReturningDelegate/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_TaskReturningDelegate/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_TaskReturningLambda/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_TaskReturningLambda/TestComponent.mappings.txt index 6ba6adcfabf..2aed5837cf6 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_TaskReturningLambda/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithGetSet_TaskReturningLambda/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (884:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithStringAttribute_DoesNotUseStringSyntax/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithStringAttribute_DoesNotUseStringSyntax/TestComponent.mappings.txt index 24815817773..21143b12259 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithStringAttribute_DoesNotUseStringSyntax/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToComponent_WithStringAttribute_DoesNotUseStringSyntax/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (17:0,17 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [9] x:\dir\subdir\Test\TestComponent.cshtml) +|InputText| +Generated Location: (703:19,49 [9] ) +|InputText| + +Source Location: (17:0,17 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (880:23,0 [5] ) |Value| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithAfter_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithAfter_Action/TestComponent.mappings.txt index 1eff1864ea2..4df718c4213 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithAfter_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithAfter_Action/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (21:0,21 [3] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (21:0,21 [3] x:\dir\subdir\Test\TestComponent.cshtml) |int| Generated Location: (799:22,0 [3] ) |int| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_Action/TestComponent.mappings.txt index 9f1a445d76d..f06ce399db8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_Action/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (21:0,21 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (21:0,21 [11] x:\dir\subdir\Test\TestComponent.cshtml) |CustomValue| Generated Location: (799:22,0 [11] ) |CustomValue| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_EventCallback/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_EventCallback/TestComponent.mappings.txt index 517e8be91eb..cf74939fc68 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_EventCallback/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_EventCallback/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (21:0,21 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (21:0,21 [11] x:\dir\subdir\Test\TestComponent.cshtml) |CustomValue| Generated Location: (799:22,0 [11] ) |CustomValue| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_Function/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_Function/TestComponent.mappings.txt index 9a1f381e4f7..b55ffba03fb 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_Function/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_ExplicitType_WithGetSet_Function/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (21:0,21 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (21:0,21 [11] x:\dir\subdir\Test\TestComponent.cshtml) |CustomValue| Generated Location: (799:22,0 [11] ) |CustomValue| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithAfter_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithAfter_Action/TestComponent.mappings.txt index 8958c2be569..792956101ff 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithAfter_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithAfter_Action/TestComponent.mappings.txt @@ -21,6 +21,11 @@ Generated Location: (1343:40,0 [82] ) public void Update() { } | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1872:58,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2072:62,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_Action/TestComponent.mappings.txt index b68e8e7fd34..0efab8f2111 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_Action/TestComponent.mappings.txt @@ -21,6 +21,11 @@ Generated Location: (1405:40,0 [147] ) public void UpdateValue(CustomValue value) => ParentValue = value; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2031:58,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2231:62,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_EventCallback/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_EventCallback/TestComponent.mappings.txt index df7365e58d2..7a6a87f8c58 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_EventCallback/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_EventCallback/TestComponent.mappings.txt @@ -19,6 +19,11 @@ Generated Location: (1405:40,0 [138] ) public EventCallback UpdateValue { get; set; } | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2022:57,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2222:61,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_Function/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_Function/TestComponent.mappings.txt index 598bda4ebc5..bc96434895e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_Function/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BindToGenericComponent_InferredType_WithGetSet_Function/TestComponent.mappings.txt @@ -21,6 +21,11 @@ Generated Location: (1405:40,0 [175] ) public Task UpdateValue(CustomValue value) { ParentValue = value; return Task.CompletedTask; } | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2059:58,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2259:62,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BodyAndAttributeChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BodyAndAttributeChildContent/TestComponent.mappings.txt index 85e1a1854d8..b2509e48e58 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BodyAndAttributeChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BodyAndAttributeChildContent/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (87:0,87 [2] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1266:41,0 [2] ) |; | +Source Location: (93:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1371:47,49 [11] ) +|MyComponent| + Source Location: (105:1,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) |Header| Generated Location: (1552:51,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BodyAndExplicitChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BodyAndExplicitChildContent/TestComponent.mappings.txt index 85e1a1854d8..b2509e48e58 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BodyAndExplicitChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/BodyAndExplicitChildContent/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (87:0,87 [2] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1266:41,0 [2] ) |; | +Source Location: (93:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1371:47,49 [11] ) +|MyComponent| + Source Location: (105:1,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) |Header| Generated Location: (1552:51,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CaptureParametersConstraint/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CaptureParametersConstraint/TestComponent.mappings.txt index 796a76d02e2..784edc0feee 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CaptureParametersConstraint/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CaptureParametersConstraint/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (857:23,0 [27] ) |new MyClass()| +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1653:44,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Param| Generated Location: (1843:48,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_CombiningMultipleAncestors/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_CombiningMultipleAncestors/TestComponent.mappings.txt index 2f6201059bb..8601e716318 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_CombiningMultipleAncestors/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_CombiningMultipleAncestors/TestComponent.mappings.txt @@ -8,13 +8,28 @@ Source Location: (59:1,24 [7] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1345:34,0 [7] ) |"Hello"| +Source Location: (1:0,1 [9] x:\dir\subdir\Test\TestComponent.cshtml) +|ParentOne| +Generated Location: (2512:61,45 [9] ) +|ParentOne| + Source Location: (11:0,11 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2704:65,0 [5] ) |Value| +Source Location: (40:1,5 [9] x:\dir\subdir\Test\TestComponent.cshtml) +|ParentTwo| +Generated Location: (3362:81,45 [9] ) +|ParentTwo| + Source Location: (50:1,15 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (3554:85,0 [5] ) |Value| +Source Location: (80:2,9 [5] x:\dir\subdir\Test\TestComponent.cshtml) +|Child| +Generated Location: (4158:101,45 [5] ) +|Child| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Explicit/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Explicit/TestComponent.mappings.txt index d19c84ee2e3..750743d1dd5 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Explicit/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Explicit/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [8] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (703:19,49 [4] ) +|Grid| + +Source Location: (13:0,13 [8] x:\dir\subdir\Test\TestComponent.cshtml) |DateTime| Generated Location: (792:22,0 [8] ) |DateTime| @@ -13,3 +18,13 @@ Source Location: (32:0,32 [23] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1334:39,0 [23] ) |Array.Empty()| +Source Location: (59:0,59 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2249:62,45 [6] ) +|Column| + +Source Location: (69:0,69 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2536:67,45 [6] ) +|Column| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_ExplicitOverride/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_ExplicitOverride/TestComponent.mappings.txt index b24a640801a..d4ed6a038c8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_ExplicitOverride/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_ExplicitOverride/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [8] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (703:19,49 [4] ) +|Grid| + +Source Location: (13:0,13 [8] x:\dir\subdir\Test\TestComponent.cshtml) |DateTime| Generated Location: (792:22,0 [8] ) |DateTime| @@ -13,6 +18,11 @@ Source Location: (32:0,32 [23] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1334:39,0 [23] ) |Array.Empty()| +Source Location: (59:0,59 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (1610:46,54 [6] ) +|Column| + Source Location: (73:0,73 [19] x:\dir\subdir\Test\TestComponent.cshtml) |System.TimeZoneInfo| Generated Location: (1701:49,0 [19] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested/TestComponent.mappings.txt index fb2c73260a9..27d0635870d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested/TestComponent.mappings.txt @@ -3,8 +3,18 @@ Generated Location: (850:23,0 [24] ) |() => new List()| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (1881:46,45 [4] ) +|Grid| + Source Location: (6:0,6 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Data| Generated Location: (2056:50,0 [4] ) |Data| +Source Location: (48:1,5 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|GridColumn| +Generated Location: (2802:66,45 [10] ) +|GridColumn| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary/TestComponent.mappings.txt index 610bc45b6fd..46df2b97d08 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary/TestComponent.mappings.txt @@ -3,8 +3,18 @@ Generated Location: (850:23,0 [33] ) |() => new Dictionary()| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (1907:46,45 [4] ) +|Grid| + Source Location: (6:0,6 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Data| Generated Location: (2082:50,0 [4] ) |Data| +Source Location: (57:1,5 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|GridColumn| +Generated Location: (2879:66,45 [10] ) +|GridColumn| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_02/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_02/TestComponent.mappings.txt index 3059d1b3ceb..18b913f512e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_02/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_02/TestComponent.mappings.txt @@ -3,8 +3,18 @@ Generated Location: (850:23,0 [33] ) |() => new Dictionary()| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (1912:46,45 [4] ) +|Grid| + Source Location: (6:0,6 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Data| Generated Location: (2087:50,0 [4] ) |Data| +Source Location: (57:1,5 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|GridColumn| +Generated Location: (2899:66,45 [10] ) +|GridColumn| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_03/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_03/TestComponent.mappings.txt index d7d695c3c25..cef8fc47b48 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_03/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_03/TestComponent.mappings.txt @@ -3,8 +3,18 @@ Generated Location: (850:23,0 [27] ) |new Dictionary()| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (1880:46,45 [4] ) +|Grid| + Source Location: (6:0,6 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Data| Generated Location: (2055:50,0 [4] ) |Data| +Source Location: (51:1,5 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|GridColumn| +Generated Location: (2789:66,45 [10] ) +|GridColumn| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_Dynamic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_Dynamic/TestComponent.mappings.txt index 843b5a3441d..ec549ee1b8e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_Dynamic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericArgumentNested_Dictionary_Dynamic/TestComponent.mappings.txt @@ -3,8 +3,18 @@ Generated Location: (850:23,0 [33] ) |new Dictionary()| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (1884:46,45 [4] ) +|Grid| + Source Location: (6:0,6 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Data| Generated Location: (2059:50,0 [4] ) |Data| +Source Location: (57:1,5 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|GridColumn| +Generated Location: (2787:66,45 [10] ) +|GridColumn| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericChildContent/TestComponent.mappings.txt index a5c61c26647..f9be09194e5 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericChildContent/TestComponent.mappings.txt @@ -8,8 +8,18 @@ Source Location: (50:0,50 [12] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1403:33,25 [12] ) |context.Year| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (2160:56,45 [4] ) +|Grid| + Source Location: (6:0,6 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (2343:60,0 [5] ) |Items| +Source Location: (42:0,42 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (3146:76,45 [6] ) +|Column| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericLambda/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericLambda/TestComponent.mappings.txt index 5c8e99104a8..732b05d7ef8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericLambda/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_GenericLambda/TestComponent.mappings.txt @@ -8,11 +8,21 @@ Source Location: (63:0,63 [11] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1345:33,0 [11] ) |x => x.Year| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (2050:54,45 [4] ) +|Grid| + Source Location: (6:0,6 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (2233:58,0 [5] ) |Items| +Source Location: (42:0,42 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (3019:74,45 [6] ) +|Column| + Source Location: (49:0,49 [10] x:\dir\subdir\Test\TestComponent.cshtml) |SomeLambda| Generated Location: (3225:78,0 [10] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints/TestComponent.mappings.txt index 55aade47d69..d8aa127d667 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [15] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (703:19,49 [4] ) +|Grid| + +Source Location: (13:0,13 [15] x:\dir\subdir\Test\TestComponent.cshtml) |WeatherForecast| Generated Location: (792:22,0 [15] ) |WeatherForecast| @@ -8,6 +13,11 @@ Source Location: (39:0,39 [30] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1019:31,0 [30] ) |Array.Empty()| +Source Location: (106:2,9 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2082:54,45 [6] ) +|Column| + Source Location: (126:2,29 [9] x:\dir\subdir\Test\TestComponent.cshtml) |FieldName| Generated Location: (2337:59,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints_ClassesAndInterfaces/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints_ClassesAndInterfaces/TestComponent.mappings.txt index 7c0ad4cc7f7..f029be6bc40 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints_ClassesAndInterfaces/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints_ClassesAndInterfaces/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (372:12,0 [13] ) |using Models;| +Source Location: (19:2,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (820:24,49 [4] ) +|Grid| + Source Location: (31:2,13 [15] x:\dir\subdir\Test\TestComponent.cshtml) |WeatherForecast| Generated Location: (909:27,0 [15] ) @@ -13,6 +18,11 @@ Source Location: (57:2,39 [30] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1136:36,0 [30] ) |Array.Empty()| +Source Location: (124:4,9 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2224:59,45 [6] ) +|Column| + Source Location: (144:4,29 [9] x:\dir\subdir\Test\TestComponent.cshtml) |FieldName| Generated Location: (2479:64,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints_GenericClassConstraints/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints_GenericClassConstraints/TestComponent.mappings.txt index f64f98645ff..3644c99c8e8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints_GenericClassConstraints/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_MultipleConstraints_GenericClassConstraints/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (372:12,0 [13] ) |using Models;| +Source Location: (17:1,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (820:24,49 [4] ) +|Grid| + Source Location: (29:1,13 [15] x:\dir\subdir\Test\TestComponent.cshtml) |WeatherForecast| Generated Location: (909:27,0 [15] ) @@ -13,6 +18,11 @@ Source Location: (55:1,39 [30] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1136:36,0 [30] ) |Array.Empty()| +Source Location: (122:3,9 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2240:59,45 [6] ) +|Column| + Source Location: (142:3,29 [9] x:\dir\subdir\Test\TestComponent.cshtml) |FieldName| Generated Location: (2495:64,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_WithConstraints/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_WithConstraints/TestComponent.mappings.txt index cdbe8392a5c..38ce05e0966 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_WithConstraints/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Inferred_WithConstraints/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [15] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (703:19,49 [4] ) +|Grid| + +Source Location: (13:0,13 [15] x:\dir\subdir\Test\TestComponent.cshtml) |WeatherForecast| Generated Location: (792:22,0 [15] ) |WeatherForecast| @@ -8,6 +13,11 @@ Source Location: (39:0,39 [30] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1019:31,0 [30] ) |Array.Empty()| +Source Location: (106:2,9 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2075:54,45 [6] ) +|Column| + Source Location: (126:2,29 [9] x:\dir\subdir\Test\TestComponent.cshtml) |FieldName| Generated Location: (2330:59,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Multilayer/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Multilayer/TestComponent.mappings.txt index 7b46f15e11a..783c6f51901 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Multilayer/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Multilayer/TestComponent.mappings.txt @@ -3,8 +3,23 @@ Generated Location: (854:23,0 [23] ) |Array.Empty()| +Source Location: (46:0,46 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|Passthrough| +Generated Location: (1195:30,58 [11] ) +|Passthrough| + +Source Location: (1:0,1 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|Ancestor| +Generated Location: (2206:51,45 [8] ) +|Ancestor| + Source Location: (10:0,10 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (2398:55,0 [5] ) |Items| +Source Location: (59:0,59 [5] x:\dir\subdir\Test\TestComponent.cshtml) +|Child| +Generated Location: (3122:71,45 [5] ) +|Child| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_MultipleTypes/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_MultipleTypes/TestComponent.mappings.txt index cc45c286efa..9127561ce93 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_MultipleTypes/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_MultipleTypes/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (133:1,29 [23] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1680:41,0 [23] ) |new[] { 'a', 'b', 'c' }| +Source Location: (1:0,1 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Parent| +Generated Location: (2503:63,45 [6] ) +|Parent| + Source Location: (8:0,8 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Data| Generated Location: (2720:67,0 [4] ) @@ -23,6 +28,11 @@ Source Location: (75:0,75 [5] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (2978:76,0 [5] ) |Other| +Source Location: (109:1,5 [5] x:\dir\subdir\Test\TestComponent.cshtml) +|Child| +Generated Location: (4012:93,45 [5] ) +|Child| + Source Location: (115:1,11 [14] x:\dir\subdir\Test\TestComponent.cshtml) |ChildOnlyItems| Generated Location: (4252:97,0 [14] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_CreatesError/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_CreatesError/TestComponent.mappings.txt index 6e56cf0909c..351f390ddc5 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_CreatesError/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_CreatesError/TestComponent.mappings.txt @@ -3,8 +3,18 @@ Generated Location: (830:22,0 [23] ) |Array.Empty()| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (1480:41,45 [4] ) +|Grid| + Source Location: (6:0,6 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (1663:45,0 [5] ) |Items| +Source Location: (42:0,42 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2057:56,45 [6] ) +|Column| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_Explicit/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_Explicit/TestComponent.mappings.txt index d19c84ee2e3..42bedd05315 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_Explicit/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_Explicit/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [8] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (703:19,49 [4] ) +|Grid| + +Source Location: (13:0,13 [8] x:\dir\subdir\Test\TestComponent.cshtml) |DateTime| Generated Location: (792:22,0 [8] ) |DateTime| @@ -13,3 +18,8 @@ Source Location: (32:0,32 [23] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1334:39,0 [23] ) |Array.Empty()| +Source Location: (59:0,59 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (1990:60,45 [6] ) +|Column| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_Inferred/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_Inferred/TestComponent.mappings.txt index 07e6f873093..bbfde11c413 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_Inferred/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_NotCascaded_Inferred/TestComponent.mappings.txt @@ -3,8 +3,23 @@ Generated Location: (850:23,0 [23] ) |Array.Empty()| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (2009:47,45 [4] ) +|Grid| + Source Location: (6:0,6 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (2192:51,0 [5] ) |Items| +Source Location: (42:0,42 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2913:67,45 [6] ) +|Column| + +Source Location: (52:0,52 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (3248:72,45 [6] ) +|Column| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Override/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Override/TestComponent.mappings.txt index a64b450019f..6d362ba1ec1 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Override/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Override/TestComponent.mappings.txt @@ -8,11 +8,21 @@ Source Location: (66:0,66 [13] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1316:33,0 [13] ) |"Some string"| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (2023:54,45 [4] ) +|Grid| + Source Location: (6:0,6 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (2206:58,0 [5] ) |Items| +Source Location: (42:0,42 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2882:74,45 [6] ) +|Column| + Source Location: (49:0,49 [13] x:\dir\subdir\Test\TestComponent.cshtml) |OverrideParam| Generated Location: (3070:78,0 [13] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Override_Multilayer/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Override_Multilayer/TestComponent.mappings.txt index 8d731b4cf42..f410d247b61 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Override_Multilayer/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Override_Multilayer/TestComponent.mappings.txt @@ -8,13 +8,38 @@ Source Location: (54:1,21 [37] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1342:34,0 [37] ) |System.Threading.Thread.CurrentThread| +Source Location: (1:0,1 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|TreeNode| +Generated Location: (4002:78,45 [8] ) +|TreeNode| + Source Location: (10:0,10 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (4194:82,0 [4] ) |Item| +Source Location: (38:1,5 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|TreeNode| +Generated Location: (4854:98,45 [8] ) +|TreeNode| + Source Location: (47:1,14 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (5046:102,0 [4] ) |Item| +Source Location: (104:2,9 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|TreeNode| +Generated Location: (5703:118,45 [8] ) +|TreeNode| + +Source Location: (128:3,13 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|TreeNode| +Generated Location: (6268:129,45 [8] ) +|TreeNode| + +Source Location: (184:6,5 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|TreeNode| +Generated Location: (6759:139,45 [8] ) +|TreeNode| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_ParameterInNamespace/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_ParameterInNamespace/TestComponent.mappings.txt index d77abcf4c27..83da3aa09a3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_ParameterInNamespace/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_ParameterInNamespace/TestComponent.mappings.txt @@ -8,8 +8,18 @@ Source Location: (59:2,28 [21] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1019:30,0 [21] ) |new MyClass()| +Source Location: (32:2,1 [15] x:\dir\subdir\Test\TestComponent.cshtml) +|ParentComponent| +Generated Location: (2082:53,57 [15] ) +|ParentComponent| + Source Location: (48:2,17 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Parameter| Generated Location: (2292:57,0 [9] ) |Parameter| +Source Location: (89:3,5 [14] x:\dir\subdir\Test\TestComponent.cshtml) +|ChildComponent| +Generated Location: (2953:73,57 [14] ) +|ChildComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Partial_CreatesError/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Partial_CreatesError/TestComponent.mappings.txt index aa194e64609..dc35de0ad88 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Partial_CreatesError/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Partial_CreatesError/TestComponent.mappings.txt @@ -3,6 +3,16 @@ Generated Location: (850:23,0 [23] ) |Array.Empty()| +Source Location: (42:0,42 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (1187:30,58 [6] ) +|Column| + +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (1868:47,45 [4] ) +|Grid| + Source Location: (6:0,6 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (2051:51,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Tuple/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Tuple/TestComponent.mappings.txt index 08399705f57..cead203068d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Tuple/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_Tuple/TestComponent.mappings.txt @@ -3,8 +3,18 @@ Generated Location: (861:23,0 [6] ) |(1, 2)| +Source Location: (1:0,1 [15] x:\dir\subdir\Test\TestComponent.cshtml) +|ParentComponent| +Generated Location: (1843:46,45 [15] ) +|ParentComponent| + Source Location: (17:0,17 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Parameter| Generated Location: (2041:50,0 [9] ) |Parameter| +Source Location: (43:1,5 [14] x:\dir\subdir\Test\TestComponent.cshtml) +|ChildComponent| +Generated Location: (2636:66,45 [14] ) +|ChildComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_WithSplatAndKey/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_WithSplatAndKey/TestComponent.mappings.txt index 70722389f90..40d734f0bf8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_WithSplatAndKey/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_WithSplatAndKey/TestComponent.mappings.txt @@ -23,8 +23,18 @@ Source Location: (78:1,13 [9] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1940:60,0 [9] ) |parentKey| +Source Location: (66:1,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (2629:80,45 [4] ) +|Grid| + Source Location: (89:1,24 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (2813:84,0 [5] ) |Items| +Source Location: (131:2,5 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (3680:101,45 [6] ) +|Column| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_WithUnrelatedType_CreatesError/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_WithUnrelatedType_CreatesError/TestComponent.mappings.txt index 1d8f7b98b58..b92c0985486 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_WithUnrelatedType_CreatesError/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/CascadingGenericInference_WithUnrelatedType_CreatesError/TestComponent.mappings.txt @@ -3,8 +3,18 @@ Generated Location: (850:23,0 [29] ) |new Dictionary()| +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|Grid| +Generated Location: (1776:45,45 [4] ) +|Grid| + Source Location: (6:0,6 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Items| Generated Location: (1983:49,0 [5] ) |Items| +Source Location: (48:0,48 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Column| +Generated Location: (2667:65,45 [6] ) +|Column| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_AtSpecifiedInRazorFileForTypeParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_AtSpecifiedInRazorFileForTypeParameter/TestComponent.mappings.txt index 243d3b8dae8..494a820ee83 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_AtSpecifiedInRazorFileForTypeParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_AtSpecifiedInRazorFileForTypeParameter/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (7:0,7 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [1] x:\dir\subdir\Test\TestComponent.cshtml) +|C| +Generated Location: (703:19,49 [1] ) +|C| + +Source Location: (7:0,7 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (788:22,0 [6] ) |string| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic/TestComponent.mappings.txt index 07c1fdbe6bf..f4dce11c0c0 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (799:22,0 [6] ) |string| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBind/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBind/TestComponent.mappings.txt index 5c858a09195..55984cf11d4 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBind/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBind/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (799:22,0 [6] ) |string| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBindWeaklyTyped/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBindWeaklyTyped/TestComponent.mappings.txt index acc1e254ed8..7c6d86d92d9 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBindWeaklyTyped/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBindWeaklyTyped/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (799:22,0 [6] ) |string| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBindWeaklyTyped_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBindWeaklyTyped_TypeInference/TestComponent.mappings.txt index 271c7e1e1e2..fa9ffd7452d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBindWeaklyTyped_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBindWeaklyTyped_TypeInference/TestComponent.mappings.txt @@ -17,6 +17,11 @@ Generated Location: (1339:40,0 [21] ) string Value; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1839:56,45 [11] ) +|MyComponent| + Source Location: (30:0,30 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2037:60,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBind_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBind_TypeInference/TestComponent.mappings.txt index 984477a5083..c041551ffe0 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBind_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericBind_TypeInference/TestComponent.mappings.txt @@ -17,11 +17,21 @@ Generated Location: (1409:42,0 [21] ) string Value; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1874:58,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2072:62,0 [4] ) |Item| +Source Location: (34:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2582:73,45 [11] ) +|MyComponent| + Source Location: (52:1,19 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2780:77,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericChildContent/TestComponent.mappings.txt index dfbc7b81986..57e1c0a2d8a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericChildContent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (799:22,0 [6] ) |string| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericChildContent_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericChildContent_TypeInference/TestComponent.mappings.txt index 5bccfa66ffc..4ef70b43ef7 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericChildContent_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericChildContent_TypeInference/TestComponent.mappings.txt @@ -8,6 +8,11 @@ Source Location: (38:1,8 [17] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1102:31,25 [17] ) |context.ToLower()| +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1740:51,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1938:55,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericWeaklyTypedAttribute/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericWeaklyTypedAttribute/TestComponent.mappings.txt index 5ec19ffb6f7..5871b4ba9a5 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericWeaklyTypedAttribute/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericWeaklyTypedAttribute/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (799:22,0 [6] ) |string| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericWeaklyTypedAttribute_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericWeaklyTypedAttribute_TypeInference/TestComponent.mappings.txt index 83a7707fa63..880b5253f9e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericWeaklyTypedAttribute_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_GenericWeaklyTypedAttribute_TypeInference/TestComponent.mappings.txt @@ -8,6 +8,11 @@ Source Location: (37:0,37 [2] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (994:30,0 [2] ) |17| +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1498:47,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1696:51,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic_TypeInference/TestComponent.mappings.txt index c79b887e47f..eaf4f8e1b10 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic_TypeInference/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (837:22,0 [4] ) |"hi"| +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1301:39,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1499:43,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic_TypeInference_Multiple/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic_TypeInference_Multiple/TestComponent.mappings.txt index ab7009a89c0..d85358c8472 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic_TypeInference_Multiple/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Generic_TypeInference_Multiple/TestComponent.mappings.txt @@ -13,16 +13,31 @@ Source Location: (93:2,21 [6] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1461:42,0 [6] ) |"bye!"| +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1927:59,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2125:63,0 [4] ) |Item| +Source Location: (32:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2475:73,45 [11] ) +|MyComponent| + Source Location: (44:1,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2673:77,0 [4] ) |Item| +Source Location: (73:2,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (3023:87,45 [11] ) +|MyComponent| + Source Location: (85:2,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (3221:91,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InFunctionsDirective/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InFunctionsDirective/TestComponent.mappings.txt index 625e2ec6820..8950ff0ac52 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InFunctionsDirective/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InFunctionsDirective/TestComponent.mappings.txt @@ -19,6 +19,11 @@ Generated Location: (1104:36,0 [69] ) { | +Source Location: (179:7,9 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1270:44,45 [11] ) +|MyComponent| + Source Location: (195:8,0 [7] x:\dir\subdir\Test\TestComponent.cshtml) | } | diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InLocalFunction/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InLocalFunction/TestComponent.mappings.txt index 1171bbd3388..f2cbe145c5d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InLocalFunction/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InLocalFunction/TestComponent.mappings.txt @@ -14,6 +14,11 @@ Generated Location: (887:26,0 [42] ) { | +Source Location: (105:4,9 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1030:34,49 [11] ) +|MyComponent| + Source Location: (121:5,0 [7] x:\dir\subdir\Test\TestComponent.cshtml) | } | diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_MultipleGenerics/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_MultipleGenerics/TestComponent.mappings.txt index fbfb0c0b8ca..fa3af8d78e4 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_MultipleGenerics/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_MultipleGenerics/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (20:0,20 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (20:0,20 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (799:22,0 [6] ) |string| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_MultipleGenerics_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_MultipleGenerics_TypeInference/TestComponent.mappings.txt index 7b9d32ef19b..a1ae2475d76 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_MultipleGenerics_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_MultipleGenerics_TypeInference/TestComponent.mappings.txt @@ -18,6 +18,11 @@ Source Location: (159:3,3 [29] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1575:50,25 [29] ) |System.Math.Max(0, item.Item)| +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2443:70,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2659:74,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_NonGenericParameterizedChildContent_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_NonGenericParameterizedChildContent_TypeInference/TestComponent.mappings.txt index 94c646bf5d7..e9b49dc360d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_NonGenericParameterizedChildContent_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_NonGenericParameterizedChildContent_TypeInference/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (103:2,16 [7] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1315:40,25 [7] ) |context| +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1996:59,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2194:63,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Simple/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Simple/TestComponent.mappings.txt new file mode 100644 index 00000000000..b5b73dd3642 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_Simple/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithChildContent/TestComponent.mappings.txt index 921c305e44c..c93f3f5e8db 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithChildContent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) |MyAttr| Generated Location: (884:23,0 [6] ) |MyAttr| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithElementOnlyChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithElementOnlyChildContent/TestComponent.mappings.txt new file mode 100644 index 00000000000..b5b73dd3642 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithElementOnlyChildContent/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitChildContent/TestComponent.mappings.txt new file mode 100644 index 00000000000..b5b73dd3642 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitChildContent/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitEventHandler/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitEventHandler/TestComponent.mappings.txt index 94c96b14b11..c5e3c529054 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitEventHandler/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitEventHandler/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitGenericChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitGenericChildContent/TestComponent.mappings.txt index f15706a320f..4ddbe517db6 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitGenericChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitGenericChildContent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (28:0,28 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (28:0,28 [7] x:\dir\subdir\Test\TestComponent.cshtml) |context| Generated Location: (997:23,25 [7] ) |context| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitStringParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitStringParameter/TestComponent.mappings.txt index e9caeb22f6a..9843184c756 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitStringParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithExplicitStringParameter/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) |StringProperty| Generated Location: (884:23,0 [14] ) |StringProperty| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent/TestComponent.mappings.txt index 708adf16209..31ab17b56c8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) |MyAttr| Generated Location: (884:23,0 [6] ) |MyAttr| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent_SetsParameterName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent_SetsParameterName/TestComponent.mappings.txt index 72cb45e83be..97032dca2b6 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent_SetsParameterName/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent_SetsParameterName/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) |MyAttr| Generated Location: (884:23,0 [6] ) |MyAttr| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent_SetsParameterNameOnComponent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent_SetsParameterNameOnComponent/TestComponent.mappings.txt index 72cb45e83be..97032dca2b6 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent_SetsParameterNameOnComponent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithGenericChildContent_SetsParameterNameOnComponent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [6] x:\dir\subdir\Test\TestComponent.cshtml) |MyAttr| Generated Location: (884:23,0 [6] ) |MyAttr| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithLambdaEventHandler/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithLambdaEventHandler/TestComponent.mappings.txt index 9e81c5f14dc..45e49a43271 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithLambdaEventHandler/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithLambdaEventHandler/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithNonPropertyAttributes/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithNonPropertyAttributes/TestComponent.mappings.txt index 36f4b7660ab..547559b262a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithNonPropertyAttributes/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithNonPropertyAttributes/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (55:0,55 [13] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (55:0,55 [13] x:\dir\subdir\Test\TestComponent.cshtml) |43.ToString()| Generated Location: (947:24,0 [13] ) |43.ToString()| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithPageDirective/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithPageDirective/TestComponent.mappings.txt index dfc8c3bb5e4..e824da9d01b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithPageDirective/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithPageDirective/TestComponent.mappings.txt @@ -8,3 +8,8 @@ Source Location: (23:1,6 [20] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (749:26,0 [20] ) |"/AnotherRoute/{id}"| +Source Location: (46:2,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1204:39,49 [11] ) +|MyComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithParameters/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithParameters/TestComponent.mappings.txt index 10e3337479b..ff4c82ba82c 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithParameters/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithParameters/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (18:1,4 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (18:1,4 [11] x:\dir\subdir\Test\TestComponent.cshtml) |IntProperty| Generated Location: (883:23,0 [11] ) |IntProperty| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithWeaklyTypeEventHandler/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithWeaklyTypeEventHandler/TestComponent.mappings.txt index 4fa8548079e..abbb1739e5a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithWeaklyTypeEventHandler/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_WithWeaklyTypeEventHandler/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (372:12,0 [41] ) |using Microsoft.AspNetCore.Components.Web| +Source Location: (45:1,1 [14] x:\dir\subdir\Test\TestComponent.cshtml) +|DynamicElement| +Generated Location: (855:25,49 [14] ) +|DynamicElement| + Source Location: (70:1,26 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (1153:29,0 [7] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildContent_FromAnotherNamespace/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildContent_FromAnotherNamespace/TestComponent.mappings.txt index a757122c03c..beb1c79c79d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildContent_FromAnotherNamespace/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildContent_FromAnotherNamespace/TestComponent.mappings.txt @@ -3,11 +3,31 @@ Generated Location: (372:12,0 [17] ) |using AnotherTest| +Source Location: (23:2,1 [15] x:\dir\subdir\Test\TestComponent.cshtml) +|HeaderComponent| +Generated Location: (831:25,49 [15] ) +|HeaderComponent| + +Source Location: (88:5,1 [15] x:\dir\subdir\Test\TestComponent.cshtml) +|FooterComponent| +Generated Location: (1208:32,56 [15] ) +|FooterComponent| + Source Location: (119:6,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |context| Generated Location: (1502:36,25 [7] ) |context| +Source Location: (158:8,1 [20] x:\dir\subdir\Test\TestComponent.cshtml) +|Test.HeaderComponent| +Generated Location: (1750:46,44 [20] ) +|Test.HeaderComponent| + +Source Location: (233:11,1 [27] x:\dir\subdir\Test\TestComponent.cshtml) +|AnotherTest.FooterComponent| +Generated Location: (2122:53,44 [27] ) +|AnotherTest.FooterComponent| + Source Location: (276:12,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |context| Generated Location: (2433:57,26 [7] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentParameter_TypeMismatch_ReportsDiagnostic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentParameter_TypeMismatch_ReportsDiagnostic/TestComponent.mappings.txt index f1a67c9fd9f..814865744e1 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentParameter_TypeMismatch_ReportsDiagnostic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentParameter_TypeMismatch_ReportsDiagnostic/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (15:0,15 [8] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|CoolnessMeter| +Generated Location: (703:19,49 [13] ) +|CoolnessMeter| + +Source Location: (15:0,15 [8] x:\dir\subdir\Test\TestComponent.cshtml) |Coolness| Generated Location: (888:23,0 [8] ) |Coolness| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithBooleanParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithBooleanParameter/TestComponent.mappings.txt index 2609d6c9677..636d5004cc7 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithBooleanParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithBooleanParameter/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (812:22,24 [8] ) |TestBool| +Source Location: (31:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1032:30,49 [13] ) +|TestComponent| + Source Location: (45:2,15 [8] x:\dir\subdir\Test\TestComponent.cshtml) |TestBool| Generated Location: (1217:34,0 [8] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithBooleanParameter_Minimized/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithBooleanParameter_Minimized/TestComponent.mappings.txt index d53ce74b8e7..0d60688cfcc 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithBooleanParameter_Minimized/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithBooleanParameter_Minimized/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (812:22,24 [8] ) |TestBool| +Source Location: (31:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1032:30,49 [13] ) +|TestComponent| + Source Location: (45:2,15 [8] x:\dir\subdir\Test\TestComponent.cshtml) |TestBool| Generated Location: (1217:34,0 [8] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithConstrainedTypeParameters/UseTestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithConstrainedTypeParameters/UseTestComponent.mappings.txt index fc1bc97692d..5424a61b5e3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithConstrainedTypeParameters/UseTestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithConstrainedTypeParameters/UseTestComponent.mappings.txt @@ -38,6 +38,11 @@ Generated Location: (1848:66,0 [268] ) List items = new List() { tag1, tag2 }; | +Source Location: (14:1,1 [13] x:\dir\subdir\Test\UseTestComponent.cshtml) +|TestComponent| +Generated Location: (2844:88,45 [13] ) +|TestComponent| + Source Location: (28:1,15 [5] x:\dir\subdir\Test\UseTestComponent.cshtml) |Item1| Generated Location: (3083:92,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithConstrainedTypeParameters_WithSemicolon/UseTestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithConstrainedTypeParameters_WithSemicolon/UseTestComponent.mappings.txt index fc1bc97692d..5424a61b5e3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithConstrainedTypeParameters_WithSemicolon/UseTestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithConstrainedTypeParameters_WithSemicolon/UseTestComponent.mappings.txt @@ -38,6 +38,11 @@ Generated Location: (1848:66,0 [268] ) List items = new List() { tag1, tag2 }; | +Source Location: (14:1,1 [13] x:\dir\subdir\Test\UseTestComponent.cshtml) +|TestComponent| +Generated Location: (2844:88,45 [13] ) +|TestComponent| + Source Location: (28:1,15 [5] x:\dir\subdir\Test\UseTestComponent.cshtml) |Item1| Generated Location: (3083:92,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithDecimalParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithDecimalParameter/TestComponent.mappings.txt index f50c7d66b95..35b3c50b2d3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithDecimalParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithDecimalParameter/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (812:22,24 [11] ) |TestDecimal| +Source Location: (34:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1035:30,49 [13] ) +|TestComponent| + Source Location: (48:2,15 [11] x:\dir\subdir\Test\TestComponent.cshtml) |TestDecimal| Generated Location: (1220:34,0 [11] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithDynamicParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithDynamicParameter/TestComponent.mappings.txt index 2070d090666..73ce907c6b0 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithDynamicParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithDynamicParameter/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (812:22,24 [11] ) |TestDynamic| +Source Location: (34:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1035:30,49 [13] ) +|TestComponent| + Source Location: (48:2,15 [11] x:\dir\subdir\Test\TestComponent.cshtml) |TestDynamic| Generated Location: (1220:34,0 [11] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTupleParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTupleParameter/TestComponent.mappings.txt index e1507a1b339..25ba502e633 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTupleParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTupleParameter/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (105:4,15 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (91:4,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (105:4,15 [6] x:\dir\subdir\Test\TestComponent.cshtml) |Gutter| Generated Location: (888:23,0 [6] ) |Gutter| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterArray/UseTestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterArray/UseTestComponent.mappings.txt index 0d3fb39c7be..ef94c92a259 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterArray/UseTestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterArray/UseTestComponent.mappings.txt @@ -38,6 +38,11 @@ Generated Location: (1866:66,0 [208] ) Tag[] items3() => new [] { tag }; | +Source Location: (14:1,1 [13] x:\dir\subdir\Test\UseTestComponent.cshtml) +|TestComponent| +Generated Location: (2678:85,45 [13] ) +|TestComponent| + Source Location: (28:1,15 [6] x:\dir\subdir\Test\UseTestComponent.cshtml) |Items1| Generated Location: (2883:89,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTuple/UseTestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTuple/UseTestComponent.mappings.txt index 9cba9469875..fd60212d497 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTuple/UseTestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTuple/UseTestComponent.mappings.txt @@ -31,6 +31,11 @@ Generated Location: (1688:58,0 [176] ) List<(string, int)> items2 = new List<(string, int)>() { item2 }; | +Source Location: (14:1,1 [13] x:\dir\subdir\Test\UseTestComponent.cshtml) +|TestComponent| +Generated Location: (2455:76,45 [13] ) +|TestComponent| + Source Location: (28:1,15 [5] x:\dir\subdir\Test\UseTestComponent.cshtml) |Item1| Generated Location: (2678:80,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTupleGloballyQualifiedTypes/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTupleGloballyQualifiedTypes/TestComponent.mappings.txt index 046a170062f..bc826356e1b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTupleGloballyQualifiedTypes/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTupleGloballyQualifiedTypes/TestComponent.mappings.txt @@ -40,6 +40,11 @@ Generated Location: (1828:65,0 [169] ) public RenderFragment<(MyClass I1, MyStruct I2, TParam P)> Template { get; set; } | +Source Location: (213:11,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (2528:85,45 [13] ) +|TestComponent| + Source Location: (227:11,15 [10] x:\dir\subdir\Test\TestComponent.cshtml) |InferParam| Generated Location: (2734:89,0 [10] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTuple_ExplicitGenericArguments/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTuple_ExplicitGenericArguments/TestComponent.mappings.txt index 468cb65949a..ac7088fde4a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTuple_ExplicitGenericArguments/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ComponentWithTypeParameterValueTuple_ExplicitGenericArguments/TestComponent.mappings.txt @@ -18,6 +18,11 @@ Source Location: (61:1,18 [21] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (981:39,0 [21] ) |where TValue : struct| +Source Location: (87:3,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1310:49,49 [13] ) +|TestComponent| + Source Location: (122:3,36 [7] x:\dir\subdir\Test\TestComponent.cshtml) |decimal| Generated Location: (1408:52,0 [7] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute/TestComponent.mappings.txt index 511a568cbcc..7d411b28d13 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) |StringProperty| Generated Location: (884:23,0 [14] ) |StringProperty| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute_02/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute_02/TestComponent.mappings.txt index 511a568cbcc..7d411b28d13 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute_02/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute_02/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) |StringProperty| Generated Location: (884:23,0 [14] ) |StringProperty| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute_03/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute_03/TestComponent.mappings.txt index df7687f3876..967e77146ca 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute_03/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_ComplexContentInAttribute_03/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) |StringProperty| Generated Location: (884:23,0 [14] ) |StringProperty| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_IgnoresStaticAndAliasUsings/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_IgnoresStaticAndAliasUsings/TestComponent.mappings.txt index bba3a009bea..8e616c9fe00 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_IgnoresStaticAndAliasUsings/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_IgnoresStaticAndAliasUsings/TestComponent.mappings.txt @@ -8,3 +8,8 @@ Source Location: (36:1,1 [17] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (515:18,0 [17] ) |using Foo = Test3| +Source Location: (56:2,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (974:31,49 [11] ) +|MyComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_MatchingIsCaseSensitive/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_MatchingIsCaseSensitive/TestComponent.mappings.txt index 5b4cb92abc6..24679dad327 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_MatchingIsCaseSensitive/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_MatchingIsCaseSensitive/TestComponent.mappings.txt @@ -1,4 +1,14 @@ -Source Location: (47:2,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (35:2,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (894:22,49 [11] ) +|MyComponent| + +Source Location: (47:2,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |intproperty| Generated Location: (1075:26,0 [11] ) |IntProperty| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_MultipleComponentsDifferByCase/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_MultipleComponentsDifferByCase/TestComponent.mappings.txt index 7a1049b1e95..6474bec48a2 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_MultipleComponentsDifferByCase/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_MultipleComponentsDifferByCase/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |IntProperty| Generated Location: (884:23,0 [11] ) |IntProperty| @@ -8,6 +13,11 @@ Source Location: (26:0,26 [1] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1150:31,0 [1] ) |1| +Source Location: (34:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|Mycomponent| +Generated Location: (1362:39,49 [11] ) +|Mycomponent| + Source Location: (46:1,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |IntProperty| Generated Location: (1543:43,0 [11] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_NamespaceDirective_InImports/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_NamespaceDirective_InImports/TestComponent.mappings.txt new file mode 100644 index 00000000000..0c98a8ce048 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_NamespaceDirective_InImports/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [7] x:\dir\subdir\Test\TestComponent.cshtml) +|Counter| +Generated Location: (1089:38,53 [7] ) +|Counter| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_NamespaceDirective_OverrideImports/Counter.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_NamespaceDirective_OverrideImports/Counter.mappings.txt index d297d378f91..15c3efb55bf 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_NamespaceDirective_OverrideImports/Counter.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_NamespaceDirective_OverrideImports/Counter.mappings.txt @@ -3,3 +3,8 @@ Generated Location: (145:5,0 [8] ) |New.Test| +Source Location: (22:1,1 [8] x:\dir\subdir\Test\Pages/Counter.razor) +|Counter2| +Generated Location: (1088:38,53 [8] ) +|Counter2| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_TextTagsAreNotRendered/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_TextTagsAreNotRendered/TestComponent.mappings.txt index 244c54efd3f..1e29d7d8dbd 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_TextTagsAreNotRendered/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_TextTagsAreNotRendered/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (14:1,1 [18] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [7] x:\dir\subdir\Test\TestComponent.cshtml) +|Counter| +Generated Location: (703:19,49 [7] ) +|Counter| + +Source Location: (14:1,1 [18] x:\dir\subdir\Test\TestComponent.cshtml) |if (true) { | diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithCssScope/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithCssScope/TestComponent.mappings.txt index 513c60ea68a..1753287e41b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithCssScope/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithCssScope/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (192:3,61 [3] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1332:37,0 [3] ) |123| +Source Location: (293:6,5 [18] x:\dir\subdir\Test\TestComponent.cshtml) +|TemplatedComponent| +Generated Location: (1730:46,49 [18] ) +|TemplatedComponent| + Source Location: (318:6,30 [20] x:\dir\subdir\Test\TestComponent.cshtml) |myComponentReference| Generated Location: (2186:54,0 [20] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.mappings.txt new file mode 100644 index 00000000000..5c41a9922de --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [39] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredChildContent| +Generated Location: (703:19,49 [39] ) +|ComponentWithEditorRequiredChildContent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified/TestComponent.mappings.txt new file mode 100644 index 00000000000..5c41a9922de --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [39] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredChildContent| +Generated Location: (703:19,49 [39] ) +|ComponentWithEditorRequiredChildContent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecifiedAsText_WithoutName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecifiedAsText_WithoutName/TestComponent.mappings.txt new file mode 100644 index 00000000000..5c41a9922de --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecifiedAsText_WithoutName/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [39] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredChildContent| +Generated Location: (703:19,49 [39] ) +|ComponentWithEditorRequiredChildContent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified_WithoutName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified_WithoutName/TestComponent.mappings.txt new file mode 100644 index 00000000000..5c41a9922de --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified_WithoutName/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [39] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredChildContent| +Generated Location: (703:19,49 [39] ) +|ComponentWithEditorRequiredChildContent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.mappings.txt new file mode 100644 index 00000000000..5c41a9922de --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [39] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredChildContent| +Generated Location: (703:19,49 [39] ) +|ComponentWithEditorRequiredChildContent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_ValueSpecified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_ValueSpecified/TestComponent.mappings.txt new file mode 100644 index 00000000000..5c41a9922de --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_ValueSpecified/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [39] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredChildContent| +Generated Location: (703:19,49 [39] ) +|ComponentWithEditorRequiredChildContent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.mappings.txt new file mode 100644 index 00000000000..d921b1ae903 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [37] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredParameters| +Generated Location: (703:19,49 [37] ) +|ComponentWithEditorRequiredParameters| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecified/TestComponent.mappings.txt index 15fec8d0b07..b7d6f4e3911 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecified/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecified/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (39:0,39 [9] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [37] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredParameters| +Generated Location: (703:19,49 [37] ) +|ComponentWithEditorRequiredParameters| + +Source Location: (39:0,39 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Property1| Generated Location: (936:23,0 [9] ) |Property1| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecifiedUsingBind/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecifiedUsingBind/TestComponent.mappings.txt index e51e016bdd3..1107f509eab 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecifiedUsingBind/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecifiedUsingBind/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (45:0,45 [9] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [37] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredParameters| +Generated Location: (703:19,49 [37] ) +|ComponentWithEditorRequiredParameters| + +Source Location: (45:0,45 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Property1| Generated Location: (936:23,0 [9] ) |Property1| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.mappings.txt index 2cf7ca3909b..310779e209e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (54:0,54 [32] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [37] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithEditorRequiredParameters| +Generated Location: (703:19,49 [37] ) +|ComponentWithEditorRequiredParameters| + +Source Location: (54:0,54 [32] x:\dir\subdir\Test\TestComponent.cshtml) |new Dictionary()| Generated Location: (1073:23,0 [32] ) |new Dictionary()| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEscapedParameterName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEscapedParameterName/TestComponent.mappings.txt index dce07277ced..0b8c098421d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEscapedParameterName/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEscapedParameterName/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [5] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [5] x:\dir\subdir\Test\TestComponent.cshtml) |class| Generated Location: (887:23,1 [5] ) |class| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithFullyQualifiedTagNames/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithFullyQualifiedTagNames/TestComponent.mappings.txt new file mode 100644 index 00000000000..70504f755f4 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithFullyQualifiedTagNames/TestComponent.mappings.txt @@ -0,0 +1,15 @@ +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (18:1,1 [16] x:\dir\subdir\Test\TestComponent.cshtml) +|Test.MyComponent| +Generated Location: (858:22,44 [16] ) +|Test.MyComponent| + +Source Location: (40:2,1 [18] x:\dir\subdir\Test\TestComponent.cshtml) +|Test2.MyComponent2| +Generated Location: (1018:25,44 [18] ) +|Test2.MyComponent2| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithImplicitLambdaEventHandler/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithImplicitLambdaEventHandler/TestComponent.mappings.txt index 0076986efef..3bf4ecd2182 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithImplicitLambdaEventHandler/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithImplicitLambdaEventHandler/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (54:2,7 [87] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (54:2,7 [87] x:\dir\subdir\Test\TestComponent.cshtml) | private int counter; private void Increment() { diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithImportsFile/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithImportsFile/TestComponent.mappings.txt new file mode 100644 index 00000000000..4d406d1fe0c --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithImportsFile/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [7] x:\dir\subdir\Test\TestComponent.cshtml) +|Counter| +Generated Location: (1097:39,49 [7] ) +|Counter| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithInitOnlyParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithInitOnlyParameter/TestComponent.mappings.txt index 3dd1f28e91a..b2bcb2756e2 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithInitOnlyParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithInitOnlyParameter/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Prop| Generated Location: (884:23,0 [4] ) |Prop| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithKey/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithKey/TestComponent.mappings.txt index 9422bff7e9d..c2da8cd0e18 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithKey/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithKey/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (40:0,40 [12] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (40:0,40 [12] x:\dir\subdir\Test\TestComponent.cshtml) |someDate.Day| Generated Location: (980:25,0 [12] ) |someDate.Day| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithKey_WithChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithKey_WithChildContent/TestComponent.mappings.txt index 1ae220ae4b8..e1269dc4061 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithKey_WithChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithKey_WithChildContent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [9] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [9] x:\dir\subdir\Test\TestComponent.cshtml) |123 + 456| Generated Location: (1211:29,0 [9] ) |123 + 456| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNamespaceDirective/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNamespaceDirective/TestComponent.mappings.txt index cb4951e79a2..ab159c49673 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNamespaceDirective/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNamespaceDirective/TestComponent.mappings.txt @@ -8,11 +8,21 @@ Source Location: (1:0,1 [10] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (513:19,0 [10] ) |using Test| +Source Location: (40:3,1 [15] x:\dir\subdir\Test\TestComponent.cshtml) +|HeaderComponent| +Generated Location: (965:32,49 [15] ) +|HeaderComponent| + Source Location: (56:3,17 [6] x:\dir\subdir\Test\TestComponent.cshtml) |Header| Generated Location: (1154:36,0 [6] ) |Header| +Source Location: (93:5,1 [15] x:\dir\subdir\Test\TestComponent.cshtml) +|FooterComponent| +Generated Location: (1386:44,56 [15] ) +|FooterComponent| + Source Location: (109:5,17 [6] x:\dir\subdir\Test\TestComponent.cshtml) |Footer| Generated Location: (1582:48,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNullableActionParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNullableActionParameter/TestComponent.mappings.txt index a09bb965918..9fd6a933430 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNullableActionParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNullableActionParameter/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (29:0,29 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [27] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithNullableAction| +Generated Location: (703:19,49 [27] ) +|ComponentWithNullableAction| + +Source Location: (29:0,29 [14] x:\dir\subdir\Test\TestComponent.cshtml) |NullableAction| Generated Location: (916:23,0 [14] ) |NullableAction| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNullableRenderFragmentParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNullableRenderFragmentParameter/TestComponent.mappings.txt index 3063c1dff0d..327daa92f31 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNullableRenderFragmentParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithNullableRenderFragmentParameter/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (37:0,37 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [35] x:\dir\subdir\Test\TestComponent.cshtml) +|ComponentWithNullableRenderFragment| +Generated Location: (703:19,49 [35] ) +|ComponentWithNullableRenderFragment| + +Source Location: (37:0,37 [6] x:\dir\subdir\Test\TestComponent.cshtml) |Header| Generated Location: (932:23,0 [6] ) |Header| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef/TestComponent.mappings.txt index 3100cc31eec..5b24d9814fc 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (40:0,40 [10] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (40:0,40 [10] x:\dir\subdir\Test\TestComponent.cshtml) |myInstance| Generated Location: (1019:25,0 [10] ) |myInstance| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_Nullable/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_Nullable/TestComponent.mappings.txt index 45b8654223c..ba32772e929 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_Nullable/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_Nullable/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (21:0,21 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (21:0,21 [11] x:\dir\subdir\Test\TestComponent.cshtml) |myComponent| Generated Location: (875:23,0 [11] ) |myComponent| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_Nullable_Generic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_Nullable_Generic/TestComponent.mappings.txt index b9847f8c6aa..c67269c3d49 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_Nullable_Generic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_Nullable_Generic/TestComponent.mappings.txt @@ -19,6 +19,11 @@ Generated Location: (1257:42,0 [114] ) public void Use() { System.GC.KeepAlive(myComponent); } | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1829:59,45 [11] ) +|MyComponent| + Source Location: (32:0,32 [11] x:\dir\subdir\Test\TestComponent.cshtml) |MyParameter| Generated Location: (2019:63,0 [11] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_WithChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_WithChildContent/TestComponent.mappings.txt index 38255405803..30c9f017faf 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_WithChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithRef_WithChildContent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [10] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [10] x:\dir\subdir\Test\TestComponent.cshtml) |myInstance| Generated Location: (1250:29,0 [10] ) |myInstance| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat/TestComponent.mappings.txt index 2f70475da93..6b39ed0885d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (51:0,51 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (51:0,51 [14] x:\dir\subdir\Test\TestComponent.cshtml) |someAttributes| Generated Location: (1125:24,0 [14] ) |someAttributes| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_ExplicitExpression/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_ExplicitExpression/TestComponent.mappings.txt index cf669038d3e..a87482e72aa 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_ExplicitExpression/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_ExplicitExpression/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (53:0,53 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (53:0,53 [14] x:\dir\subdir\Test\TestComponent.cshtml) |someAttributes| Generated Location: (1125:24,0 [14] ) |someAttributes| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_GenericTypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_GenericTypeInference/TestComponent.mappings.txt index 3bd696a8af1..4984101fb2b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_GenericTypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_GenericTypeInference/TestComponent.mappings.txt @@ -17,6 +17,11 @@ Generated Location: (1203:40,0 [93] ) private Dictionary someAttributes = new Dictionary(); | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1815:56,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2005:60,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_ImplicitExpression/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_ImplicitExpression/TestComponent.mappings.txt index ba7912a32c6..df996e13067 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_ImplicitExpression/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithSplat_ImplicitExpression/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (52:0,52 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (52:0,52 [14] x:\dir\subdir\Test\TestComponent.cshtml) |someAttributes| Generated Location: (1125:24,0 [14] ) |someAttributes| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithUsingDirectives/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithUsingDirectives/TestComponent.mappings.txt index 41b92897113..1e233d56cd3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithUsingDirectives/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithUsingDirectives/TestComponent.mappings.txt @@ -13,3 +13,13 @@ Source Location: (23:1,6 [20] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (871:32,0 [20] ) |"/AnotherRoute/{id}"| +Source Location: (60:3,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1326:45,49 [11] ) +|MyComponent| + +Source Location: (77:4,1 [12] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent2| +Generated Location: (1487:48,50 [12] ) +|MyComponent2| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithUsingDirectives_AmbiguousImport/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithUsingDirectives_AmbiguousImport/TestComponent.mappings.txt index ef93efe911a..2616ce7a396 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithUsingDirectives_AmbiguousImport/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithUsingDirectives_AmbiguousImport/TestComponent.mappings.txt @@ -8,3 +8,8 @@ Source Location: (15:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (494:18,0 [11] ) |using Test3| +Source Location: (29:2,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (947:31,49 [11] ) +|MyComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithWriteOnlyParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithWriteOnlyParameter/TestComponent.mappings.txt index 3dd1f28e91a..b2bcb2756e2 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithWriteOnlyParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithWriteOnlyParameter/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Prop| Generated Location: (884:23,0 [4] ) |Prop| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError/TestComponent.mappings.txt index aee5de94f20..13be66a2cb8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |Message| Generated Location: (884:23,0 [7] ) |Message| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessage/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessage/TestComponent.mappings.txt index d1ca801dd40..a9d91666efc 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessage/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessage/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |Message| Generated Location: (884:23,0 [7] ) |Message| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessageChanged/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessageChanged/TestComponent.mappings.txt index 3fb5998d483..fbe7f42e7ce 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessageChanged/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessageChanged/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) |MessageChanged| Generated Location: (884:23,0 [14] ) |MessageChanged| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessageExpression/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessageExpression/TestComponent.mappings.txt index 5587b5952ad..499389d9cc8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessageExpression/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_BindMessageExpression/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (38:0,38 [17] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (38:0,38 [17] x:\dir\subdir\Test\TestComponent.cshtml) |MessageExpression| Generated Location: (884:23,0 [17] ) |MessageExpression| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_Multiple/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_Multiple/TestComponent.mappings.txt index aee5de94f20..13be66a2cb8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_Multiple/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_Multiple/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |Message| Generated Location: (884:23,0 [7] ) |Message| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_WeaklyTyped/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_WeaklyTyped/TestComponent.mappings.txt new file mode 100644 index 00000000000..b5b73dd3642 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/DuplicateComponentParameters_IsAnError_WeaklyTyped/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Duplicate_RenderMode/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Duplicate_RenderMode/TestComponent.mappings.txt index 93432e31893..060b9ddbd42 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Duplicate_RenderMode/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Duplicate_RenderMode/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (28:0,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (28:0,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (895:23,0 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EmptyRootNamespace/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EmptyRootNamespace/TestComponent.mappings.txt new file mode 100644 index 00000000000..ed9d17a45bc --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EmptyRootNamespace/TestComponent.mappings.txt @@ -0,0 +1,10 @@ +Source Location: (21:1,1 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|Component1| +Generated Location: (751:19,44 [10] ) +|Component1| + +Source Location: (37:2,1 [17] x:\dir\subdir\Test\TestComponent.cshtml) +|Shared.Component2| +Generated Location: (905:22,44 [17] ) +|Shared.Component2| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_Array/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_Array/TestComponent.mappings.txt index f85ca7aa75c..f414f64a699 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_Array/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_Array/TestComponent.mappings.txt @@ -12,6 +12,11 @@ Generated Location: (1288:32,0 [64] ) string[] Selected { get; set; } = Array.Empty(); | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1925:48,45 [11] ) +|MyComponent| + Source Location: (19:0,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2123:52,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_ExplicitType/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_ExplicitType/TestComponent.mappings.txt index 6d62119024d..2cf680058a8 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_ExplicitType/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_ExplicitType/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (16:0,16 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (16:0,16 [6] x:\dir\subdir\Test\TestComponent.cshtml) |MyType| Generated Location: (799:22,0 [6] ) |MyType| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_ExplicitType_MethodGroup/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_ExplicitType_MethodGroup/TestComponent.mappings.txt index 15d22296209..35ea68144e1 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_ExplicitType_MethodGroup/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_ExplicitType_MethodGroup/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (16:0,16 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (16:0,16 [6] x:\dir\subdir\Test\TestComponent.cshtml) |MyType| Generated Location: (799:22,0 [6] ) |MyType| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_MissingTypeParameterBinding_01/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_MissingTypeParameterBinding_01/TestComponent.mappings.txt index d2985a41102..a36d4bb0477 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_MissingTypeParameterBinding_01/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_MissingTypeParameterBinding_01/TestComponent.mappings.txt @@ -7,6 +7,11 @@ Generated Location: (783:23,0 [28] ) private int counter; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1257:39,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (1463:43,0 [7] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_MissingTypeParameterBinding_02/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_MissingTypeParameterBinding_02/TestComponent.mappings.txt index 7e5e43de5a9..5551fa69c29 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_MissingTypeParameterBinding_02/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallbackOfT_GenericComponent_MissingTypeParameterBinding_02/TestComponent.mappings.txt @@ -7,3 +7,8 @@ Generated Location: (783:23,0 [28] ) private int counter; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1222:39,45 [11] ) +|MyComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Explicitly/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Explicitly/TestComponent.mappings.txt index 2be87acfaf0..3e85fa5a703 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Explicitly/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Explicitly/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (372:12,0 [41] ) |using Microsoft.AspNetCore.Components.Web| +Source Location: (45:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (855:25,49 [11] ) +|MyComponent| + Source Location: (57:1,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (1036:29,0 [7] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_Action/TestComponent.mappings.txt index 9bfc98acdcf..7a1e2ca39d7 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_Action/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_ActionOfT/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_ActionOfT/TestComponent.mappings.txt index c9eec819a28..da3c2994c59 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_ActionOfT/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_ActionOfT/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (372:12,0 [41] ) |using Microsoft.AspNetCore.Components.Web| +Source Location: (45:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (855:25,49 [11] ) +|MyComponent| + Source Location: (57:1,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (1036:29,0 [7] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_FuncOfTTask/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_FuncOfTTask/TestComponent.mappings.txt index 8d6ae294b6b..663ff360122 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_FuncOfTTask/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_FuncOfTTask/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (372:12,0 [41] ) |using Microsoft.AspNetCore.Components.Web| +Source Location: (45:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (855:25,49 [11] ) +|MyComponent| + Source Location: (57:1,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (1036:29,0 [7] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_FuncOfTask/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_FuncOfTask/TestComponent.mappings.txt index 7108b3258d7..cf2be9d0007 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_FuncOfTask/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_FuncOfTask/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_TypeMismatch/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_TypeMismatch/TestComponent.mappings.txt index 21307e42d2b..b225e2aa1b6 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_TypeMismatch/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallbackOfT_Implicitly_TypeMismatch/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (372:12,0 [41] ) |using Microsoft.AspNetCore.Components.Web| +Source Location: (45:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (855:25,49 [11] ) +|MyComponent| + Source Location: (57:1,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (1036:29,0 [7] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Explicitly/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Explicitly/TestComponent.mappings.txt index cafda797e6a..b3f76ae9a77 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Explicitly/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Explicitly/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_Action/TestComponent.mappings.txt index 4d3475d6d60..867a2aef578 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_Action/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_ActionOfObject/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_ActionOfObject/TestComponent.mappings.txt index f9a8b09c611..42cf1839b53 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_ActionOfObject/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_ActionOfObject/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_FuncOfTask/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_FuncOfTask/TestComponent.mappings.txt index 9a1fbff6cf0..c62a9daebc5 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_FuncOfTask/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_FuncOfTask/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_FuncOfobjectTask/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_FuncOfobjectTask/TestComponent.mappings.txt index 81c6fcdabc9..5b85c0bb504 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_FuncOfobjectTask/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/EventCallback_CanPassEventCallback_Implicitly_FuncOfobjectTask/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [7] x:\dir\subdir\Test\TestComponent.cshtml) |OnClick| Generated Location: (884:23,0 [7] ) |OnClick| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component/TestComponent.mappings.txt index 83be993fd5e..eb4cad7e7b3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component/TestComponent.mappings.txt @@ -3,11 +3,21 @@ Generated Location: (372:12,0 [41] ) |using Microsoft.AspNetCore.Components.Web| +Source Location: (45:1,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (855:25,49 [13] ) +|TestComponent| + Source Location: (84:1,40 [9] x:\dir\subdir\Test\TestComponent.cshtml) |() => { }| Generated Location: (1186:30,0 [9] ) |() => { }| +Source Location: (131:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1490:39,49 [13] ) +|TestComponent| + Source Location: (170:2,40 [9] x:\dir\subdir\Test\TestComponent.cshtml) |() => { }| Generated Location: (1821:44,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_Generic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_Generic/TestComponent.mappings.txt index da9f4220c29..488e3caa229 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_Generic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_Generic/TestComponent.mappings.txt @@ -42,11 +42,21 @@ Generated Location: (2388:80,0 [52] ) [Parameter] public T Parameter { get; set; } | +Source Location: (59:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (2955:96,45 [13] ) +|TestComponent| + Source Location: (140:2,82 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Parameter| Generated Location: (3358:103,0 [9] ) |Parameter| +Source Location: (159:3,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (3833:113,45 [13] ) +|TestComponent| + Source Location: (245:3,87 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Parameter| Generated Location: (4236:120,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_Generic_RazorLangVersion7/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_Generic_RazorLangVersion7/TestComponent.mappings.txt index 10733e3ec4b..2830d00cded 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_Generic_RazorLangVersion7/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_Generic_RazorLangVersion7/TestComponent.mappings.txt @@ -42,11 +42,21 @@ Generated Location: (2388:80,0 [52] ) [Parameter] public T Parameter { get; set; } | +Source Location: (59:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (2955:96,45 [13] ) +|TestComponent| + Source Location: (140:2,82 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Parameter| Generated Location: (3346:103,0 [9] ) |Parameter| +Source Location: (159:3,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (3829:113,45 [13] ) +|TestComponent| + Source Location: (245:3,87 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Parameter| Generated Location: (4220:120,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_RazorLangVersion7/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_RazorLangVersion7/TestComponent.mappings.txt index 665e504a344..98f933310d9 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_RazorLangVersion7/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Component_RazorLangVersion7/TestComponent.mappings.txt @@ -3,11 +3,21 @@ Generated Location: (372:12,0 [41] ) |using Microsoft.AspNetCore.Components.Web| +Source Location: (45:1,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (855:25,49 [13] ) +|TestComponent| + Source Location: (84:1,40 [9] x:\dir\subdir\Test\TestComponent.cshtml) |() => { }| Generated Location: (1187:30,0 [9] ) |() => { }| +Source Location: (131:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1493:39,49 [13] ) +|TestComponent| + Source Location: (170:2,40 [9] x:\dir\subdir\Test\TestComponent.cshtml) |() => { }| Generated Location: (1825:44,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Nested/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Nested/TestComponent.mappings.txt index 25ed0987d2e..c872f1c9540 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Nested/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/FormName_Nested/TestComponent.mappings.txt @@ -8,11 +8,21 @@ Source Location: (75:1,31 [9] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1146:30,0 [9] ) |() => { }| +Source Location: (110:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1555:40,49 [13] ) +|TestComponent| + Source Location: (161:3,35 [9] x:\dir\subdir\Test\TestComponent.cshtml) |() => { }| Generated Location: (2060:47,0 [9] ) |() => { }| +Source Location: (200:4,5 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (2507:57,54 [13] ) +|TestComponent| + Source Location: (255:5,39 [9] x:\dir\subdir\Test\TestComponent.cshtml) |() => { }| Generated Location: (3034:64,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_Action/TestComponent.mappings.txt index b4173905812..1be7d59af40 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_Action/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [6] ) |TParam| +Source Location: (20:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (851:27,49 [11] ) +|MyComponent| + Source Location: (40:1,21 [6] x:\dir\subdir\Test\TestComponent.cshtml) |TParam| Generated Location: (947:30,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_EventCallback/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_EventCallback/TestComponent.mappings.txt index eb30bcbc7e3..f93912f9c41 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_EventCallback/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_EventCallback/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [6] ) |TParam| +Source Location: (20:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (851:27,49 [11] ) +|MyComponent| + Source Location: (40:1,21 [6] x:\dir\subdir\Test\TestComponent.cshtml) |TParam| Generated Location: (947:30,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_Function/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_Function/TestComponent.mappings.txt index ce35563e522..2793f3737ee 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_Function/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericBindToGenericComponent_ExplicitType_WithGetSet_Function/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [6] ) |TParam| +Source Location: (20:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (851:27,49 [11] ) +|MyComponent| + Source Location: (40:1,21 [6] x:\dir\subdir\Test\TestComponent.cshtml) |TParam| Generated Location: (947:30,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_ExplicitType_WithAfter_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_ExplicitType_WithAfter_Action/TestComponent.mappings.txt index ce392ded33a..0bc75f02517 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_ExplicitType_WithAfter_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_ExplicitType_WithAfter_Action/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [6] ) |TParam| +Source Location: (20:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (851:27,49 [11] ) +|MyComponent| + Source Location: (40:1,21 [6] x:\dir\subdir\Test\TestComponent.cshtml) |TParam| Generated Location: (947:30,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithAfter_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithAfter_Action/TestComponent.mappings.txt index 4fbc1b895f8..9c35a816e3b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithAfter_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithAfter_Action/TestComponent.mappings.txt @@ -26,6 +26,11 @@ Generated Location: (1491:48,0 [79] ) public void Update() { } | +Source Location: (20:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2017:66,45 [11] ) +|MyComponent| + Source Location: (38:1,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2217:70,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_Action/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_Action/TestComponent.mappings.txt index 6886fc84d8c..55dd47414da 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_Action/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_Action/TestComponent.mappings.txt @@ -26,6 +26,11 @@ Generated Location: (1553:48,0 [128] ) public void UpdateValue(TParam value) { ParentValue = value; } | +Source Location: (20:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2160:66,45 [11] ) +|MyComponent| + Source Location: (38:1,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2360:70,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_EventCallback/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_EventCallback/TestComponent.mappings.txt index d08c43f4646..eb2ee6aa5b0 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_EventCallback/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_EventCallback/TestComponent.mappings.txt @@ -24,6 +24,11 @@ Generated Location: (1553:48,0 [118] ) public EventCallback UpdateValue { get; set; } | +Source Location: (20:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2150:65,45 [11] ) +|MyComponent| + Source Location: (38:1,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2350:69,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_Function/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_Function/TestComponent.mappings.txt index e0ca795cbd6..d6b33596834 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_Function/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentBindToGenericComponent_InferredType_WithGetSet_Function/TestComponent.mappings.txt @@ -26,6 +26,11 @@ Generated Location: (1553:48,0 [155] ) public Task UpdateValue(TParam value) { ParentValue = value; return Task.CompletedTask; } | +Source Location: (20:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2187:66,45 [11] ) +|MyComponent| + Source Location: (38:1,19 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (2387:70,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentMultipleTypeParamUsage/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentMultipleTypeParamUsage/TestComponent.mappings.txt index 381fc4471b6..d11b989a55a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentMultipleTypeParamUsage/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentMultipleTypeParamUsage/TestComponent.mappings.txt @@ -8,6 +8,11 @@ Source Location: (29:1,11 [6] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (620:24,0 [6] ) |TItem2| +Source Location: (168:10,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (997:35,49 [13] ) +|TestComponent| + Source Location: (202:10,35 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (1097:38,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeParamUsageWithImplicitExpression/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeParamUsageWithImplicitExpression/TestComponent.mappings.txt index 2dc326461b9..1f79098c02d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeParamUsageWithImplicitExpression/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeParamUsageWithImplicitExpression/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [5] ) |TItem| +Source Location: (89:6,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (850:27,49 [13] ) +|TestComponent| + Source Location: (111:6,23 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (948:30,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeParamUsageWithImplicitExpression2/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeParamUsageWithImplicitExpression2/TestComponent.mappings.txt index 252f4ee99a7..add78b4342b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeParamUsageWithImplicitExpression2/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeParamUsageWithImplicitExpression2/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [5] ) |TItem| +Source Location: (89:6,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (850:27,49 [13] ) +|TestComponent| + Source Location: (112:6,24 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (948:30,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsage/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsage/TestComponent.mappings.txt index 48162741197..abb05a91912 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsage/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsage/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [5] ) |TItem| +Source Location: (89:6,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (850:27,49 [13] ) +|TestComponent| + Source Location: (110:6,22 [6] x:\dir\subdir\Test\TestComponent.cshtml) |string| Generated Location: (948:30,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWhitespace/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWhitespace/TestComponent.mappings.txt index 703b596644a..2df17407965 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWhitespace/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWhitespace/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [5] ) |TItem| +Source Location: (89:6,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (850:27,49 [13] ) +|TestComponent| + Source Location: (110:6,22 [10] x:\dir\subdir\Test\TestComponent.cshtml) | string | Generated Location: (948:30,0 [10] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWithGenericType/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWithGenericType/TestComponent.mappings.txt index 93bc1c3475b..742d4fceb65 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWithGenericType/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWithGenericType/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (474:16,0 [5] ) |TItem| +Source Location: (89:6,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (850:27,49 [13] ) +|TestComponent| + Source Location: (110:6,22 [21] x:\dir\subdir\Test\TestComponent.cshtml) |TestComponent| Generated Location: (948:30,0 [21] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWithInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWithInference/TestComponent.mappings.txt index 8586ee8b31f..130a3b53fcd 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWithInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponentTypeUsageWithInference/TestComponent.mappings.txt @@ -19,6 +19,11 @@ Generated Location: (1184:40,0 [58] ) public TItem MyItem { get; set; } | +Source Location: (89:6,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1639:57,45 [13] ) +|TestComponent| + Source Location: (103:6,15 [6] x:\dir\subdir\Test\TestComponent.cshtml) |MyItem| Generated Location: (1841:61,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_NestedTypeExplicit/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_NestedTypeExplicit/TestComponent.mappings.txt index 30e422cc98a..47b6a746319 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_NestedTypeExplicit/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_NestedTypeExplicit/TestComponent.mappings.txt @@ -8,6 +8,11 @@ Source Location: (11:0,11 [6] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (595:22,0 [6] ) |TChild| +Source Location: (33:2,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (972:33,49 [11] ) +|MyComponent| + Source Location: (52:2,20 [6] x:\dir\subdir\Test\TestComponent.cshtml) |TChild| Generated Location: (1068:36,0 [6] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_NestedTypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_NestedTypeInference/TestComponent.mappings.txt index cdca58b2a0b..f6c688ce3d6 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_NestedTypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_NestedTypeInference/TestComponent.mappings.txt @@ -29,6 +29,11 @@ Generated Location: (1553:54,0 [138] ) [Parameter] public EventCallback MyChildEvent { get; set; } | +Source Location: (33:2,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2167:71,45 [11] ) +|MyComponent| + Source Location: (45:2,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2365:75,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_TypeInference/TestComponent.mappings.txt index c486eb8f2c6..96969cbee3b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithGenericTypeParameter_TypeInference/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (44:1,31 [13] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1187:36,0 [13] ) |(int x) => {}| +Source Location: (14:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1742:53,45 [11] ) +|MyComponent| + Source Location: (26:1,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1940:57,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithNestedGenericTypeParameter_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithNestedGenericTypeParameter_TypeInference/TestComponent.mappings.txt index 479997d5071..c329d84bec9 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithNestedGenericTypeParameter_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallbackWithNestedGenericTypeParameter_TypeInference/TestComponent.mappings.txt @@ -18,6 +18,11 @@ Source Location: (79:2,31 [26] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1283:41,0 [26] ) |(IEnumerable x) => {}| +Source Location: (49:2,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1899:58,45 [11] ) +|MyComponent| + Source Location: (61:2,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2097:62,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallback_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallback_TypeInference/TestComponent.mappings.txt index d6a6111ba10..d7463f06929 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallback_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_GenericEventCallback_TypeInference/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (44:1,31 [7] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1213:36,0 [7] ) |x => {}| +Source Location: (14:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1781:53,45 [11] ) +|MyComponent| + Source Location: (26:1,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1979:57,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NestedGenericEventCallback_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NestedGenericEventCallback_TypeInference/TestComponent.mappings.txt index 842cda3d95a..8ea7d9b449a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NestedGenericEventCallback_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NestedGenericEventCallback_TypeInference/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (44:1,31 [7] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1302:36,0 [7] ) |x => {}| +Source Location: (14:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1983:53,45 [11] ) +|MyComponent| + Source Location: (26:1,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2181:57,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonGenericEventCallback_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonGenericEventCallback_TypeInference/TestComponent.mappings.txt index c0aa1d96bcf..55f8a8ce682 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonGenericEventCallback_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonGenericEventCallback_TypeInference/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (44:1,31 [7] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1187:36,0 [7] ) |x => {}| +Source Location: (14:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1729:53,45 [11] ) +|MyComponent| + Source Location: (26:1,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1927:57,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonGenericParameter_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonGenericParameter_TypeInference/TestComponent.mappings.txt index 401c5557f8a..a09f5966704 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonGenericParameter_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonGenericParameter_TypeInference/TestComponent.mappings.txt @@ -22,6 +22,11 @@ Generated Location: (1321:46,0 [38] ) MyClass Hello = new MyClass(); | +Source Location: (21:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1802:62,45 [11] ) +|MyComponent| + Source Location: (33:1,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2000:66,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonPrimitiveType/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonPrimitiveType/TestComponent.mappings.txt index ff319969729..b1debb15ac1 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonPrimitiveType/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonPrimitiveType/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (20:0,20 [10] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (20:0,20 [10] x:\dir\subdir\Test\TestComponent.cshtml) |CustomType| Generated Location: (799:22,0 [10] ) |CustomType| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonPrimitiveTypeRenderFragment/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonPrimitiveTypeRenderFragment/TestComponent.mappings.txt index c6d377f54de..3cc7c810359 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonPrimitiveTypeRenderFragment/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_NonPrimitiveTypeRenderFragment/TestComponent.mappings.txt @@ -8,6 +8,11 @@ Source Location: (38:0,38 [18] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1064:30,25 [18] ) |context.ToString()| +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1677:49,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1875:53,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_TypeParameterOrdering/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_TypeParameterOrdering/TestComponent.mappings.txt index 0a33557d3fc..e3a7b980757 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_TypeParameterOrdering/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_TypeParameterOrdering/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (37:0,37 [18] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (37:0,37 [18] x:\dir\subdir\Test\TestComponent.cshtml) |IComposedInterface| Generated Location: (799:22,0 [18] ) |IComposedInterface| @@ -18,6 +23,11 @@ Source Location: (70:0,70 [15] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1482:47,0 [15] ) |_componentValue| +Source Location: (92:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2224:56,49 [11] ) +|MyComponent| + Source Location: (114:1,23 [18] x:\dir\subdir\Test\TestComponent.cshtml) |IComposedInterface| Generated Location: (2320:59,0 [18] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_UnmanagedConstraint/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_UnmanagedConstraint/TestComponent.mappings.txt index 4884032ea02..982daf749b3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_UnmanagedConstraint/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_UnmanagedConstraint/TestComponent.mappings.txt @@ -8,6 +8,11 @@ Source Location: (37:1,24 [1] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (958:28,0 [1] ) |1| +Source Location: (14:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1444:46,45 [11] ) +|MyComponent| + Source Location: (26:1,13 [9] x:\dir\subdir\Test\TestComponent.cshtml) |Parameter| Generated Location: (1634:50,0 [9] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithComponentRef_CreatesDiagnostic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithComponentRef_CreatesDiagnostic/TestComponent.mappings.txt index 5d649aaf94b..30a75cacf6f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithComponentRef_CreatesDiagnostic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithComponentRef_CreatesDiagnostic/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [3] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [3] x:\dir\subdir\Test\TestComponent.cshtml) |int| Generated Location: (799:22,0 [3] ) |int| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithComponentRef_TypeInference_CreatesDiagnostic/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithComponentRef_TypeInference_CreatesDiagnostic/TestComponent.mappings.txt index 2092c343fd4..7e68915e162 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithComponentRef_TypeInference_CreatesDiagnostic/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithComponentRef_TypeInference_CreatesDiagnostic/TestComponent.mappings.txt @@ -19,6 +19,11 @@ Generated Location: (1249:42,0 [90] ) public void Foo() { System.GC.KeepAlive(_my); } | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1809:59,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (2007:63,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithFullyQualifiedTagName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithFullyQualifiedTagName/TestComponent.mappings.txt index 5a01b576210..9786106dcad 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithFullyQualifiedTagName/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithFullyQualifiedTagName/TestComponent.mappings.txt @@ -8,6 +8,11 @@ Source Location: (43:1,8 [17] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1107:31,25 [17] ) |context.ToLower()| +Source Location: (1:0,1 [16] x:\dir\subdir\Test\TestComponent.cshtml) +|Test.MyComponent| +Generated Location: (1745:51,40 [16] ) +|Test.MyComponent| + Source Location: (18:0,18 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1948:55,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithKey/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithKey/TestComponent.mappings.txt index 155a6923fb5..a91f4e793f3 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithKey/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithKey/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [3] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [3] x:\dir\subdir\Test\TestComponent.cshtml) |int| Generated Location: (799:22,0 [3] ) |int| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithKey_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithKey_TypeInference/TestComponent.mappings.txt index f5c85016a03..c9a0f2b87ca 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithKey_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericComponent_WithKey_TypeInference/TestComponent.mappings.txt @@ -17,6 +17,11 @@ Generated Location: (1198:41,0 [47] ) private object _someKey = new object(); | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1667:57,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (1865:61,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericInference_DynamicallyAccessedMembers_01/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericInference_DynamicallyAccessedMembers_01/TestComponent.mappings.txt index acddc46cbae..a3d79f656c4 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericInference_DynamicallyAccessedMembers_01/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericInference_DynamicallyAccessedMembers_01/TestComponent.mappings.txt @@ -27,16 +27,31 @@ Generated Location: (2082:59,0 [39] ) private string value1 = "true"; | +Source Location: (49:2,1 [15] x:\dir\subdir\Test\TestComponent.cshtml) +|InputRadioGroup| +Generated Location: (2977:75,78 [15] ) +|InputRadioGroup| + Source Location: (71:2,23 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (3218:79,0 [5] ) |Value| +Source Location: (93:3,5 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|InputRadio| +Generated Location: (4153:92,78 [10] ) +|InputRadio| + Source Location: (104:3,16 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (4384:96,0 [5] ) |Value| +Source Location: (132:4,5 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|InputRadio| +Generated Location: (4942:106,78 [10] ) +|InputRadio| + Source Location: (143:4,16 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Value| Generated Location: (5173:110,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericInference_DynamicallyAccessedMembers_02/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericInference_DynamicallyAccessedMembers_02/TestComponent.mappings.txt index e47bea3a94d..5a6b54c4013 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericInference_DynamicallyAccessedMembers_02/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericInference_DynamicallyAccessedMembers_02/TestComponent.mappings.txt @@ -22,6 +22,11 @@ Generated Location: (1343:48,0 [31] ) private string s = "x"; | +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (2163:64,45 [11] ) +|MyComponent| + Source Location: (13:0,13 [2] x:\dir\subdir\Test\TestComponent.cshtml) |P1| Generated Location: (2371:68,0 [2] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericTypeCheck/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericTypeCheck/TestComponent.mappings.txt index 419d824f7ea..c0f90c27fbc 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericTypeCheck/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/GenericTypeCheck/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (15:0,15 [4] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (15:0,15 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Data| Generated Location: (888:23,0 [4] ) |Data| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_AddAttribute/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_AddAttribute/TestComponent.mappings.txt index b01cda0ae12..4d920ae37ce 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_AddAttribute/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_AddAttribute/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |PlaceHolder| Generated Location: (875:23,0 [11] ) |Placeholder| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_AddComponentParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_AddComponentParameter/TestComponent.mappings.txt index 70756d5b4e6..80b6c49b1df 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_AddComponentParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_AddComponentParameter/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |PlaceHolder| Generated Location: (884:23,0 [11] ) |Placeholder| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind/TestComponent.mappings.txt index 376104183be..d1e315dde4d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (19:0,19 [11] x:\dir\subdir\Test\TestComponent.cshtml) |PlaceHolder| Generated Location: (884:23,0 [11] ) |Placeholder| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind_02/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind_02/TestComponent.mappings.txt index 1ed51a1dc34..11e38c340aa 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind_02/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind_02/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (33:0,33 [1] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (33:0,33 [1] x:\dir\subdir\Test\TestComponent.cshtml) |s| Generated Location: (873:23,0 [1] ) |s| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind_03/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind_03/TestComponent.mappings.txt index 05e5eedb366..4cb7901f419 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind_03/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Bind_03/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (36:0,36 [1] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (36:0,36 [1] x:\dir\subdir\Test\TestComponent.cshtml) |s| Generated Location: (871:23,0 [1] ) |s| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Multiple/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Multiple/TestComponent.mappings.txt index 70756d5b4e6..80b6c49b1df 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Multiple/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ImplicitStringConversion_ParameterCasing_Multiple/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [11] x:\dir\subdir\Test\TestComponent.cshtml) |PlaceHolder| Generated Location: (884:23,0 [11] ) |Placeholder| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/InvalidCode_EmptyTransition/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/InvalidCode_EmptyTransition/TestComponent.mappings.txt index 9fd658c338a..0c8a9dd49c9 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/InvalidCode_EmptyTransition/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/InvalidCode_EmptyTransition/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (36:2,1 [0] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (36:2,1 [0] x:\dir\subdir\Test\TestComponent.cshtml) || Generated Location: (994:25,24 [0] ) || diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/LeadingWhiteSpace_WithComponent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/LeadingWhiteSpace_WithComponent/TestComponent.mappings.txt index 582141bcaa6..33dccb729fa 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/LeadingWhiteSpace_WithComponent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/LeadingWhiteSpace_WithComponent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (48:1,26 [12] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [18] x:\dir\subdir\Test\TestComponent.cshtml) +|SomeOtherComponent| +Generated Location: (703:19,49 [18] ) +|SomeOtherComponent| + +Source Location: (48:1,26 [12] x:\dir\subdir\Test\TestComponent.cshtml) |DateTime.Now| Generated Location: (1082:25,25 [12] ) |DateTime.Now| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Legacy_3_1_LeadingWhiteSpace_WithComponent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Legacy_3_1_LeadingWhiteSpace_WithComponent/TestComponent.mappings.txt index 733b264e120..68eda2d474e 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Legacy_3_1_LeadingWhiteSpace_WithComponent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Legacy_3_1_LeadingWhiteSpace_WithComponent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (48:1,26 [12] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [18] x:\dir\subdir\Test\TestComponent.cshtml) +|SomeOtherComponent| +Generated Location: (703:19,49 [18] ) +|SomeOtherComponent| + +Source Location: (48:1,26 [12] x:\dir\subdir\Test\TestComponent.cshtml) |DateTime.Now| Generated Location: (1143:26,25 [12] ) |DateTime.Now| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Legacy_3_1_TrailingWhiteSpace_WithComponent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Legacy_3_1_TrailingWhiteSpace_WithComponent/TestComponent.mappings.txt new file mode 100644 index 00000000000..6404ea9cae1 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Legacy_3_1_TrailingWhiteSpace_WithComponent/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (19:2,1 [18] x:\dir\subdir\Test\TestComponent.cshtml) +|SomeOtherComponent| +Generated Location: (773:20,49 [18] ) +|SomeOtherComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/MultipleChildContentMatchingComponentName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/MultipleChildContentMatchingComponentName/TestComponent.mappings.txt new file mode 100644 index 00000000000..8f963bdd7a4 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/MultipleChildContentMatchingComponentName/TestComponent.mappings.txt @@ -0,0 +1,10 @@ +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (81:4,1 [6] x:\dir\subdir\Test\TestComponent.cshtml) +|Header| +Generated Location: (1276:30,49 [6] ) +|Header| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/MultipleExplictChildContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/MultipleExplictChildContent/TestComponent.mappings.txt index 0dd7d436906..ca24cc86255 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/MultipleExplictChildContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/MultipleExplictChildContent/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (55:2,14 [6] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (55:2,14 [6] x:\dir\subdir\Test\TestComponent.cshtml) |"bye!"| Generated Location: (1161:27,25 [6] ) |"bye!"| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/NamespaceWithSurrogatePair/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/NamespaceWithSurrogatePair/TestComponent.mappings.txt new file mode 100644 index 00000000000..a3409a4fd23 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/NamespaceWithSurrogatePair/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (21:1,1 [10] x:\dir\subdir\Test\TestComponent.cshtml) +|Component1| +Generated Location: (793:20,59 [10] ) +|Component1| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/NonGenericComponent_WithGenericEventHandler/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/NonGenericComponent_WithGenericEventHandler/TestComponent.mappings.txt index a358475d932..cd2631f59bb 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/NonGenericComponent_WithGenericEventHandler/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/NonGenericComponent_WithGenericEventHandler/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (703:19,49 [11] ) +|MyComponent| + +Source Location: (13:0,13 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Item| Generated Location: (884:23,0 [4] ) |Item| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_AsComponentParameter_MixedContent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_AsComponentParameter_MixedContent/TestComponent.mappings.txt index 8c257869b9b..b203182dc26 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_AsComponentParameter_MixedContent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_AsComponentParameter_MixedContent/TestComponent.mappings.txt @@ -18,6 +18,11 @@ Source Location: (107:0,107 [2] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1565:51,0 [2] ) |; | +Source Location: (113:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1670:57,49 [11] ) +|MyComponent| + Source Location: (125:1,13 [8] x:\dir\subdir\Test\TestComponent.cshtml) |Template| Generated Location: (1851:61,0 [8] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_ContainsComponent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_ContainsComponent/TestComponent.mappings.txt index 63a212472e1..4c671ee983d 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_ContainsComponent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_ContainsComponent/TestComponent.mappings.txt @@ -5,6 +5,11 @@ Generated Location: (735:21,0 [45] ) | RenderFragment p = (person) => | +Source Location: (54:1,50 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (970:30,54 [11] ) +|MyComponent| + Source Location: (66:1,62 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Name| Generated Location: (1156:34,0 [4] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_FollowedByComponent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_FollowedByComponent/TestComponent.mappings.txt index a09e678c6ac..091f7998232 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_FollowedByComponent/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_FollowedByComponent/TestComponent.mappings.txt @@ -5,6 +5,11 @@ Generated Location: (735:21,0 [45] ) | RenderFragment p = (person) => | +Source Location: (54:1,50 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (970:30,54 [11] ) +|MyComponent| + Source Location: (66:1,62 [4] x:\dir\subdir\Test\TestComponent.cshtml) |Name| Generated Location: (1156:34,0 [4] ) @@ -22,6 +27,11 @@ Generated Location: (1690:53,0 [3] ) |; | +Source Location: (100:3,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1794:59,49 [11] ) +|MyComponent| + Source Location: (116:4,2 [15] x:\dir\subdir\Test\TestComponent.cshtml) |"hello, world!"| Generated Location: (2051:63,25 [15] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_Generic_AsComponentParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_Generic_AsComponentParameter/TestComponent.mappings.txt index 2179ff2f540..4bbf40a8735 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_Generic_AsComponentParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_Generic_AsComponentParameter/TestComponent.mappings.txt @@ -13,6 +13,11 @@ Source Location: (73:0,73 [2] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1252:41,0 [2] ) |; | +Source Location: (79:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1357:47,49 [11] ) +|MyComponent| + Source Location: (91:1,13 [14] x:\dir\subdir\Test\TestComponent.cshtml) |PersonTemplate| Generated Location: (1538:51,0 [14] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_NonGeneric_AsComponentParameter/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_NonGeneric_AsComponentParameter/TestComponent.mappings.txt index 31a8715d912..473d8a060cf 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_NonGeneric_AsComponentParameter/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RazorTemplate_NonGeneric_AsComponentParameter/TestComponent.mappings.txt @@ -8,6 +8,11 @@ Source Location: (45:0,45 [2] x:\dir\subdir\Test\TestComponent.cshtml) Generated Location: (1012:32,0 [2] ) |; | +Source Location: (51:1,1 [11] x:\dir\subdir\Test\TestComponent.cshtml) +|MyComponent| +Generated Location: (1117:38,49 [11] ) +|MyComponent| + Source Location: (72:1,22 [8] x:\dir\subdir\Test\TestComponent.cshtml) |template| Generated Location: (1276:42,0 [8] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_597/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_597/TestComponent.mappings.txt index 6f29ef98852..f698d3a7a5c 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_597/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_597/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (18:0,18 [1] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [7] x:\dir\subdir\Test\TestComponent.cshtml) +|Counter| +Generated Location: (703:19,49 [7] ) +|Counter| + +Source Location: (18:0,18 [1] x:\dir\subdir\Test\TestComponent.cshtml) |y| Generated Location: (853:23,0 [1] ) |y| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_609/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_609/TestComponent.mappings.txt index d787010f724..bb1d7a16228 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_609/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_609/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (19:0,19 [8] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [4] x:\dir\subdir\Test\TestComponent.cshtml) +|User| +Generated Location: (703:19,49 [4] ) +|User| + +Source Location: (19:0,19 [8] x:\dir\subdir\Test\TestComponent.cshtml) |UserName| Generated Location: (853:23,0 [8] ) |UserName| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_772/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_772/TestComponent.mappings.txt index 62a314b52ff..b91cd9a3277 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_772/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_772/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (504:16,0 [3] ) |"/"| +Source Location: (68:6,1 [12] x:\dir\subdir\Test\TestComponent.cshtml) +|SurveyPrompt| +Generated Location: (1052:30,49 [12] ) +|SurveyPrompt| + Source Location: (81:6,14 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Title| Generated Location: (1235:34,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_773/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_773/TestComponent.mappings.txt index 62a314b52ff..b91cd9a3277 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_773/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Regression_773/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (504:16,0 [3] ) |"/"| +Source Location: (68:6,1 [12] x:\dir\subdir\Test\TestComponent.cshtml) +|SurveyPrompt| +Generated Location: (1052:30,49 [12] ) +|SurveyPrompt| + Source Location: (81:6,14 [5] x:\dir\subdir\Test\TestComponent.cshtml) |Title| Generated Location: (1235:34,0 [5] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_Existing_Attributes/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_Existing_Attributes/TestComponent.mappings.txt index d04dd17a216..a781685404f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_Existing_Attributes/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_Existing_Attributes/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (15:0,15 [2] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (15:0,15 [2] x:\dir\subdir\Test\TestComponent.cshtml) |P2| Generated Location: (888:23,0 [2] ) |P2| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_Expression/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_Expression/TestComponent.mappings.txt index c027541242f..9c2963cf2a4 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_Expression/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_Expression/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (30:0,30 [38] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (30:0,30 [38] x:\dir\subdir\Test\TestComponent.cshtml) |new MyRenderMode() { Extra = "Hello" }| Generated Location: (895:23,0 [38] ) |new MyRenderMode() { Extra = "Hello" }| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_SimpleIdentifier/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_SimpleIdentifier/TestComponent.mappings.txt index 93432e31893..060b9ddbd42 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_SimpleIdentifier/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Attribute_With_SimpleIdentifier/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (28:0,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (28:0,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (895:23,0 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Child_Components/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Child_Components/TestComponent.mappings.txt index 77eb7b5e552..2f227cf75e6 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Child_Components/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Child_Components/TestComponent.mappings.txt @@ -1,28 +1,58 @@ -Source Location: (28:0,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (28:0,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (895:23,0 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Source Location: (101:1,5 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1212:31,54 [13] ) +|TestComponent| + Source Location: (128:1,32 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (1411:35,0 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Source Location: (205:2,9 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1741:43,58 [13] ) +|TestComponent| + Source Location: (232:2,36 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (1945:47,0 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Source Location: (326:4,2 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (2476:61,54 [13] ) +|TestComponent| + Source Location: (353:4,29 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (2675:65,0 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Source Location: (430:5,9 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (3005:73,58 [13] ) +|TestComponent| + Source Location: (457:5,36 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (3209:77,0 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Source Location: (536:6,9 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (3600:87,58 [13] ) +|TestComponent| + Source Location: (563:6,36 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (3805:91,0 [64] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.codegen.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.codegen.cs index 09254ae367b..21583a385ae 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.codegen.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.codegen.cs @@ -22,7 +22,15 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. #pragma warning restore 1998 private sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute { - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => +#nullable restore +#line (1,13)-(1,77) "x:\dir\subdir\Test\TestComponent.cshtml" +Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + +#line default +#line hidden +#nullable disable + ; public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.ir.txt index 09fb15ec983..dd168de9614 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.ir.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.ir.txt @@ -13,7 +13,7 @@ CSharpCode - IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => CSharpCode - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - IntermediateToken - - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer IntermediateToken - - CSharp - ; CSharpCode - IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.mappings.txt new file mode 100644 index 00000000000..f43427c96e2 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_FullyQualified/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (1100:27,0 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.codegen.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.codegen.cs index aad4143b641..973716b765a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.codegen.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.codegen.cs @@ -29,7 +29,15 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. #pragma warning restore 1998 private sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute { - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => +#nullable restore +#line (3,13)-(3,77) "x:\dir\subdir\Test\TestComponent.cshtml" +Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + +#line default +#line hidden +#nullable disable + ; public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; } diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.ir.txt index 05166e87312..94b04eb6e6b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.ir.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.ir.txt @@ -13,7 +13,7 @@ CSharpCode - IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => CSharpCode - (43:2,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - IntermediateToken - - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - (43:2,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer IntermediateToken - - CSharp - ; CSharpCode - IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.mappings.txt index 2d3d9bb71c1..f4bd9529513 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithNamespaces/TestComponent.mappings.txt @@ -3,3 +3,8 @@ Generated Location: (146:5,0 [16] ) |Custom.Namespace| +Source Location: (43:2,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (1258:34,0 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.codegen.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.codegen.cs new file mode 100644 index 00000000000..c976239e20b --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.codegen.cs @@ -0,0 +1,47 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line default + using global::System; + using global::System.Collections.Generic; + using global::System.Linq; + using global::System.Threading.Tasks; + using global::Microsoft.AspNetCore.Components; + #line default + #line hidden + [__PrivateComponentRenderModeAttribute] + #nullable restore + public partial class TestComponent< +#nullable restore +#line (1,12)-(1,13) "x:\dir\subdir\Test\TestComponent.cshtml" +T + +#line default +#line hidden +#nullable disable + > : global::Microsoft.AspNetCore.Components.ComponentBase + #nullable disable + { + #pragma warning disable 1998 + protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + } + #pragma warning restore 1998 + } + file sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => +#nullable restore +#line (2,13)-(2,77) "x:\dir\subdir\Test\TestComponent.cshtml" +Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + +#line default +#line hidden +#nullable disable + + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } +} +#pragma warning restore 1591 diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.ir.txt new file mode 100644 index 00000000000..89b6b2a3930 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.ir.txt @@ -0,0 +1,19 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [20] ) - global::System + UsingDirective - (26:2,1 [40] ) - global::System.Collections.Generic + UsingDirective - (69:3,1 [25] ) - global::System.Linq + UsingDirective - (97:4,1 [36] ) - global::System.Threading.Tasks + UsingDirective - (136:5,1 [45] ) - global::Microsoft.AspNetCore.Components + CSharpCode - + IntermediateToken - - CSharp - [__PrivateComponentRenderModeAttribute] + ClassDeclaration - - public partial - TestComponent - global::Microsoft.AspNetCore.Components.ComponentBase - - T + MethodDeclaration - - protected override - void - BuildRenderTree + ClassDeclaration - - file sealed - __PrivateComponentRenderModeAttribute - global::Microsoft.AspNetCore.Components.RenderModeAttribute - + CSharpCode - + IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + CSharpCode - (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) + IntermediateToken - (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - - CSharp - ; + CSharpCode - + IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.mappings.txt new file mode 100644 index 00000000000..87aeafd088c --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam/TestComponent.mappings.txt @@ -0,0 +1,10 @@ +Source Location: (11:0,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) +|T| +Generated Location: (519:17,0 [1] ) +|T| + +Source Location: (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (1208:36,0 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.codegen.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.codegen.cs new file mode 100644 index 00000000000..f717453f37f --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.codegen.cs @@ -0,0 +1,47 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line default + using global::System; + using global::System.Collections.Generic; + using global::System.Linq; + using global::System.Threading.Tasks; + using global::Microsoft.AspNetCore.Components; + #line default + #line hidden + [__PrivateComponentRenderModeAttribute] + #nullable restore + public partial class TestComponent< +#nullable restore +#line (2,12)-(2,13) "x:\dir\subdir\Test\TestComponent.cshtml" +T + +#line default +#line hidden +#nullable disable + > : global::Microsoft.AspNetCore.Components.ComponentBase + #nullable disable + { + #pragma warning disable 1998 + protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + } + #pragma warning restore 1998 + } + file sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => +#nullable restore +#line (1,13)-(1,77) "x:\dir\subdir\Test\TestComponent.cshtml" +Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + +#line default +#line hidden +#nullable disable + + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } +} +#pragma warning restore 1591 diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.ir.txt new file mode 100644 index 00000000000..82e79475ddc --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.ir.txt @@ -0,0 +1,19 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [20] ) - global::System + UsingDirective - (26:2,1 [40] ) - global::System.Collections.Generic + UsingDirective - (69:3,1 [25] ) - global::System.Linq + UsingDirective - (97:4,1 [36] ) - global::System.Threading.Tasks + UsingDirective - (136:5,1 [45] ) - global::Microsoft.AspNetCore.Components + CSharpCode - + IntermediateToken - - CSharp - [__PrivateComponentRenderModeAttribute] + ClassDeclaration - - public partial - TestComponent - global::Microsoft.AspNetCore.Components.ComponentBase - - T + MethodDeclaration - - protected override - void - BuildRenderTree + ClassDeclaration - - file sealed - __PrivateComponentRenderModeAttribute - global::Microsoft.AspNetCore.Components.RenderModeAttribute - + CSharpCode - + IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + CSharpCode - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) + IntermediateToken - (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - - CSharp - ; + CSharpCode - + IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.mappings.txt new file mode 100644 index 00000000000..69a8af45042 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_First/TestComponent.mappings.txt @@ -0,0 +1,10 @@ +Source Location: (89:1,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) +|T| +Generated Location: (519:17,0 [1] ) +|T| + +Source Location: (12:0,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Generated Location: (1208:36,0 [64] ) +|Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.codegen.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.codegen.cs new file mode 100644 index 00000000000..2dcf885600f --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.codegen.cs @@ -0,0 +1,39 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line default + using global::System; + using global::System.Collections.Generic; + using global::System.Linq; + using global::System.Threading.Tasks; + using global::Microsoft.AspNetCore.Components; + #line default + #line hidden + [global::Test.TestComponent.__PrivateComponentRenderModeAttribute] + #nullable restore + public partial class TestComponent< +#nullable restore +#line (1,12)-(1,13) "x:\dir\subdir\Test\TestComponent.cshtml" +T + +#line default +#line hidden +#nullable disable + > : global::Microsoft.AspNetCore.Components.ComponentBase + #nullable disable + { + #pragma warning disable 1998 + protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + } + #pragma warning restore 1998 + private sealed class __PrivateComponentRenderModeAttribute : global::Microsoft.AspNetCore.Components.RenderModeAttribute + { + private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + ; + public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; + } + } +} +#pragma warning restore 1591 diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.ir.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.ir.txt new file mode 100644 index 00000000000..15e90cdcf64 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.ir.txt @@ -0,0 +1,19 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [20] ) - global::System + UsingDirective - (26:2,1 [40] ) - global::System.Collections.Generic + UsingDirective - (69:3,1 [25] ) - global::System.Linq + UsingDirective - (97:4,1 [36] ) - global::System.Threading.Tasks + UsingDirective - (136:5,1 [45] ) - global::Microsoft.AspNetCore.Components + CSharpCode - + IntermediateToken - - CSharp - [global::Test.TestComponent.__PrivateComponentRenderModeAttribute] + ClassDeclaration - - public partial - TestComponent - global::Microsoft.AspNetCore.Components.ComponentBase - - T + MethodDeclaration - - protected override - void - BuildRenderTree + ClassDeclaration - - private sealed - __PrivateComponentRenderModeAttribute - global::Microsoft.AspNetCore.Components.RenderModeAttribute - + CSharpCode - + IntermediateToken - - CSharp - private static global::Microsoft.AspNetCore.Components.IComponentRenderMode ModeImpl => + CSharpCode - (26:1,12 [64] x:\dir\subdir\Test\TestComponent.cshtml) + IntermediateToken - - CSharp - Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + IntermediateToken - - CSharp - ; + CSharpCode - + IntermediateToken - - CSharp - public override global::Microsoft.AspNetCore.Components.IComponentRenderMode Mode => ModeImpl; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.mappings.txt new file mode 100644 index 00000000000..97b5870256a --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Directive_WithTypeParam_Razor9/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (11:0,11 [1] x:\dir\subdir\Test\TestComponent.cshtml) +|T| +Generated Location: (546:17,0 [1] ) +|T| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Multiple_Components/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Multiple_Components/TestComponent.mappings.txt index 3c78aca2813..2f48379ee25 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Multiple_Components/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_Multiple_Components/TestComponent.mappings.txt @@ -1,8 +1,18 @@ -Source Location: (28:0,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (28:0,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (895:23,0 [64] ) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| +Source Location: (99:1,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (1231:33,49 [13] ) +|TestComponent| + Source Location: (126:1,28 [64] x:\dir\subdir\Test\TestComponent.cshtml) |Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer| Generated Location: (1426:37,0 [64] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Null_Nullable_Disabled/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Null_Nullable_Disabled/TestComponent.mappings.txt index 6b3789ae474..c4cac0f1d3f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Null_Nullable_Disabled/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Null_Nullable_Disabled/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (28:0,28 [4] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (28:0,28 [4] x:\dir\subdir\Test\TestComponent.cshtml) |null| Generated Location: (895:23,0 [4] ) |null| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Null_Nullable_Enabled/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Null_Nullable_Enabled/TestComponent.mappings.txt index 6b3789ae474..c4cac0f1d3f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Null_Nullable_Enabled/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Null_Nullable_Enabled/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (28:0,28 [4] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (28:0,28 [4] x:\dir\subdir\Test\TestComponent.cshtml) |null| Generated Location: (895:23,0 [4] ) |null| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Nullable_Receiver/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Nullable_Receiver/TestComponent.mappings.txt index b8fd30484dd..b9ebe4d7b2b 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Nullable_Receiver/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Nullable_Receiver/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (291:9,30 [20] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (262:9,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (291:9,30 [20] x:\dir\subdir\Test\TestComponent.cshtml) |Container.RenderMode| Generated Location: (897:23,0 [20] ) |Container.RenderMode| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Ternary/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Ternary/TestComponent.mappings.txt index 1a1c9293c01..5968c23850a 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Ternary/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_Ternary/TestComponent.mappings.txt @@ -1,4 +1,9 @@ -Source Location: (30:0,30 [78] x:\dir\subdir\Test\TestComponent.cshtml) +Source Location: (1:0,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (703:19,49 [13] ) +|TestComponent| + +Source Location: (30:0,30 [78] x:\dir\subdir\Test\TestComponent.cshtml) |true ? Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer : null| Generated Location: (896:23,0 [78] ) |true ? Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer : null| diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_TypeInference/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_TypeInference/TestComponent.mappings.txt index 5a28ba16584..c01a444eb61 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_TypeInference/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/RenderMode_With_TypeInference/TestComponent.mappings.txt @@ -27,6 +27,11 @@ Generated Location: (1630:56,0 [67] ) [Parameter] public TRenderMode RenderModeParam { get; set;} | +Source Location: (100:2,1 [13] x:\dir\subdir\Test\TestComponent.cshtml) +|TestComponent| +Generated Location: (2273:73,45 [13] ) +|TestComponent| + Source Location: (144:2,45 [15] x:\dir\subdir\Test\TestComponent.cshtml) |RenderModeParam| Generated Location: (2487:77,0 [15] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/TrailingWhiteSpace_WithComponent/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/TrailingWhiteSpace_WithComponent/TestComponent.mappings.txt new file mode 100644 index 00000000000..6404ea9cae1 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/TrailingWhiteSpace_WithComponent/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (19:2,1 [18] x:\dir\subdir\Test\TestComponent.cshtml) +|SomeOtherComponent| +Generated Location: (773:20,49 [18] ) +|SomeOtherComponent| + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName/TestComponent.mappings.txt index ff36719db7e..8d67377612f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (320:11,0 [37] ) |using Microsoft.AspNetCore.Components| +Source Location: (43:2,1 [3] x:\dir\subdir\Test\TestComponent.cshtml) +|Col| +Generated Location: (799:24,49 [3] ) +|Col| + Source Location: (66:3,2 [2] x:\dir\subdir\Test\TestComponent.cshtml) | | @@ -10,6 +15,11 @@ Generated Location: (1148:32,0 [2] ) | | +Source Location: (73:4,5 [3] x:\dir\subdir\Test\TestComponent.cshtml) +|Col| +Generated Location: (1251:38,49 [3] ) +|Col| + Source Location: (77:4,9 [51] x:\dir\subdir\Test\TestComponent.cshtml) |in code block RenderFragment template = | @@ -17,6 +27,11 @@ Generated Location: (1384:42,0 [51] ) |in code block RenderFragment template = | +Source Location: (130:5,32 [3] x:\dir\subdir\Test\TestComponent.cshtml) +|Col| +Generated Location: (1574:50,54 [3] ) +|Col| + Source Location: (134:5,36 [20] x:\dir\subdir\Test\TestComponent.cshtml) |in template; | diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName_FullyQualified/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName_FullyQualified/TestComponent.mappings.txt index 3e559ac80a5..bd47bcd043f 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName_FullyQualified/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName_FullyQualified/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (320:11,0 [37] ) |using Microsoft.AspNetCore.Components| +Source Location: (43:2,1 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|Test.Col| +Generated Location: (794:24,44 [8] ) +|Test.Col| + Source Location: (76:3,2 [2] x:\dir\subdir\Test\TestComponent.cshtml) | | @@ -10,11 +15,21 @@ Generated Location: (1148:32,0 [2] ) | | +Source Location: (83:4,5 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|Test.Col| +Generated Location: (1246:38,44 [8] ) +|Test.Col| + Source Location: (118:5,0 [30] x:\dir\subdir\Test\TestComponent.cshtml) | RenderFragment template = | Generated Location: (1605:46,0 [30] ) | RenderFragment template = | +Source Location: (150:5,32 [8] x:\dir\subdir\Test\TestComponent.cshtml) +|Test.Col| +Generated Location: (1769:53,49 [8] ) +|Test.Col| + Source Location: (181:5,63 [3] x:\dir\subdir\Test\TestComponent.cshtml) |; | diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName_SelfClosing/TestComponent.mappings.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName_SelfClosing/TestComponent.mappings.txt index a2fc0fa4645..4dfb654c4b0 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName_SelfClosing/TestComponent.mappings.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/VoidTagName_SelfClosing/TestComponent.mappings.txt @@ -3,6 +3,11 @@ Generated Location: (320:11,0 [37] ) |using Microsoft.AspNetCore.Components| +Source Location: (43:2,1 [3] x:\dir\subdir\Test\TestComponent.cshtml) +|Col| +Generated Location: (799:24,49 [3] ) +|Col| + Source Location: (53:3,2 [2] x:\dir\subdir\Test\TestComponent.cshtml) | | @@ -10,11 +15,21 @@ Generated Location: (930:28,0 [2] ) | | +Source Location: (60:4,5 [3] x:\dir\subdir\Test\TestComponent.cshtml) +|Col| +Generated Location: (1033:34,49 [3] ) +|Col| + Source Location: (68:5,0 [30] x:\dir\subdir\Test\TestComponent.cshtml) | RenderFragment template = | Generated Location: (1165:38,0 [30] ) | RenderFragment template = | +Source Location: (100:5,32 [3] x:\dir\subdir\Test\TestComponent.cshtml) +|Col| +Generated Location: (1334:45,54 [3] ) +|Col| + Source Location: (106:5,38 [3] x:\dir\subdir\Test\TestComponent.cshtml) |; | diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression.cspans.txt new file mode 100644 index 00000000000..4735a170f25 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression.cspans.txt @@ -0,0 +1,6 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [92] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [92] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [92] ) +Code span at (2:0,2 [89] ) - Parent: Statement block at (0:0,0 [92] ) +MetaCode span at (91:6,0 [1] ) - Parent: Statement block at (0:0,0 [92] ) +Markup span at (92:6,1 [0] ) - Parent: Markup block at (0:0,0 [92] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression.stree.txt new file mode 100644 index 00000000000..c12ad43af9b --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression.stree.txt @@ -0,0 +1,52 @@ +RazorDocument - [0..92)::92 - [@{LF var val = 0 switchLF {LF 0 => "value",LF _ => "no value"LF };LF}] + MarkupBlock - [0..92)::92 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..92)::92 + CSharpStatement - [0..92)::92 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..92)::91 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..91)::89 + CSharpStatementLiteral - [2..91)::89 - [LF var val = 0 switchLF {LF 0 => "value",LF _ => "no value"LF };LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["value"]; + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[_]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["no value"]; + NewLine;[LF]; + Whitespace;[ ]; + RightBrace;[}]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [91..92)::1 - Gen + RightBrace;[}]; + MarkupTextLiteral - [92..92)::0 - [] - Gen + Marker;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.cspans.txt new file mode 100644 index 00000000000..c01f9850b2a --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.cspans.txt @@ -0,0 +1,4 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [86] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [86] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [86] ) +Code span at (2:0,2 [84] ) - Parent: Statement block at (0:0,0 [86] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.diag.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.diag.txt new file mode 100644 index 00000000000..bcd37730bb1 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.diag.txt @@ -0,0 +1 @@ +(1,2): Error RZ1006: The code block is missing a closing "}" character. Make sure you have a matching "}" character for all the "{" characters within this block, and that none of the "}" characters are being interpreted as markup. diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.stree.txt new file mode 100644 index 00000000000..cb8363db2ba --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_Incomplete.stree.txt @@ -0,0 +1,50 @@ +RazorDocument - [0..86)::86 - [@{LF var val = 0 switchLF {LF 0 => "value"LFLF var val2 = "value2";LF}] + MarkupBlock - [0..86)::86 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..86)::86 + CSharpStatement - [0..86)::86 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..86)::85 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..86)::84 + CSharpStatementLiteral - [2..86)::84 - [LF var val = 0 switchLF {LF 0 => "value"LFLF var val2 = "value2";LF}] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["value"]; + NewLine;[LF]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val2]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + StringLiteral;["value2"]; + Semicolon;[;]; + NewLine;[LF]; + RightBrace;[}]; + RazorMetaCode - [86..86)::0 - Gen + RightBrace;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithGreaterThan.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithGreaterThan.cspans.txt new file mode 100644 index 00000000000..419520ad9b6 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithGreaterThan.cspans.txt @@ -0,0 +1,6 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [79] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [79] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [79] ) +Code span at (2:0,2 [76] ) - Parent: Statement block at (0:0,0 [79] ) +MetaCode span at (78:5,0 [1] ) - Parent: Statement block at (0:0,0 [79] ) +Markup span at (79:5,1 [0] ) - Parent: Markup block at (0:0,0 [79] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithGreaterThan.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithGreaterThan.stree.txt new file mode 100644 index 00000000000..a55bfd990a0 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithGreaterThan.stree.txt @@ -0,0 +1,46 @@ +RazorDocument - [0..79)::79 - [@{LF var val = 0 switchLF {LF > 10 => "greater than 10"LF };LF}] + MarkupBlock - [0..79)::79 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..79)::79 + CSharpStatement - [0..79)::79 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..79)::78 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..78)::76 + CSharpStatementLiteral - [2..78)::76 - [LF var val = 0 switchLF {LF > 10 => "greater than 10"LF };LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + GreaterThan;[>]; + Whitespace;[ ]; + NumericLiteral;[10]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["greater than 10"]; + NewLine;[LF]; + Whitespace;[ ]; + RightBrace;[}]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [78..79)::1 - Gen + RightBrace;[}]; + MarkupTextLiteral - [79..79)::0 - [] - Gen + Marker;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan.cspans.txt new file mode 100644 index 00000000000..11d636f3db8 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan.cspans.txt @@ -0,0 +1,6 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [75] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [75] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [75] ) +Code span at (2:0,2 [72] ) - Parent: Statement block at (0:0,0 [75] ) +MetaCode span at (74:5,0 [1] ) - Parent: Statement block at (0:0,0 [75] ) +Markup span at (75:5,1 [0] ) - Parent: Markup block at (0:0,0 [75] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan.stree.txt new file mode 100644 index 00000000000..e0c2dcba4ad --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan.stree.txt @@ -0,0 +1,46 @@ +RazorDocument - [0..75)::75 - [@{LF var val = 0 switchLF {LF < 9 => "less than 10"LF };LF}] + MarkupBlock - [0..75)::75 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..75)::75 + CSharpStatement - [0..75)::75 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..75)::74 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..74)::72 + CSharpStatementLiteral - [2..74)::72 - [LF var val = 0 switchLF {LF < 9 => "less than 10"LF };LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + LessThan;[<]; + Whitespace;[ ]; + NumericLiteral;[9]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["less than 10"]; + NewLine;[LF]; + Whitespace;[ ]; + RightBrace;[}]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [74..75)::1 - Gen + RightBrace;[}]; + MarkupTextLiteral - [75..75)::0 - [] - Gen + Marker;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.cspans.txt new file mode 100644 index 00000000000..ef773df7ec6 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.cspans.txt @@ -0,0 +1,4 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [95] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [95] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [95] ) +Code span at (2:0,2 [93] ) - Parent: Statement block at (0:0,0 [95] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.diag.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.diag.txt new file mode 100644 index 00000000000..bcd37730bb1 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.diag.txt @@ -0,0 +1 @@ +(1,2): Error RZ1006: The code block is missing a closing "}" character. Make sure you have a matching "}" character for all the "{" characters within this block, and that none of the "}" characters are being interpreted as markup. diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.stree.txt new file mode 100644 index 00000000000..22f33697f27 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithLessThan_Incomplete.stree.txt @@ -0,0 +1,52 @@ +RazorDocument - [0..95)::95 - [@{LF var val = 0 switchLF {LF < 9 => "less than 10"LFLF var val2 = "value2";LF}] + MarkupBlock - [0..95)::95 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..95)::95 + CSharpStatement - [0..95)::95 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..95)::94 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..95)::93 + CSharpStatementLiteral - [2..95)::93 - [LF var val = 0 switchLF {LF < 9 => "less than 10"LFLF var val2 = "value2";LF}] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + LessThan;[<]; + Whitespace;[ ]; + NumericLiteral;[9]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["less than 10"]; + NewLine;[LF]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val2]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + StringLiteral;["value2"]; + Semicolon;[;]; + NewLine;[LF]; + RightBrace;[}]; + RazorMetaCode - [95..95)::0 - Gen + RightBrace;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside.cspans.txt new file mode 100644 index 00000000000..4731ba0bbe5 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside.cspans.txt @@ -0,0 +1,6 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [111] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [111] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [111] ) +Code span at (2:0,2 [108] ) - Parent: Statement block at (0:0,0 [111] ) +MetaCode span at (110:6,0 [1] ) - Parent: Statement block at (0:0,0 [111] ) +Markup span at (111:6,1 [0] ) - Parent: Markup block at (0:0,0 [111] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside.stree.txt new file mode 100644 index 00000000000..3bd30db8269 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside.stree.txt @@ -0,0 +1,68 @@ +RazorDocument - [0..111)::111 - [@{LF var val = 0 switchLF {LF 0 => some html,LF _ => "value"LF };LF}] + MarkupBlock - [0..111)::111 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..111)::111 + CSharpStatement - [0..111)::111 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..111)::110 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..110)::108 + CSharpStatementLiteral - [2..110)::108 - [LF var val = 0 switchLF {LF 0 => some html,LF _ => "value"LF };LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + LessThan;[<]; + Identifier;[span]; + GreaterThan;[>]; + Identifier;[some]; + Whitespace;[ ]; + LessThan;[<]; + Identifier;[i]; + GreaterThan;[>]; + Identifier;[html]; + LessThan;[<]; + CSharpOperator;[/]; + Identifier;[i]; + GreaterThan;[>]; + LessThan;[<]; + CSharpOperator;[/]; + Identifier;[span]; + GreaterThan;[>]; + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[_]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["value"]; + NewLine;[LF]; + Whitespace;[ ]; + RightBrace;[}]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [110..111)::1 - Gen + RightBrace;[}]; + MarkupTextLiteral - [111..111)::0 - [] - Gen + Marker;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_ViaAtSymbol.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_ViaAtSymbol.cspans.txt new file mode 100644 index 00000000000..7ec01ca859a --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_ViaAtSymbol.cspans.txt @@ -0,0 +1,17 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [110] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [110] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [110] ) +Code span at (2:0,2 [46] ) - Parent: Statement block at (0:0,0 [110] ) +Transition span at (48:3,13 [1] ) - Parent: Markup block at (48:3,13 [18] ) +Markup span at (49:3,14 [6] ) - Parent: Tag block at (49:3,14 [6] ) +Markup span at (55:3,20 [4] ) - Parent: Markup block at (48:3,13 [18] ) +Markup span at (59:3,24 [7] ) - Parent: Tag block at (59:3,24 [7] ) +Code span at (66:3,31 [16] ) - Parent: Statement block at (0:0,0 [110] ) +Transition span at (82:4,13 [1] ) - Parent: Markup block at (82:4,13 [19] ) +Markup span at (83:4,14 [6] ) - Parent: Tag block at (83:4,14 [6] ) +Markup span at (89:4,20 [3] ) - Parent: Markup block at (82:4,13 [19] ) +Markup span at (92:4,23 [7] ) - Parent: Tag block at (92:4,23 [7] ) +Markup span at (99:4,30 [2] ) - Parent: Markup block at (82:4,13 [19] ) +Code span at (101:5,0 [8] ) - Parent: Statement block at (0:0,0 [110] ) +MetaCode span at (109:6,0 [1] ) - Parent: Statement block at (0:0,0 [110] ) +Markup span at (110:6,1 [0] ) - Parent: Markup block at (0:0,0 [110] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_ViaAtSymbol.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_ViaAtSymbol.stree.txt new file mode 100644 index 00000000000..7e71ccb5aba --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_ViaAtSymbol.stree.txt @@ -0,0 +1,85 @@ +RazorDocument - [0..110)::110 - [@{LF var val = 0 switchLF {LF 0 => @zero,LF _ => @oneLF };LF}] + MarkupBlock - [0..110)::110 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..110)::110 + CSharpStatement - [0..110)::110 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..110)::109 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..109)::107 + CSharpStatementLiteral - [2..48)::46 - [LF var val = 0 switchLF {LF 0 => ] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + CSharpTemplateBlock - [48..66)::18 + MarkupBlock - [48..66)::18 + MarkupTransition - [48..49)::1 - Gen + Transition;[@]; + MarkupElement - [49..66)::17 + MarkupStartTag - [49..55)::6 - [] - Gen + OpenAngle;[<]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [55..59)::4 - [zero] - Gen + Text;[zero]; + MarkupEndTag - [59..66)::7 - [] - Gen + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[span]; + CloseAngle;[>]; + CSharpStatementLiteral - [66..82)::16 - [,LF _ => ] - Gen + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[_]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + CSharpTemplateBlock - [82..101)::19 + MarkupBlock - [82..101)::19 + MarkupTransition - [82..83)::1 - Gen + Transition;[@]; + MarkupElement - [83..99)::16 + MarkupStartTag - [83..89)::6 - [] - Gen + OpenAngle;[<]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [89..92)::3 - [one] - Gen + Text;[one]; + MarkupEndTag - [92..99)::7 - [] - Gen + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [99..101)::2 - [LF] - Gen + NewLine;[LF]; + CSharpStatementLiteral - [101..109)::8 - [ };LF] - Gen + Whitespace;[ ]; + RightBrace;[}]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [109..110)::1 - Gen + RightBrace;[}]; + MarkupTextLiteral - [110..110)::0 - [] - Gen + Marker;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_WithLessThan.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_WithLessThan.cspans.txt new file mode 100644 index 00000000000..9abc93e8674 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_WithLessThan.cspans.txt @@ -0,0 +1,17 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [123] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [123] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [123] ) +Code span at (2:0,2 [49] ) - Parent: Statement block at (0:0,0 [123] ) +Transition span at (51:3,16 [1] ) - Parent: Markup block at (51:3,16 [26] ) +Markup span at (52:3,17 [6] ) - Parent: Tag block at (52:3,17 [6] ) +Markup span at (58:3,23 [12] ) - Parent: Markup block at (51:3,16 [26] ) +Markup span at (70:3,35 [7] ) - Parent: Tag block at (70:3,35 [7] ) +Code span at (77:3,42 [16] ) - Parent: Statement block at (0:0,0 [123] ) +Transition span at (93:4,13 [1] ) - Parent: Markup block at (93:4,13 [21] ) +Markup span at (94:4,14 [6] ) - Parent: Tag block at (94:4,14 [6] ) +Markup span at (100:4,20 [5] ) - Parent: Markup block at (93:4,13 [21] ) +Markup span at (105:4,25 [7] ) - Parent: Tag block at (105:4,25 [7] ) +Markup span at (112:4,32 [2] ) - Parent: Markup block at (93:4,13 [21] ) +Code span at (114:5,0 [8] ) - Parent: Statement block at (0:0,0 [123] ) +MetaCode span at (122:6,0 [1] ) - Parent: Statement block at (0:0,0 [123] ) +Markup span at (123:6,1 [0] ) - Parent: Markup block at (0:0,0 [123] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_WithLessThan.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_WithLessThan.stree.txt new file mode 100644 index 00000000000..c77d1d81932 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMarkupInside_WithLessThan.stree.txt @@ -0,0 +1,91 @@ +RazorDocument - [0..123)::123 - [@{LF var val = 0 switchLF {LF < 10 => @less than 10,LF _ => @otherLF };LF}] + MarkupBlock - [0..123)::123 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..123)::123 + CSharpStatement - [0..123)::123 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..123)::122 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..122)::120 + CSharpStatementLiteral - [2..51)::49 - [LF var val = 0 switchLF {LF < 10 => ] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + LessThan;[<]; + Whitespace;[ ]; + NumericLiteral;[10]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + CSharpTemplateBlock - [51..77)::26 + MarkupBlock - [51..77)::26 + MarkupTransition - [51..52)::1 - Gen + Transition;[@]; + MarkupElement - [52..77)::25 + MarkupStartTag - [52..58)::6 - [] - Gen + OpenAngle;[<]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [58..70)::12 - [less than 10] - Gen + Text;[less]; + Whitespace;[ ]; + Text;[than]; + Whitespace;[ ]; + Text;[10]; + MarkupEndTag - [70..77)::7 - [] - Gen + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[span]; + CloseAngle;[>]; + CSharpStatementLiteral - [77..93)::16 - [,LF _ => ] - Gen + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[_]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + CSharpTemplateBlock - [93..114)::21 + MarkupBlock - [93..114)::21 + MarkupTransition - [93..94)::1 - Gen + Transition;[@]; + MarkupElement - [94..112)::18 + MarkupStartTag - [94..100)::6 - [] - Gen + OpenAngle;[<]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [100..105)::5 - [other] - Gen + Text;[other]; + MarkupEndTag - [105..112)::7 - [] - Gen + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [112..114)::2 - [LF] - Gen + NewLine;[LF]; + CSharpStatementLiteral - [114..122)::8 - [ };LF] - Gen + Whitespace;[ ]; + RightBrace;[}]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [122..123)::1 - Gen + RightBrace;[}]; + MarkupTextLiteral - [123..123)::0 - [] - Gen + Marker;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMultipleComparisons.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMultipleComparisons.cspans.txt new file mode 100644 index 00000000000..6c30f50644f --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMultipleComparisons.cspans.txt @@ -0,0 +1,6 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [141] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [141] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [141] ) +Code span at (2:0,2 [138] ) - Parent: Statement block at (0:0,0 [141] ) +MetaCode span at (140:7,0 [1] ) - Parent: Statement block at (0:0,0 [141] ) +Markup span at (141:7,1 [0] ) - Parent: Markup block at (0:0,0 [141] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMultipleComparisons.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMultipleComparisons.stree.txt new file mode 100644 index 00000000000..26350dfd805 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithMultipleComparisons.stree.txt @@ -0,0 +1,64 @@ +RazorDocument - [0..141)::141 - [@{LF var val = 0 switchLF {LF < 9 => "less than 10",LF 10 => "equal to 10",LF > 10 => "greater than 10"LF };LF}] + MarkupBlock - [0..141)::141 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..141)::141 + CSharpStatement - [0..141)::141 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..141)::140 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..140)::138 + CSharpStatementLiteral - [2..140)::138 - [LF var val = 0 switchLF {LF < 9 => "less than 10",LF 10 => "equal to 10",LF > 10 => "greater than 10"LF };LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[switch]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + LessThan;[<]; + Whitespace;[ ]; + NumericLiteral;[9]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["less than 10"]; + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[10]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["equal to 10"]; + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + GreaterThan;[>]; + Whitespace;[ ]; + NumericLiteral;[10]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["greater than 10"]; + NewLine;[LF]; + Whitespace;[ ]; + RightBrace;[}]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [140..141)::1 - Gen + RightBrace;[}]; + MarkupTextLiteral - [141..141)::0 - [] - Gen + Marker;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword.cspans.txt new file mode 100644 index 00000000000..c7077e09573 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword.cspans.txt @@ -0,0 +1,6 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [65] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [65] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [65] ) +Code span at (2:0,2 [62] ) - Parent: Statement block at (0:0,0 [65] ) +MetaCode span at (64:5,0 [1] ) - Parent: Statement block at (0:0,0 [65] ) +Markup span at (65:5,1 [0] ) - Parent: Markup block at (0:0,0 [65] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword.stree.txt new file mode 100644 index 00000000000..0c6a1ab1dea --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword.stree.txt @@ -0,0 +1,44 @@ +RazorDocument - [0..65)::65 - [@{LF var val = 0 usingLF {LF 0 => "value"LF };LF}] + MarkupBlock - [0..65)::65 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..65)::65 + CSharpStatement - [0..65)::65 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..65)::64 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..64)::62 + CSharpStatementLiteral - [2..64)::62 - [LF var val = 0 usingLF {LF 0 => "value"LF };LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[using]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["value"]; + NewLine;[LF]; + Whitespace;[ ]; + RightBrace;[}]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [64..65)::1 - Gen + RightBrace;[}]; + MarkupTextLiteral - [65..65)::0 - [] - Gen + Marker;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.cspans.txt new file mode 100644 index 00000000000..f8ab6e1670e --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.cspans.txt @@ -0,0 +1,9 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [75] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [75] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [75] ) +Code span at (2:0,2 [32] ) - Parent: Statement block at (0:0,0 [75] ) +Markup span at (34:3,0 [9] ) - Parent: Markup block at (34:3,0 [41] ) +Markup span at (43:3,9 [1] ) - Parent: Tag block at (43:3,9 [6] ) +Markup span at (44:3,10 [4] ) - Parent: Markup block at (44:3,10 [4] ) +Markup span at (48:3,14 [1] ) - Parent: Tag block at (43:3,9 [6] ) +Markup span at (49:3,15 [26] ) - Parent: Markup block at (34:3,0 [41] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.diag.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.diag.txt new file mode 100644 index 00000000000..38f0aa59af9 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.diag.txt @@ -0,0 +1,2 @@ +(1,2): Error RZ1006: The code block is missing a closing "}" character. Make sure you have a matching "}" character for all the "{" characters within this block, and that none of the "}" characters are being interpreted as markup. +(4,11): Error RZ1025: The "" element was not closed. All elements must be either self-closing or have a matching end tag. diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.stree.txt new file mode 100644 index 00000000000..aa7b280ad89 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpBlockTest/SwitchExpression_WithWrongKeyword_AndLessThan.stree.txt @@ -0,0 +1,61 @@ +RazorDocument - [0..75)::75 - [@{LF var val = 0 usingLF {LF < 9 => "less than 10"LF };LF}] + MarkupBlock - [0..75)::75 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..75)::75 + CSharpStatement - [0..75)::75 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..75)::74 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..75)::73 + CSharpStatementLiteral - [2..34)::32 - [LF var val = 0 usingLF {LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[val]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[0]; + Whitespace;[ ]; + Keyword;[using]; + NewLine;[LF]; + Whitespace;[ ]; + LeftBrace;[{]; + NewLine;[LF]; + MarkupBlock - [34..75)::41 + MarkupTextLiteral - [34..43)::9 - [ ] - Gen + Whitespace;[ ]; + MarkupElement - [43..75)::32 + MarkupStartTag - [43..49)::6 - [< 9 =>] - Gen + OpenAngle;[<]; + Text;[]; + MarkupAttributeBlock - [44..48)::4 - [ 9 =] + MarkupTextLiteral - [44..45)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [45..46)::1 - [9] - Gen + Text;[9]; + MarkupTextLiteral - [46..47)::1 - [ ] - Gen + Whitespace;[ ]; + Equals;[=]; + CloseAngle;[>]; + MarkupTextLiteral - [49..75)::26 - [ "less than 10"LF };LF}] - Gen + Whitespace;[ ]; + DoubleQuote;["]; + Text;[less]; + Whitespace;[ ]; + Text;[than]; + Whitespace;[ ]; + Text;[10]; + DoubleQuote;["]; + NewLine;[LF]; + Whitespace;[ ]; + Text;[};]; + NewLine;[LF]; + Text;[}]; + RazorMetaCode - [75..75)::0 - Gen + RightBrace;[]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression.cspans.txt new file mode 100644 index 00000000000..36f15ecb9d1 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression.cspans.txt @@ -0,0 +1,10 @@ +Markup span at (0:0,0 [6] ) - Parent: Tag block at (0:0,0 [6] ) +Transition span at (6:0,6 [1] ) - Parent: Expression block at (6:0,6 [55] ) +MetaCode span at (7:0,7 [1] ) - Parent: Expression block at (6:0,6 [55] ) +Code span at (8:0,8 [52] ) - Parent: Expression block at (6:0,6 [55] ) +MetaCode span at (60:3,1 [1] ) - Parent: Expression block at (6:0,6 [55] ) +Markup span at (61:3,2 [7] ) - Parent: Tag block at (61:3,2 [7] ) +Markup span at (68:3,9 [4] ) - Parent: Markup block at (0:0,0 [109] ) +Transition span at (72:5,0 [1] ) - Parent: Expression block at (72:5,0 [5] ) +Code span at (73:5,1 [4] ) - Parent: Expression block at (72:5,0 [5] ) +Markup span at (77:5,5 [32] ) - Parent: Markup block at (0:0,0 [109] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression.stree.txt new file mode 100644 index 00000000000..55d1ff488cb --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression.stree.txt @@ -0,0 +1,71 @@ +RazorDocument - [0..109)::109 - [@(value switch{LF 10 => "ten",LF _ => "other"LF})LFLF@code{LF public int value = 10;LF}] + MarkupBlock - [0..109)::109 + MarkupElement - [0..68)::68 + MarkupStartTag - [0..6)::6 - [] - Gen + OpenAngle;[<]; + Text;[span]; + CloseAngle;[>]; + CSharpCodeBlock - [6..61)::55 + CSharpExplicitExpression - [6..61)::55 + CSharpTransition - [6..7)::1 - Gen + Transition;[@]; + CSharpExplicitExpressionBody - [7..61)::54 + RazorMetaCode - [7..8)::1 - Gen + LeftParenthesis;[(]; + CSharpCodeBlock - [8..60)::52 + CSharpExpressionLiteral - [8..60)::52 - [value switch{LF 10 => "ten",LF _ => "other"LF}] - Gen + Identifier;[value]; + Whitespace;[ ]; + Keyword;[switch]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[10]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["ten"]; + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[_]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["other"]; + NewLine;[LF]; + RightBrace;[}]; + RazorMetaCode - [60..61)::1 - Gen + RightParenthesis;[)]; + MarkupEndTag - [61..68)::7 - [] - Gen + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [68..72)::4 - [LFLF] - Gen + NewLine;[LF]; + NewLine;[LF]; + CSharpCodeBlock - [72..77)::5 + CSharpImplicitExpression - [72..77)::5 + CSharpTransition - [72..73)::1 - Gen + Transition;[@]; + CSharpImplicitExpressionBody - [73..77)::4 + CSharpCodeBlock - [73..77)::4 + CSharpExpressionLiteral - [73..77)::4 - [code] - Gen + Identifier;[code]; + MarkupTextLiteral - [77..109)::32 - [{LF public int value = 10;LF}] - Gen + Text;[{]; + NewLine;[LF]; + Whitespace;[ ]; + Text;[public]; + Whitespace;[ ]; + Text;[int]; + Whitespace;[ ]; + Text;[value]; + Whitespace;[ ]; + Equals;[=]; + Whitespace;[ ]; + Text;[10;]; + NewLine;[LF]; + Text;[}]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithHtml.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithHtml.cspans.txt new file mode 100644 index 00000000000..eb6c6326224 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithHtml.cspans.txt @@ -0,0 +1,10 @@ +Markup span at (0:0,0 [6] ) - Parent: Tag block at (0:0,0 [6] ) +Transition span at (6:0,6 [1] ) - Parent: Expression block at (6:0,6 [66] ) +MetaCode span at (7:0,7 [1] ) - Parent: Expression block at (6:0,6 [66] ) +Code span at (8:0,8 [63] ) - Parent: Expression block at (6:0,6 [66] ) +MetaCode span at (71:3,1 [1] ) - Parent: Expression block at (6:0,6 [66] ) +Markup span at (72:3,2 [7] ) - Parent: Tag block at (72:3,2 [7] ) +Markup span at (79:3,9 [4] ) - Parent: Markup block at (0:0,0 [120] ) +Transition span at (83:5,0 [1] ) - Parent: Expression block at (83:5,0 [5] ) +Code span at (84:5,1 [4] ) - Parent: Expression block at (83:5,0 [5] ) +Markup span at (88:5,5 [32] ) - Parent: Markup block at (0:0,0 [120] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithHtml.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithHtml.stree.txt new file mode 100644 index 00000000000..498c07c5c23 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithHtml.stree.txt @@ -0,0 +1,78 @@ +RazorDocument - [0..120)::120 - [@(value switch{LF 10 => ten,LF _ => "other"LF})LFLF@code{LF public int value = 10;LF}] + MarkupBlock - [0..120)::120 + MarkupElement - [0..79)::79 + MarkupStartTag - [0..6)::6 - [] - Gen + OpenAngle;[<]; + Text;[span]; + CloseAngle;[>]; + CSharpCodeBlock - [6..72)::66 + CSharpExplicitExpression - [6..72)::66 + CSharpTransition - [6..7)::1 - Gen + Transition;[@]; + CSharpExplicitExpressionBody - [7..72)::65 + RazorMetaCode - [7..8)::1 - Gen + LeftParenthesis;[(]; + CSharpCodeBlock - [8..71)::63 + CSharpExpressionLiteral - [8..71)::63 - [value switch{LF 10 => ten,LF _ => "other"LF}] - Gen + Identifier;[value]; + Whitespace;[ ]; + Keyword;[switch]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[10]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + LessThan;[<]; + Identifier;[span]; + GreaterThan;[>]; + Identifier;[ten]; + LessThan;[<]; + CSharpOperator;[/]; + Identifier;[span]; + GreaterThan;[>]; + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[_]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["other"]; + NewLine;[LF]; + RightBrace;[}]; + RazorMetaCode - [71..72)::1 - Gen + RightParenthesis;[)]; + MarkupEndTag - [72..79)::7 - [] - Gen + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [79..83)::4 - [LFLF] - Gen + NewLine;[LF]; + NewLine;[LF]; + CSharpCodeBlock - [83..88)::5 + CSharpImplicitExpression - [83..88)::5 + CSharpTransition - [83..84)::1 - Gen + Transition;[@]; + CSharpImplicitExpressionBody - [84..88)::4 + CSharpCodeBlock - [84..88)::4 + CSharpExpressionLiteral - [84..88)::4 - [code] - Gen + Identifier;[code]; + MarkupTextLiteral - [88..120)::32 - [{LF public int value = 10;LF}] - Gen + Text;[{]; + NewLine;[LF]; + Whitespace;[ ]; + Text;[public]; + Whitespace;[ ]; + Text;[int]; + Whitespace;[ ]; + Text;[value]; + Whitespace;[ ]; + Equals;[=]; + Whitespace;[ ]; + Text;[10;]; + NewLine;[LF]; + Text;[}]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithLessThan.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithLessThan.cspans.txt new file mode 100644 index 00000000000..3fda7945558 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithLessThan.cspans.txt @@ -0,0 +1,10 @@ +Markup span at (0:0,0 [6] ) - Parent: Tag block at (0:0,0 [6] ) +Transition span at (6:0,6 [1] ) - Parent: Expression block at (6:0,6 [81] ) +MetaCode span at (7:0,7 [1] ) - Parent: Expression block at (6:0,6 [81] ) +Code span at (8:0,8 [78] ) - Parent: Expression block at (6:0,6 [81] ) +MetaCode span at (86:4,1 [1] ) - Parent: Expression block at (6:0,6 [81] ) +Markup span at (87:4,2 [7] ) - Parent: Tag block at (87:4,2 [7] ) +Markup span at (94:4,9 [4] ) - Parent: Markup block at (0:0,0 [135] ) +Transition span at (98:6,0 [1] ) - Parent: Expression block at (98:6,0 [5] ) +Code span at (99:6,1 [4] ) - Parent: Expression block at (98:6,0 [5] ) +Markup span at (103:6,5 [32] ) - Parent: Markup block at (0:0,0 [135] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithLessThan.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithLessThan.stree.txt new file mode 100644 index 00000000000..df30587b92d --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/CSharpExplicitExpressionTest/SwitchExpression_WithLessThan.stree.txt @@ -0,0 +1,81 @@ +RazorDocument - [0..135)::135 - [@(value switch{LF < 10 => "less than",LF 10 => "ten",LF _ => "other"LF})LFLF@code{LF public int value = 10;LF}] + MarkupBlock - [0..135)::135 + MarkupElement - [0..94)::94 + MarkupStartTag - [0..6)::6 - [] - Gen + OpenAngle;[<]; + Text;[span]; + CloseAngle;[>]; + CSharpCodeBlock - [6..87)::81 + CSharpExplicitExpression - [6..87)::81 + CSharpTransition - [6..7)::1 - Gen + Transition;[@]; + CSharpExplicitExpressionBody - [7..87)::80 + RazorMetaCode - [7..8)::1 - Gen + LeftParenthesis;[(]; + CSharpCodeBlock - [8..86)::78 + CSharpExpressionLiteral - [8..86)::78 - [value switch{LF < 10 => "less than",LF 10 => "ten",LF _ => "other"LF}] - Gen + Identifier;[value]; + Whitespace;[ ]; + Keyword;[switch]; + LeftBrace;[{]; + NewLine;[LF]; + Whitespace;[ ]; + LessThan;[<]; + Whitespace;[ ]; + NumericLiteral;[10]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["less than"]; + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + NumericLiteral;[10]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["ten"]; + Comma;[,]; + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[_]; + Whitespace;[ ]; + CSharpOperator;[=>]; + Whitespace;[ ]; + StringLiteral;["other"]; + NewLine;[LF]; + RightBrace;[}]; + RazorMetaCode - [86..87)::1 - Gen + RightParenthesis;[)]; + MarkupEndTag - [87..94)::7 - [] - Gen + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[span]; + CloseAngle;[>]; + MarkupTextLiteral - [94..98)::4 - [LFLF] - Gen + NewLine;[LF]; + NewLine;[LF]; + CSharpCodeBlock - [98..103)::5 + CSharpImplicitExpression - [98..103)::5 + CSharpTransition - [98..99)::1 - Gen + Transition;[@]; + CSharpImplicitExpressionBody - [99..103)::4 + CSharpCodeBlock - [99..103)::4 + CSharpExpressionLiteral - [99..103)::4 - [code] - Gen + Identifier;[code]; + MarkupTextLiteral - [103..135)::32 - [{LF public int value = 10;LF}] - Gen + Text;[{]; + NewLine;[LF]; + Whitespace;[ ]; + Text;[public]; + Whitespace;[ ]; + Text;[int]; + Whitespace;[ ]; + Text;[value]; + Whitespace;[ ]; + Equals;[=]; + Whitespace;[ ]; + Text;[10;]; + NewLine;[LF]; + Text;[}]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.cspans.txt new file mode 100644 index 00000000000..9ac95d543e0 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.cspans.txt @@ -0,0 +1,13 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [115] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [22] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [22] ) +Code span at (2:0,2 [19] ) - Parent: Statement block at (0:0,0 [22] ) +MetaCode span at (21:2,0 [1] ) - Parent: Statement block at (0:0,0 [22] ) +Markup span at (22:2,1 [2] ) - Parent: Markup block at (0:0,0 [115] ) +Markup span at (41:3,17 [9] ) - Parent: Tag block at (24:3,0 [91] ) +Markup span at (73:3,49 [5] ) - Parent: Tag block at (24:3,0 [91] ) +Markup span at (89:3,65 [7] ) - Parent: Markup block at (89:3,65 [11] ) +Transition span at (96:3,72 [1] ) - Parent: Expression block at (96:3,72 [3] ) +Code span at (97:3,73 [2] ) - Parent: Expression block at (96:3,72 [3] ) +Markup span at (99:3,75 [1] ) - Parent: Markup block at (89:3,65 [11] ) +Markup span at (102:3,78 [7] ) - Parent: Tag block at (24:3,0 [91] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.stree.txt new file mode 100644 index 00000000000..611041fb169 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.stree.txt @@ -0,0 +1,97 @@ +RazorDocument - [0..115)::115 - [@{LF var id = 5;LF}LF
                  Content
                  ] + MarkupBlock - [0..115)::115 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..22)::22 + CSharpStatement - [0..22)::22 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..22)::21 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..21)::19 + CSharpStatementLiteral - [2..21)::19 - [LF var id = 5;LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[id]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[5]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [21..22)::1 - Gen + RightBrace;[}]; + MarkupEphemeralTextLiteral - [22..24)::2 - [LF] - Gen + NewLine;[LF]; + MarkupTagHelperElement - [24..115)::91 - div[StartTagAndEndTag] - ControlIdTagHelper + MarkupTagHelperStartTag - [24..102)::78 - [
                  ] - Gen + OpenAngle;[<]; + Text;[div]; + MarkupTagHelperAttribute - [28..51)::23 - control-id - DoubleQuotes - Bound - [ control-id="container"] + MarkupTextLiteral - [28..29)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [29..39)::10 - [control-id] - Gen + Text;[control-id]; + Equals;[=]; + MarkupTextLiteral - [40..41)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [41..50)::9 + MarkupTextLiteral - [41..50)::9 - [container] - Gen + Text;[container]; + MarkupTextLiteral - [50..51)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttribute - [51..79)::28 - is-confirm-redirect - DoubleQuotes - Bound - [ is-confirm-redirect="false"] + MarkupTextLiteral - [51..52)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [52..71)::19 - [is-confirm-redirect] - Gen + Text;[is-confirm-redirect]; + Equals;[=]; + MarkupTextLiteral - [72..73)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [73..78)::5 + MarkupTextLiteral - [73..78)::5 - [false] - Gen + Text;[false]; + MarkupTextLiteral - [78..79)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTextLiteral - [79..80)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupEphemeralTextLiteral - [80..81)::1 - [@] - Gen + Transition;[@]; + MarkupTagHelperAttribute - [81..101)::20 - @click - DoubleQuotes - Unbound - [@click="action(@id)"] + MarkupTextLiteral - [81..87)::6 - [@click] - Gen + Transition;[@]; + Text;[click]; + Equals;[=]; + MarkupTextLiteral - [88..89)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [89..100)::11 + MarkupLiteralAttributeValue - [89..96)::7 - [action(] + MarkupTextLiteral - [89..96)::7 - [action(] - Gen + Text;[action(]; + MarkupDynamicAttributeValue - [96..99)::3 - [@id] + GenericBlock - [96..99)::3 + CSharpCodeBlock - [96..99)::3 + CSharpImplicitExpression - [96..99)::3 + CSharpTransition - [96..97)::1 - Gen + Transition;[@]; + CSharpImplicitExpressionBody - [97..99)::2 + CSharpCodeBlock - [97..99)::2 + CSharpExpressionLiteral - [97..99)::2 - [id] - Gen + Identifier;[id]; + MarkupLiteralAttributeValue - [99..100)::1 - [)] + MarkupTextLiteral - [99..100)::1 - [)] - Gen + Text;[)]; + MarkupTextLiteral - [100..101)::1 - ["] - Gen + DoubleQuote;["]; + CloseAngle;[>]; + MarkupTextLiteral - [102..109)::7 - [Content] - Gen + Text;[Content]; + MarkupTagHelperEndTag - [109..115)::6 - [
                  ] + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[div]; + CloseAngle;[>]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.tspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.tspans.txt new file mode 100644 index 00000000000..a7f9e5a02f9 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_AtEnd.tspans.txt @@ -0,0 +1 @@ +TagHelper span at (24:3,0 [91] ) - ControlIdTagHelper diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.cspans.txt new file mode 100644 index 00000000000..06a17681f29 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.cspans.txt @@ -0,0 +1,12 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [105] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [29] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [29] ) +Code span at (2:0,2 [26] ) - Parent: Statement block at (0:0,0 [29] ) +MetaCode span at (28:2,0 [1] ) - Parent: Statement block at (0:0,0 [29] ) +Markup span at (29:2,1 [2] ) - Parent: Markup block at (0:0,0 [105] ) +Markup span at (48:3,17 [9] ) - Parent: Markup block at (48:3,17 [14] ) +Transition span at (57:3,26 [1] ) - Parent: Expression block at (57:3,26 [4] ) +Code span at (58:3,27 [3] ) - Parent: Expression block at (57:3,26 [4] ) +Markup span at (61:3,30 [1] ) - Parent: Markup block at (48:3,17 [14] ) +Markup span at (76:3,45 [10] ) - Parent: Tag block at (31:3,0 [74] ) +Markup span at (88:3,57 [8] ) - Parent: Tag block at (31:3,0 [74] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.stree.txt new file mode 100644 index 00000000000..17d8de33de7 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.stree.txt @@ -0,0 +1,84 @@ +RazorDocument - [0..105)::105 - [@{LF var url = "Tasks";LF}LF] + MarkupBlock - [0..105)::105 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..29)::29 + CSharpStatement - [0..29)::29 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..29)::28 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..28)::26 + CSharpStatementLiteral - [2..28)::26 - [LF var url = "Tasks";LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[url]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + StringLiteral;["Tasks"]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [28..29)::1 - Gen + RightBrace;[}]; + MarkupEphemeralTextLiteral - [29..31)::2 - [LF] - Gen + NewLine;[LF]; + MarkupTagHelperElement - [31..105)::74 - button[StartTagAndEndTag] - ControlIdTagHelper + MarkupTagHelperStartTag - [31..88)::57 - [] + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[button]; + CloseAngle;[>]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.tspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.tspans.txt new file mode 100644 index 00000000000..29f5708c3a0 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_BoundAttributeFollows.tspans.txt @@ -0,0 +1 @@ +TagHelper span at (31:3,0 [74] ) - ControlIdTagHelper diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.cspans.txt new file mode 100644 index 00000000000..8e028c79bd0 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.cspans.txt @@ -0,0 +1,13 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [138] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [33] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [33] ) +Code span at (2:0,2 [30] ) - Parent: Statement block at (0:0,0 [33] ) +MetaCode span at (32:2,0 [1] ) - Parent: Statement block at (0:0,0 [33] ) +Markup span at (33:2,1 [2] ) - Parent: Markup block at (0:0,0 [138] ) +Markup span at (49:3,14 [15] ) - Parent: Markup block at (49:3,14 [29] ) +Transition span at (64:3,29 [1] ) - Parent: Expression block at (64:3,29 [13] ) +Code span at (65:3,30 [12] ) - Parent: Expression block at (64:3,29 [13] ) +Markup span at (77:3,42 [1] ) - Parent: Markup block at (49:3,14 [29] ) +Markup span at (101:3,66 [4] ) - Parent: Tag block at (35:3,0 [103] ) +Markup span at (119:3,84 [4] ) - Parent: Tag block at (35:3,0 [103] ) +Markup span at (125:3,90 [7] ) - Parent: Tag block at (35:3,0 [103] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.stree.txt new file mode 100644 index 00000000000..f7f6ba2a8f8 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.stree.txt @@ -0,0 +1,97 @@ +RazorDocument - [0..138)::138 - [@{LF var functionCode = 10;LF}LF
                  Content
                  ] + MarkupBlock - [0..138)::138 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..33)::33 + CSharpStatement - [0..33)::33 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..33)::32 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..32)::30 + CSharpStatementLiteral - [2..32)::30 - [LF var functionCode = 10;LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[functionCode]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[10]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [32..33)::1 - Gen + RightBrace;[}]; + MarkupEphemeralTextLiteral - [33..35)::2 - [LF] - Gen + NewLine;[LF]; + MarkupTagHelperElement - [35..138)::103 - div[StartTagAndEndTag] - ControlIdTagHelper + MarkupTagHelperStartTag - [35..125)::90 - [
                  ] - Gen + OpenAngle;[<]; + Text;[div]; + MarkupTextLiteral - [39..40)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupEphemeralTextLiteral - [40..41)::1 - [@] - Gen + Transition;[@]; + MarkupTagHelperAttribute - [41..79)::38 - @click - DoubleQuotes - Unbound - [@click="switchFunction(@functionCode)"] + MarkupTextLiteral - [41..47)::6 - [@click] - Gen + Transition;[@]; + Text;[click]; + Equals;[=]; + MarkupTextLiteral - [48..49)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [49..78)::29 + MarkupLiteralAttributeValue - [49..64)::15 - [switchFunction(] + MarkupTextLiteral - [49..64)::15 - [switchFunction(] - Gen + Text;[switchFunction(]; + MarkupDynamicAttributeValue - [64..77)::13 - [@functionCode] + GenericBlock - [64..77)::13 + CSharpCodeBlock - [64..77)::13 + CSharpImplicitExpression - [64..77)::13 + CSharpTransition - [64..65)::1 - Gen + Transition;[@]; + CSharpImplicitExpressionBody - [65..77)::12 + CSharpCodeBlock - [65..77)::12 + CSharpExpressionLiteral - [65..77)::12 - [functionCode] - Gen + Identifier;[functionCode]; + MarkupLiteralAttributeValue - [77..78)::1 - [)] + MarkupTextLiteral - [77..78)::1 - [)] - Gen + Text;[)]; + MarkupTextLiteral - [78..79)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttribute - [79..106)::27 - is-confirm-redirect - DoubleQuotes - Bound - [ is-confirm-redirect="true"] + MarkupTextLiteral - [79..80)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [80..99)::19 - [is-confirm-redirect] - Gen + Text;[is-confirm-redirect]; + Equals;[=]; + MarkupTextLiteral - [100..101)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [101..105)::4 + MarkupTextLiteral - [101..105)::4 - [true] - Gen + Text;[true]; + MarkupTextLiteral - [105..106)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttribute - [106..124)::18 - control-id - DoubleQuotes - Bound - [ control-id="test"] + MarkupTextLiteral - [106..107)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [107..117)::10 - [control-id] - Gen + Text;[control-id]; + Equals;[=]; + MarkupTextLiteral - [118..119)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [119..123)::4 + MarkupTextLiteral - [119..123)::4 - [test] - Gen + Text;[test]; + MarkupTextLiteral - [123..124)::1 - ["] - Gen + DoubleQuote;["]; + CloseAngle;[>]; + MarkupTextLiteral - [125..132)::7 - [Content] - Gen + Text;[Content]; + MarkupTagHelperEndTag - [132..138)::6 - [
                  ] + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[div]; + CloseAngle;[>]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.tspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.tspans.txt new file mode 100644 index 00000000000..2e2795a87d1 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_DoesNotSwallowFollowingAttributes.tspans.txt @@ -0,0 +1 @@ +TagHelper span at (35:3,0 [103] ) - ControlIdTagHelper diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.cspans.txt new file mode 100644 index 00000000000..a9d2b9f9b36 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.cspans.txt @@ -0,0 +1,12 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [124] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [26] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [26] ) +Code span at (2:0,2 [23] ) - Parent: Statement block at (0:0,0 [26] ) +MetaCode span at (25:2,0 [1] ) - Parent: Statement block at (0:0,0 [26] ) +Markup span at (26:2,1 [2] ) - Parent: Markup block at (0:0,0 [124] ) +Markup span at (58:3,30 [4] ) - Parent: Tag block at (28:3,0 [96] ) +Markup span at (75:3,47 [5] ) - Parent: Markup block at (75:3,47 [11] ) +Transition span at (80:3,52 [1] ) - Parent: Expression block at (80:3,52 [6] ) +Code span at (81:3,53 [5] ) - Parent: Expression block at (80:3,52 [6] ) +Markup span at (100:3,72 [8] ) - Parent: Tag block at (28:3,0 [96] ) +Markup span at (110:3,82 [4] ) - Parent: Tag block at (28:3,0 [96] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.stree.txt new file mode 100644 index 00000000000..9c4146564ca --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.stree.txt @@ -0,0 +1,94 @@ +RazorDocument - [0..124)::124 - [@{LF var value = 42;LF}LF
                  Text
                  ] + MarkupBlock - [0..124)::124 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..26)::26 + CSharpStatement - [0..26)::26 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..26)::25 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..25)::23 + CSharpStatementLiteral - [2..25)::23 - [LF var value = 42;LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[value]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[42]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [25..26)::1 - Gen + RightBrace;[}]; + MarkupEphemeralTextLiteral - [26..28)::2 - [LF] - Gen + NewLine;[LF]; + MarkupTagHelperElement - [28..124)::96 - section[StartTagAndEndTag] - ControlIdTagHelper + MarkupTagHelperStartTag - [28..110)::82 - [
                  ] - Gen + OpenAngle;[<]; + Text;[section]; + MarkupTagHelperAttribute - [36..63)::27 - is-confirm-redirect - DoubleQuotes - Bound - [ is-confirm-redirect="true"] + MarkupTextLiteral - [36..37)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [37..56)::19 - [is-confirm-redirect] - Gen + Text;[is-confirm-redirect]; + Equals;[=]; + MarkupTextLiteral - [57..58)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [58..62)::4 + MarkupTextLiteral - [58..62)::4 - [true] - Gen + Text;[true]; + MarkupTextLiteral - [62..63)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTextLiteral - [63..64)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupEphemeralTextLiteral - [64..65)::1 - [@] - Gen + Transition;[@]; + MarkupTagHelperAttribute - [65..87)::22 - @data-id - DoubleQuotes - Unbound - [@data-id="item_@value"] + MarkupTextLiteral - [65..73)::8 - [@data-id] - Gen + Transition;[@]; + Text;[data-id]; + Equals;[=]; + MarkupTextLiteral - [74..75)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [75..86)::11 + MarkupLiteralAttributeValue - [75..80)::5 - [item_] + MarkupTextLiteral - [75..80)::5 - [item_] - Gen + Text;[item_]; + MarkupDynamicAttributeValue - [80..86)::6 - [@value] + GenericBlock - [80..86)::6 + CSharpCodeBlock - [80..86)::6 + CSharpImplicitExpression - [80..86)::6 + CSharpTransition - [80..81)::1 - Gen + Transition;[@]; + CSharpImplicitExpressionBody - [81..86)::5 + CSharpCodeBlock - [81..86)::5 + CSharpExpressionLiteral - [81..86)::5 - [value] - Gen + Identifier;[value]; + MarkupTextLiteral - [86..87)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttribute - [87..109)::22 - control-id - DoubleQuotes - Bound - [ control-id="section1"] + MarkupTextLiteral - [87..88)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [88..98)::10 - [control-id] - Gen + Text;[control-id]; + Equals;[=]; + MarkupTextLiteral - [99..100)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [100..108)::8 + MarkupTextLiteral - [100..108)::8 - [section1] - Gen + Text;[section1]; + MarkupTextLiteral - [108..109)::1 - ["] - Gen + DoubleQuote;["]; + CloseAngle;[>]; + MarkupTextLiteral - [110..114)::4 - [Text] - Gen + Text;[Text]; + MarkupTagHelperEndTag - [114..124)::10 - [
                  ] + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[section]; + CloseAngle;[>]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.tspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.tspans.txt new file mode 100644 index 00000000000..7b2d26522c2 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MiddlePosition.tspans.txt @@ -0,0 +1 @@ +TagHelper span at (28:3,0 [96] ) - ControlIdTagHelper diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.cspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.cspans.txt new file mode 100644 index 00000000000..ad369afc0e3 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.cspans.txt @@ -0,0 +1,14 @@ +Markup span at (0:0,0 [0] ) - Parent: Markup block at (0:0,0 [132] ) +Transition span at (0:0,0 [1] ) - Parent: Statement block at (0:0,0 [25] ) +MetaCode span at (1:0,1 [1] ) - Parent: Statement block at (0:0,0 [25] ) +Code span at (2:0,2 [22] ) - Parent: Statement block at (0:0,0 [25] ) +MetaCode span at (24:2,0 [1] ) - Parent: Statement block at (0:0,0 [25] ) +Markup span at (25:2,1 [2] ) - Parent: Markup block at (0:0,0 [132] ) +Markup span at (42:3,15 [8] ) - Parent: Markup block at (42:3,15 [14] ) +Transition span at (50:3,23 [1] ) - Parent: Expression block at (50:3,23 [5] ) +Code span at (51:3,24 [4] ) - Parent: Expression block at (50:3,23 [5] ) +Markup span at (55:3,28 [1] ) - Parent: Markup block at (42:3,15 [14] ) +Markup span at (79:3,52 [4] ) - Parent: Tag block at (27:3,0 [105] ) +Markup span at (97:3,70 [4] ) - Parent: Tag block at (27:3,0 [105] ) +Markup span at (115:3,88 [4] ) - Parent: Tag block at (27:3,0 [105] ) +Markup span at (121:3,94 [4] ) - Parent: Tag block at (27:3,0 [105] ) diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.stree.txt new file mode 100644 index 00000000000..8ab8707d3a8 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.stree.txt @@ -0,0 +1,110 @@ +RazorDocument - [0..132)::132 - [@{LF var code = 20;LF}LFText] + MarkupBlock - [0..132)::132 + MarkupTextLiteral - [0..0)::0 - [] - Gen + Marker;[]; + CSharpCodeBlock - [0..25)::25 + CSharpStatement - [0..25)::25 + CSharpTransition - [0..1)::1 - Gen + Transition;[@]; + CSharpStatementBody - [1..25)::24 + RazorMetaCode - [1..2)::1 - Gen + LeftBrace;[{]; + CSharpCodeBlock - [2..24)::22 + CSharpStatementLiteral - [2..24)::22 - [LF var code = 20;LF] - Gen + NewLine;[LF]; + Whitespace;[ ]; + Keyword;[var]; + Whitespace;[ ]; + Identifier;[code]; + Whitespace;[ ]; + Assign;[=]; + Whitespace;[ ]; + NumericLiteral;[20]; + Semicolon;[;]; + NewLine;[LF]; + RazorMetaCode - [24..25)::1 - Gen + RightBrace;[}]; + MarkupEphemeralTextLiteral - [25..27)::2 - [LF] - Gen + NewLine;[LF]; + MarkupTagHelperElement - [27..132)::105 - span[StartTagAndEndTag] - ControlIdTagHelper + MarkupTagHelperStartTag - [27..121)::94 - [] - Gen + OpenAngle;[<]; + Text;[span]; + MarkupTextLiteral - [32..33)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupEphemeralTextLiteral - [33..34)::1 - [@] - Gen + Transition;[@]; + MarkupTagHelperAttribute - [34..57)::23 - @click - DoubleQuotes - Unbound - [@click="handler(@code)"] + MarkupTextLiteral - [34..40)::6 - [@click] - Gen + Transition;[@]; + Text;[click]; + Equals;[=]; + MarkupTextLiteral - [41..42)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [42..56)::14 + MarkupLiteralAttributeValue - [42..50)::8 - [handler(] + MarkupTextLiteral - [42..50)::8 - [handler(] - Gen + Text;[handler(]; + MarkupDynamicAttributeValue - [50..55)::5 - [@code] + GenericBlock - [50..55)::5 + CSharpCodeBlock - [50..55)::5 + CSharpImplicitExpression - [50..55)::5 + CSharpTransition - [50..51)::1 - Gen + Transition;[@]; + CSharpImplicitExpressionBody - [51..55)::4 + CSharpCodeBlock - [51..55)::4 + CSharpExpressionLiteral - [51..55)::4 - [code] - Gen + Identifier;[code]; + MarkupLiteralAttributeValue - [55..56)::1 - [)] + MarkupTextLiteral - [55..56)::1 - [)] - Gen + Text;[)]; + MarkupTextLiteral - [56..57)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttribute - [57..84)::27 - is-confirm-redirect - DoubleQuotes - Bound - [ is-confirm-redirect="true"] + MarkupTextLiteral - [57..58)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [58..77)::19 - [is-confirm-redirect] - Gen + Text;[is-confirm-redirect]; + Equals;[=]; + MarkupTextLiteral - [78..79)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [79..83)::4 + MarkupTextLiteral - [79..83)::4 - [true] - Gen + Text;[true]; + MarkupTextLiteral - [83..84)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttribute - [84..102)::18 - control-id - DoubleQuotes - Bound - [ control-id="myid"] + MarkupTextLiteral - [84..85)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [85..95)::10 - [control-id] - Gen + Text;[control-id]; + Equals;[=]; + MarkupTextLiteral - [96..97)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [97..101)::4 + MarkupTextLiteral - [97..101)::4 - [myid] - Gen + Text;[myid]; + MarkupTextLiteral - [101..102)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttribute - [102..120)::18 - data-value - DoubleQuotes - Unbound - [ data-value="test"] + MarkupTextLiteral - [102..103)::1 - [ ] - Gen + Whitespace;[ ]; + MarkupTextLiteral - [103..113)::10 - [data-value] - Gen + Text;[data-value]; + Equals;[=]; + MarkupTextLiteral - [114..115)::1 - ["] - Gen + DoubleQuote;["]; + MarkupTagHelperAttributeValue - [115..119)::4 + MarkupTextLiteral - [115..119)::4 - [test] - Gen + Text;[test]; + MarkupTextLiteral - [119..120)::1 - ["] - Gen + DoubleQuote;["]; + CloseAngle;[>]; + MarkupTextLiteral - [121..125)::4 - [Text] - Gen + Text;[Text]; + MarkupTagHelperEndTag - [125..132)::7 - [] + OpenAngle;[<]; + ForwardSlash;[/]; + Text;[span]; + CloseAngle;[>]; + EndOfFile;[]; diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.tspans.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.tspans.txt new file mode 100644 index 00000000000..ac8283198e2 --- /dev/null +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/EscapedAttributeWithUnquotedExpression_MultipleFollowingAttributes.tspans.txt @@ -0,0 +1 @@ +TagHelper span at (27:3,0 [105] ) - ControlIdTagHelper diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelper_AttributeAfterRazorComment.stree.txt b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelper_AttributeAfterRazorComment.stree.txt index 07ed19732c6..45797617537 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelper_AttributeAfterRazorComment.stree.txt +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelper_AttributeAfterRazorComment.stree.txt @@ -29,7 +29,7 @@ RazorCommentTransition;[@]; MarkupEphemeralTextLiteral - [41..43)::2 - [LF] - Gen NewLine;[LF]; - MarkupMinimizedAttributeBlock - [43..56)::13 - [ not-visible] + MarkupMinimizedTagHelperAttribute - [43..56)::13 - not-visible - Minimized - Bound - [ not-visible] MarkupTextLiteral - [43..45)::2 - [ ] - Gen Whitespace;[ ]; MarkupTextLiteral - [45..56)::11 - [not-visible] - Gen diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/BindTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/BindTagHelperDescriptorProvider.cs deleted file mode 100644 index dc14b840fbe..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/BindTagHelperDescriptorProvider.cs +++ /dev/null @@ -1,685 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.Language.Components; -using Microsoft.AspNetCore.Razor.PooledObjects; - -namespace Microsoft.CodeAnalysis.Razor; - -// Run after the component tag helper provider, because we need to see the results. -internal sealed class BindTagHelperDescriptorProvider() : TagHelperDescriptorProviderBase(order: 1000) -{ - private static readonly Lazy s_fallbackBindTagHelper = new(CreateFallbackBindTagHelper); - - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) - { - ArgHelper.ThrowIfNull(context); - - // This provider returns tag helper information for 'bind' which doesn't necessarily - // map to any real component. Bind behaviors more like a macro, which can map a single LValue to - // both a 'value' attribute and a 'value changed' attribute. - // - // User types: - // - // - // We generate: - // - // - // This isn't very different from code the user could write themselves - thus the pronouncement - // that @bind is very much like a macro. - // - // A lot of the value that provide in this case is that the associations between the - // elements, and the attributes aren't straightforward. - // - // For instance on we need to listen to 'value' and 'onchange', - // but on - // and so we have a special case for input elements and their type attributes. - // - // Additionally, our mappings tell us about cases like where - // we need to treat the value as an invariant culture value. In general the HTML5 field - // types use invariant culture values when interacting with the DOM, in contrast to - // which is free-form text and is most likely to be - // culture-sensitive. - // - // 4. For components, we have a bit of a special case. We can infer a syntax that matches - // case #2 based on property names. So if a component provides both 'Value' and 'ValueChanged' - // we will turn that into an instance of bind. - // - // So case #1 here is the most general case. Case #2 and #3 are data-driven based on attribute data - // we have. Case #4 is data-driven based on component definitions. - // - // We provide a good set of attributes that map to the HTML dom. This set is user extensible. - var compilation = context.Compilation; - - var bindMethods = compilation.GetTypeByMetadataName(ComponentsApi.BindConverter.FullTypeName); - if (bindMethods == null) - { - // If we can't find BindConverter, then just bail. We won't be able to compile the - // generated code anyway. - return; - } - - if (context.TargetAssembly is { } targetAssembly && - !SymbolEqualityComparer.Default.Equals(targetAssembly, bindMethods.ContainingAssembly)) - { - return; - } - - // Tag Helper definition for case #1. This is the most general case. - context.Results.Add(s_fallbackBindTagHelper.Value); - - var bindElementAttribute = compilation.GetTypeByMetadataName(ComponentsApi.BindElementAttribute.FullTypeName); - var bindInputElementAttribute = compilation.GetTypeByMetadataName(ComponentsApi.BindInputElementAttribute.FullTypeName); - - if (bindElementAttribute == null || bindInputElementAttribute == null) - { - // This won't likely happen, but just in case. - return; - } - - // We want to walk the compilation and its references, not the target symbol. - var collector = new Collector( - compilation, bindElementAttribute, bindInputElementAttribute); - collector.Collect(context, cancellationToken); - } - - private static TagHelperDescriptor CreateFallbackBindTagHelper() - { - using var _ = TagHelperDescriptorBuilder.GetPooledInstance( - TagHelperKind.Bind, "Bind", ComponentsApi.AssemblyName, - out var builder); - - builder.SetTypeName( - fullName: "Microsoft.AspNetCore.Components.Bind", - typeNamespace: "Microsoft.AspNetCore.Components", - typeNameIdentifier: "Bind"); - - builder.CaseSensitive = true; - builder.ClassifyAttributesOnly = true; - builder.SetDocumentation(DocumentationDescriptor.BindTagHelper_Fallback); - - builder.SetMetadata(new BindMetadata() { IsFallback = true }); - - builder.TagMatchingRule(rule => - { - rule.TagName = "*"; - rule.Attribute(attribute => - { - attribute.Name = "@bind-"; - attribute.NameComparison = RequiredAttributeNameComparison.PrefixMatch; - attribute.IsDirectiveAttribute = true; - }); - }); - - builder.BindAttribute(attribute => - { - attribute.SetDocumentation(DocumentationDescriptor.BindTagHelper_Fallback); - - var attributeName = "@bind-..."; - attribute.Name = attributeName; - attribute.AsDictionary("@bind-", typeof(object).FullName); - attribute.IsDirectiveAttribute = true; - - attribute.PropertyName = "Bind"; - - attribute.TypeName = "System.Collections.Generic.Dictionary"; - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "format"; - parameter.PropertyName = "Format"; - parameter.TypeName = typeof(string).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Fallback_Format); - }); - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "event"; - parameter.PropertyName = "Event"; - parameter.TypeName = typeof(string).FullName; - parameter.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.BindTagHelper_Fallback_Event, attributeName)); - }); - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "culture"; - parameter.PropertyName = "Culture"; - parameter.TypeName = typeof(CultureInfo).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Culture); - }); - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "get"; - parameter.PropertyName = "Get"; - parameter.TypeName = typeof(object).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Get); - parameter.BindAttributeGetSet = true; - }); - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "set"; - parameter.PropertyName = "Set"; - parameter.TypeName = typeof(Delegate).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Set); - }); - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "after"; - parameter.PropertyName = "After"; - parameter.TypeName = typeof(Delegate).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_After); - }); - }); - - return builder.Build(); - } - - private class Collector( - Compilation compilation, - INamedTypeSymbol bindElementAttribute, - INamedTypeSymbol bindInputElementAttribute) - : TagHelperCollector(compilation, targetAssembly: null) - { - protected override bool IsCandidateType(INamedTypeSymbol types) - => types.DeclaredAccessibility == Accessibility.Public && - types.Name == "BindAttributes"; - - protected override void Collect(IAssemblySymbol assembly, ICollection results, CancellationToken cancellationToken) - { - // First, collect the initial set of tag helpers from this assembly. This calls - // the Collect(INamedTypeSymbol, ...) overload below for cases #2 & #3. - base.Collect(assembly, results, cancellationToken); - - // Then, for case #4 we look at the tag helpers that were already created corresponding to components - // and pattern match on properties. - using var componentBindTagHelpers = new PooledArrayBuilder(capacity: results.Count); - - foreach (var tagHelper in results) - { - cancellationToken.ThrowIfCancellationRequested(); - - AddComponentBindTagHelpers(tagHelper, ref componentBindTagHelpers.AsRef()); - } - - foreach (var tagHelper in componentBindTagHelpers) - { - results.Add(tagHelper); - } - } - - protected override void Collect( - INamedTypeSymbol type, - ICollection results, - CancellationToken cancellationToken) - { - // Not handling duplicates here for now since we're the primary ones extending this. - // If we see users adding to the set of 'bind' constructs we will want to add deduplication - // and potentially diagnostics. - foreach (var attribute in type.GetAttributes()) - { - var constructorArguments = attribute.ConstructorArguments; - - TagHelperDescriptor? tagHelper = null; - - // For case #2 & #3 we have a whole bunch of attribute entries on BindMethods that we can use - // to data-drive the definitions of these tag helpers. - - // We need to check the constructor argument length here, because this can show up as 0 - // if the language service fails to initialize. This is an invalid case, so skip it. - if (constructorArguments.Length == 4 && SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, bindElementAttribute)) - { - tagHelper = CreateElementBindTagHelper( - typeName: type.GetDefaultDisplayString(), - typeNamespace: type.ContainingNamespace.GetFullName(), - typeNameIdentifier: type.Name, - element: (string?)constructorArguments[0].Value, - typeAttribute: null, - suffix: (string?)constructorArguments[1].Value, - valueAttribute: (string?)constructorArguments[2].Value, - changeAttribute: (string?)constructorArguments[3].Value); - } - else if (constructorArguments.Length == 4 && SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, bindInputElementAttribute)) - { - tagHelper = CreateElementBindTagHelper( - typeName: type.GetDefaultDisplayString(), - typeNamespace: type.ContainingNamespace.GetFullName(), - typeNameIdentifier: type.Name, - element: "input", - typeAttribute: (string?)constructorArguments[0].Value, - suffix: (string?)constructorArguments[1].Value, - valueAttribute: (string?)constructorArguments[2].Value, - changeAttribute: (string?)constructorArguments[3].Value); - } - else if (constructorArguments.Length == 6 && SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, bindInputElementAttribute)) - { - tagHelper = CreateElementBindTagHelper( - typeName: type.GetDefaultDisplayString(), - typeNamespace: type.ContainingNamespace.GetFullName(), - typeNameIdentifier: type.Name, - element: "input", - typeAttribute: (string?)constructorArguments[0].Value, - suffix: (string?)constructorArguments[1].Value, - valueAttribute: (string?)constructorArguments[2].Value, - changeAttribute: (string?)constructorArguments[3].Value, - isInvariantCulture: (bool?)constructorArguments[4].Value ?? false, - format: (string?)constructorArguments[5].Value); - } - - if (tagHelper is not null) - { - results.Add(tagHelper); - } - } - } - - private static TagHelperDescriptor CreateElementBindTagHelper( - string typeName, - string typeNamespace, - string typeNameIdentifier, - string? element, - string? typeAttribute, - string? suffix, - string? valueAttribute, - string? changeAttribute, - bool isInvariantCulture = false, - string? format = null) - { - string name, attributeName, formatName, formatAttributeName, eventName; - - if (suffix is { } s) - { - name = "Bind_" + s; - attributeName = "@bind-" + s; - formatName = "Format_" + s; - formatAttributeName = "format-" + s; - eventName = "Event_" + s; - } - else - { - name = "Bind"; - attributeName = "@bind"; - - suffix = valueAttribute; - formatName = "Format_" + suffix; - formatAttributeName = "format-" + suffix; - eventName = "Event_" + suffix; - } - - using var _ = TagHelperDescriptorBuilder.GetPooledInstance( - TagHelperKind.Bind, name, ComponentsApi.AssemblyName, - out var builder); - - builder.SetTypeName(typeName, typeNamespace, typeNameIdentifier); - - builder.CaseSensitive = true; - builder.ClassifyAttributesOnly = true; - builder.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.BindTagHelper_Element, - valueAttribute, - changeAttribute)); - - var metadata = new BindMetadata.Builder - { - ValueAttribute = valueAttribute, - ChangeAttribute = changeAttribute, - IsInvariantCulture = isInvariantCulture, - Format = format - }; - - if (typeAttribute != null) - { - // For entries that map to the element, we need to be able to know - // the difference between and for which we - // want to use the same attributes. - // - // We provide a tag helper for that should match all input elements, - // but we only want it to be used when a more specific one is used. - // - // Therefore we use this metadata to know which one is more specific when two - // tag helpers match. - metadata.TypeAttribute = typeAttribute; - } - - builder.SetMetadata(metadata.Build()); - - builder.TagMatchingRule(rule => - { - rule.TagName = element; - if (typeAttribute != null) - { - rule.Attribute(a => - { - a.Name = "type"; - a.NameComparison = RequiredAttributeNameComparison.FullMatch; - a.Value = typeAttribute; - a.ValueComparison = RequiredAttributeValueComparison.FullMatch; - }); - } - - rule.Attribute(a => - { - a.Name = attributeName; - a.NameComparison = RequiredAttributeNameComparison.FullMatch; - a.IsDirectiveAttribute = true; - }); - }); - - builder.TagMatchingRule(rule => - { - rule.TagName = element; - if (typeAttribute != null) - { - rule.Attribute(a => - { - a.Name = "type"; - a.NameComparison = RequiredAttributeNameComparison.FullMatch; - a.Value = typeAttribute; - a.ValueComparison = RequiredAttributeValueComparison.FullMatch; - }); - } - - rule.Attribute(a => - { - a.Name = $"{attributeName}:get"; - a.NameComparison = RequiredAttributeNameComparison.FullMatch; - a.IsDirectiveAttribute = true; - }); - - rule.Attribute(a => - { - a.Name = $"{attributeName}:set"; - a.NameComparison = RequiredAttributeNameComparison.FullMatch; - a.IsDirectiveAttribute = true; - }); - }); - - builder.BindAttribute(a => - { - a.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.BindTagHelper_Element, - valueAttribute, - changeAttribute)); - - a.Name = attributeName; - a.TypeName = typeof(object).FullName; - a.IsDirectiveAttribute = true; - a.PropertyName = name; - - a.BindAttributeParameter(parameter => - { - parameter.Name = "format"; - parameter.PropertyName = formatName; - parameter.TypeName = typeof(string).FullName; - parameter.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.BindTagHelper_Element_Format, - attributeName)); - }); - - a.BindAttributeParameter(parameter => - { - parameter.Name = "event"; - parameter.PropertyName = eventName; - parameter.TypeName = typeof(string).FullName; - parameter.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.BindTagHelper_Element_Event, - attributeName)); - }); - - a.BindAttributeParameter(parameter => - { - parameter.Name = "culture"; - parameter.PropertyName = "Culture"; - parameter.TypeName = typeof(CultureInfo).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Culture); - }); - - a.BindAttributeParameter(parameter => - { - parameter.Name = "get"; - parameter.PropertyName = "Get"; - parameter.TypeName = typeof(object).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Get); - parameter.BindAttributeGetSet = true; - }); - - a.BindAttributeParameter(parameter => - { - parameter.Name = "set"; - parameter.PropertyName = "Set"; - parameter.TypeName = typeof(Delegate).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Set); - }); - - a.BindAttributeParameter(parameter => - { - parameter.Name = "after"; - parameter.PropertyName = "After"; - parameter.TypeName = typeof(Delegate).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_After); - }); - }); - - // This is no longer supported. This is just here so we can add a diagnostic later on when this matches. - builder.BindAttribute(attribute => - { - attribute.Name = formatAttributeName; - attribute.TypeName = "System.String"; - attribute.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.BindTagHelper_Element_Format, - attributeName)); - - attribute.PropertyName = formatName; - }); - - return builder.Build(); - } - - private static void AddComponentBindTagHelpers(TagHelperDescriptor tagHelper, ref PooledArrayBuilder results) - { - if (tagHelper.Kind != TagHelperKind.Component) - { - return; - } - - // We want to create a 'bind' tag helper everywhere we see a pair of properties like `Foo`, `FooChanged` - // where `FooChanged` is a delegate and `Foo` is not. - // - // The easiest way to figure this out without a lot of backtracking is to look for `FooChanged` and then - // try to find a matching "Foo". - // - // We also look for a corresponding FooExpression attribute, though its presence is optional. - foreach (var changeAttribute in tagHelper.BoundAttributes) - { - if (!changeAttribute.Name.EndsWith("Changed", StringComparison.Ordinal) || - - // Allow the ValueChanged attribute to be a delegate or EventCallback<>. - // - // We assume that the Delegate or EventCallback<> has a matching type, and the C# compiler will help - // you figure figure it out if you did it wrongly. - (!changeAttribute.IsDelegateProperty() && !changeAttribute.IsEventCallbackProperty())) - { - continue; - } - - BoundAttributeDescriptor? valueAttribute = null; - BoundAttributeDescriptor? expressionAttribute = null; - var valueAttributeName = changeAttribute.Name[..^"Changed".Length]; - var expressionAttributeName = valueAttributeName + "Expression"; - foreach (var attribute in tagHelper.BoundAttributes) - { - if (attribute.Name == valueAttributeName) - { - valueAttribute = attribute; - } - - if (attribute.Name == expressionAttributeName) - { - expressionAttribute = attribute; - } - - if (valueAttribute != null && expressionAttribute != null) - { - // We found both, so we can stop looking now - break; - } - } - - if (valueAttribute == null) - { - // No matching attribute found. - continue; - } - - using var _ = TagHelperDescriptorBuilder.GetPooledInstance( - TagHelperKind.Bind, tagHelper.Name, tagHelper.AssemblyName, - out var builder); - - builder.SetTypeName(tagHelper.TypeNameObject); - - builder.DisplayName = tagHelper.DisplayName; - builder.CaseSensitive = true; - builder.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.BindTagHelper_Component, - valueAttribute.Name, - changeAttribute.Name)); - - var metadata = new BindMetadata.Builder - { - ValueAttribute = valueAttribute.Name, - ChangeAttribute = changeAttribute.Name - }; - - if (expressionAttribute != null) - { - metadata.ExpressionAttribute = expressionAttribute.Name; - } - - // Match the component and attribute name - builder.TagMatchingRule(rule => - { - rule.TagName = tagHelper.TagMatchingRules.Single().TagName; - rule.Attribute(attribute => - { - attribute.Name = "@bind-" + valueAttribute.Name; - attribute.NameComparison = RequiredAttributeNameComparison.FullMatch; - attribute.IsDirectiveAttribute = true; - }); - }); - - builder.TagMatchingRule(rule => - { - rule.TagName = tagHelper.TagMatchingRules.Single().TagName; - rule.Attribute(attribute => - { - attribute.Name = "@bind-" + valueAttribute.Name + ":get"; - attribute.NameComparison = RequiredAttributeNameComparison.FullMatch; - attribute.IsDirectiveAttribute = true; - }); - rule.Attribute(attribute => - { - attribute.Name = "@bind-" + valueAttribute.Name + ":set"; - attribute.NameComparison = RequiredAttributeNameComparison.FullMatch; - attribute.IsDirectiveAttribute = true; - }); - }); - - builder.BindAttribute(attribute => - { - attribute.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.BindTagHelper_Component, - valueAttribute.Name, - changeAttribute.Name)); - - attribute.Name = "@bind-" + valueAttribute.Name; - attribute.TypeName = changeAttribute.TypeName; - attribute.IsEnum = valueAttribute.IsEnum; - attribute.ContainingType = valueAttribute.ContainingType; - attribute.IsDirectiveAttribute = true; - attribute.PropertyName = valueAttribute.PropertyName; - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "get"; - parameter.PropertyName = "Get"; - parameter.TypeName = typeof(object).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Get); - parameter.BindAttributeGetSet = true; - }); - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "set"; - parameter.PropertyName = "Set"; - parameter.TypeName = typeof(Delegate).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Set); - }); - - attribute.BindAttributeParameter(parameter => - { - parameter.Name = "after"; - parameter.PropertyName = "After"; - parameter.TypeName = typeof(Delegate).FullName; - parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_After); - }); - }); - - if (tagHelper.IsFullyQualifiedNameMatch) - { - builder.IsFullyQualifiedNameMatch = true; - } - - builder.SetMetadata(metadata.Build()); - - results.Add(builder.Build()); - } - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/CompilationTagHelperFeature.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/CompilationTagHelperFeature.cs index 9e52ee57431..7d75cd3d507 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/CompilationTagHelperFeature.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/CompilationTagHelperFeature.cs @@ -5,6 +5,7 @@ using System.Collections.Immutable; using System.Linq; using System.Threading; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis.CSharp; @@ -12,10 +13,10 @@ namespace Microsoft.CodeAnalysis.Razor; public sealed class CompilationTagHelperFeature : RazorEngineFeatureBase, ITagHelperFeature { - private ImmutableArray _providers; + private ITagHelperDiscoveryService? _discoveryService; private IMetadataReferenceFeature? _referenceFeature; - public IReadOnlyList GetDescriptors(CancellationToken cancellationToken = default) + public TagHelperCollection GetTagHelpers(CancellationToken cancellationToken = default) { var compilation = CSharpCompilation.Create("__TagHelpers", references: _referenceFeature?.References); if (!IsValidCompilation(compilation)) @@ -23,21 +24,15 @@ public IReadOnlyList GetDescriptors(CancellationToken cance return []; } - var results = new List(); - var context = new TagHelperDescriptorProviderContext(compilation, results); + Assumed.NotNull(_discoveryService); - foreach (var provider in _providers) - { - provider.Execute(context, cancellationToken); - } - - return results; + return _discoveryService.GetTagHelpers(compilation, cancellationToken); } protected override void OnInitialized() { _referenceFeature = Engine.GetFeatures().FirstOrDefault(); - _providers = Engine.GetFeatures().OrderByAsArray(static f => f.Order); + _discoveryService = GetRequiredFeature(); } internal static bool IsValidCompilation(Compilation compilation) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/CompilerFeatures.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/CompilerFeatures.cs index c774727e7f2..910d9e4348e 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/CompilerFeatures.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/CompilerFeatures.cs @@ -1,10 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - -using System; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; namespace Microsoft.CodeAnalysis.Razor; @@ -19,25 +18,22 @@ public static class CompilerFeatures /// The . public static void Register(RazorProjectEngineBuilder builder) { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } + ArgHelper.ThrowIfNull(builder); if (builder.Configuration.LanguageVersion >= RazorLanguageVersion.Version_3_0) { - builder.Features.Add(new BindTagHelperDescriptorProvider()); - builder.Features.Add(new ComponentTagHelperDescriptorProvider()); - builder.Features.Add(new EventHandlerTagHelperDescriptorProvider()); - builder.Features.Add(new RefTagHelperDescriptorProvider()); - builder.Features.Add(new KeyTagHelperDescriptorProvider()); - builder.Features.Add(new SplatTagHelperDescriptorProvider()); + builder.Features.Add(new BindTagHelperProducer.Factory()); + builder.Features.Add(new ComponentTagHelperProducer.Factory()); + builder.Features.Add(new EventHandlerTagHelperProducer.Factory()); + builder.Features.Add(new RefTagHelperProducer.Factory()); + builder.Features.Add(new KeyTagHelperProducer.Factory()); + builder.Features.Add(new SplatTagHelperProducer.Factory()); } if (builder.Configuration.LanguageVersion >= RazorLanguageVersion.Version_8_0) { - builder.Features.Add(new RenderModeTagHelperDescriptorProvider()); - builder.Features.Add(new FormNameTagHelperDescriptorProvider()); + builder.Features.Add(new RenderModeTagHelperProducer.Factory()); + builder.Features.Add(new FormNameTagHelperProducer.Factory()); } } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/ComponentTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/ComponentTagHelperDescriptorProvider.cs deleted file mode 100644 index 3f1b93c1369..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/ComponentTagHelperDescriptorProvider.cs +++ /dev/null @@ -1,759 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.Language.Components; -using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.CodeAnalysis.CSharp; - -namespace Microsoft.CodeAnalysis.Razor; - -internal sealed class ComponentTagHelperDescriptorProvider : TagHelperDescriptorProviderBase -{ - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) - { - ArgHelper.ThrowIfNull(context); - - var compilation = context.Compilation; - var targetAssembly = context.TargetAssembly; - - var collector = new Collector(compilation, targetAssembly); - collector.Collect(context, cancellationToken); - } - - private sealed class Collector( - Compilation compilation, - IAssemblySymbol? targetAssembly) - : TagHelperCollector(compilation, targetAssembly) - { - protected override bool IsCandidateType(INamedTypeSymbol type) - => ComponentDetectionConventions.IsComponent(type, ComponentsApi.IComponent.MetadataName); - - protected override void Collect( - INamedTypeSymbol type, - ICollection results, - CancellationToken cancellationToken) - { - // Components have very simple matching rules. - // 1. The type name (short) matches the tag name. - // 2. The fully qualified name matches the tag name. - - // First, compute the relevant properties for this type so that we - // don't need to compute them twice. - var properties = GetProperties(type); - - var shortNameMatchingDescriptor = CreateShortNameMatchingDescriptor(type, properties); - results.Add(shortNameMatchingDescriptor); - - // If the component is in the global namespace, skip adding this descriptor which will be the same as the short name one. - TagHelperDescriptor? fullyQualifiedNameMatchingDescriptor = null; - if (!type.ContainingNamespace.IsGlobalNamespace) - { - fullyQualifiedNameMatchingDescriptor = CreateFullyQualifiedNameMatchingDescriptor(type, properties); - results.Add(fullyQualifiedNameMatchingDescriptor); - } - - foreach (var childContent in shortNameMatchingDescriptor.GetChildContentProperties()) - { - // Synthesize a separate tag helper for each child content property that's declared. - results.Add(CreateChildContentDescriptor(shortNameMatchingDescriptor, childContent)); - if (fullyQualifiedNameMatchingDescriptor is not null) - { - results.Add(CreateChildContentDescriptor(fullyQualifiedNameMatchingDescriptor, childContent)); - } - } - } - - private static TagHelperDescriptor CreateShortNameMatchingDescriptor( - INamedTypeSymbol type, - ImmutableArray<(IPropertySymbol property, PropertyKind kind)> properties) - => CreateNameMatchingDescriptor(type, properties, fullyQualified: false); - - private static TagHelperDescriptor CreateFullyQualifiedNameMatchingDescriptor( - INamedTypeSymbol type, - ImmutableArray<(IPropertySymbol property, PropertyKind kind)> properties) - => CreateNameMatchingDescriptor(type, properties, fullyQualified: true); - - private static TagHelperDescriptor CreateNameMatchingDescriptor( - INamedTypeSymbol type, - ImmutableArray<(IPropertySymbol property, PropertyKind kind)> properties, - bool fullyQualified) - { - var typeName = TypeNameObject.From(type); - var assemblyName = type.ContainingAssembly.Identity.Name; - - using var _ = TagHelperDescriptorBuilder.GetPooledInstance( - TagHelperKind.Component, typeName.FullName.AssumeNotNull(), assemblyName, out var builder); - - builder.RuntimeKind = RuntimeKind.IComponent; - builder.SetTypeName(typeName); - - var metadata = new ComponentMetadata.Builder(); - - builder.CaseSensitive = true; - - if (fullyQualified) - { - var fullName = type.ContainingNamespace.IsGlobalNamespace - ? type.Name - : $"{type.ContainingNamespace.GetFullName()}.{type.Name}"; - - builder.TagMatchingRule(r => - { - r.TagName = fullName; - }); - - builder.IsFullyQualifiedNameMatch = true; - } - else - { - builder.TagMatchingRule(r => - { - r.TagName = type.Name; - }); - } - - if (type.IsGenericType) - { - metadata.IsGeneric = true; - - using var cascadeGenericTypeAttributes = new PooledHashSet(StringHashSetPool.Ordinal); - - foreach (var attribute in type.GetAttributes()) - { - if (attribute.HasFullName(ComponentsApi.CascadingTypeParameterAttribute.MetadataName) && - attribute.ConstructorArguments.FirstOrDefault() is { Value: string value }) - { - cascadeGenericTypeAttributes.Add(value); - } - } - - foreach (var typeArgument in type.TypeArguments) - { - if (typeArgument is ITypeParameterSymbol typeParameter) - { - var cascade = cascadeGenericTypeAttributes.Contains(typeParameter.Name); - CreateTypeParameterProperty(builder, typeParameter, cascade); - } - } - } - - if (HasRenderModeDirective(type)) - { - metadata.HasRenderModeDirective = true; - } - - var xml = type.GetDocumentationCommentXml(); - if (!string.IsNullOrEmpty(xml)) - { - builder.SetDocumentation(xml); - } - - foreach (var (property, kind) in properties) - { - if (kind == PropertyKind.Ignored) - { - continue; - } - - CreateProperty(builder, type, property, kind); - } - - if (builder.BoundAttributes.Any(static a => a.IsParameterizedChildContentProperty()) && - !builder.BoundAttributes.Any(static a => string.Equals(a.Name, ComponentHelpers.ChildContent.ParameterAttributeName, StringComparison.OrdinalIgnoreCase))) - { - // If we have any parameterized child content parameters, synthesize a 'Context' parameter to be - // able to set the variable name (for all child content). If the developer defined a 'Context' parameter - // already, then theirs wins. - CreateContextParameter(builder, childContentName: null); - } - - builder.SetMetadata(metadata.Build()); - - return builder.Build(); - } - - private static void CreateProperty(TagHelperDescriptorBuilder builder, INamedTypeSymbol containingSymbol, IPropertySymbol property, PropertyKind kind) - { - builder.BindAttribute(pb => - { - var builder = new PropertyMetadata.Builder(); - - pb.Name = property.Name; - pb.ContainingType = containingSymbol.GetFullName(); - pb.TypeName = property.Type.GetFullName(); - pb.PropertyName = property.Name; - pb.IsEditorRequired = property.GetAttributes().Any( - static a => a.HasFullName("Microsoft.AspNetCore.Components.EditorRequiredAttribute")); - - pb.CaseSensitive = false; - - builder.GloballyQualifiedTypeName = property.Type.GetGloballyQualifiedFullName(); - - if (kind == PropertyKind.Enum) - { - pb.IsEnum = true; - } - else if (kind == PropertyKind.ChildContent) - { - builder.IsChildContent = true; - } - else if (kind == PropertyKind.EventCallback) - { - builder.IsEventCallback = true; - } - else if (kind == PropertyKind.Delegate) - { - builder.IsDelegateSignature = true; - builder.IsDelegateWithAwaitableResult = IsAwaitable(property); - } - - if (HasTypeParameter(property.Type)) - { - builder.IsGenericTyped = true; - } - - if (property.SetMethod.AssumeNotNull().IsInitOnly) - { - builder.IsInitOnlyProperty = true; - } - - pb.SetMetadata(builder.Build()); - - var xml = property.GetDocumentationCommentXml(); - if (!string.IsNullOrEmpty(xml)) - { - pb.SetDocumentation(xml); - } - }); - - static bool HasTypeParameter(ITypeSymbol type) - { - if (type is ITypeParameterSymbol) - { - return true; - } - - // We need to check for cases like: - // [Parameter] public List MyProperty { get; set; } - // AND - // [Parameter] public List MyProperty { get; set; } - // - // We need to inspect the type arguments to tell the difference between a property that - // uses the containing class' type parameter(s) and a vanilla usage of generic types like - // List<> and Dictionary<,> - // - // Since we need to handle cases like RenderFragment>, this check must be recursive. - if (type is INamedTypeSymbol namedType && namedType.IsGenericType) - { - foreach (var typeArgument in namedType.TypeArguments) - { - if (HasTypeParameter(typeArgument)) - { - return true; - } - } - - // Another case to handle - if the type being inspected is a nested type - // inside a generic containing class. The common usage for this would be a case - // where a generic templated component defines a 'context' nested class. - if (namedType.ContainingType != null && HasTypeParameter(namedType.ContainingType)) - { - return true; - } - } - // Also check for cases like: - // [Parameter] public T[] MyProperty { get; set; } - else if (type is IArrayTypeSymbol array && HasTypeParameter(array.ElementType)) - { - return true; - } - - return false; - } - } - - private static bool IsAwaitable(IPropertySymbol prop) - { - var methodSymbol = ((INamedTypeSymbol)prop.Type).DelegateInvokeMethod.AssumeNotNull(); - if (methodSymbol.ReturnsVoid) - { - return false; - } - - var members = methodSymbol.ReturnType.GetMembers(); - foreach (var candidate in members) - { - if (candidate is not IMethodSymbol method || !string.Equals(candidate.Name, "GetAwaiter", StringComparison.Ordinal)) - { - continue; - } - - if (!VerifyGetAwaiter(method)) - { - continue; - } - - return true; - } - - return methodSymbol.IsAsync; - - static bool VerifyGetAwaiter(IMethodSymbol getAwaiter) - { - var returnType = getAwaiter.ReturnType; - if (returnType == null) - { - return false; - } - - var foundIsCompleted = false; - var foundOnCompleted = false; - var foundGetResult = false; - - foreach (var member in returnType.GetMembers()) - { - if (!foundIsCompleted && - member is IPropertySymbol property && - IsProperty_IsCompleted(property)) - { - foundIsCompleted = true; - } - - if (!(foundOnCompleted && foundGetResult) && member is IMethodSymbol method) - { - if (IsMethod_OnCompleted(method)) - { - foundOnCompleted = true; - } - else if (IsMethod_GetResult(method)) - { - foundGetResult = true; - } - } - - if (foundIsCompleted && foundOnCompleted && foundGetResult) - { - return true; - } - } - - return false; - - static bool IsProperty_IsCompleted(IPropertySymbol property) - { - return property is - { - Name: WellKnownMemberNames.IsCompleted, - Type.SpecialType: SpecialType.System_Boolean, - GetMethod: not null - }; - } - - static bool IsMethod_OnCompleted(IMethodSymbol method) - { - return method is - { - Name: WellKnownMemberNames.OnCompleted, - ReturnsVoid: true, - Parameters: [{ Type.TypeKind: TypeKind.Delegate }] - }; - } - - static bool IsMethod_GetResult(IMethodSymbol method) - { - return method is - { - Name: WellKnownMemberNames.GetResult, - Parameters: [] - }; - } - } - } - - private static void CreateTypeParameterProperty(TagHelperDescriptorBuilder builder, ITypeParameterSymbol typeParameter, bool cascade) - { - builder.BindAttribute(pb => - { - pb.DisplayName = typeParameter.Name; - pb.Name = typeParameter.Name; - pb.TypeName = typeof(Type).FullName; - pb.PropertyName = typeParameter.Name; - - var metadata = new TypeParameterMetadata.Builder - { - IsCascading = cascade - }; - - // Type constraints (like "Image" or "Foo") are stored independently of - // things like constructor constraints and not null constraints in the - // type parameter so we create a single string representation of all the constraints - // here. - using var constraints = new PooledList(); - - // CS0449: The 'class', 'struct', 'unmanaged', 'notnull', and 'default' constraints - // cannot be combined or duplicated, and must be specified first in the constraints list. - if (typeParameter.HasReferenceTypeConstraint) - { - constraints.Add("class"); - } - - if (typeParameter.HasNotNullConstraint) - { - constraints.Add("notnull"); - } - - if (typeParameter.HasUnmanagedTypeConstraint) - { - constraints.Add("unmanaged"); - } - else if (typeParameter.HasValueTypeConstraint) - { - // `HasValueTypeConstraint` is also true when `unmanaged` constraint is present. - constraints.Add("struct"); - } - - foreach (var constraintType in typeParameter.ConstraintTypes) - { - constraints.Add(constraintType.GetGloballyQualifiedFullName()); - } - - // CS0401: The new() constraint must be the last constraint specified. - if (typeParameter.HasConstructorConstraint) - { - constraints.Add("new()"); - } - - if (TryGetWhereClauseText(typeParameter, constraints, out var whereClauseText)) - { - metadata.Constraints = whereClauseText; - } - - // Collect attributes that should be propagated to the type inference method. - using var _ = StringBuilderPool.GetPooledObject(out var withAttributes); - foreach (var attribute in typeParameter.GetAttributes()) - { - if (attribute.HasFullName("System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute")) - { - Debug.Assert(attribute.AttributeClass != null); - - if (withAttributes.Length > 0) - { - withAttributes.Append(", "); - } - else - { - withAttributes.Append('['); - } - - withAttributes.Append(attribute.AttributeClass.GetGloballyQualifiedFullName()); - withAttributes.Append('('); - - var first = true; - foreach (var arg in attribute.ConstructorArguments) - { - if (first) - { - first = false; - } - else - { - withAttributes.Append(", "); - } - - if (arg.Kind == TypedConstantKind.Enum) - { - withAttributes.Append("unchecked(("); - withAttributes.Append(arg.Type!.GetGloballyQualifiedFullName()); - withAttributes.Append(')'); - withAttributes.Append(CSharp.SymbolDisplay.FormatPrimitive(arg.Value!, quoteStrings: true, useHexadecimalNumbers: true)); - withAttributes.Append(')'); - } - else - { - Debug.Assert(false, $"Need to add support for '{arg.Kind}' and make sure the output is 'global::' prefixed."); - withAttributes.Append(arg.ToCSharpString()); - } - } - - withAttributes.Append(')'); - } - } - - if (withAttributes.Length > 0) - { - withAttributes.Append("] "); - withAttributes.Append(typeParameter.Name); - metadata.NameWithAttributes = withAttributes.ToString(); - } - - pb.SetMetadata(metadata.Build()); - - pb.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.ComponentTypeParameter, - typeParameter.Name, - builder.Name)); - }); - - static bool TryGetWhereClauseText(ITypeParameterSymbol typeParameter, PooledList constraints, [NotNullWhen(true)] out string? constraintsText) - { - if (constraints.Count == 0) - { - constraintsText = null; - return false; - } - - using var _ = StringBuilderPool.GetPooledObject(out var builder); - - builder.Append("where "); - builder.Append(typeParameter.Name); - builder.Append(" : "); - - var addComma = false; - - foreach (var item in constraints) - { - if (addComma) - { - builder.Append(", "); - } - else - { - addComma = true; - } - - builder.Append(item); - } - - constraintsText = builder.ToString(); - return true; - } - } - - private static TagHelperDescriptor CreateChildContentDescriptor(TagHelperDescriptor component, BoundAttributeDescriptor attribute) - { - var typeName = component.TypeName + "." + attribute.Name; - var assemblyName = component.AssemblyName; - - using var _ = TagHelperDescriptorBuilder.GetPooledInstance( - TagHelperKind.ChildContent, typeName, assemblyName, - out var builder); - - builder.SetTypeName(typeName, component.TypeNamespace, component.TypeNameIdentifier); - - builder.CaseSensitive = true; - - var xml = attribute.Documentation; - if (!string.IsNullOrEmpty(xml)) - { - builder.SetDocumentation(xml); - } - - // Child content matches the property name, but only as a direct child of the component. - builder.TagMatchingRule(r => - { - r.TagName = attribute.Name; - r.ParentTag = component.TagMatchingRules[0].TagName; - }); - - if (attribute.IsParameterizedChildContentProperty()) - { - // For child content attributes with a parameter, synthesize an attribute that allows you to name - // the parameter. - CreateContextParameter(builder, attribute.Name); - } - - if (component.IsFullyQualifiedNameMatch) - { - builder.IsFullyQualifiedNameMatch = true; - } - - var descriptor = builder.Build(); - - return descriptor; - } - - private static void CreateContextParameter(TagHelperDescriptorBuilder builder, string? childContentName) - { - builder.BindAttribute(b => - { - b.Name = ComponentHelpers.ChildContent.ParameterAttributeName; - b.TypeName = typeof(string).FullName; - b.PropertyName = b.Name; - b.SetMetadata(ChildContentParameterMetadata.Default); - - var documentation = childContentName == null - ? DocumentationDescriptor.ChildContentParameterName_TopLevel - : DocumentationDescriptor.From(DocumentationId.ChildContentParameterName, childContentName); - - b.SetDocumentation(documentation); - }); - } - - // Does a walk up the inheritance chain to determine the set of parameters by using - // a dictionary keyed on property name. - // - // We consider parameters to be defined by properties satisfying all of the following: - // - are public - // - are visible (not shadowed) - // - have the [Parameter] attribute - // - have a setter, even if private - // - are not indexers - private static ImmutableArray<(IPropertySymbol property, PropertyKind kind)> GetProperties(INamedTypeSymbol type) - { - using var names = new PooledHashSet(StringHashSetPool.Ordinal); - using var results = new PooledArrayBuilder<(IPropertySymbol, PropertyKind)>(); - - var currentType = type; - do - { - if (currentType.HasFullName(ComponentsApi.ComponentBase.MetadataName)) - { - // The ComponentBase base class doesn't have any [Parameter]. - // Bail out now to avoid walking through its many members, plus the members - // of the System.Object base class. - break; - } - - foreach (var member in currentType.GetMembers()) - { - if (member is not IPropertySymbol property) - { - // Not a property - continue; - } - - if (names.Contains(property.Name)) - { - // Not visible - continue; - } - - var kind = PropertyKind.Default; - if (property.DeclaredAccessibility != Accessibility.Public) - { - // Not public - kind = PropertyKind.Ignored; - } - - if (property.Parameters.Length != 0) - { - // Indexer - kind = PropertyKind.Ignored; - } - - if (property.SetMethod == null) - { - // No setter - kind = PropertyKind.Ignored; - } - else if (property.SetMethod.DeclaredAccessibility != Accessibility.Public) - { - // No public setter - kind = PropertyKind.Ignored; - } - - if (property.IsStatic) - { - kind = PropertyKind.Ignored; - } - - if (!property.GetAttributes().Any(static a => a.HasFullName(ComponentsApi.ParameterAttribute.MetadataName))) - { - if (property.IsOverride) - { - // This property does not contain [Parameter] attribute but it was overridden. Don't ignore it for now. - // We can ignore it if the base class does not contains a [Parameter] as well. - continue; - } - - // Does not have [Parameter] - kind = PropertyKind.Ignored; - } - - if (kind == PropertyKind.Default) - { - kind = property switch - { - var p when IsEnum(p) => PropertyKind.Enum, - var p when IsRenderFragment(p) => PropertyKind.ChildContent, - var p when IsEventCallback(p) => PropertyKind.EventCallback, - var p when IsDelegate(p) => PropertyKind.Delegate, - _ => PropertyKind.Default - }; - } - - names.Add(property.Name); - results.Add((property, kind)); - } - - currentType = currentType.BaseType; - } - while (currentType != null); - - return results.ToImmutableAndClear(); - - static bool IsEnum(IPropertySymbol property) - { - return property.Type.TypeKind == TypeKind.Enum; - } - - static bool IsRenderFragment(IPropertySymbol property) - { - return property.Type.HasFullName(ComponentsApi.RenderFragment.MetadataName) || - (property.Type is INamedTypeSymbol { IsGenericType: true } namedType && - namedType.ConstructedFrom.HasFullName(ComponentsApi.RenderFragmentOfT.DisplayName)); - } - - static bool IsEventCallback(IPropertySymbol property) - { - return property.Type.HasFullName(ComponentsApi.EventCallback.MetadataName) || - (property.Type is INamedTypeSymbol { IsGenericType: true } namedType && - namedType.ConstructedFrom.HasFullName(ComponentsApi.EventCallbackOfT.DisplayName)); - } - - static bool IsDelegate(IPropertySymbol property) - { - return property.Type.TypeKind == TypeKind.Delegate; - } - } - - private static bool HasRenderModeDirective(INamedTypeSymbol type) - { - var attributes = type.GetAttributes(); - foreach (var attribute in attributes) - { - var attributeClass = attribute.AttributeClass; - while (attributeClass is not null) - { - if (attributeClass.HasFullName(ComponentsApi.RenderModeAttribute.FullTypeName)) - { - return true; - } - - attributeClass = attributeClass.BaseType; - } - } - return false; - } - - private enum PropertyKind - { - Ignored, - Default, - Enum, - ChildContent, - Delegate, - EventCallback, - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/DefaultTagHelperDescriptorFactory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/DefaultTagHelperDescriptorFactory.cs index 80d321f90d2..066182915ea 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/DefaultTagHelperDescriptorFactory.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/DefaultTagHelperDescriptorFactory.cs @@ -375,7 +375,7 @@ private static bool IsPotentialDictionaryProperty(IPropertySymbol property) private static void CollectAccessibleProperties( INamedTypeSymbol typeSymbol, ref PooledArrayBuilder properties) { - using var names = new PooledHashSet(StringHashSetPool.Ordinal); + using var names = new PooledHashSet(StringComparer.Ordinal); // Traverse the type hierarchy to find all accessible properties. var currentType = typeSymbol; diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/DefaultTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/DefaultTagHelperDescriptorProvider.cs deleted file mode 100644 index 35dfbd5fcc9..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/DefaultTagHelperDescriptorProvider.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; - -namespace Microsoft.CodeAnalysis.Razor; - -public sealed class DefaultTagHelperDescriptorProvider : TagHelperDescriptorProviderBase -{ - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) - { - ArgHelper.ThrowIfNull(context); - - var compilation = context.Compilation; - - var iTagHelperType = compilation.GetTypeByMetadataName(TagHelperTypes.ITagHelper); - if (iTagHelperType == null || iTagHelperType.TypeKind == TypeKind.Error) - { - // Could not find attributes we care about in the compilation. Nothing to do. - return; - } - - var targetAssembly = context.TargetAssembly; - var factory = new DefaultTagHelperDescriptorFactory(context.IncludeDocumentation, context.ExcludeHidden); - var collector = new Collector(compilation, targetAssembly, factory, iTagHelperType); - collector.Collect(context, cancellationToken); - } - - private class Collector( - Compilation compilation, - IAssemblySymbol? targetAssembly, - DefaultTagHelperDescriptorFactory factory, - INamedTypeSymbol iTagHelperType) - : TagHelperCollector(compilation, targetAssembly) - { - private readonly DefaultTagHelperDescriptorFactory _factory = factory; - private readonly INamedTypeSymbol _iTagHelperType = iTagHelperType; - - protected override bool IsCandidateType(INamedTypeSymbol type) - => type.IsTagHelper(_iTagHelperType); - - protected override void Collect( - INamedTypeSymbol type, - ICollection results, - CancellationToken cancellationToken) - { - var descriptor = _factory.CreateDescriptor(type); - - if (descriptor != null) - { - results.Add(descriptor); - } - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/EventHandlerTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/EventHandlerTagHelperDescriptorProvider.cs deleted file mode 100644 index 828c18ab326..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/EventHandlerTagHelperDescriptorProvider.cs +++ /dev/null @@ -1,253 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.Language.Components; - -namespace Microsoft.CodeAnalysis.Razor; - -internal sealed class EventHandlerTagHelperDescriptorProvider : TagHelperDescriptorProviderBase -{ - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) - { - ArgHelper.ThrowIfNull(context); - - var compilation = context.Compilation; - - if (compilation.GetTypeByMetadataName(ComponentsApi.EventHandlerAttribute.FullTypeName) is not INamedTypeSymbol eventHandlerAttribute) - { - // If we can't find EventHandlerAttribute, then just bail. We won't discover anything. - return; - } - - var targetAssembly = context.TargetAssembly; - - var collector = new Collector(compilation, targetAssembly, eventHandlerAttribute); - collector.Collect(context, cancellationToken); - } - - private class Collector( - Compilation compilation, - IAssemblySymbol? targetAssembly, - INamedTypeSymbol eventHandlerAttribute) - : TagHelperCollector(compilation, targetAssembly) - { - private readonly INamedTypeSymbol _eventHandlerAttribute = eventHandlerAttribute; - - protected override bool IsCandidateType(INamedTypeSymbol type) - => type.DeclaredAccessibility == Accessibility.Public && - type.Name == "EventHandlers"; - - protected override void Collect( - INamedTypeSymbol type, - ICollection results, - CancellationToken cancellationToken) - { - // Not handling duplicates here for now since we're the primary ones extending this. - // If we see users adding to the set of event handler constructs we will want to add deduplication - // and potentially diagnostics. - foreach (var attribute in type.GetAttributes()) - { - if (SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, _eventHandlerAttribute)) - { - if (!AttributeArgs.TryGet(attribute, out var args)) - { - // If this occurs, the [EventHandler] was defined incorrectly, so we can't create a tag helper. - continue; - } - - var typeName = type.GetDefaultDisplayString(); - var namespaceName = type.ContainingNamespace.GetFullName(); - results.Add(CreateTagHelper(typeName, namespaceName, type.Name, args)); - } - } - } - - private readonly record struct AttributeArgs( - string Attribute, - INamedTypeSymbol EventArgsType, - bool EnableStopPropagation = false, - bool EnablePreventDefault = false) - { - public static bool TryGet(AttributeData attribute, out AttributeArgs args) - { - // EventHandlerAttribute has two constructors: - // - // - EventHandlerAttribute(string attributeName, Type eventArgsType); - // - EventHandlerAttribute(string attributeName, Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault); - - var arguments = attribute.ConstructorArguments; - - return TryGetFromTwoArguments(arguments, out args) || - TryGetFromFourArguments(arguments, out args); - - static bool TryGetFromTwoArguments(ImmutableArray arguments, out AttributeArgs args) - { - // Ctor 1: EventHandlerAttribute(string attributeName, Type eventArgsType); - - if (arguments is [ - { Value: string attributeName }, - { Value: INamedTypeSymbol eventArgsType }]) - { - args = new(attributeName, eventArgsType); - return true; - } - - args = default; - return false; - } - - static bool TryGetFromFourArguments(ImmutableArray arguments, out AttributeArgs args) - { - // Ctor 2: EventHandlerAttribute(string attributeName, Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault); - - // TODO: The enablePreventDefault and enableStopPropagation arguments are incorrectly swapped! - // However, they have been that way since the 4-argument constructor variant was introduced - // in https://github.com/dotnet/razor/commit/7635bba6ef2d3e6798d0846ceb96da6d5908e1b0. - // Fixing this is tracked be https://github.com/dotnet/razor/issues/10497 - - if (arguments is [ - { Value: string attributeName }, - { Value: INamedTypeSymbol eventArgsType }, - { Value: bool enablePreventDefault }, - { Value: bool enableStopPropagation }]) - { - args = new(attributeName, eventArgsType, enableStopPropagation, enablePreventDefault); - return true; - } - - args = default; - return false; - } - } - } - - private static TagHelperDescriptor CreateTagHelper( - string typeName, - string typeNamespace, - string typeNameIdentifier, - AttributeArgs args) - { - var (attribute, eventArgsType, enableStopPropagation, enablePreventDefault) = args; - - var attributeName = "@" + attribute; - var eventArgType = eventArgsType.GetDefaultDisplayString(); - using var _ = TagHelperDescriptorBuilder.GetPooledInstance( - TagHelperKind.EventHandler, attribute, ComponentsApi.AssemblyName, - out var builder); - - builder.SetTypeName(typeName, typeNamespace, typeNameIdentifier); - - builder.CaseSensitive = true; - builder.ClassifyAttributesOnly = true; - builder.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.EventHandlerTagHelper, - attributeName, - eventArgType)); - - builder.SetMetadata(new EventHandlerMetadata() - { - EventArgsType = eventArgType - }); - - builder.TagMatchingRule(rule => - { - rule.TagName = "*"; - - rule.Attribute(a => - { - a.Name = attributeName; - a.NameComparison = RequiredAttributeNameComparison.FullMatch; - a.IsDirectiveAttribute = true; - }); - }); - - if (enablePreventDefault) - { - builder.TagMatchingRule(rule => - { - rule.TagName = "*"; - - rule.Attribute(a => - { - a.Name = attributeName + ":preventDefault"; - a.NameComparison = RequiredAttributeNameComparison.FullMatch; - a.IsDirectiveAttribute = true; - }); - }); - } - - if (enableStopPropagation) - { - builder.TagMatchingRule(rule => - { - rule.TagName = "*"; - - rule.Attribute(a => - { - a.Name = attributeName + ":stopPropagation"; - a.NameComparison = RequiredAttributeNameComparison.FullMatch; - a.IsDirectiveAttribute = true; - }); - }); - } - - builder.BindAttribute(a => - { - a.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.EventHandlerTagHelper, - attributeName, - eventArgType)); - - a.Name = attributeName; - - // We want event handler directive attributes to default to C# context. - a.TypeName = $"Microsoft.AspNetCore.Components.EventCallback<{eventArgType}>"; - - a.PropertyName = attribute; - - a.IsDirectiveAttribute = true; - - // Make this weakly typed (don't type check) - delegates have their own type-checking - // logic that we don't want to interfere with. - a.IsWeaklyTyped = true; - - if (enablePreventDefault) - { - a.BindAttributeParameter(parameter => - { - parameter.Name = "preventDefault"; - parameter.PropertyName = "PreventDefault"; - parameter.TypeName = typeof(bool).FullName; - parameter.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.EventHandlerTagHelper_PreventDefault, - attributeName)); - }); - } - - if (enableStopPropagation) - { - a.BindAttributeParameter(parameter => - { - parameter.Name = "stopPropagation"; - parameter.PropertyName = "StopPropagation"; - parameter.TypeName = typeof(bool).FullName; - parameter.SetDocumentation( - DocumentationDescriptor.From( - DocumentationId.EventHandlerTagHelper_StopPropagation, - attributeName)); - }); - } - }); - - return builder.Build(); - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/AllowedChildTagDescriptor.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/AllowedChildTagDescriptor.cs index cc8444e85af..f9efa99dcbe 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/AllowedChildTagDescriptor.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/AllowedChildTagDescriptor.cs @@ -23,8 +23,8 @@ internal AllowedChildTagDescriptor(string name, string displayName, ImmutableArr private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData(Name); - builder.AppendData(DisplayName); + builder.Append(Name); + builder.Append(DisplayName); } public TagHelperDescriptor Parent diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/AllowedChildTagDescriptorBuilder_Pooling.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/AllowedChildTagDescriptorBuilder_Pooling.cs index 9300f359434..481a7093d29 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/AllowedChildTagDescriptorBuilder_Pooling.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/AllowedChildTagDescriptorBuilder_Pooling.cs @@ -8,7 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language; public partial class AllowedChildTagDescriptorBuilder { - internal static readonly ObjectPool Pool = DefaultPool.Create(Policy.Instance); + internal static readonly ObjectPool Pool = + DefaultPool.Create(static () => new AllowedChildTagDescriptorBuilder()); internal static AllowedChildTagDescriptorBuilder GetInstance(TagHelperDescriptorBuilder parent) { @@ -26,15 +27,4 @@ private protected override void Reset() Name = null; DisplayName = null; } - - private sealed class Policy : PooledBuilderPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public override AllowedChildTagDescriptorBuilder Create() => new(); - } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeDescriptor.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeDescriptor.cs index 498772d3df9..55b2f47fe1a 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeDescriptor.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeDescriptor.cs @@ -83,12 +83,12 @@ internal BoundAttributeDescriptor( private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData((byte)_flags); - builder.AppendData(Name); - builder.AppendData(PropertyName); - builder.AppendData(IndexerNamePrefix); - builder.AppendData(DisplayName); - builder.AppendData(ContainingType); + builder.Append((byte)_flags); + builder.Append(Name); + builder.Append(PropertyName); + builder.Append(IndexerNamePrefix); + builder.Append(DisplayName); + builder.Append(ContainingType); TypeNameObject.AppendToChecksum(in builder); IndexerTypeNameObject.AppendToChecksum(in builder); @@ -96,7 +96,7 @@ private protected override void BuildChecksum(in Checksum.Builder builder) foreach (var descriptor in Parameters) { - builder.AppendData(descriptor.Checksum); + builder.Append(descriptor.Checksum); } Metadata.AppendToChecksum(in builder); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeDescriptorBuilder_Pooling.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeDescriptorBuilder_Pooling.cs index db6e31a7846..31ce2aa85fb 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeDescriptorBuilder_Pooling.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeDescriptorBuilder_Pooling.cs @@ -8,7 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language; public partial class BoundAttributeDescriptorBuilder { - internal static readonly ObjectPool Pool = DefaultPool.Create(Policy.Instance); + internal static readonly ObjectPool Pool = + DefaultPool.Create(static () => new BoundAttributeDescriptorBuilder()); internal static BoundAttributeDescriptorBuilder GetInstance(TagHelperDescriptorBuilder parent) { @@ -36,15 +37,4 @@ private protected override void Reset() ContainingType = null; Parameters.Clear(); } - - private sealed class Policy : PooledBuilderPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public override BoundAttributeDescriptorBuilder Create() => new(); - } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeParameterDescriptor.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeParameterDescriptor.cs index 96e564b3535..a382574ca61 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeParameterDescriptor.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeParameterDescriptor.cs @@ -49,9 +49,9 @@ internal BoundAttributeParameterDescriptor( private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData((byte)_flags); - builder.AppendData(Name); - builder.AppendData(PropertyName); + builder.Append((byte)_flags); + builder.Append(Name); + builder.Append(PropertyName); TypeNameObject.AppendToChecksum(in builder); DocumentationObject.AppendToChecksum(in builder); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeParameterDescriptorBuilder_Pooling.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeParameterDescriptorBuilder_Pooling.cs index 0613dbf22bf..c15dbef2b72 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeParameterDescriptorBuilder_Pooling.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/BoundAttributeParameterDescriptorBuilder_Pooling.cs @@ -8,7 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language; public partial class BoundAttributeParameterDescriptorBuilder { - internal static readonly ObjectPool Pool = DefaultPool.Create(Policy.Instance); + internal static readonly ObjectPool Pool = + DefaultPool.Create(static () => new BoundAttributeParameterDescriptorBuilder()); internal static BoundAttributeParameterDescriptorBuilder GetInstance(BoundAttributeDescriptorBuilder parent) { @@ -29,15 +30,4 @@ private protected override void Reset() Name = null; PropertyName = null; } - - private sealed class Policy : PooledBuilderPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public override BoundAttributeParameterDescriptorBuilder Create() => new(); - } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/BindMetadata.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/BindMetadata.cs index 2156603966c..35740ccccda 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/BindMetadata.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/BindMetadata.cs @@ -21,13 +21,13 @@ public sealed record class BindMetadata() : MetadataObject(MetadataKind.Bind) private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData(IsFallback); - builder.AppendData(ValueAttribute); - builder.AppendData(ChangeAttribute); - builder.AppendData(ExpressionAttribute); - builder.AppendData(TypeAttribute); - builder.AppendData(IsInvariantCulture); - builder.AppendData(Format); + builder.Append(IsFallback); + builder.Append(ValueAttribute); + builder.Append(ChangeAttribute); + builder.Append(ExpressionAttribute); + builder.Append(TypeAttribute); + builder.Append(IsInvariantCulture); + builder.Append(Format); } public ref struct Builder diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentBindLoweringPass.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentBindLoweringPass.cs index 3de4b21afca..7f84cc9f7ab 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentBindLoweringPass.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentBindLoweringPass.cs @@ -217,7 +217,7 @@ private static void ProcessDuplicates( ref PooledArrayBuilder> references, ref PooledArrayBuilder> parameterReferences) { - using var _ = ReferenceEqualityHashSetPool.GetPooledObject(out var parents); + using var _ = SpecializedPools.GetPooledReferenceEqualityHashSet(out var parents); foreach (var reference in references) { @@ -307,7 +307,7 @@ private static void ProcessDuplicateAttributes(IntermediateNode node) // If we still have duplicates at this point then they are genuine conflicts. // Use a hash set to quickly determine whether there are any duplicates. // If so, we need to do a more expensive pass to identify and remove them. - using var _ = StringHashSetPool.Ordinal.GetPooledObject(out var duplicates); + using var _ = SpecializedPools.GetPooledStringHashSet(out var duplicates); foreach (var child in children) { @@ -329,7 +329,7 @@ static void ReportDiagnosticAndRemoveDuplicates(IntermediateNode node) { var children = node.Children; - using var _ = StringDictionaryPool.Builder>.Ordinal.GetPooledObject(out var duplicates); + using var _ = SpecializedPools.GetPooledStringDictionary.Builder>(out var duplicates); for (var i = 0; i < children.Count; i++) { diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentDesignTimeNodeWriter.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentDesignTimeNodeWriter.cs index f255d39b662..0314d106820 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentDesignTimeNodeWriter.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentDesignTimeNodeWriter.cs @@ -563,7 +563,7 @@ public override void WriteComponent(CodeRenderingContext context, ComponentInter public override void WriteComponentTypeInferenceMethod(CodeRenderingContext context, ComponentTypeInferenceMethodIntermediateNode node) { - base.WriteComponentTypeInferenceMethod(context, node, returnComponentType: true, allowNameof: false); + base.WriteComponentTypeInferenceMethod(context, node, returnComponentType: true, allowNameof: false, mapComponentStartTag: false); } private void WriteTypeInferenceMethodParameterInnards(CodeRenderingContext context, TypeInferenceMethodParameter parameter) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentEventHandlerLoweringPass.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentEventHandlerLoweringPass.cs index a0428735fc0..68ae25f5aae 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentEventHandlerLoweringPass.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentEventHandlerLoweringPass.cs @@ -36,7 +36,7 @@ protected override void ExecuteCore( // For each event handler *usage* we need to rewrite the tag helper node to map to basic constructs. // Each usage will be represented by a tag helper property that is a descendant of either // a component or element. - using var _ = ReferenceEqualityHashSetPool.GetPooledObject(out var parents); + using var _ = SpecializedPools.GetPooledReferenceEqualityHashSet(out var parents); var references = documentNode.FindDescendantReferences(); foreach (var reference in references) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentLoweringPass.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentLoweringPass.cs index 980e7090021..f5d9e977b8c 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentLoweringPass.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentLoweringPass.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading; using Microsoft.AspNetCore.Razor.Language.Intermediate; @@ -142,12 +143,14 @@ static TagHelperDescriptor GetTagHelperOrAddDiagnostic(TagHelperIntermediateNode private static ComponentIntermediateNode RewriteAsComponent(TagHelperIntermediateNode node, TagHelperDescriptor tagHelper) { + Debug.Assert(node.StartTagSpan.HasValue, "Component tags should always have a start tag span."); var component = new ComponentIntermediateNode() { Component = tagHelper, Source = node.Source, TagName = node.TagName, TypeName = tagHelper.TypeName, + StartTagSpan = node.StartTagSpan.AssumeNotNull(), }; component.AddDiagnosticsFromNode(node); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentMetadata.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentMetadata.cs index dcd039203cd..9a7d5db5970 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentMetadata.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentMetadata.cs @@ -16,8 +16,8 @@ public sealed record class ComponentMetadata() : MetadataObject(MetadataKind.Com private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData(IsGeneric); - builder.AppendData(HasRenderModeDirective); + builder.Append(IsGeneric); + builder.Append(HasRenderModeDirective); } public ref struct Builder diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentNodeWriter.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentNodeWriter.cs index 36219c5e611..4b96271f9c8 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentNodeWriter.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentNodeWriter.cs @@ -75,7 +75,7 @@ protected bool ShouldSuppressTypeInferenceCall(ComponentIntermediateNode node) return node.Diagnostics.Any(d => d.Id == ComponentDiagnosticFactory.GenericComponentTypeInferenceUnderspecified.Id); } - protected void WriteComponentTypeInferenceMethod(CodeRenderingContext context, ComponentTypeInferenceMethodIntermediateNode node, bool returnComponentType, bool allowNameof) + protected void WriteComponentTypeInferenceMethod(CodeRenderingContext context, ComponentTypeInferenceMethodIntermediateNode node, bool returnComponentType, bool allowNameof, bool mapComponentStartTag) { if (context == null) { @@ -166,7 +166,18 @@ protected void WriteComponentTypeInferenceMethod(CodeRenderingContext context, C context.CodeWriter.Write("."); context.CodeWriter.Write(ComponentsApi.RenderTreeBuilder.OpenComponent); context.CodeWriter.Write("<"); - context.CodeWriter.Write(node.Component.TypeName); + + if (mapComponentStartTag) + { + var nonGenericTypeName = TypeNameHelper.GetNonGenericTypeName(node.Component.TypeName, out var genericTypeParameterList); + WriteComponentTypeName(context, node.Component, nonGenericTypeName); + context.CodeWriter.Write(genericTypeParameterList); + } + else + { + context.CodeWriter.Write(node.Component.TypeName); + } + context.CodeWriter.Write(">("); context.CodeWriter.Write("seq"); context.CodeWriter.Write(");"); @@ -530,6 +541,40 @@ protected static void WriteGloballyQualifiedTypeName(CodeRenderingContext contex } } + protected static void WriteComponentTypeName(CodeRenderingContext context, ComponentIntermediateNode node, ReadOnlyMemory nonGenericTypeName) + { + // The type name we are given may or may not be globally qualified, and we want to map it to the component start + // tag, which may or may not be fully qualified. ie "global::My.Fun.Component" could map to just "Component" + + // Write out "global::" if it's present, and trim it off + var lastColon = nonGenericTypeName.Span.LastIndexOf(':'); + if (lastColon > -1) + { + lastColon++; + context.CodeWriter.Write(nonGenericTypeName[0..lastColon]); + nonGenericTypeName = nonGenericTypeName.Slice(lastColon); + } + + // If the start tag is shorter than the type name, then it must not be a fully qualified tag, so write out + // the namespace parts and trim. Razor components don't support nested types, so this logic doesn't either. + if (node.StartTagSpan.Length < nonGenericTypeName.Length) + { + var lastDot = nonGenericTypeName.Span.LastIndexOf('.'); + if (lastDot > -1) + { + lastDot++; + context.CodeWriter.Write(nonGenericTypeName[0..lastDot]); + nonGenericTypeName = nonGenericTypeName.Slice(lastDot); + } + } + + var offset = nonGenericTypeName.Span.StartsWith('@') + ? 1 + : 0; + context.AddSourceMappingFor(node.StartTagSpan, offset); + context.CodeWriter.Write(nonGenericTypeName); + } + [DebuggerDisplay($"{{{nameof(GetDebuggerDisplay)}(),nq}}")] protected internal readonly struct SeqName(int index) : IWriteableValue { diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentRenderModeDirectivePass.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentRenderModeDirectivePass.cs index c67f462d6c1..10b3c9ee316 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentRenderModeDirectivePass.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentRenderModeDirectivePass.cs @@ -39,12 +39,20 @@ protected override void ExecuteCore( return; } + // If the user is Razor 10 or higher, C# 11 or higher, and has a generic compoment, then we can use a file-scoped class for the generated attribute + // so everything compiles correctly. + var useFileScopedClass = codeDocument.ParserOptions.CSharpParseOptions.LanguageVersion >= CodeAnalysis.CSharp.LanguageVersion.CSharp11 && + codeDocument.ParserOptions.LanguageVersion >= RazorLanguageVersion.Version_11_0 && + @class.TypeParameters.Length > 0; + // generate the inner attribute class var classDecl = new ClassDeclarationIntermediateNode { Name = GeneratedRenderModeAttributeName, BaseType = new BaseTypeWithModel($"global::{ComponentsApi.RenderModeAttribute.FullTypeName}"), - Modifiers = CommonModifiers.PrivateSealed + Modifiers = useFileScopedClass + ? CommonModifiers.FileSealed + : CommonModifiers.PrivateSealed }; classDecl.Children.Add(new CSharpCodeIntermediateNode() @@ -59,7 +67,12 @@ protected override void ExecuteCore( { child is not DirectiveTokenIntermediateNode directiveToken ? child - : IntermediateNodeFactory.CSharpToken(directiveToken.Content) + : IntermediateNodeFactory.CSharpToken( + content: directiveToken.Content, + // To avoid breaking hot reload, we don't map the content back to the source unless we're on Razor 11 or higher + source: codeDocument.ParserOptions.LanguageVersion >= RazorLanguageVersion.Version_11_0 + ? directiveToken.Source + : null) } }, IntermediateNodeFactory.CSharpToken(";") @@ -74,13 +87,23 @@ child is not DirectiveTokenIntermediateNode directiveToken } }); - @class.Children.Add(classDecl); + if (useFileScopedClass) + { + @namespace.Children.Add(classDecl); + } + else + { + @class.Children.Add(classDecl); + } // generate the attribute usage on top of the class var attributeNode = new CSharpCodeIntermediateNode(); var namespaceSeparator = string.IsNullOrEmpty(@namespace.Name) ? string.Empty : "."; + var attributeContents = useFileScopedClass + ? GeneratedRenderModeAttributeName + : $"global::{@namespace.Name}{namespaceSeparator}{@class.Name}.{GeneratedRenderModeAttributeName}"; attributeNode.Children.Add( - IntermediateNodeFactory.CSharpToken($"[global::{@namespace.Name}{namespaceSeparator}{@class.Name}.{GeneratedRenderModeAttributeName}]")); + IntermediateNodeFactory.CSharpToken($"[{attributeContents}]")); // Insert the new attribute on top of the class var childCount = @namespace.Children.Count; diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentRuntimeNodeWriter.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentRuntimeNodeWriter.cs index ddcaf605493..0e3bda3dce5 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentRuntimeNodeWriter.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/ComponentRuntimeNodeWriter.cs @@ -378,7 +378,10 @@ public override void WriteComponent(CodeRenderingContext context, ComponentInter context.CodeWriter.Write(ComponentsApi.RenderTreeBuilder.OpenComponent); context.CodeWriter.Write("<"); - TypeNameHelper.WriteGloballyQualifiedName(context.CodeWriter, TypeNameHelper.GetNonGenericTypeName(node.TypeName)); + var nonGenericTypeName = TypeNameHelper.GetNonGenericTypeName(node.TypeName, out _); + TypeNameHelper.WriteGlobalPrefixIfNeeded(context.CodeWriter, nonGenericTypeName); + WriteComponentTypeName(context, node, nonGenericTypeName); + if (!node.OrderedTypeArguments.IsDefaultOrEmpty) { context.CodeWriter.Write("<"); @@ -540,7 +543,7 @@ public override void WriteComponent(CodeRenderingContext context, ComponentInter public override void WriteComponentTypeInferenceMethod(CodeRenderingContext context, ComponentTypeInferenceMethodIntermediateNode node) { - WriteComponentTypeInferenceMethod(context, node, returnComponentType: false, allowNameof: true); + WriteComponentTypeInferenceMethod(context, node, returnComponentType: false, allowNameof: true, mapComponentStartTag: true); } private void WriteTypeInferenceMethodParameterInnards(CodeRenderingContext context, TypeInferenceMethodParameter parameter) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/EventHandlerMetadata.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/EventHandlerMetadata.cs index 7c4e42c48a4..1e2c975454e 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/EventHandlerMetadata.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/EventHandlerMetadata.cs @@ -13,7 +13,7 @@ public sealed record EventHandlerMetadata() : MetadataObject(MetadataKind.EventH private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData(EventArgsType); + builder.Append(EventArgsType); } public ref struct Builder diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/PropertyMetadata.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/PropertyMetadata.cs index 2b80d422143..2d473e73aef 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/PropertyMetadata.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/PropertyMetadata.cs @@ -21,13 +21,13 @@ public sealed record PropertyMetadata() : MetadataObject(MetadataKind.Property) private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData(GloballyQualifiedTypeName); - builder.AppendData(IsChildContent); - builder.AppendData(IsEventCallback); - builder.AppendData(IsDelegateSignature); - builder.AppendData(IsDelegateWithAwaitableResult); - builder.AppendData(IsGenericTyped); - builder.AppendData(IsInitOnlyProperty); + builder.Append(GloballyQualifiedTypeName); + builder.Append(IsChildContent); + builder.Append(IsEventCallback); + builder.Append(IsDelegateSignature); + builder.Append(IsDelegateWithAwaitableResult); + builder.Append(IsGenericTyped); + builder.Append(IsInitOnlyProperty); } public ref struct Builder diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/TypeNameHelper.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/TypeNameHelper.cs index 1bd340bf448..02a6272f535 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/TypeNameHelper.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/TypeNameHelper.cs @@ -79,6 +79,15 @@ public static void WriteGloballyQualifiedName(CodeWriter codeWriter, string type } internal static void WriteGloballyQualifiedName(CodeWriter codeWriter, ReadOnlyMemory typeName) + { + WriteGlobalPrefixIfNeeded(codeWriter, typeName); + codeWriter.Write(typeName); + } + + /// + /// Writes "global::" if the typename doesn't already start with it and isn't a predefined type. + /// + internal static void WriteGlobalPrefixIfNeeded(CodeWriter codeWriter, ReadOnlyMemory typeName) { if (typeName.Length == 0) { @@ -89,7 +98,6 @@ internal static void WriteGloballyQualifiedName(CodeWriter codeWriter, ReadOnlyM if (typeNameSpan.StartsWith(GlobalPrefix.AsSpan(), StringComparison.Ordinal)) { - codeWriter.Write(typeName); return; } @@ -98,7 +106,6 @@ internal static void WriteGloballyQualifiedName(CodeWriter codeWriter, ReadOnlyM // just skip prefixing tuples. if (typeNameSpan[0] == '(') { - codeWriter.Write(typeName); return; } @@ -107,24 +114,25 @@ internal static void WriteGloballyQualifiedName(CodeWriter codeWriter, ReadOnlyM if (typeNameSpan.Length < 3 || typeNameSpan.Length > 7) { codeWriter.Write(GlobalPrefix); - codeWriter.Write(typeName); return; } if (PredefinedTypeNames.Contains(typeName)) { - codeWriter.Write(typeName); return; } codeWriter.Write(GlobalPrefix); - codeWriter.Write(typeName); } - internal static ReadOnlyMemory GetNonGenericTypeName(string typeName) + internal static ReadOnlyMemory GetNonGenericTypeName(string typeName, out ReadOnlyMemory genericTypeParameterList) { var memory = typeName.AsMemory(); var index = memory.Span.IndexOf('<'); + + genericTypeParameterList = index == -1 + ? default + : memory[index..]; return index == -1 ? memory : memory[..index]; } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/TypeParameterMetadata.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/TypeParameterMetadata.cs index ba400caf251..788dded9fe1 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/TypeParameterMetadata.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Components/TypeParameterMetadata.cs @@ -22,9 +22,9 @@ public sealed record TypeParameterMetadata() : MetadataObject(MetadataKind.TypeP private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData(IsCascading); - builder.AppendData(Constraints); - builder.AppendData(NameWithAttributes); + builder.Append(IsCascading); + builder.Append(Constraints); + builder.Append(NameWithAttributes); } public ref struct Builder diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorCSharpLoweringPhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorCSharpLoweringPhase.cs index ed11554a649..00abcedbdb2 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorCSharpLoweringPhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorCSharpLoweringPhase.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language; internal class DefaultRazorCSharpLoweringPhase : RazorEnginePhaseBase, IRazorCSharpLoweringPhase { - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { var documentNode = codeDocument.GetDocumentNode(); ThrowForMissingDocumentDependency(documentNode); @@ -27,7 +27,7 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation } var csharpDocument = WriteDocument(codeDocument, cancellationToken); - codeDocument.SetCSharpDocument(csharpDocument); + return codeDocument.WithCSharpDocument(csharpDocument); } private static RazorCSharpDocument WriteDocument(RazorCodeDocument codeDocument, CancellationToken cancellationToken = default) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorDirectiveClassifierPhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorDirectiveClassifierPhase.cs index 79cc5ff1f4e..aec0ca358b6 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorDirectiveClassifierPhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorDirectiveClassifierPhase.cs @@ -15,7 +15,7 @@ protected override void OnInitialized() Passes = Engine.GetFeatures().OrderByAsArray(static x => x.Order); } - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { var documentNode = codeDocument.GetDocumentNode(); ThrowForMissingDocumentDependency(documentNode); @@ -27,6 +27,6 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation pass.Execute(codeDocument, documentNode, cancellationToken); } - codeDocument.SetDocumentNode(documentNode); + return codeDocument.WithDocumentNode(documentNode); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorDocumentClassifierPhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorDocumentClassifierPhase.cs index 0e9a76859c8..ca5f8c5c760 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorDocumentClassifierPhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorDocumentClassifierPhase.cs @@ -15,7 +15,7 @@ protected override void OnInitialized() Passes = Engine.GetFeatures().OrderByAsArray(p => p.Order); } - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { var documentNode = codeDocument.GetDocumentNode(); ThrowForMissingDocumentDependency(documentNode); @@ -27,6 +27,6 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation pass.Execute(codeDocument, documentNode, cancellationToken); } - codeDocument.SetDocumentNode(documentNode); + return codeDocument.WithDocumentNode(documentNode); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorIntermediateNodeLoweringPhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorIntermediateNodeLoweringPhase.cs index b9597b7bb54..de6b0f4eed9 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorIntermediateNodeLoweringPhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorIntermediateNodeLoweringPhase.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Razor.Language; internal class DefaultRazorIntermediateNodeLoweringPhase : RazorEnginePhaseBase, IRazorIntermediateNodeLoweringPhase { - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { var syntaxTree = codeDocument.GetSyntaxTree(); ThrowForMissingDocumentDependency(syntaxTree); @@ -139,7 +139,7 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation } } - codeDocument.SetDocumentNode(documentNode); + return codeDocument.WithDocumentNode(documentNode); static bool TryRemoveGlobalPrefixFromDefaultUsing(in UsingReference usingReference, out ReadOnlySpan trimmedNamespace) { @@ -187,7 +187,7 @@ private static IReadOnlyList ImportDirectives( private static void PostProcessImportedDirectives(DocumentIntermediateNode document) { - using var _ = ReferenceEqualityHashSetPool.GetPooledObject(out var seenDirectives); + using var _ = SpecializedPools.GetPooledReferenceEqualityHashSet(out var seenDirectives); var references = document.FindDescendantReferences(); for (var i = references.Length - 1; i >= 0; i--) @@ -1035,7 +1035,7 @@ public override void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax no TagName = tagName, TagMode = info.TagMode, Source = BuildSourceSpanFromNode(node), - TagHelpers = info.BindingResult.Descriptors + TagHelpers = info.BindingResult.TagHelpers }; _builder.Push(tagHelperNode); @@ -1080,11 +1080,11 @@ public override void VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHe } var element = node.FirstAncestorOrSelf(); - var descriptors = element.TagHelperInfo.BindingResult.Descriptors; + var tagHelpers = element.TagHelperInfo.BindingResult.TagHelpers; var attributeName = node.Name.GetContent(); using var matches = new PooledArrayBuilder(); - TagHelperMatchingConventions.GetAttributeMatches(descriptors, attributeName, ref matches.AsRef()); + TagHelperMatchingConventions.GetAttributeMatches(tagHelpers, attributeName, ref matches.AsRef()); if (matches.Any() && _renderedBoundAttributeNames.Add(attributeName)) { @@ -1121,12 +1121,12 @@ public override void VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHe public override void VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node) { var element = node.FirstAncestorOrSelf(); - var descriptors = element.TagHelperInfo.BindingResult.Descriptors; + var tagHelpers = element.TagHelperInfo.BindingResult.TagHelpers; var attributeName = node.Name.GetContent(); var attributeValueNode = node.Value; using var matches = new PooledArrayBuilder(); - TagHelperMatchingConventions.GetAttributeMatches(descriptors, attributeName, ref matches.AsRef()); + TagHelperMatchingConventions.GetAttributeMatches(tagHelpers, attributeName, ref matches.AsRef()); if (matches.Any() && _renderedBoundAttributeNames.Add(attributeName)) { @@ -1753,7 +1753,8 @@ public override void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax no TagName = tagName, TagMode = info.TagMode, Source = BuildSourceSpanFromNode(node), - TagHelpers = info.BindingResult.Descriptors + TagHelpers = info.BindingResult.TagHelpers, + StartTagSpan = node.StartTag.Name.GetSourceSpan(SourceDocument) }; if (node.StartTag != null && @@ -1827,11 +1828,11 @@ public override void VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHe } var element = node.FirstAncestorOrSelf(); - var descriptors = element.TagHelperInfo.BindingResult.Descriptors; + var tagHelpers = element.TagHelperInfo.BindingResult.TagHelpers; var attributeName = node.Name.GetContent(); using var matches = new PooledArrayBuilder(); - TagHelperMatchingConventions.GetAttributeMatches(descriptors, attributeName, ref matches.AsRef()); + TagHelperMatchingConventions.GetAttributeMatches(tagHelpers, attributeName, ref matches.AsRef()); if (matches.Any() && _renderedBoundAttributeNames.Add(attributeName)) { @@ -1876,11 +1877,11 @@ public override void VisitMarkupMinimizedTagHelperDirectiveAttribute(MarkupMinim } var element = node.FirstAncestorOrSelf(); - var descriptors = element.TagHelperInfo.BindingResult.Descriptors; + var tagHelpers = element.TagHelperInfo.BindingResult.TagHelpers; var attributeName = node.FullName; using var matches = new PooledArrayBuilder(); - TagHelperMatchingConventions.GetAttributeMatches(descriptors, attributeName, ref matches.AsRef()); + TagHelperMatchingConventions.GetAttributeMatches(tagHelpers, attributeName, ref matches.AsRef()); if (matches.Any() && _renderedBoundAttributeNames.Add(attributeName)) { @@ -1929,12 +1930,12 @@ public override void VisitMarkupMinimizedTagHelperDirectiveAttribute(MarkupMinim public override void VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node) { var element = node.FirstAncestorOrSelf(); - var descriptors = element.TagHelperInfo.BindingResult.Descriptors; + var tagHelpers = element.TagHelperInfo.BindingResult.TagHelpers; var attributeName = node.Name.GetContent(); var attributeValueNode = node.Value; using var matches = new PooledArrayBuilder(); - TagHelperMatchingConventions.GetAttributeMatches(descriptors, attributeName, ref matches.AsRef()); + TagHelperMatchingConventions.GetAttributeMatches(tagHelpers, attributeName, ref matches.AsRef()); if (matches.Any() && _renderedBoundAttributeNames.Add(attributeName)) { @@ -1970,12 +1971,12 @@ public override void VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSynta public override void VisitMarkupTagHelperDirectiveAttribute(MarkupTagHelperDirectiveAttributeSyntax node) { var element = node.FirstAncestorOrSelf(); - var descriptors = element.TagHelperInfo.BindingResult.Descriptors; + var tagHelpers = element.TagHelperInfo.BindingResult.TagHelpers; var attributeName = node.FullName; var attributeValueNode = node.Value; using var matches = new PooledArrayBuilder(); - TagHelperMatchingConventions.GetAttributeMatches(descriptors, attributeName, ref matches.AsRef()); + TagHelperMatchingConventions.GetAttributeMatches(tagHelpers, attributeName, ref matches.AsRef()); if (matches.Any() && _renderedBoundAttributeNames.Add(attributeName)) { diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorOptimizationPhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorOptimizationPhase.cs index b1ca451b55e..de3bb498030 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorOptimizationPhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorOptimizationPhase.cs @@ -15,7 +15,7 @@ protected override void OnInitialized() Passes = Engine.GetFeatures().OrderByAsArray(static x => x.Order); } - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { var documentNode = codeDocument.GetDocumentNode(); ThrowForMissingDocumentDependency(documentNode); @@ -27,6 +27,6 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation pass.Execute(codeDocument, documentNode, cancellationToken); } - codeDocument.SetDocumentNode(documentNode); + return codeDocument.WithDocumentNode(documentNode); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorParsingPhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorParsingPhase.cs index 692938e6ada..348467cef17 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorParsingPhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorParsingPhase.cs @@ -16,11 +16,10 @@ internal class DefaultRazorParsingPhase : RazorEnginePhaseBase, IRazorParsingPha private static readonly object s_importTreesLock = new(); #endif - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { var options = codeDocument.ParserOptions; var syntaxTree = RazorSyntaxTree.Parse(codeDocument.Source, options, cancellationToken); - codeDocument.SetSyntaxTree(syntaxTree); using var importSyntaxTrees = new PooledArrayBuilder(codeDocument.Imports.Length); @@ -62,7 +61,9 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation importSyntaxTrees.Add(tree); } - codeDocument.SetImportSyntaxTrees(importSyntaxTrees.ToImmutableAndClear()); + return codeDocument + .WithSyntaxTree(syntaxTree) + .WithImportSyntaxTrees(importSyntaxTrees.ToImmutableAndClear()); static bool TryGetCachedImportTree(RazorSourceDocument import, RazorParserOptions options, [NotNullWhen(true)] out RazorSyntaxTree? tree) => s_importTrees.TryGetValue(import, out tree) && tree.Options.Equals(options); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorSyntaxTreePhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorSyntaxTreePhase.cs index 53943abf799..d0731fe499e 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorSyntaxTreePhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorSyntaxTreePhase.cs @@ -15,7 +15,7 @@ protected override void OnInitialized() Passes = Engine.GetFeatures().OrderByAsArray(static x => x.Order); } - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { var syntaxTree = codeDocument.GetSyntaxTree(); ThrowForMissingDocumentDependency(syntaxTree); @@ -27,6 +27,6 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation syntaxTree = pass.Execute(codeDocument, syntaxTree, cancellationToken); } - codeDocument.SetSyntaxTree(syntaxTree); + return codeDocument.WithSyntaxTree(syntaxTree); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperContextDiscoveryPhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperContextDiscoveryPhase.cs index 0aceb9158e0..90426013d4a 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperContextDiscoveryPhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperContextDiscoveryPhase.cs @@ -3,22 +3,19 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; -using System.Linq; using System.Threading; using Microsoft.AspNetCore.Razor.Language.Components; using Microsoft.AspNetCore.Razor.Language.Legacy; using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.Language; internal sealed partial class DefaultRazorTagHelperContextDiscoveryPhase : RazorEnginePhaseBase { - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { var syntaxTree = codeDocument.GetPreTagHelperSyntaxTree() ?? codeDocument.GetSyntaxTree(); ThrowForMissingDocumentDependency(syntaxTree); @@ -28,10 +25,10 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation if (!Engine.TryGetFeature(out ITagHelperFeature? tagHelperFeature)) { // No feature, nothing to do. - return; + return codeDocument; } - tagHelpers = tagHelperFeature.GetDescriptors(cancellationToken); + tagHelpers = tagHelperFeature.GetTagHelpers(cancellationToken); } using var _ = GetPooledVisitor(codeDocument, tagHelpers, cancellationToken, out var visitor); @@ -54,9 +51,10 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation // This will always be null for a component document. var tagHelperPrefix = visitor.TagHelperPrefix; - var context = TagHelperDocumentContext.Create(tagHelperPrefix, visitor.GetResults()); - codeDocument.SetTagHelperContext(context); - codeDocument.SetPreTagHelperSyntaxTree(syntaxTree); + var context = TagHelperDocumentContext.GetOrCreate(tagHelperPrefix, visitor.GetResults()); + return codeDocument + .WithTagHelperContext(context) + .WithPreTagHelperSyntaxTree(syntaxTree); } internal static ReadOnlyMemory GetMemoryWithoutGlobalPrefix(string s) @@ -73,14 +71,16 @@ internal static ReadOnlyMemory GetMemoryWithoutGlobalPrefix(string s) return mem; } - internal abstract class DirectiveVisitor : SyntaxWalker + internal abstract class DirectiveVisitor : SyntaxWalker, IPoolableObject { private bool _isInitialized; private string? _filePath; private RazorSourceDocument? _source; private CancellationToken _cancellationToken; - private readonly HashSet _matches = []; + private TagHelperCollection.Builder? _matches; + + private TagHelperCollection.Builder Matches => _matches ??= []; protected bool IsInitialized => _isInitialized; protected RazorSourceDocument Source => _source.AssumeNotNull(); @@ -101,7 +101,7 @@ public void Visit(RazorSyntaxTree tree) Visit(tree.Root); } - public ImmutableArray GetResults() => [.. _matches]; + public TagHelperCollection GetResults() => _matches?.ToCollection() ?? []; protected void Initialize(string? filePath, CancellationToken cancellationToken) { @@ -112,7 +112,12 @@ protected void Initialize(string? filePath, CancellationToken cancellationToken) public virtual void Reset() { - _matches.Clear(); + if (_matches is { } matches) + { + matches.Dispose(); + _matches = null; + } + _filePath = null; _source = null; _cancellationToken = default; @@ -122,7 +127,7 @@ public virtual void Reset() protected void AddMatch(TagHelperDescriptor tagHelper) { _cancellationToken.ThrowIfCancellationRequested(); - _matches.Add(tagHelper); + Matches.Add(tagHelper); } protected void AddMatches(List tagHelpers) @@ -131,14 +136,14 @@ protected void AddMatches(List tagHelpers) foreach (var tagHelper in tagHelpers) { - _matches.Add(tagHelper); + Matches.Add(tagHelper); } } protected void RemoveMatch(TagHelperDescriptor tagHelper) { _cancellationToken.ThrowIfCancellationRequested(); - _matches.Remove(tagHelper); + Matches.Remove(tagHelper); } protected void RemoveMatches(List tagHelpers) @@ -147,7 +152,7 @@ protected void RemoveMatches(List tagHelpers) foreach (var tagHelper in tagHelpers) { - _matches.Remove(tagHelper); + Matches.Remove(tagHelper); } } @@ -173,7 +178,7 @@ internal sealed class TagHelperDirectiveVisitor : DirectiveVisitor /// A larger pool of lists to handle scenarios where tag helpers /// originate from a large number of assemblies. /// - private static readonly ObjectPool> s_pool = ListPool.Create(100); + private static readonly ListPool s_pool = ListPool.Create(poolSize: 100); /// /// A map from assembly name to list of . Lists are allocated from and returned to @@ -181,7 +186,7 @@ internal sealed class TagHelperDirectiveVisitor : DirectiveVisitor /// private readonly Dictionary> _tagHelperMap = new(StringComparer.Ordinal); - private IReadOnlyList? _descriptors; + private TagHelperCollection? _tagHelpers; private bool _tagHelperMapComputed; private string? _tagHelperPrefix; @@ -202,13 +207,13 @@ private Dictionary> TagHelperMap void ComputeTagHelperMap() { - var tagHelpers = _descriptors.AssumeNotNull(); + var tagHelpers = _tagHelpers.AssumeNotNull(); string? currentAssemblyName = null; List? currentTagHelpers = null; // We don't want to consider components in a view document. - foreach (var tagHelper in tagHelpers.AsEnumerable()) + foreach (var tagHelper in tagHelpers) { if (!tagHelper.IsAnyComponentDocumentTagHelper()) { @@ -231,13 +236,13 @@ void ComputeTagHelperMap() } public void Initialize( - IReadOnlyList descriptors, + TagHelperCollection tagHelpers, string? filePath, CancellationToken cancellationToken = default) { Debug.Assert(!IsInitialized); - _descriptors = descriptors; + _tagHelpers = tagHelpers; base.Initialize(filePath, cancellationToken); } @@ -251,7 +256,7 @@ public override void Reset() _tagHelperMap.Clear(); _tagHelperMapComputed = false; - _descriptors = null; + _tagHelpers = null; _tagHelperPrefix = null; base.Reset(); @@ -382,14 +387,14 @@ internal sealed class ComponentDirectiveVisitor : DirectiveVisitor private List? _componentsWithoutNamespace; public void Initialize( - IReadOnlyList descriptors, + TagHelperCollection tagHelpers, string? filePath, string? currentNamespace, CancellationToken cancellationToken = default) { Debug.Assert(!IsInitialized); - foreach (var component in descriptors.AsEnumerable()) + foreach (var component in tagHelpers) { cancellationToken.ThrowIfCancellationRequested(); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperContextDiscoveryPhase_Pooling.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperContextDiscoveryPhase_Pooling.cs index 1f4dfbb2673..83eff11bdec 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperContextDiscoveryPhase_Pooling.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperContextDiscoveryPhase_Pooling.cs @@ -10,27 +10,8 @@ namespace Microsoft.AspNetCore.Razor.Language; internal partial class DefaultRazorTagHelperContextDiscoveryPhase { - private static readonly ObjectPool s_tagHelperDirectiveVisitorPool = DefaultPool.Create(DirectiveVisitorPolicy.Instance); - private static readonly ObjectPool s_componentDirectiveVisitorPool = DefaultPool.Create(DirectiveVisitorPolicy.Instance); - - private sealed class DirectiveVisitorPolicy : IPooledObjectPolicy - where T : DirectiveVisitor, new() - { - public static readonly DirectiveVisitorPolicy Instance = new(); - - private DirectiveVisitorPolicy() - { - } - - public T Create() => new(); - - public bool Return(T visitor) - { - visitor.Reset(); - - return true; - } - } + private static readonly ObjectPool s_tagHelperDirectiveVisitorPool = DefaultPool.Create(); + private static readonly ObjectPool s_componentDirectiveVisitorPool = DefaultPool.Create(); internal readonly ref struct PooledDirectiveVisitor(DirectiveVisitor visitor, bool isComponentDirectiveVisitor) { @@ -49,7 +30,7 @@ public void Dispose() internal static PooledDirectiveVisitor GetPooledVisitor( RazorCodeDocument codeDocument, - IReadOnlyList tagHelpers, + TagHelperCollection tagHelpers, CancellationToken cancellationToken, out DirectiveVisitor visitor) { diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperRewritePhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperRewritePhase.cs index f0e3b7277a1..f4edc5f57c4 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperRewritePhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultRazorTagHelperRewritePhase.cs @@ -1,8 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; -using System.Collections.Immutable; using System.Threading; using Microsoft.AspNetCore.Razor.Language.Legacy; @@ -10,7 +8,7 @@ namespace Microsoft.AspNetCore.Razor.Language; internal sealed class DefaultRazorTagHelperRewritePhase : RazorEnginePhaseBase { - protected override void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + protected override RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { if (!codeDocument.TryGetPreTagHelperSyntaxTree(out var syntaxTree) || !codeDocument.TryGetTagHelperContext(out var context) || @@ -18,15 +16,15 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation { // No descriptors, so no need to see if any are used. Without setting this though, // we trigger an Assert in the ProcessRemaining method in the source generator. - codeDocument.SetReferencedTagHelpers(ImmutableHashSet.Empty); - return; + return codeDocument.WithReferencedTagHelpers([]); } var binder = context.GetBinder(); - var usedHelpers = new HashSet(); + using var usedHelpers = new TagHelperCollection.Builder(); var rewrittenSyntaxTree = TagHelperParseTreeRewriter.Rewrite(syntaxTree, binder, usedHelpers, cancellationToken); - codeDocument.SetReferencedTagHelpers(usedHelpers); - codeDocument.SetSyntaxTree(rewrittenSyntaxTree); + return codeDocument + .WithReferencedTagHelpers(usedHelpers.ToCollection()) + .WithSyntaxTree(rewrittenSyntaxTree); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DocumentationObject.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DocumentationObject.cs index 5e964a1cb23..ffb2b4ae9d9 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DocumentationObject.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DocumentationObject.cs @@ -30,22 +30,22 @@ public void AppendToChecksum(in Checksum.Builder builder) switch (Object) { case DocumentationDescriptor descriptor: - builder.AppendData((int)descriptor.Id); + builder.Append((int)descriptor.Id); foreach (var arg in descriptor.Args) { switch (arg) { case string s: - builder.AppendData(s); + builder.Append(s); break; case int i: - builder.AppendData(i); + builder.Append(i); break; case bool b: - builder.AppendData(b); + builder.Append(b); break; case null: @@ -60,7 +60,7 @@ public void AppendToChecksum(in Checksum.Builder builder) break; case string s: - builder.AppendData(s); + builder.Append(s); break; case null: diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/IRazorEnginePhase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/IRazorEnginePhase.cs index 91bdf0de0f5..33a97c05d8b 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/IRazorEnginePhase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/IRazorEnginePhase.cs @@ -10,5 +10,5 @@ public interface IRazorEnginePhase RazorEngine Engine { get; } void Initialize(RazorEngine engine); - void Execute(RazorCodeDocument codeDocument, CancellationToken cancellationToken = default); + RazorCodeDocument Execute(RazorCodeDocument codeDocument, CancellationToken cancellationToken = default); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperDescriptorProvider.cs deleted file mode 100644 index 1ce96e5a161..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperDescriptorProvider.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Threading; - -namespace Microsoft.AspNetCore.Razor.Language; - -public interface ITagHelperDescriptorProvider : IRazorEngineFeature -{ - int Order { get; } - - void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default); -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperDiscoveryService.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperDiscoveryService.cs new file mode 100644 index 00000000000..1c6497487fa --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperDiscoveryService.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language; + +internal interface ITagHelperDiscoveryService : IRazorEngineFeature +{ + TagHelperCollection GetTagHelpers(Compilation compilation, TagHelperDiscoveryOptions options, CancellationToken cancellationToken = default); + TagHelperCollection GetTagHelpers(Compilation compilation, CancellationToken cancellationToken = default); + + bool TryGetDiscoverer(Compilation compilation, TagHelperDiscoveryOptions options, [NotNullWhen(true)] out TagHelperDiscoverer? discoverer); + bool TryGetDiscoverer(Compilation compilation, [NotNullWhen(true)] out TagHelperDiscoverer? discoverer); +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperFeature.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperFeature.cs index d69f3fcf62c..2d4bdc9abc8 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperFeature.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/ITagHelperFeature.cs @@ -1,12 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; using System.Threading; namespace Microsoft.AspNetCore.Razor.Language; public interface ITagHelperFeature : IRazorEngineFeature { - IReadOnlyList GetDescriptors(CancellationToken cancellationToken = default); + TagHelperCollection GetTagHelpers(CancellationToken cancellationToken = default); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/CommonModifiers.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/CommonModifiers.cs index e30e518cd01..f1b55bfda01 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/CommonModifiers.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/CommonModifiers.cs @@ -34,6 +34,10 @@ private static string GetText(CSharpSyntaxKind kind) GetText(CSharpSyntaxKind.PrivateKeyword), GetText(CSharpSyntaxKind.SealedKeyword)]; + public static ImmutableArray FileSealed { get; } = [ + GetText(CSharpSyntaxKind.FileKeyword), + GetText(CSharpSyntaxKind.SealedKeyword)]; + public static ImmutableArray Protected { get; } = [ GetText(CSharpSyntaxKind.ProtectedKeyword)]; diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/ComponentIntermediateNode.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/ComponentIntermediateNode.cs index 30793a7b464..3cbecb7af99 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/ComponentIntermediateNode.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/ComponentIntermediateNode.cs @@ -49,6 +49,8 @@ public sealed class ComponentIntermediateNode : IntermediateNode public string TypeName { get; set; } + public SourceSpan StartTagSpan { get; init; } + public override void Accept(IntermediateNodeVisitor visitor) { if (visitor == null) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/TagHelperIntermediateNode.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/TagHelperIntermediateNode.cs index f957e6a0869..393833562b9 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/TagHelperIntermediateNode.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/TagHelperIntermediateNode.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using System.Linq; namespace Microsoft.AspNetCore.Razor.Language.Intermediate; @@ -11,7 +10,12 @@ public sealed class TagHelperIntermediateNode : IntermediateNode public required TagMode TagMode { get; init; } public required string TagName { get; init; } - public ImmutableArray TagHelpers { get; init => field = value.NullToEmpty(); } = []; + /// + /// The source span of the start tag of the component that this tag helper represents, or null for an Mvc tag helper + /// + public SourceSpan? StartTagSpan { get; init; } + + public TagHelperCollection TagHelpers { get; init => field = value ?? []; } = []; public override IntermediateNodeCollection Children { get => field ??= []; } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/CSharpCodeParser.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/CSharpCodeParser.cs index 1270c10c540..9e9b47b7d43 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/CSharpCodeParser.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/CSharpCodeParser.cs @@ -997,7 +997,8 @@ not SyntaxKind.Transition and not SyntaxKind.LeftBrace and not SyntaxKind.LeftParenthesis and not SyntaxKind.LeftBracket and - not SyntaxKind.RightBrace, + not SyntaxKind.RightBrace and + not SyntaxKind.Keyword, ref read.AsRef()); if ((!Context.Options.AllowRazorInAllCodeBlocks && At(SyntaxKind.LeftBrace)) || @@ -1005,14 +1006,8 @@ not SyntaxKind.LeftBracket and At(SyntaxKind.LeftBracket)) { Accept(in read); - if (Balance(builder, BalancingModes.AllowCommentsAndTemplates | BalancingModes.BacktrackOnFailure)) + if (!TryBalanceBlock(builder)) { - TryAccept(SyntaxKind.RightBrace); - } - else - { - // Recovery - AcceptUntil(SyntaxKind.LessThan, SyntaxKind.RightBrace); return; } } @@ -1106,6 +1101,23 @@ not SyntaxKind.LeftBracket and Accept(in read); return; } + else if (At(SyntaxKind.Keyword)) + { + Accept(in read); + if (CurrentToken.Content == "switch") + { + AcceptUntil(SyntaxKind.LeftBrace); // TODO: how do we do error recovery at this point? + if (!TryBalanceBlock(builder)) + { + return; + } + } + else + { + // unknown keyword, continue parsing + AcceptAndMoveNext(); + } + } else { _tokenizer.Reset(bookmark); @@ -1114,6 +1126,22 @@ not SyntaxKind.LeftBracket and return; } } + + bool TryBalanceBlock(SyntaxListBuilder builder) + { + if (Balance(builder, BalancingModes.AllowCommentsAndTemplates | BalancingModes.BacktrackOnFailure)) + { + TryAccept(SyntaxKind.RightBrace); + } + else + { + // Recovery + AcceptUntil(SyntaxKind.LessThan, SyntaxKind.RightBrace); + return false; + } + + return true; + } } private void ParseTemplate(in SyntaxListBuilder builder) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/ClassifiedSpanVisitor.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/ClassifiedSpanVisitor.cs index c3cc20f56b6..3a5fa5509df 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/ClassifiedSpanVisitor.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/ClassifiedSpanVisitor.cs @@ -9,9 +9,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy; -internal sealed class ClassifiedSpanVisitor : SyntaxWalker +internal sealed class ClassifiedSpanVisitor : SyntaxWalker, IPoolableObject { - private static readonly ObjectPool Pool = DefaultPool.Create(Policy.Instance, size: 5); + // Significantly larger than DefaultPool.MaximumObjectSize as there shouldn't be much concurrency + // of these arrays (we limit the number of pooled items to 5) and they are commonly large + public const int MaximumObjectSize = DefaultPool.DefaultMaximumObjectSize * 32; + + private static readonly ObjectPool Pool = DefaultPool.Create(static () => new ClassifiedSpanVisitor(), poolSize: 5); private readonly ImmutableArray.Builder _spans; @@ -433,11 +437,11 @@ private void AddSpan(SyntaxToken token, SpanKindInternal kind, AcceptedCharacter private void AddSpan(SourceSpan span, SpanKindInternal kind, AcceptedCharactersInternal acceptedCharacters) => _spans.Add(new(span, CurrentBlockSpan, kind, _currentBlockKind, acceptedCharacters)); - private void Reset() + void IPoolableObject.Reset() { _spans.Clear(); - if (_spans.Capacity > Policy.MaximumObjectSize) + if (_spans.Capacity > MaximumObjectSize) { // Differs from ArrayBuilderPool.Policy's behavior as we allow our array to grow significantly larger _spans.Capacity = 0; @@ -448,26 +452,4 @@ private void Reset() _currentBlockSpan = null; _currentBlockKind = BlockKindInternal.Markup; } - - private sealed class Policy : IPooledObjectPolicy - { - public static readonly Policy Instance = new(); - - // Significantly larger than DefaultPool.MaximumObjectSize as there shouldn't be much concurrency - // of these arrays (we limit the number of pooled items to 5) and they are commonly large - public const int MaximumObjectSize = DefaultPool.MaximumObjectSize * 32; - - private Policy() - { - } - - public ClassifiedSpanVisitor Create() => new(); - - public bool Return(ClassifiedSpanVisitor visitor) - { - visitor.Reset(); - - return true; - } - } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/HtmlMarkupParser.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/HtmlMarkupParser.cs index 7e6a22403f3..40d69e2c29a 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/HtmlMarkupParser.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/HtmlMarkupParser.cs @@ -514,7 +514,7 @@ private void ParseMarkupElement(in SyntaxListBuilder builder, P { // Parsing an end tag. var endTagStart = CurrentStart; - var endTag = ParseEndTag(mode, out var endTagName, out var _); + var endTag = ParseEndTag(mode, out var endTagName, out _); if (string.Equals(CurrentStartTagName, endTagName, StringComparison.OrdinalIgnoreCase)) { diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/ParserContext.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/ParserContext.cs index 001b310bf0c..5ddd3cc9606 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/ParserContext.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/ParserContext.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Threading; using Microsoft.AspNetCore.Razor.PooledObjects; @@ -38,7 +37,7 @@ public ParserContext(RazorSourceDocument source, RazorParserOptions options, Can _errorSinkStack = StackPool.Default.Get(); _errorSinkStack.Push(new ErrorSink()); - _seenDirectivesSet = StringHashSetPool.Ordinal.Get(); + _seenDirectivesSet = SpecializedPools.StringHashSet.Ordinal.Get(); Source = new SeekableTextReader(SourceDocument); } @@ -52,7 +51,7 @@ public void Dispose() } StackPool.Default.Return(_errorSinkStack); - StringHashSetPool.Ordinal.Return(_seenDirectivesSet); + SpecializedPools.StringHashSet.Ordinal.Return(_seenDirectivesSet); } public ErrorSink ErrorSink => _errorSinkStack.Peek(); @@ -74,7 +73,7 @@ public ErrorScope PushNewErrorScope(ErrorSink errorSink) // Debug Helpers #if DEBUG -[DebuggerDisplay("{" + nameof(DebuggerToString) + "(),nq}")] +[System.Diagnostics.DebuggerDisplay("{" + nameof(DebuggerToString) + "(),nq}")] internal partial class ParserContext { private string Unparsed diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperBlockRewriter.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperBlockRewriter.cs index 1b69b0860bc..ea6dd5c05b0 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperBlockRewriter.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperBlockRewriter.cs @@ -61,7 +61,7 @@ public static MarkupTagHelperStartTagSyntax Rewrite( string tagName, RazorParserOptions options, MarkupStartTagSyntax startTag, - TagHelperBinding bindingResult, + TagHelperBinding binding, ErrorSink errorSink, RazorSourceDocument source) { @@ -83,7 +83,7 @@ public static MarkupTagHelperStartTagSyntax Rewrite( result = TryParseAttribute( tagName, attributeBlock, - bindingResult.Descriptors, + binding.TagHelpers, errorSink, processedBoundAttributeNames, options); @@ -96,7 +96,7 @@ public static MarkupTagHelperStartTagSyntax Rewrite( result = TryParseMinimizedAttribute( tagName, minimizedAttributeBlock, - bindingResult.Descriptors, + binding.TagHelpers, errorSink, processedBoundAttributeNames); attributeBuilder.Add(result.RewrittenAttribute); @@ -153,6 +153,13 @@ public static MarkupTagHelperStartTagSyntax Rewrite( result = null; } + else if (child is MarkupEphemeralTextLiteralSyntax ephemeralLiteral) + { + // Ephemeral literals (like escaped @@ in attribute names) should be preserved. + // Continue processing subsequent attributes. + attributeBuilder.Add(ephemeralLiteral); + continue; + } else { result = null; @@ -181,7 +188,7 @@ public static MarkupTagHelperStartTagSyntax Rewrite( string.IsNullOrWhiteSpace(GetAttributeValueContent(result.RewrittenAttribute)))) { var errorLocation = new SourceSpan(attributeNameLocation, result.AttributeName.Length); - var propertyTypeName = GetPropertyType(result.AttributeName, bindingResult.Descriptors); + var propertyTypeName = GetPropertyType(result.AttributeName, binding.TagHelpers); var diagnostic = RazorDiagnosticFactory.CreateTagHelper_EmptyBoundAttribute(errorLocation, result.AttributeName, tagName, propertyTypeName); errorSink.OnError(diagnostic); } @@ -216,12 +223,12 @@ public static MarkupTagHelperStartTagSyntax Rewrite( private static TryParseResult TryParseMinimizedAttribute( string tagName, MarkupMinimizedAttributeBlockSyntax attributeBlock, - IEnumerable descriptors, + TagHelperCollection tagHelpers, ErrorSink errorSink, HashSet processedBoundAttributeNames) { // Have a name now. Able to determine correct isBoundNonStringAttribute value. - var result = CreateTryParseResult(attributeBlock.Name.GetContent(), descriptors, processedBoundAttributeNames); + var result = CreateTryParseResult(attributeBlock.Name.GetContent(), tagHelpers, processedBoundAttributeNames); result.AttributeStructure = AttributeStructure.Minimized; @@ -253,13 +260,13 @@ private static TryParseResult TryParseMinimizedAttribute( private static TryParseResult TryParseAttribute( string tagName, MarkupAttributeBlockSyntax attributeBlock, - IEnumerable descriptors, + TagHelperCollection tagHelpers, ErrorSink errorSink, HashSet processedBoundAttributeNames, RazorParserOptions options) { // Have a name now. Able to determine correct isBoundNonStringAttribute value. - var result = CreateTryParseResult(attributeBlock.Name.GetContent(), descriptors, processedBoundAttributeNames); + var result = CreateTryParseResult(attributeBlock.Name.GetContent(), tagHelpers, processedBoundAttributeNames); if (attributeBlock.ValuePrefix == null) { @@ -465,11 +472,11 @@ private static MarkupTagHelperAttributeValueSyntax RewriteAttributeValue(TryPars } // Determines the full name of the Type of the property corresponding to an attribute with the given name. - private static string GetPropertyType(string name, IEnumerable descriptors) + private static string GetPropertyType(string name, TagHelperCollection tagHelpers) { - foreach (var descriptor in descriptors) + foreach (var tagHelper in tagHelpers) { - if (TagHelperMatchingConventions.TryGetFirstBoundAttributeMatch(descriptor, name, out var match)) + if (TagHelperMatchingConventions.TryGetFirstBoundAttributeMatch(tagHelper, name, out var match)) { return match.IsIndexerMatch ? match.Attribute.IndexerTypeName @@ -483,7 +490,7 @@ private static string GetPropertyType(string name, IEnumerable descriptors, + TagHelperCollection tagHelpers, HashSet processedBoundAttributeNames) { var isBoundAttribute = false; @@ -493,9 +500,9 @@ private static TryParseResult CreateTryParseResult( var isDirectiveAttribute = false; var isDuplicateAttribute = false; - foreach (var descriptor in descriptors) + foreach (var tagHelper in tagHelpers) { - if (TagHelperMatchingConventions.TryGetFirstBoundAttributeMatch(descriptor, name, out var match)) + if (TagHelperMatchingConventions.TryGetFirstBoundAttributeMatch(tagHelper, name, out var match)) { isBoundAttribute = true; isBoundNonStringAttribute = !match.ExpectsStringValue; diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperParseTreeRewriter.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperParseTreeRewriter.cs index 26dc3dae791..7706ba59913 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperParseTreeRewriter.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperParseTreeRewriter.cs @@ -18,7 +18,7 @@ internal static class TagHelperParseTreeRewriter public static RazorSyntaxTree Rewrite( RazorSyntaxTree syntaxTree, TagHelperBinder binder, - ISet? usedDescriptors = null, + TagHelperCollection.Builder? usedDescriptors = null, CancellationToken cancellationToken = default) { using var errorSink = new ErrorSink(); @@ -41,7 +41,7 @@ public static RazorSyntaxTree Rewrite( builder.AddRange(treeDiagnostics); builder.AddRange(sinkDiagnostics); - foreach (var descriptor in binder.Descriptors) + foreach (var descriptor in binder.TagHelpers) { descriptor.AppendAllDiagnostics(ref builder.AsRef()); } @@ -57,7 +57,7 @@ internal sealed class Rewriter( TagHelperBinder binder, RazorParserOptions options, ErrorSink errorSink, - ISet? usedDescriptors, + TagHelperCollection.Builder? usedDescriptors, CancellationToken cancellationToken) : SyntaxRewriter { // Internal for testing. @@ -69,7 +69,7 @@ internal sealed class Rewriter( private readonly Stack _trackerStack = new(); private readonly ErrorSink _errorSink = errorSink; private readonly RazorParserOptions _options = options; - private readonly ISet _usedDescriptors = usedDescriptors ?? new HashSet(); + private readonly TagHelperCollection.Builder? _usedDescriptors = usedDescriptors; private readonly CancellationToken _cancellationToken = cancellationToken; private TagTracker? CurrentTracker => _trackerStack.Count > 0 ? _trackerStack.Peek() : null; @@ -282,10 +282,7 @@ private bool TryRewriteTagHelperStart( return false; } - foreach (var descriptor in tagHelperBinding.Descriptors) - { - _usedDescriptors.Add(descriptor); - } + _usedDescriptors?.AddRange(tagHelperBinding.TagHelpers); ValidateParentAllowsTagHelper(tagName, startTag); ValidateBinding(tagHelperBinding, tagName, startTag); @@ -774,7 +771,7 @@ public bool AllowsChild(string tagName, bool nameIncludesPrefix) using var result = new PooledArrayBuilder(); - foreach (var tagHelper in _binding.Descriptors) + foreach (var tagHelper in _binding.TagHelpers) { foreach (var allowedChildTag in tagHelper.AllowedChildTags) { diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperSpanInternal.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperSpanInternal.cs index 67737ae0700..df90720bfc8 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperSpanInternal.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/TagHelperSpanInternal.cs @@ -1,11 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; - namespace Microsoft.AspNetCore.Razor.Language.Legacy; internal readonly record struct TagHelperSpanInternal(SourceSpan Span, TagHelperBinding Binding) { - public ImmutableArray TagHelpers => Binding.Descriptors; + public TagHelperCollection TagHelpers => Binding.TagHelpers; } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/MetadataObject.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/MetadataObject.cs index afb5472f41e..1c2e8264bad 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/MetadataObject.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/MetadataObject.cs @@ -32,7 +32,7 @@ protected MetadataObject(MetadataKind kind) internal void AppendToChecksum(in Checksum.Builder builder) { - builder.AppendData((byte)Kind); + builder.Append((byte)Kind); BuildChecksum(in builder); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeDocument.PropertyTable.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeDocument.PropertyTable.cs deleted file mode 100644 index c8f829e5f98..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeDocument.PropertyTable.cs +++ /dev/null @@ -1,131 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using Microsoft.AspNetCore.Razor.Language.Intermediate; - -namespace Microsoft.AspNetCore.Razor.Language; - -public sealed partial class RazorCodeDocument -{ - /// - /// Represents a set of mutable values associated with a . - /// - private readonly struct PropertyTable() - { - // To add a mutable value, increase Size by 1 and add a new property below. - // Use a Property for reference types or a BoxedProperty for value types. - - private const int Size = 10; - - private readonly object?[] _values = new object?[Size]; - - public Property> TagHelpers => new(_values, 0); - public Property> ReferencedTagHelpers => new(_values, 1); - public Property PreTagHelperSyntaxTree => new(_values, 2); - public Property SyntaxTree => new(_values, 3); - public BoxedProperty> ImportSyntaxTrees => new(_values, 4); - public Property TagHelperContext => new(_values, 5); - public Property DocumentNode => new(_values, 6); - public Property CSharpDocument => new(_values, 7); - public Property HtmlDocument => new(_values, 8); - public BoxedProperty<(string name, SourceSpan? span)> NamespaceInfo => new(_values, 9); - - [EditorBrowsable(EditorBrowsableState.Never)] - [Obsolete("Do not use. Present to support the legacy editor", error: false)] - public PropertyTable Clone() - { - var clone = new PropertyTable(); - Array.Copy(_values, clone._values, Size); - - return clone; - } - - /// - /// Provides access to a specific slot within an array for a given reference type. - /// - /// The array of values. - /// The index within to access. - /// - /// A value in the slot indicates that the value is not present. - /// - public readonly ref struct Property(object?[] values, int index) - where T : class - { - // We can use a ref field to access the array slot directly on modern .NET. - // On NetFx, we index into the array for each access. -#if NET - private readonly ref object? _value = ref values[index]; -#endif - - public T? Value -#if NET - => (T?)_value; -#else - => (T?)values[index]; -#endif - - public void SetValue(T? value) -#if NET - => _value = value; -#else - => values[index] = value; -#endif - - public bool TryGetValue([NotNullWhen(true)] out T? result) - { - result = Value; - return result is not null; - } - - public T RequiredValue - => Value.AssumeNotNull(); - } - - /// - /// Provides access to a specific slot within an array for a given value type. - /// A is employed to avoid boxing and unboxing the value. - /// - /// The array of values. - /// The index within to access. - public readonly ref struct BoxedProperty(object?[] values, int index) - where T : struct - { - private readonly Property> _box = new(values, index); - - public T? Value => _box.Value?.Value; - - public bool TryGetValue(out T result) - { - if (_box.TryGetValue(out var box)) - { - result = box.Value; - return true; - } - - result = default; - return false; - } - - public void SetValue(T value) - { - if (_box.TryGetValue(out var box)) - { - // If we've already created a StrongBox, just update the value. - box.Value = value; - } - else - { - // Otherwise, create a new StrongBox. - box = new(value); - _box.SetValue(box); - } - } - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeDocument.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeDocument.cs index b48baabb2c2..411d563b142 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeDocument.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeDocument.cs @@ -1,13 +1,12 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Runtime.InteropServices; using Microsoft.AspNetCore.Razor.Language.Intermediate; using Microsoft.CodeAnalysis; @@ -17,40 +16,55 @@ public sealed partial class RazorCodeDocument { public RazorSourceDocument Source { get; } public ImmutableArray Imports { get; } - public RazorParserOptions ParserOptions { get; } public RazorCodeGenerationOptions CodeGenerationOptions { get; } public RazorFileKind FileKind => ParserOptions.FileKind; - private readonly PropertyTable _properties = new(); - private readonly object _htmlDocumentLock = new(); + private readonly TagHelperCollection? _tagHelpers; + private readonly TagHelperCollection? _referencedTagHelpers; + private readonly RazorSyntaxTree? _preTagHelperSyntaxTree; + private readonly RazorSyntaxTree? _syntaxTree; + private readonly ImmutableArray _importSyntaxTrees; + private readonly TagHelperDocumentContext? _tagHelperContext; + private readonly DocumentIntermediateNode? _documentNode; + private readonly RazorCSharpDocument? _csharpDocument; private RazorCodeDocument( RazorSourceDocument source, ImmutableArray imports, - RazorParserOptions? parserOptions, - RazorCodeGenerationOptions? codeGenerationOptions, - PropertyTable? properties = null) + RazorParserOptions parserOptions, + RazorCodeGenerationOptions codeGenerationOptions, + TagHelperCollection? tagHelpers, + TagHelperCollection? referencedTagHelpers, + RazorSyntaxTree? preTagHelperSyntaxTree, + RazorSyntaxTree? syntaxTree, + ImmutableArray importSyntaxTrees, + TagHelperDocumentContext? tagHelperContext, + DocumentIntermediateNode? documentNode, + RazorCSharpDocument? csharpDocument) { Source = source; Imports = imports.NullToEmpty(); - ParserOptions = parserOptions ?? RazorParserOptions.Default; - CodeGenerationOptions = codeGenerationOptions ?? RazorCodeGenerationOptions.Default; - - _properties = properties ?? new(); + ParserOptions = parserOptions; + CodeGenerationOptions = codeGenerationOptions; + + _tagHelpers = tagHelpers; + _referencedTagHelpers = referencedTagHelpers; + _preTagHelperSyntaxTree = preTagHelperSyntaxTree; + _syntaxTree = syntaxTree; + _importSyntaxTrees = importSyntaxTrees; + _tagHelperContext = tagHelperContext; + _documentNode = documentNode; + _csharpDocument = csharpDocument; } public static RazorCodeDocument Create( RazorSourceDocument source, RazorParserOptions? parserOptions = null, RazorCodeGenerationOptions? codeGenerationOptions = null) - { - ArgHelper.ThrowIfNull(source); - - return new RazorCodeDocument(source, imports: [], parserOptions, codeGenerationOptions); - } + => Create(source, imports: [], parserOptions, codeGenerationOptions); public static RazorCodeDocument Create( RazorSourceDocument source, @@ -60,140 +74,198 @@ public static RazorCodeDocument Create( { ArgHelper.ThrowIfNull(source); - return new RazorCodeDocument(source, imports, parserOptions, codeGenerationOptions); + return new RazorCodeDocument( + source, + imports, + parserOptions ?? RazorParserOptions.Default, + codeGenerationOptions ?? RazorCodeGenerationOptions.Default, + tagHelpers: null, + referencedTagHelpers: null, + preTagHelperSyntaxTree: null, + syntaxTree: null, + importSyntaxTrees: default, + tagHelperContext: null, + documentNode: null, + csharpDocument: null); } - internal bool TryGetTagHelpers([NotNullWhen(true)] out IReadOnlyList? result) - => _properties.TagHelpers.TryGetValue(out result); + internal bool TryGetTagHelpers([NotNullWhen(true)] out TagHelperCollection? result) + { + result = _tagHelpers; + return result is not null; + } - internal IReadOnlyList? GetTagHelpers() - => _properties.TagHelpers.Value; + internal TagHelperCollection? GetTagHelpers() + => _tagHelpers; - internal IReadOnlyList GetRequiredTagHelpers() - => _properties.TagHelpers.RequiredValue; + internal TagHelperCollection GetRequiredTagHelpers() + => _tagHelpers.AssumeNotNull(); - internal void SetTagHelpers(IReadOnlyList? value) - => _properties.TagHelpers.SetValue(value); + internal RazorCodeDocument WithTagHelpers(TagHelperCollection? value) + { + if (Equals(value, _tagHelpers)) + { + return this; + } + return new RazorCodeDocument(Source, Imports, ParserOptions, CodeGenerationOptions, value, _referencedTagHelpers, _preTagHelperSyntaxTree, _syntaxTree, _importSyntaxTrees, _tagHelperContext, _documentNode, _csharpDocument); + } - internal bool TryGetReferencedTagHelpers([NotNullWhen(true)] out ISet? result) - => _properties.ReferencedTagHelpers.TryGetValue(out result); + internal bool TryGetReferencedTagHelpers([NotNullWhen(true)] out TagHelperCollection? result) + { + result = _referencedTagHelpers; + return result is not null; + } - internal ISet? GetReferencedTagHelpers() - => _properties.ReferencedTagHelpers.Value; + internal TagHelperCollection? GetReferencedTagHelpers() + => _referencedTagHelpers; - internal ISet GetRequiredReferencedTagHelpers() - => _properties.ReferencedTagHelpers.RequiredValue; + internal TagHelperCollection GetRequiredReferencedTagHelpers() + => _referencedTagHelpers.AssumeNotNull(); - internal void SetReferencedTagHelpers(ISet value) + internal RazorCodeDocument WithReferencedTagHelpers(TagHelperCollection value) { - ArgHelper.ThrowIfNull(value); - _properties.ReferencedTagHelpers.SetValue(value); + if (Equals(value, _referencedTagHelpers)) + { + return this; + } + return new RazorCodeDocument(Source, Imports, ParserOptions, CodeGenerationOptions, _tagHelpers, value, _preTagHelperSyntaxTree, _syntaxTree, _importSyntaxTrees, _tagHelperContext, _documentNode, _csharpDocument); } internal bool TryGetPreTagHelperSyntaxTree([NotNullWhen(true)] out RazorSyntaxTree? result) - => _properties.PreTagHelperSyntaxTree.TryGetValue(out result); + { + result = _preTagHelperSyntaxTree; + return result is not null; + } internal RazorSyntaxTree? GetPreTagHelperSyntaxTree() - => _properties.PreTagHelperSyntaxTree.Value; + => _preTagHelperSyntaxTree; internal RazorSyntaxTree GetRequiredPreTagHelperSyntaxTree() - => _properties.PreTagHelperSyntaxTree.RequiredValue; + => _preTagHelperSyntaxTree.AssumeNotNull(); - internal void SetPreTagHelperSyntaxTree(RazorSyntaxTree? value) - => _properties.PreTagHelperSyntaxTree.SetValue(value); + internal RazorCodeDocument WithPreTagHelperSyntaxTree(RazorSyntaxTree? value) + { + if (ReferenceEquals(value, _preTagHelperSyntaxTree)) + { + return this; + } + return new RazorCodeDocument(Source, Imports, ParserOptions, CodeGenerationOptions, _tagHelpers, _referencedTagHelpers, value, _syntaxTree, _importSyntaxTrees, _tagHelperContext, _documentNode, _csharpDocument); + } internal bool TryGetSyntaxTree([NotNullWhen(true)] out RazorSyntaxTree? result) - => _properties.SyntaxTree.TryGetValue(out result); + { + result = _syntaxTree; + return result is not null; + } internal RazorSyntaxTree? GetSyntaxTree() - => _properties.SyntaxTree.Value; + => _syntaxTree; internal RazorSyntaxTree GetRequiredSyntaxTree() - => _properties.SyntaxTree.RequiredValue; + => _syntaxTree.AssumeNotNull(); - internal void SetSyntaxTree(RazorSyntaxTree value) + internal RazorCodeDocument WithSyntaxTree(RazorSyntaxTree value) { Debug.Assert(value is not null); - _properties.SyntaxTree.SetValue(value); + if (ReferenceEquals(value, _syntaxTree)) + { + return this; + } + return new RazorCodeDocument(Source, Imports, ParserOptions, CodeGenerationOptions, _tagHelpers, _referencedTagHelpers, _preTagHelperSyntaxTree, value, _importSyntaxTrees, _tagHelperContext, _documentNode, _csharpDocument); } internal bool TryGetImportSyntaxTrees(out ImmutableArray result) - => _properties.ImportSyntaxTrees.TryGetValue(out result); + { + if (!_importSyntaxTrees.IsDefault) + { + result = _importSyntaxTrees; + return true; + } + + result = default; + return false; + } internal ImmutableArray GetImportSyntaxTrees() - => _properties.ImportSyntaxTrees.Value ?? []; + => _importSyntaxTrees.IsDefault ? [] : _importSyntaxTrees; - internal void SetImportSyntaxTrees(ImmutableArray value) + internal RazorCodeDocument WithImportSyntaxTrees(ImmutableArray value) { Debug.Assert(!value.IsDefault); Debug.Assert(value.IsEmpty || value.All(static t => t is not null)); - _properties.ImportSyntaxTrees.SetValue(value); + if (ReferenceEquals(ImmutableCollectionsMarshal.AsArray(value), ImmutableCollectionsMarshal.AsArray(_importSyntaxTrees))) + { + return this; + } + return new RazorCodeDocument(Source, Imports, ParserOptions, CodeGenerationOptions, _tagHelpers, _referencedTagHelpers, _preTagHelperSyntaxTree, _syntaxTree, value, _tagHelperContext, _documentNode, _csharpDocument); } internal bool TryGetTagHelperContext([NotNullWhen(true)] out TagHelperDocumentContext? result) - => _properties.TagHelperContext.TryGetValue(out result); + { + result = _tagHelperContext; + return result is not null; + } internal TagHelperDocumentContext? GetTagHelperContext() - => _properties.TagHelperContext.Value; + => _tagHelperContext; internal TagHelperDocumentContext GetRequiredTagHelperContext() - => _properties.TagHelperContext.RequiredValue; + => _tagHelperContext.AssumeNotNull(); - internal void SetTagHelperContext(TagHelperDocumentContext value) + internal RazorCodeDocument WithTagHelperContext(TagHelperDocumentContext value) { Debug.Assert(value is not null); - _properties.TagHelperContext.SetValue(value); + + if (ReferenceEquals(value, _tagHelperContext)) + { + return this; + } + return new RazorCodeDocument(Source, Imports, ParserOptions, CodeGenerationOptions, _tagHelpers, _referencedTagHelpers, _preTagHelperSyntaxTree, _syntaxTree, _importSyntaxTrees, value, _documentNode, _csharpDocument); } internal bool TryGetDocumentNode([NotNullWhen(true)] out DocumentIntermediateNode? result) - => _properties.DocumentNode.TryGetValue(out result); + { + result = _documentNode; + return result is not null; + } internal DocumentIntermediateNode? GetDocumentNode() - => _properties.DocumentNode.Value; + => _documentNode; internal DocumentIntermediateNode GetRequiredDocumentNode() - => _properties.DocumentNode.RequiredValue; + => _documentNode.AssumeNotNull(); - internal void SetDocumentNode(DocumentIntermediateNode value) + internal RazorCodeDocument WithDocumentNode(DocumentIntermediateNode value) { Debug.Assert(value is not null); - _properties.DocumentNode.SetValue(value); + if (ReferenceEquals(value, _documentNode)) + { + return this; + } + return new RazorCodeDocument(Source, Imports, ParserOptions, CodeGenerationOptions, _tagHelpers, _referencedTagHelpers, _preTagHelperSyntaxTree, _syntaxTree, _importSyntaxTrees, _tagHelperContext, value, _csharpDocument); } internal bool TryGetCSharpDocument([NotNullWhen(true)] out RazorCSharpDocument? result) - => _properties.CSharpDocument.TryGetValue(out result); + { + result = _csharpDocument; + return result is not null; + } internal RazorCSharpDocument? GetCSharpDocument() - => _properties.CSharpDocument.Value; + => _csharpDocument; internal RazorCSharpDocument GetRequiredCSharpDocument() - => _properties.CSharpDocument.RequiredValue; + => _csharpDocument.AssumeNotNull(); - internal void SetCSharpDocument(RazorCSharpDocument value) + internal RazorCodeDocument WithCSharpDocument(RazorCSharpDocument value) { Debug.Assert(value is not null); - _properties.CSharpDocument.SetValue(value); - } - - internal RazorHtmlDocument GetHtmlDocument() - { - if (_properties.HtmlDocument.TryGetValue(out var result)) + if (ReferenceEquals(value, _csharpDocument)) { - return result; + return this; } - - // Perf: Avoid concurrent requests generating the same html document - lock (_htmlDocumentLock) - { - if (!_properties.HtmlDocument.TryGetValue(out result)) - { - result = RazorHtmlWriter.GetHtmlDocument(this); - _properties.HtmlDocument.SetValue(result); - } - } - - return result; + return new RazorCodeDocument(Source, Imports, ParserOptions, CodeGenerationOptions, _tagHelpers, _referencedTagHelpers, _preTagHelperSyntaxTree, _syntaxTree, _importSyntaxTrees, _tagHelperContext, _documentNode, value); } // In general documents will have a relative path (relative to the project root). @@ -206,22 +278,9 @@ internal bool TryGetNamespace( [NotNullWhen(true)] out string? @namespace, out SourceSpan? namespaceSpan) { - // We only want to cache the namespace if we're considering all possibilities. - // Anyone wanting something different (i.e., tooling) has to pay a slight penalty. - if (fallbackToRootNamespace && considerImports && - _properties.NamespaceInfo.TryGetValue(out var info)) - { - VerifyNamespace(this, fallbackToRootNamespace, considerImports, info.name); - - (@namespace, namespaceSpan) = info; - return true; - } - if (NamespaceComputer.TryComputeNamespace(this, fallbackToRootNamespace, considerImports, out @namespace, out namespaceSpan)) { VerifyNamespace(this, fallbackToRootNamespace, considerImports, @namespace); - - _properties.NamespaceInfo.SetValue((@namespace, namespaceSpan)); return true; } @@ -239,9 +298,4 @@ static void VerifyNamespace(RazorCodeDocument codeDocument, bool fallbackToRootN Debug.Assert(validateNamespace == @namespace, $"We cached a namespace of {@namespace} but calculated that it should be {validateNamespace}"); } } - - [EditorBrowsable(EditorBrowsableState.Never)] - [Obsolete("Do not use. Present to support the legacy editor", error: false)] - internal RazorCodeDocument Clone() - => new(Source, Imports, ParserOptions, CodeGenerationOptions, _properties.Clone()); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeGenerationOptions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeGenerationOptions.cs index 9a1ea1eb3d6..3774b8783c1 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeGenerationOptions.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorCodeGenerationOptions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using Microsoft.CodeAnalysis; namespace Microsoft.AspNetCore.Razor.Language; diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorDiagnostic.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorDiagnostic.cs index a7c11d365e2..351b0c44040 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorDiagnostic.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorDiagnostic.cs @@ -22,7 +22,7 @@ private RazorDiagnostic(RazorDiagnosticDescriptor descriptor, SourceSpan? span, { _descriptor = descriptor ?? throw new ArgumentNullException(nameof(descriptor)); Span = span ?? SourceSpan.Undefined; - _args = args ?? Array.Empty(); + _args = args ?? []; } public static RazorDiagnostic Create(RazorDiagnosticDescriptor descriptor) @@ -38,29 +38,29 @@ public static RazorDiagnostic Create(RazorDiagnosticDescriptor descriptor, Sourc => new(descriptor, span, args); internal Checksum Checksum - => _checksum ?? InterlockedOperations.Initialize(ref _checksum, ComputeChecksum()); + => _checksum ??= ComputeChecksum(); private Checksum ComputeChecksum() { var builder = new Checksum.Builder(); - builder.AppendData(_descriptor.Id); - builder.AppendData((int)_descriptor.Severity); - builder.AppendData(_descriptor.MessageFormat); + builder.Append(_descriptor.Id); + builder.Append((int)_descriptor.Severity); + builder.Append(_descriptor.MessageFormat); foreach (var arg in _args) { - builder.AppendData(ConvertEnumIfNeeded(arg)); + builder.Append(ConvertEnumIfNeeded(arg)); } var span = Span; - builder.AppendData(span.FilePath); - builder.AppendData(span.AbsoluteIndex); - builder.AppendData(span.LineIndex); - builder.AppendData(span.CharacterIndex); - builder.AppendData(span.Length); - builder.AppendData(span.LineCount); - builder.AppendData(span.EndCharacterIndex); + builder.Append(span.FilePath); + builder.Append(span.AbsoluteIndex); + builder.Append(span.LineIndex); + builder.Append(span.CharacterIndex); + builder.Append(span.Length); + builder.Append(span.LineCount); + builder.Append(span.EndCharacterIndex); return builder.FreeAndGetChecksum(); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorEngine.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorEngine.cs index c127fc09098..83e3411fa4c 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorEngine.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorEngine.cs @@ -32,15 +32,18 @@ internal RazorEngine(ImmutableArray features, ImmutableArra } } - public void Process(RazorCodeDocument codeDocument, CancellationToken cancellationToken = default) + public RazorCodeDocument Process(RazorCodeDocument codeDocument, CancellationToken cancellationToken = default) { ArgHelper.ThrowIfNull(codeDocument); + var currentDocument = codeDocument; foreach (var phase in Phases) { cancellationToken.ThrowIfCancellationRequested(); - phase.Execute(codeDocument, cancellationToken); + currentDocument = phase.Execute(currentDocument, cancellationToken); } + + return currentDocument; } public ImmutableArray GetFeatures() diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorEnginePhaseBase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorEnginePhaseBase.cs index d41ea625f10..5e3de9db9d3 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorEnginePhaseBase.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorEnginePhaseBase.cs @@ -29,12 +29,12 @@ public void Initialize(RazorEngine engine) OnInitialized(); } - public void Execute(RazorCodeDocument codeDocument, CancellationToken cancellationToken = default) + public RazorCodeDocument Execute(RazorCodeDocument codeDocument, CancellationToken cancellationToken = default) { ArgHelper.ThrowIfNull(codeDocument); Assumed.NotNull(_engine, Resources.PhaseMustBeInitialized); - ExecuteCore(codeDocument, cancellationToken); + return ExecuteCore(codeDocument, cancellationToken); } protected T GetRequiredFeature() @@ -62,5 +62,5 @@ protected virtual void OnInitialized() { } - protected abstract void ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken); + protected abstract RazorCodeDocument ExecuteCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorLanguageVersion.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorLanguageVersion.cs index aa55faadba0..fa8f7a1e977 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorLanguageVersion.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorLanguageVersion.cs @@ -25,7 +25,10 @@ public sealed record RazorLanguageVersion : IComparable public static readonly RazorLanguageVersion Version_7_0 = new(7, 0); public static readonly RazorLanguageVersion Version_8_0 = new(8, 0); public static readonly RazorLanguageVersion Version_9_0 = new(9, 0); + public static readonly RazorLanguageVersion Version_10_0 = new(10, 0); // Didn't ship anywhere + public static readonly RazorLanguageVersion Version_11_0 = new(11, 0); public static readonly RazorLanguageVersion Latest = Version_9_0; + public static readonly RazorLanguageVersion Preview = Version_11_0; public static readonly RazorLanguageVersion Experimental = new(1337, 1337); private static readonly FrozenDictionary s_knownVersions = BuildKnownVersions(); @@ -53,7 +56,10 @@ private static FrozenDictionary BuildKnownVersions ["7.0"] = Version_7_0, ["8.0"] = Version_8_0, ["9.0"] = Version_9_0, + ["10.0"] = Version_10_0, + ["11.0"] = Version_11_0, ["latest"] = Latest, + ["preview"] = Preview, ["experimental"] = Experimental, }; diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorParserOptions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorParserOptions.cs index ae213a67853..739bb4de3c2 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorParserOptions.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorParserOptions.cs @@ -5,7 +5,6 @@ using System.Collections.Immutable; using System.Linq; using Microsoft.AspNetCore.Razor.Utilities; -using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.Extensions.Internal; diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngine.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngine.cs index 702782fd46b..3427898e1a1 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngine.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngine.cs @@ -63,23 +63,21 @@ public RazorCodeDocument Process(RazorProjectItem projectItem, CancellationToken ArgHelper.ThrowIfNull(projectItem); var codeDocument = CreateCodeDocumentCore(projectItem); - ProcessCore(codeDocument, cancellationToken); - return codeDocument; + return ProcessCore(codeDocument, cancellationToken); } public RazorCodeDocument Process( RazorSourceDocument source, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList? tagHelpers, + TagHelperCollection? tagHelpers, CancellationToken cancellationToken = default) { ArgHelper.ThrowIfNull(source); ArgHelper.ThrowIfNull(fileKind); var codeDocument = CreateCodeDocumentCore(source, fileKind, importSources, tagHelpers, cssScope: null, configureParser: null, configureCodeGeneration: null); - ProcessCore(codeDocument, cancellationToken); - return codeDocument; + return ProcessCore(codeDocument, cancellationToken); } public RazorCodeDocument ProcessDeclarationOnly(RazorProjectItem projectItem, CancellationToken cancellationToken = default) @@ -91,15 +89,14 @@ public RazorCodeDocument ProcessDeclarationOnly(RazorProjectItem projectItem, Ca builder.SuppressPrimaryMethodBody = true; }); - ProcessCore(codeDocument, cancellationToken); - return codeDocument; + return ProcessCore(codeDocument, cancellationToken); } public RazorCodeDocument ProcessDeclarationOnly( RazorSourceDocument source, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList? tagHelpers, + TagHelperCollection? tagHelpers, CancellationToken cancellationToken = default) { ArgHelper.ThrowIfNull(source); @@ -110,8 +107,7 @@ public RazorCodeDocument ProcessDeclarationOnly( builder.SuppressPrimaryMethodBody = true; }); - ProcessCore(codeDocument, cancellationToken); - return codeDocument; + return ProcessCore(codeDocument, cancellationToken); } public RazorCodeDocument ProcessDesignTime(RazorProjectItem projectItem, CancellationToken cancellationToken = default) @@ -119,23 +115,21 @@ public RazorCodeDocument ProcessDesignTime(RazorProjectItem projectItem, Cancell ArgHelper.ThrowIfNull(projectItem); var codeDocument = CreateCodeDocumentDesignTimeCore(projectItem); - ProcessCore(codeDocument, cancellationToken); - return codeDocument; + return ProcessCore(codeDocument, cancellationToken); } public RazorCodeDocument ProcessDesignTime( RazorSourceDocument source, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList? tagHelpers, + TagHelperCollection? tagHelpers, CancellationToken cancellationToken = default) { ArgHelper.ThrowIfNull(source); ArgHelper.ThrowIfNull(fileKind); var codeDocument = CreateCodeDocumentDesignTimeCore(source, fileKind, importSources, tagHelpers, configureParser: null, configureCodeGeneration: null); - ProcessCore(codeDocument, cancellationToken); - return codeDocument; + return ProcessCore(codeDocument, cancellationToken); } internal RazorCodeDocument CreateCodeDocument(RazorProjectItem projectItem, bool designTime) @@ -151,7 +145,7 @@ internal RazorCodeDocument CreateCodeDocument( RazorSourceDocument source, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList? tagHelpers, + TagHelperCollection? tagHelpers, string? cssScope) { ArgHelper.ThrowIfNull(source); @@ -163,7 +157,7 @@ internal RazorCodeDocument CreateDesignTimeCodeDocument( RazorSourceDocument source, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList? tagHelpers) + TagHelperCollection? tagHelpers) { ArgHelper.ThrowIfNull(source); @@ -186,7 +180,7 @@ private RazorCodeDocument CreateCodeDocumentCore( RazorSourceDocument source, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList? tagHelpers, + TagHelperCollection? tagHelpers, string? cssScope, Action? configureParser, Action? configureCodeGeneration) @@ -196,9 +190,7 @@ private RazorCodeDocument CreateCodeDocumentCore( var codeDocument = RazorCodeDocument.Create(source, importSources, parserOptions, codeGenerationOptions); - codeDocument.SetTagHelpers(tagHelpers); - - return codeDocument; + return tagHelpers != null ? codeDocument.WithTagHelpers(tagHelpers) : codeDocument; } private RazorCodeDocument CreateCodeDocumentDesignTimeCore( @@ -216,7 +208,7 @@ private RazorCodeDocument CreateCodeDocumentDesignTimeCore( RazorSourceDocument sourceDocument, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList? tagHelpers, + TagHelperCollection? tagHelpers, Action? configureParser, Action? configureCodeGeneration) { @@ -240,9 +232,7 @@ private RazorCodeDocument CreateCodeDocumentDesignTimeCore( var codeDocument = RazorCodeDocument.Create(sourceDocument, importSources, parserOptions, codeGenerationOptions); - codeDocument.SetTagHelpers(tagHelpers); - - return codeDocument; + return tagHelpers != null ? codeDocument.WithTagHelpers(tagHelpers) : codeDocument; } private RazorParserOptions ComputeParserOptions(RazorFileKind fileKind, Action? configure) @@ -278,11 +268,11 @@ private RazorCodeGenerationOptions ComputeCodeGenerationOptions(string? cssScope return builder.ToOptions(); } - private void ProcessCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) + private RazorCodeDocument ProcessCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { ArgHelper.ThrowIfNull(codeDocument); - Engine.Process(codeDocument, cancellationToken); + return Engine.Process(codeDocument, cancellationToken); } internal static RazorProjectEngine CreateEmpty(Action? configure = null) @@ -356,6 +346,7 @@ private static void AddDefaultPhases(ImmutableArray.Builder p private static void AddDefaultFeatures(ImmutableArray.Builder features) { features.Add(new DefaultImportProjectFeature()); + features.Add(new TagHelperDiscoveryService()); // General extensibility features.Add(new ConfigureDirectivesFeature()); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngineBuilderExtensions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngineBuilderExtensions.cs index b223f9efa50..d0b89c9a5a4 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngineBuilderExtensions.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngineBuilderExtensions.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Razor.Language.CodeGeneration; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Microsoft.CodeAnalysis.CSharp; using RazorExtensionsV1_X = Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.RazorExtensions; using RazorExtensionsV2_X = Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X.RazorExtensions; @@ -49,6 +50,18 @@ public static void RegisterExtensions(this RazorProjectEngineBuilder builder) } } + public static RazorProjectEngineBuilder RegisterDefaultTagHelperProducer(this RazorProjectEngineBuilder builder) + { + ArgHelper.ThrowIfNull(builder); + + if (!builder.Features.OfType().Any()) + { + builder.Features.Add(new DefaultTagHelperProducer.Factory()); + } + + return builder; + } + public static RazorProjectEngineBuilder ConfigureParserOptions(this RazorProjectEngineBuilder builder, Action configure) { ArgHelper.ThrowIfNull(builder); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngineExtensions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngineExtensions.cs index 8db362d70ab..89c00fac19b 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngineExtensions.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorProjectEngineExtensions.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; using System.Collections.Immutable; namespace Microsoft.AspNetCore.Razor.Language; @@ -32,21 +31,21 @@ public static RazorCodeDocument CreateCodeDocument( public static RazorCodeDocument CreateCodeDocument( this RazorProjectEngine projectEngine, RazorSourceDocument source, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateCodeDocumentCore(source, tagHelpers: tagHelpers); public static RazorCodeDocument CreateCodeDocument( this RazorProjectEngine projectEngine, RazorSourceDocument source, RazorFileKind fileKind, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateCodeDocumentCore(source, fileKind, tagHelpers: tagHelpers); public static RazorCodeDocument CreateCodeDocument( this RazorProjectEngine projectEngine, RazorSourceDocument source, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateCodeDocumentCore(source, importSources: importSources, tagHelpers: tagHelpers); public static RazorCodeDocument CreateCodeDocument( @@ -54,7 +53,7 @@ public static RazorCodeDocument CreateCodeDocument( RazorSourceDocument source, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateCodeDocumentCore(source, fileKind, importSources, tagHelpers); private static RazorCodeDocument CreateCodeDocumentCore( @@ -62,7 +61,7 @@ private static RazorCodeDocument CreateCodeDocumentCore( RazorSourceDocument source, RazorFileKind? fileKind = null, ImmutableArray importSources = default, - IReadOnlyList? tagHelpers = null) + TagHelperCollection? tagHelpers = null) { var fileKindValue = fileKind ?? (source.FilePath is string filePath ? FileKinds.GetFileKindFromPath(filePath) @@ -93,21 +92,21 @@ public static RazorCodeDocument CreateDesignTimeCodeDocument( public static RazorCodeDocument CreateDesignTimeCodeDocument( this RazorProjectEngine projectEngine, RazorSourceDocument source, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateDesignTimeCodeDocumentCore(source, tagHelpers: tagHelpers); public static RazorCodeDocument CreateDesignTimeCodeDocument( this RazorProjectEngine projectEngine, RazorSourceDocument source, RazorFileKind fileKind, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateDesignTimeCodeDocumentCore(source, fileKind, tagHelpers: tagHelpers); public static RazorCodeDocument CreateDesignTimeCodeDocument( this RazorProjectEngine projectEngine, RazorSourceDocument source, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateDesignTimeCodeDocumentCore(source, importSources: importSources, tagHelpers: tagHelpers); public static RazorCodeDocument CreateDesignTimeCodeDocument( @@ -115,7 +114,7 @@ public static RazorCodeDocument CreateDesignTimeCodeDocument( RazorSourceDocument source, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateDesignTimeCodeDocumentCore(source, fileKind, importSources, tagHelpers); private static RazorCodeDocument CreateDesignTimeCodeDocumentCore( @@ -123,7 +122,7 @@ private static RazorCodeDocument CreateDesignTimeCodeDocumentCore( RazorSourceDocument source, RazorFileKind? fileKind = null, ImmutableArray importSources = default, - IReadOnlyList? tagHelpers = null) + TagHelperCollection? tagHelpers = null) { var fileKindValue = fileKind ?? (source.FilePath is string filePath ? FileKinds.GetFileKindFromPath(filePath) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptor.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptor.cs index 5635e279ff1..7afc84ff37b 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptor.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptor.cs @@ -42,11 +42,11 @@ internal RequiredAttributeDescriptor( private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData((int)Flags); - builder.AppendData(Name); - builder.AppendData((int)NameComparison); - builder.AppendData(Value); - builder.AppendData((int)ValueComparison); + builder.Append((int)Flags); + builder.Append(Name); + builder.Append((int)NameComparison); + builder.Append(Value); + builder.Append((int)ValueComparison); } public TagMatchingRuleDescriptor Parent diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptorBuilder_Pooling.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptorBuilder_Pooling.cs index ab9428c9d15..b47177a2f2d 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptorBuilder_Pooling.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptorBuilder_Pooling.cs @@ -8,7 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language; public partial class RequiredAttributeDescriptorBuilder { - internal static readonly ObjectPool Pool = DefaultPool.Create(Policy.Instance); + internal static readonly ObjectPool Pool = + DefaultPool.Create(static () => new RequiredAttributeDescriptorBuilder()); internal static RequiredAttributeDescriptorBuilder GetInstance(TagMatchingRuleDescriptorBuilder parent) { @@ -29,15 +30,4 @@ private protected override void Reset() Value = null; ValueComparison = default; } - - private sealed class Policy : PooledBuilderPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public override RequiredAttributeDescriptorBuilder Create() => new(); - } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/SymbolCache.AssemblySymbolData.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/SymbolCache.AssemblySymbolData.cs index ab381e77ff4..c3f249a8daf 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/SymbolCache.AssemblySymbolData.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/SymbolCache.AssemblySymbolData.cs @@ -2,6 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Microsoft.AspNetCore.Razor; using Microsoft.CodeAnalysis; @@ -12,6 +15,14 @@ internal partial class SymbolCache { public sealed partial class AssemblySymbolData(IAssemblySymbol symbol) { + private readonly ConcurrentDictionary _tagHelpers = []; + + public bool TryGetTagHelpers(int key, [NotNullWhen(true)] out TagHelperCollection? value) + => _tagHelpers.TryGetValue(key, out value); + + public TagHelperCollection AddTagHelpers(int key, TagHelperCollection value) + => _tagHelpers.GetOrAdd(key, value); + public bool MightContainTagHelpers { get; } = CalculateMightContainTagHelpers(symbol); private static bool CalculateMightContainTagHelpers(IAssemblySymbol assembly) diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/BaseMarkupStartTagSyntax.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/BaseMarkupStartTagSyntax.cs index 681ab1aeb67..ac6f08cb6e6 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/BaseMarkupStartTagSyntax.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/BaseMarkupStartTagSyntax.cs @@ -117,4 +117,6 @@ static bool IsValidToken(SyntaxToken token, out SyntaxToken validToken) return false; } } + + public abstract BaseMarkupEndTagSyntax? GetEndTag(); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/MarkupStartTagSyntax.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/MarkupStartTagSyntax.cs index 788618550c6..f0e9a3fb5f8 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/MarkupStartTagSyntax.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/MarkupStartTagSyntax.cs @@ -23,4 +23,9 @@ public bool IsVoidElement() { return ParserHelpers.VoidElements.Contains(Name.Content); } + + public override BaseMarkupEndTagSyntax? GetEndTag() + { + return (Parent as MarkupElementSyntax)?.EndTag; + } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/MarkupTagHelperStartTagSyntax.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/MarkupTagHelperStartTagSyntax.cs new file mode 100644 index 00000000000..27f99eebe71 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/MarkupTagHelperStartTagSyntax.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Razor.Language.Syntax; + +internal partial class MarkupTagHelperStartTagSyntax +{ + public override BaseMarkupEndTagSyntax? GetEndTag() + { + return (Parent as MarkupTagHelperElementSyntax)?.EndTag; + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/SyntaxSerializer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/SyntaxSerializer.cs index ba11e20c6ee..363f4ebb7f2 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/SyntaxSerializer.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/SyntaxSerializer.cs @@ -133,12 +133,12 @@ private void WriteTagHelperElement(MarkupTagHelperElementSyntax node) WriteValue($"{tagHelperInfo.TagName}[{tagHelperInfo.TagMode}]"); // Write descriptors - foreach (var descriptor in tagHelperInfo.BindingResult.Descriptors) + foreach (var tagHelper in tagHelperInfo.BindingResult.TagHelpers) { WriteSeparator(); // Get the type name without the namespace. - var typeName = descriptor.Name[(descriptor.Name.LastIndexOf('.') + 1)..]; + var typeName = tagHelper.Name[(tagHelper.Name.LastIndexOf('.') + 1)..]; WriteValue(typeName); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperBinder.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperBinder.cs index c85bcd90d97..90d57d1577b 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperBinder.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperBinder.cs @@ -15,28 +15,28 @@ namespace Microsoft.AspNetCore.Razor.Language; /// internal sealed partial class TagHelperBinder { - private readonly TagHelperSet _catchAllDescriptors; - private readonly ReadOnlyDictionary _tagNameToDescriptorsMap; + private readonly TagHelperSet _catchAllTagHelpers; + private readonly ReadOnlyDictionary _tagNameToTagHelpersMap; public string? TagNamePrefix { get; } - public ImmutableArray Descriptors { get; } + public TagHelperCollection TagHelpers { get; } /// /// Instantiates a new instance of the . /// /// The tag helper prefix being used by the document. - /// The s that the + /// The s that the /// will pull from. - public TagHelperBinder(string? tagNamePrefix, ImmutableArray descriptors) + public TagHelperBinder(string? tagNamePrefix, TagHelperCollection tagHelpers) { TagNamePrefix = tagNamePrefix; - Descriptors = descriptors.NullToEmpty(); + TagHelpers = tagHelpers; - ProcessDescriptors(descriptors, tagNamePrefix, out _tagNameToDescriptorsMap, out _catchAllDescriptors); + ProcessDescriptors(tagHelpers, tagNamePrefix, out _tagNameToTagHelpersMap, out _catchAllTagHelpers); } private static void ProcessDescriptors( - ImmutableArray descriptors, + TagHelperCollection descriptors, string? tagNamePrefix, out ReadOnlyDictionary tagNameToDescriptorsMap, out TagHelperSet catchAllDescriptors) @@ -47,29 +47,19 @@ private static void ProcessDescriptors( // Keep track of what needs to be added in the second pass. // There will be an entry for every tag matching rule. // Each entry consists of an index to identify a builder and the TagHelperDescriptor to add to it. - using var toAdd = new MemoryBuilder<(int, TagHelperDescriptor)>(initialCapacity: descriptors.Length * 4, clearArray: true); + using var toAdd = new MemoryBuilder<(int, TagHelperDescriptor)>(initialCapacity: descriptors.Count * 4, clearArray: true); // Use a special TagHelperSet.Builder to track catch-all tag helpers. var catchAllBuilder = new TagHelperSet.Builder(); // At most, there should only be one catch-all tag helper per descriptor. - using var catchAllToAdd = new MemoryBuilder(initialCapacity: descriptors.Length, clearArray: true); + using var catchAllToAdd = new MemoryBuilder(initialCapacity: descriptors.Count, clearArray: true); // The builders are indexed using a map of "tag name" to the index of the builder in the array. - using var _1 = StringDictionaryPool.OrdinalIgnoreCase.GetPooledObject(out var tagNameToBuilderIndexMap); - using var _2 = HashSetPool.GetPooledObject(out var tagHelperSet); - -#if NET - tagHelperSet.EnsureCapacity(descriptors.Length); -#endif + using var _1 = SpecializedPools.GetPooledStringDictionary(ignoreCase: true, out var tagNameToBuilderIndexMap); foreach (var tagHelper in descriptors) { - if (!tagHelperSet.Add(tagHelper)) - { - // We've already seen this tag helper. Skip. - continue; - } foreach (var rule in tagHelper.TagMatchingRules) { @@ -167,7 +157,7 @@ private static void ProcessDescriptors( using var pooledSet = HashSetPool.GetPooledObject(out var distinctSet); // First, try any tag helpers with this tag name. - if (_tagNameToDescriptorsMap.TryGetValue(tagName, out var matchingDescriptors)) + if (_tagNameToTagHelpersMap.TryGetValue(tagName, out var matchingDescriptors)) { CollectBoundRulesInfo( matchingDescriptors, @@ -177,7 +167,7 @@ private static void ProcessDescriptors( // Next, try any "catch all" descriptors. CollectBoundRulesInfo( - _catchAllDescriptors, + _catchAllTagHelpers, tagNameSpan, parentTagNameSpan, attributes, ref resultsBuilder.AsRef(), ref tempRulesBuilder.AsRef(), distinctSet); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperBinding.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperBinding.cs index d67122cf217..4d9d796b565 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperBinding.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperBinding.cs @@ -1,9 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; using System.Collections.Immutable; +using Microsoft.AspNetCore.Razor.Threading; namespace Microsoft.AspNetCore.Razor.Language; @@ -15,7 +15,15 @@ internal sealed class TagHelperBinding public string? ParentTagName { get; } public ImmutableArray> Attributes { get; } - private ImmutableArray _descriptors; + private LazyValue, TagHelperCollection> _lazyTagHelpers = new(static allBoundRules => + TagHelperCollection.Build(allBoundRules, initialCapacity: allBoundRules.Length, static (ref builder, allBoundRules) => + { + foreach (var boundRule in allBoundRules) + { + builder.Add(boundRule.Descriptor); + } + })); + private bool? _isAttributeMatch; internal TagHelperBinding( @@ -32,18 +40,7 @@ internal TagHelperBinding( TagNamePrefix = tagNamePrefix; } - public ImmutableArray Descriptors - { - get - { - if (_descriptors.IsDefault) - { - ImmutableInterlocked.InterlockedInitialize(ref _descriptors, AllBoundRules.SelectAsArray(x => x.Descriptor)); - } - - return _descriptors; - } - } + public TagHelperCollection TagHelpers => _lazyTagHelpers.GetValue(AllBoundRules); public ImmutableArray GetBoundRules(TagHelperDescriptor descriptor) => AllBoundRules.First(descriptor, static (info, d) => info.Descriptor.Equals(d)).Rules; @@ -62,13 +59,13 @@ public bool IsAttributeMatch { get { - return _isAttributeMatch ??= ComputeIsAttributeMatch(Descriptors); + return _isAttributeMatch ??= ComputeIsAttributeMatch(TagHelpers); - static bool ComputeIsAttributeMatch(ImmutableArray descriptors) + static bool ComputeIsAttributeMatch(TagHelperCollection tagHelpers) { - foreach (var descriptor in descriptors) + foreach (var tagHelper in tagHelpers) { - if (!descriptor.ClassifyAttributesOnly) + if (!tagHelper.ClassifyAttributesOnly) { return false; } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Builder.Enumerator.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Builder.Enumerator.cs new file mode 100644 index 00000000000..25458a84408 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Builder.Enumerator.cs @@ -0,0 +1,71 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections; +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + public sealed partial class Builder + { + public ref struct Enumerator(Builder builder) + { + private int _index = -1; + + public readonly TagHelperDescriptor Current => builder[_index]; + + public bool MoveNext() + { + if (_index < builder.Count - 1) + { + _index++; + return true; + } + + return false; + } + + public void Reset() + { + _index = -1; + } + + public void Dispose() + { + Reset(); + } + } + + private sealed class EnumeratorImpl(Builder builder) : IEnumerator + { + private int _index = -1; + + public TagHelperDescriptor Current => builder[_index]; + + object IEnumerator.Current => Current; + + public bool MoveNext() + { + if (_index < builder.Count - 1) + { + _index++; + return true; + } + + return false; + } + + public void Reset() + { + _index = -1; + } + + public void Dispose() + { + _index = -1; + } + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Builder.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Builder.cs new file mode 100644 index 00000000000..3f3f8e12244 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Builder.cs @@ -0,0 +1,150 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + public sealed partial class Builder : ICollection, IReadOnlyList, IDisposable + { + // Create new pooled builders and sets with a larger initial capacity to limit growth. + private const int InitialCapacity = 256; + + // Builders and sets are typically large, so allow them to stay larger when returned to their pool. + private const int MaximumObjectSize = 2048; + + private static readonly ArrayBuilderPool s_arrayBuilderPool = + ArrayBuilderPool.Create(InitialCapacity, MaximumObjectSize); + + private ImmutableArray.Builder _items; + private HashSet _set; + + public Builder() + { + _items = s_arrayBuilderPool.Get(); + _set = ChecksumSetPool.Default.Get(); + } + + public void Dispose() + { + var items = Interlocked.Exchange(ref _items, null!); + if (items is not null) + { + s_arrayBuilderPool.Return(items); + } + + var set = Interlocked.Exchange(ref _set, null!); + if (set is not null) + { + ChecksumSetPool.Default.Return(set); + } + } + + public bool IsEmpty => Count == 0; + + public int Count => _items.Count; + + public bool IsReadOnly => false; + + public TagHelperDescriptor this[int index] + { + get + { + ArgHelper.ThrowIfNegative(index); + ArgHelper.ThrowIfGreaterThanOrEqual(index, Count); + + return _items[index]; + } + } + + public bool Add(TagHelperDescriptor item) + { + if (!_set.Add(item.Checksum)) + { + return false; + } + + _items.Add(item); + return true; + } + + void ICollection.Add(TagHelperDescriptor item) + => Add(item); + + public void AddRange(TagHelperCollection items) + { + foreach (var item in items) + { + if (_set.Add(item.Checksum)) + { + _items.Add(item); + } + } + } + + public void AddRange(ReadOnlySpan span) + { + foreach (var item in span) + { + if (_set.Add(item.Checksum)) + { + _items.Add(item); + } + } + } + + public void AddRange(IEnumerable source) + { + foreach (var item in source) + { + if (_set.Add(item.Checksum)) + { + _items.Add(item); + } + } + } + + public void Clear() + { + _items.Clear(); + _set.Clear(); + } + + public bool Contains(TagHelperDescriptor item) + => _set.Contains(item.Checksum); + + public void CopyTo(TagHelperDescriptor[] array, int arrayIndex) + => _items.CopyTo(array, arrayIndex); + + public bool Remove(TagHelperDescriptor item) + => _set.Remove(item.Checksum) && _items.Remove(item); + + public TagHelperCollection ToCollection() + { + if (_items.Count == 0) + { + return Empty; + } + + var array = _items.ToImmutable(); + return new SingleSegmentCollection(array.AsMemory()); + } + + public Enumerator GetEnumerator() + => new(this); + + IEnumerator IEnumerable.GetEnumerator() + => new EnumeratorImpl(this); + + IEnumerator IEnumerable.GetEnumerator() + => new EnumeratorImpl(this); + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.ChecksumSetPool.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.ChecksumSetPool.cs new file mode 100644 index 00000000000..e25bfc22a63 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.ChecksumSetPool.cs @@ -0,0 +1,61 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + private sealed class ChecksumSetPool : CustomObjectPool> + { + private const int MaximumObjectSize = 2048; + + public static readonly ChecksumSetPool Default = new(Policy.Instance, DefaultPoolSize); + + private ChecksumSetPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + private sealed class Policy : PooledObjectPolicy + { + public static readonly Policy Instance = new(); + + private Policy() + { + } + + public override HashSet Create() + { +#if NET + return new(capacity: MaximumObjectSize); +#else + return []; +#endif + } + + public override bool Return(HashSet set) + { + var count = set.Count; + set.Clear(); + + if (count > MaximumObjectSize) + { +#if NET9_0_OR_GREATER + set.TrimExcess(MaximumObjectSize); +#elif NET8_0 + set.TrimExcess(); + set.EnsureCapacity(MaximumObjectSize); +#else + set.TrimExcess(); +#endif + } + + return true; + } + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.EmptyCollection.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.EmptyCollection.cs new file mode 100644 index 00000000000..dfe20d3dbf1 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.EmptyCollection.cs @@ -0,0 +1,41 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + /// + /// Represents an immutable, empty collection of tag helpers. + /// + private sealed class EmptyCollection : TagHelperCollection + { + public static readonly EmptyCollection Instance = new(); + + private EmptyCollection() + { + } + + public override int Count => 0; + + public override TagHelperDescriptor this[int index] + => throw new IndexOutOfRangeException(); + + internal override Checksum Checksum => Checksum.Null; + + public override int IndexOf(TagHelperDescriptor item) => -1; + + public override void CopyTo(Span destination) + { + // Nothing to copy. + } + + protected override int SegmentCount => 0; + + protected override ReadOnlyMemory GetSegment(int index) + => Assumed.Unreachable>(); + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Enumerator.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Enumerator.cs new file mode 100644 index 00000000000..e5de371e28a --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.Enumerator.cs @@ -0,0 +1,84 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + public struct Enumerator(TagHelperCollection collection) : IDisposable + { + private SegmentEnumerator _segmentEnumerator = new(collection); + private ReadOnlyMemory _segment; + private int _index = -1; + private TagHelperDescriptor? _current; + + public readonly TagHelperDescriptor Current + => _index >= 0 + ? _current! + : ThrowHelper.ThrowInvalidOperationException("Enumeration has not started. Call MoveNext."); + + public bool MoveNext() + { + // Try to move to next item in current segment + var nextIndex = _index + 1; + if (_index >= 0 && nextIndex < _segment.Length) + { + _index = nextIndex; + _current = _segment.Span[_index]; + return true; + } + + // Move to next segment + while (_segmentEnumerator.MoveNext()) + { + _segment = _segmentEnumerator.Current; + _index = 0; + + if (_segment.Length > 0) + { + _current = _segment.Span[0]; + return true; + } + + // Empty segment, continue to next one + } + + return false; + } + + public void Reset() + { + _segmentEnumerator.Reset(); + _segment = default; + _index = -1; + _current = null; + } + + public void Dispose() + { + Reset(); + } + } + + private sealed class EnumeratorImpl(TagHelperCollection collection) : IEnumerator + { + private Enumerator _enumerator = new(collection); + + public TagHelperDescriptor Current => _enumerator.Current; + + object IEnumerator.Current => Current; + + public bool MoveNext() + => _enumerator.MoveNext(); + + public void Reset() + => _enumerator.Reset(); + + public void Dispose() + => _enumerator.Dispose(); + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.FixedSizeBuilder.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.FixedSizeBuilder.cs new file mode 100644 index 00000000000..46b24ae2a9d --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.FixedSizeBuilder.cs @@ -0,0 +1,106 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + /// + /// Provides a builder for efficiently constructing a collection of + /// objects with a single segment + /// and a fixed maximum size. + /// + private ref struct FixedSizeBuilder + { + private readonly TagHelperDescriptor[] _items; + private HashSet _set; + private int _length; + + public FixedSizeBuilder(int size) + { + _items = new TagHelperDescriptor[size]; + _set = ChecksumSetPool.Default.Get(); + _length = 0; + +#if NET + _set.EnsureCapacity(size); +#endif + } + + public void Dispose() + { + var set = Interlocked.Exchange(ref _set, null!); + if (set is not null) + { + ChecksumSetPool.Default.Return(set); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Add(TagHelperDescriptor item) + { + if (!_set.Add(item.Checksum)) + { + return false; + } + + AppendItem(item); + return true; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void AddRange(TagHelperCollection collection) + { + foreach (var item in collection) + { + if (_set.Add(item.Checksum)) + { + AppendItem(item); + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void AddRange(ReadOnlySpan span) + { + foreach (var item in span) + { + if (_set.Add(item.Checksum)) + { + AppendItem(item); + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void AddRange(IEnumerable source) + { + foreach (var item in source) + { + if (_set.Add(item.Checksum)) + { + AppendItem(item); + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void AppendItem(TagHelperDescriptor item) + { + _items[_length++] = item; + } + + public readonly TagHelperCollection ToCollection() + => _length switch + { + 0 => Empty, + var length => new SingleSegmentCollection(_items.AsMemory(0, length)) + }; + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.MultiSegmentCollection.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.MultiSegmentCollection.cs new file mode 100644 index 00000000000..163025abff3 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.MultiSegmentCollection.cs @@ -0,0 +1,89 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Immutable; +using System.Diagnostics; +using System.Linq; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + /// + /// Represents a read-only collection of objects composed + /// from multiple contiguous memory segments, providing efficient indexed access across all segments. + /// + /// + /// This collection is optimized for scenarios where items + /// are distributed across several memory segments, allowing for efficient access without merging + /// the segments into a single array. The collection is immutable and thread-safe for concurrent + /// read operations. + /// + private sealed class MultiSegmentCollection : SegmentCollectionBase + { + private readonly ImmutableArray> _segments; + private readonly int[] _segmentStartIndices; + private readonly int _count; + + public MultiSegmentCollection(ImmutableArray> segments) + { + Debug.Assert(segments.Length > 0, "Segments cannot be empty."); + + _segments = segments; + + // Pre-calculate segment boundaries for efficient indexing + _segmentStartIndices = new int[segments.Length]; + var count = 0; + + for (var i = 0; i < segments.Length; i++) + { + Debug.Assert(segments[i].Length > 0, "Segments cannot be empty."); + + _segmentStartIndices[i] = count; + count += segments[i].Length; + } + + _count = count; + } + + protected override int SegmentCount => _segments.Length; + + protected override ReadOnlyMemory GetSegment(int index) + { + Debug.Assert(index >= 0 && index < _segments.Length); + + return _segments[index]; + } + + public override int Count => _count; + + public override TagHelperDescriptor this[int index] + { + get + { + ArgHelper.ThrowIfNegative(index); + ArgHelper.ThrowIfGreaterThanOrEqual(index, Count); + + // Binary search to find the segment containing this index + var segmentIndex = FindSegmentIndex(index); + var localIndex = index - _segmentStartIndices[segmentIndex]; + + return _segments[segmentIndex].Span[localIndex]; + } + } + + private int FindSegmentIndex(int index) + { + var searchResult = _segmentStartIndices.BinarySearch(index); + + if (searchResult >= 0) + { + return searchResult; + } + + var insertionPoint = ~searchResult; + return insertionPoint - 1; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.RefBuilder.Enumerator.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.RefBuilder.Enumerator.cs new file mode 100644 index 00000000000..70d6b4e6ba9 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.RefBuilder.Enumerator.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + + public ref partial struct RefBuilder + { + public ref struct Enumerator(RefBuilder builder) + { + // Do not dispose the RefBuilder being enumerated. +#pragma warning disable CA2213 // Disposable fields should be disposed + private readonly RefBuilder _builder = builder; +#pragma warning restore CA2213 + + private int _index = -1; + + public readonly TagHelperDescriptor Current => _builder[_index]; + + public bool MoveNext() + { + if (_index < _builder.Count - 1) + { + _index++; + return true; + } + + return false; + } + + public void Reset() + { + _index = -1; + } + + public void Dispose() + { + Reset(); + } + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.RefBuilder.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.RefBuilder.cs new file mode 100644 index 00000000000..bc94f7a1327 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.RefBuilder.cs @@ -0,0 +1,131 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + public ref partial struct RefBuilder + { +#pragma warning disable CA2213 // Disposable fields should be disposed + private MemoryBuilder _builder; +#pragma warning restore CA2213 + + private HashSet _set; + + public RefBuilder() + : this(initialCapacity: 8) + { + } + + public RefBuilder(int initialCapacity) + { + if (initialCapacity < 8) + { + initialCapacity = 8; + } + + _builder = new(initialCapacity, clearArray: true); + _set = ChecksumSetPool.Default.Get(); + +#if NET + _set.EnsureCapacity(initialCapacity); +#endif + } + + public void Dispose() + { + _builder.Dispose(); + + var set = Interlocked.Exchange(ref _set, null!); + if (set is not null) + { + ChecksumSetPool.Default.Return(set); + } + } + + public readonly bool IsEmpty => Count == 0; + + public readonly int Count => _builder.Length; + + public readonly TagHelperDescriptor this[int index] + { + get + { + ArgHelper.ThrowIfNegative(index); + ArgHelper.ThrowIfGreaterThanOrEqual(index, Count); + + return _builder[index]; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Add(TagHelperDescriptor item) + { + if (!_set.Add(item.Checksum)) + { + return false; + } + + _builder.Append(item); + return true; + } + + public void AddRange(TagHelperCollection collection) + { + foreach (var item in collection) + { + if (_set.Add(item.Checksum)) + { + _builder.Append(item); + } + } + } + + public void AddRange(ReadOnlySpan span) + { + foreach (var item in span) + { + if (_set.Add(item.Checksum)) + { + _builder.Append(item); + } + } + } + + public void AddRange(IEnumerable source) + { + foreach (var item in source) + { + if (_set.Add(item.Checksum)) + { + _builder.Append(item); + } + } + } + + public readonly Enumerator GetEnumerator() + => new(this); + + public readonly TagHelperCollection ToCollection() + { + switch (_builder.Length) + { + case 0: + return Empty; + } + + // We need to copy the final array out since MemoryBuilder + // uses ArrayPool internally. + var array = _builder.AsMemory().ToArray(); + + return new SingleSegmentCollection(array); + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentAccessor.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentAccessor.cs new file mode 100644 index 00000000000..3b1533f6030 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentAccessor.cs @@ -0,0 +1,52 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + /// + /// Provides read-only access to segments within a , + /// enabling enumeration and indexed retrieval of segments. + /// + /// + /// Segments are represented as . + /// + private readonly ref struct SegmentAccessor(TagHelperCollection collection) + { + public int Count => collection.SegmentCount; + + public ReadOnlyMemory this[int index] + => collection.GetSegment(index); + + public SegmentEnumerator GetEnumerator() + => new(collection); + } + + private struct SegmentEnumerator(TagHelperCollection collection) + { + private int _index = -1; + + public readonly ReadOnlyMemory Current + => collection.GetSegment(_index); + + public bool MoveNext() + { + var nextIndex = _index + 1; + if (nextIndex < collection.SegmentCount) + { + _index = nextIndex; + return true; + } + + return false; + } + + public void Reset() + { + _index = -1; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentBuilder.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentBuilder.cs new file mode 100644 index 00000000000..5639649767c --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentBuilder.cs @@ -0,0 +1,116 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.AspNetCore.Razor.Utilities; + +#if DEBUG +using System.Diagnostics; +#endif + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + /// + /// Provides a builder for efficiently constructing a collection of tag helper descriptor + /// segments, ensuring that each segment contains only unique descriptors based on their checksums. + /// De-duplication is performed by slicing the original segment into smaller segments + /// to avoid copying each unique descriptor into a new array. + /// + private ref struct SegmentBuilder + { + private MemoryBuilder> _builder; + private readonly HashSet _seenChecksums; + + public SegmentBuilder() + : this(capacity: 8) + { + } + + public SegmentBuilder(int capacity) + { + if (capacity < 8) + { + capacity = 8; + } + + _builder = new MemoryBuilder>(capacity, clearArray: true); + ChecksumSetPool.Default.GetPooledObject(out _seenChecksums); + } + + public void Dispose() + { + _builder.Dispose(); + ChecksumSetPool.Default.Return(_seenChecksums); + } + + /// + /// Adds a segment of TagHelperDescriptor items, appending only unique items based on + /// their checksum to the underlying collection. + /// + /// + /// A read-only memory region containing the TagHelperDescriptor items to add. Only items + /// with unique checksums, not previously added, are appended. + /// + /// + /// If the segment contains duplicate items (by checksum), only the first occurrence is + /// added; subsequent duplicates are ignored. The method preserves the order of unique + /// items as they appear in the segment. + /// + public void AddSegment(ReadOnlyMemory segment) + { + var span = segment.Span; + var segmentStart = 0; + + for (var i = 0; i < span.Length; i++) + { + if (_seenChecksums.Add(span[i].Checksum)) + { + // Item is unique, continue building current segment + continue; + } + + // Found duplicate - close current segment if it has items + if (i > segmentStart) + { + // Create a slice from the original segment, avoiding array allocation + var uniqueSegment = segment[segmentStart..i]; + _builder.Append(uniqueSegment); + } + + // Start new segment after this duplicate + segmentStart = i + 1; + } + + // Close final segment if it has items + if (segmentStart < span.Length) + { + var finalSegment = segment[segmentStart..]; + _builder.Append(finalSegment); + } + } + + public readonly TagHelperCollection ToCollection() + { + var segments = _builder.AsMemory().Span; + +#if DEBUG + foreach (var segment in segments) + { + Debug.Assert(!segment.IsEmpty, "SegmentBuilder should not contain an empty segment."); + } +#endif + + return segments switch + { + [] => Empty, + [var singleSegment] => new SingleSegmentCollection(singleSegment), + _ => new MultiSegmentCollection(ImmutableCollectionsMarshal.AsImmutableArray(segments.ToArray())) + }; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentCollectionBase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentCollectionBase.cs new file mode 100644 index 00000000000..e2c4e9eed0f --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SegmentCollectionBase.cs @@ -0,0 +1,108 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Diagnostics; +using Microsoft.AspNetCore.Razor.Threading; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + /// + /// Represents an abstract collection of tag helper descriptors organized into segments. + /// + /// + /// SegmentCollection provides efficient lookup and indexing for tag helper descriptors by + /// utilizing a segmented internal structure. This class is intended to be used as a base + /// for specialized collections that require optimized access patterns for large numbers of + /// tag helpers. Thread safety and mutability depend on the implementation of the derived class. + /// + private abstract class SegmentCollectionBase : TagHelperCollection + { + private LazyValue> _lazyLookupTable = new(collection => + { + var lookupTable = new Dictionary(collection.Count); + var index = 0; + + foreach (var segment in collection.Segments) + { + foreach (var item in segment.Span) + { + lookupTable.Add(item.Checksum, index++); + } + } + + return lookupTable; + }); + + private LazyValue _lazyChecksum = new(collection => + { + var builder = new Checksum.Builder(); + + foreach (var segment in collection.Segments) + { + foreach (var item in segment.Span) + { + builder.Append(item.Checksum); + } + } + + return builder.FreeAndGetChecksum(); + }); + + private bool UseLookupTable => Count > 8; + + private Dictionary LookupTable + { + get + { + Debug.Assert(UseLookupTable); + return _lazyLookupTable.GetValue(this); + } + } + + internal override Checksum Checksum + => _lazyChecksum.GetValue(this); + + public override int IndexOf(TagHelperDescriptor item) + { + if (UseLookupTable) + { + return LookupTable.TryGetValue(item.Checksum, out var index) + ? index + : -1; + } + + var currentOffset = 0; + + foreach (var segment in Segments) + { + var index = segment.Span.IndexOf(item); + + if (index >= 0) + { + return currentOffset + index; + } + + currentOffset += segment.Length; + } + + return -1; + } + + public override void CopyTo(Span destination) + { + ArgHelper.ThrowIfDestinationTooShort(destination, Count); + + foreach (var segment in Segments) + { + segment.Span.CopyTo(destination); + destination = destination[segment.Length..]; + } + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SingleSegmentCollection.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SingleSegmentCollection.cs new file mode 100644 index 00000000000..cdf918ec18f --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.SingleSegmentCollection.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Diagnostics; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + /// + /// Represents a collection of objects that contains + /// a single contiguous segment. + /// + private sealed class SingleSegmentCollection : SegmentCollectionBase + { + private readonly ReadOnlyMemory _segment; + + public SingleSegmentCollection(TagHelperDescriptor item) + { + _segment = new[] { item }; + } + + public SingleSegmentCollection(ReadOnlyMemory segment) + { + Debug.Assert(segment.Length > 0, "Segments cannot be empty."); + + _segment = segment; + } + + protected override int SegmentCount => 1; + + protected override ReadOnlyMemory GetSegment(int index) + { + Debug.Assert(index == 0); + + return _segment; + } + + public override int Count => _segment.Length; + + public override TagHelperDescriptor this[int index] + { + get + { + ArgHelper.ThrowIfNegative(index); + ArgHelper.ThrowIfGreaterThanOrEqual(index, Count); + + return _segment.Span[index]; + } + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.cs new file mode 100644 index 00000000000..3550fbe1e64 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection.cs @@ -0,0 +1,381 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.Language; + +/// +/// Represents an immutable, ordered collection of instances. +/// +/// +/// +/// provides high-performance access to tag helper descriptors with +/// automatic deduplication based on . The collection is +/// optimized for common operations including indexing, searching, and enumeration. +/// +/// +/// Collections can be created using collection expressions, factory methods, or by merging existing +/// collections. Large collections (>8 items) automatically use hash-based lookup tables for O(1) +/// search performance. +/// +/// +/// This type supports collection expressions: +/// +/// TagHelperCollection collection = [tagHelper1, tagHelper2, tagHelper3]; +/// +/// +/// +[CollectionBuilder(typeof(TagHelperCollection), methodName: "Create")] +public abstract partial class TagHelperCollection : IEquatable, IReadOnlyList +{ + /// + /// Gets an empty . + /// + /// + /// A singleton empty collection instance. + /// + public static TagHelperCollection Empty => EmptyCollection.Instance; + + /// + /// Gets a value indicating whether the collection is empty. + /// + /// + /// if the collection contains no elements; otherwise, . + /// + public bool IsEmpty => Count == 0; + + private SegmentAccessor Segments => new(this); + + /// + /// Gets the number of memory segments that make up this collection. + /// + /// + /// The number of contiguous memory segments. + /// + protected abstract int SegmentCount { get; } + + /// + /// Gets the memory segment at the specified index. + /// + /// The zero-based index of the segment to retrieve. + /// + /// A containing the tag helper descriptors in the segment. + /// + protected abstract ReadOnlyMemory GetSegment(int index); + + /// + /// Gets the number of tag helper descriptors in the collection. + /// + /// + /// The total number of tag helper descriptors. + /// + public abstract int Count { get; } + + /// + /// Gets the at the specified index. + /// + /// The zero-based index of the tag helper descriptor to retrieve. + /// + /// The tag helper descriptor at the specified index. + /// + /// + /// is less than 0 or greater than or equal to . + /// + public abstract TagHelperDescriptor this[int index] { get; } + + /// + /// Gets the computed checksum for this collection based on the checksums of all contained descriptors. + /// + /// + /// A checksum representing the content of this collection. + /// + internal abstract Checksum Checksum { get; } + + /// + /// Determines whether the specified object is equal to the current . + /// + /// The object to compare with the current collection. + /// + /// if the specified object is a that contains + /// the same tag helper descriptors in the same order; otherwise, . + /// + public override bool Equals(object? obj) + => obj is TagHelperCollection other && Equals(other); + + /// + /// Determines whether the specified is equal to the current collection. + /// + /// The collection to compare with the current collection. + /// + /// if the specified collection contains the same tag helper descriptors + /// in the same order; otherwise, . + /// + /// + /// Equality is determined by comparing the computed checksums of both collections for performance. + /// Collections with the same content will have identical checksums regardless of their internal structure. + /// + public bool Equals(TagHelperCollection? other) + { + if (other is null) + { + return false; + } + + if (ReferenceEquals(this, other)) + { + return true; + } + + if (Count != other.Count) + { + return false; + } + + return Checksum.Equals(other.Checksum); + } + + /// + /// Returns a hash code for the current . + /// + /// + /// A hash code for the current collection. + /// + /// + /// The hash code is derived from the collection's checksum, ensuring that collections + /// with identical content have the same hash code. + /// + public override int GetHashCode() + => Checksum.GetHashCode(); + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// An for the collection. + /// + public Enumerator GetEnumerator() + => new(this); + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// An for the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + => new EnumeratorImpl(this); + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// An for the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + => new EnumeratorImpl(this); + + /// + /// Searches for the specified and returns the zero-based index + /// of the first occurrence within the collection. + /// + /// The tag helper descriptor to locate in the collection. + /// + /// The zero-based index of the first occurrence of within the collection, + /// if found; otherwise, -1. + /// + /// + /// The search is performed using the descriptor's checksum for efficient comparison. + /// For collections with more than 8 items, this operation uses a hash-based lookup table + /// for O(1) performance. Smaller collections use linear search. + /// + public abstract int IndexOf(TagHelperDescriptor item); + + /// + /// Determines whether the collection contains a specific . + /// + /// The tag helper descriptor to locate in the collection. + /// + /// if is found in the collection; otherwise, . + /// + /// + /// This method uses internally and benefits from + /// the same performance optimizations. + /// + public bool Contains(TagHelperDescriptor item) + => IndexOf(item) >= 0; + + /// + /// Copies all the tag helper descriptors in the collection to a compatible one-dimensional span, + /// starting at the beginning of the target span. + /// + /// + /// The one-dimensional that is the destination of the descriptors + /// copied from the collection. + /// + /// + /// The span is too short to contain all the descriptors in the collection. + /// + public abstract void CopyTo(Span destination); + + /// + /// Filters the collection based on a predicate and returns a new + /// containing only the tag helper descriptors that satisfy the condition. + /// + /// The type of the state object passed to the predicate. + /// The state object to pass to the predicate function. + /// A function to test each tag helper descriptor for a condition. + /// + /// A new that contains the tag helper descriptors from the + /// current collection that satisfy the condition specified by . + /// + /// + /// + /// This method preserves the order of elements and automatically handles deduplication. + /// The resulting collection maintains the same performance characteristics as the original. + /// + /// + /// If no elements match the predicate, is returned. + /// If all elements match the predicate, this collection is returned.. + /// + /// + /// This overload allows passing state to the predicate without creating closures, which can + /// improve performance by avoiding allocations. + /// + /// + public TagHelperCollection Where(TState state, Func predicate) + { + if (IsEmpty) + { + return []; + } + + // Note: We don't have to worry about checking for duplicates since this + // collection is already de-duped. + using var segments = new PooledArrayBuilder>(); + + foreach (var segment in Segments) + { + var span = segment.Span; + var segmentStart = 0; + + for (var i = 0; i < span.Length; i++) + { + if (predicate(span[i], state)) + { + // Item matches predicate, continue building current segment + continue; + } + + // Item doesn't match predicate - close current segment if it has items + if (i > segmentStart) + { + segments.Add(segment[segmentStart..i]); + } + + // Start new segment after this filtered item + segmentStart = i + 1; + } + + // Close final segment if it has items + if (segmentStart < span.Length) + { + segments.Add(segment[segmentStart..]); + } + } + + return segments.Count switch + { + 0 => Empty, + + // If there's only one segment and its length is different from the original count, + // we need to create a new collection. Otherwise, the predicate matched all items and + // we can just return the current collection. + 1 => segments[0].Length != Count + ? new SingleSegmentCollection(segments[0]) + : this, + + _ => new MultiSegmentCollection(segments.ToImmutableAndClear()) + }; + } + + /// + /// Filters the collection based on a predicate and returns a new + /// containing only the tag helper descriptors that satisfy the condition. + /// + /// A function to test each tag helper descriptor for a condition. + /// + /// A new that contains the tag helper descriptors from the + /// current collection that satisfy the condition specified by . + /// + /// + /// + /// This method preserves the order of elements and automatically handles deduplication. + /// The resulting collection maintains the same performance characteristics as the original. + /// + /// + /// If no elements match the predicate, is returned. + /// If all elements match the predicate, this collection is returned.. + /// + /// + public TagHelperCollection Where(Predicate predicate) + { + if (IsEmpty) + { + return []; + } + + // Note: We don't have to worry about checking for duplicates since this + // collection is already de-duped. + using var segments = new PooledArrayBuilder>(); + + foreach (var segment in Segments) + { + var span = segment.Span; + var segmentStart = 0; + + for (var i = 0; i < span.Length; i++) + { + if (predicate(span[i])) + { + // Item matches predicate, continue building current segment + continue; + } + + // Item doesn't match predicate - close current segment if it has items + if (i > segmentStart) + { + segments.Add(segment[segmentStart..i]); + } + + // Start new segment after this filtered item + segmentStart = i + 1; + } + + // Close final segment if it has items + if (segmentStart < span.Length) + { + segments.Add(segment[segmentStart..]); + } + } + + return segments.Count switch + { + 0 => Empty, + + // If there's only one segment and its length is different from the original count, + // we need to create a new collection. Otherwise, the predicate matched all items and + // we can just return the current collection. + 1 => segments[0].Length != Count + ? new SingleSegmentCollection(segments[0]) + : this, + + _ => new MultiSegmentCollection(segments.ToImmutableAndClear()) + }; + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection_Factories.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection_Factories.cs new file mode 100644 index 00000000000..0bfca6ba51d --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollection_Factories.cs @@ -0,0 +1,462 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Microsoft.AspNetCore.Razor.PooledObjects; + +namespace Microsoft.AspNetCore.Razor.Language; + +public abstract partial class TagHelperCollection +{ + /// + /// Creates a new from the specified span of tag helper descriptors. + /// + /// The span of tag helper descriptors to include in the collection. + /// + /// A new containing the specified descriptors with automatic + /// deduplication based on checksums. + /// + /// + /// + /// This method automatically deduplicates descriptors based on their checksums and optimizes + /// the internal structure based on the number of elements. Empty spans return the singleton + /// instance, single elements use optimized storage, and larger collections + /// use segmented storage with hash-based lookup tables when beneficial. + /// + /// + public static TagHelperCollection Create(ReadOnlySpan span) + { + return span switch + { + [] => Empty, + [var singleItem] => new SingleSegmentCollection(singleItem), + var items => BuildCollection(items), + }; + + static TagHelperCollection BuildCollection(ReadOnlySpan span) + { + using var builder = new FixedSizeBuilder(span.Length); + + builder.AddRange(span); + + return builder.ToCollection(); + } + } + + /// + /// Creates a new from the specified immutable array of tag helper descriptors. + /// + /// The immutable array of tag helper descriptors to include in the collection. + /// + /// A new containing the specified descriptors with automatic + /// deduplication based on checksums. + /// + /// + /// + /// This method leverages the memory-efficient nature of by using + /// its underlying memory directly when possible. The collection automatically deduplicates + /// descriptors based on their checksums. + /// + /// + /// Empty arrays return the singleton instance, and single-element arrays + /// use optimized storage that shares the original array's memory. + /// + /// + /// This method is given higher overload resolution priority because it uses the underlying memory + /// of the and can be more efficient than + /// , which must create a new array to hold the elements. + /// + /// + [OverloadResolutionPriority(1)] + public static TagHelperCollection Create(params ImmutableArray array) + { + // Note: We intentionally do *not* delegate to the Create(ReadOnlySpan) + // overload, which must copy all of the elements from the span that's passed in. + // We can use the underlying memory of the ImmutableArray directly. + var segment = array.AsMemory(); + + return segment.Span switch + { + [] => Empty, + [TagHelperDescriptor] => new SingleSegmentCollection(segment), + _ => BuildCollection(segment) + }; + + static TagHelperCollection BuildCollection(ReadOnlyMemory segment) + { + using var builder = new SegmentBuilder(); + + builder.AddSegment(segment); + + return builder.ToCollection(); + } + } + + /// + /// Creates a new from the specified enumerable of tag helper descriptors. + /// + /// The enumerable of tag helper descriptors to include in the collection. + /// + /// A new containing the specified descriptors with automatic + /// deduplication based on checksums. + /// + /// is . + /// + /// + /// This method optimizes for enumerables that provide a count (such as arrays, lists, and other + /// collections) by pre-allocating the appropriate storage. For arbitrary enumerables without + /// a known count, it uses a growing buffer approach. + /// + /// + /// The collection automatically deduplicates descriptors based on their checksums and maintains + /// the order of first occurrence for duplicate items. + /// + /// + public static TagHelperCollection Create(IEnumerable source) + { + if (source.TryGetCount(out var count)) + { + // Copy the IEnumerable to an immutable array and delegate to the + // Create(ImmutableArray) method. + + // Note: We intentionally do *not* delegate to the Create(ReadOnlySpan) + // overload, which must copy all of the elements from the span that's passed in. + var array = new TagHelperDescriptor[count]; + source.CopyTo(array); + + return Create(ImmutableCollectionsMarshal.AsImmutableArray(array)); + } + + // Fallback for an arbitrary IEnumerable with no count. + + // Copy the IEnumerable to a MemoryBuilder and delegate to the other Create method. + // Note that we can pass a span to the underlying pooled array below because + // Create(ReadOnlySpan) copies the elements into a new array. + using var builder = new MemoryBuilder(clearArray: true); + + foreach (var item in source) + { + builder.Append(item); + } + + return Create(builder.AsMemory().Span); + } + + /// + /// Merges multiple instances into a single collection. + /// + /// The span of collections to merge. + /// + /// A new containing all unique tag helper descriptors from + /// the input collections, with duplicates removed based on checksums. + /// + /// + /// + /// This method efficiently merges collections by first filtering out empty collections and + /// those with duplicate checksums. The resulting collection maintains the order of elements + /// as they appear in the input collections, with the first occurrence of duplicates preserved. + /// + /// + /// If no collections are provided or all are empty, is returned. + /// If only one non-empty unique collection is provided, that collection is returned directly. + /// + /// + [OverloadResolutionPriority(1)] + public static TagHelperCollection Merge(params ReadOnlySpan collections) + { + switch (collections) + { + case []: + return Empty; + + case [var singleCollection]: + return singleCollection; + } + + // First, collect the "mergeable" collections, i.e., those that are not empty and have unique checksums. + using var _ = CollectMergeableCollections(collections, out var mergeableCollections); + + return mergeableCollections switch + { + [] => Empty, + [var single] => single, + _ => MergeMultipleCollections(mergeableCollections) + }; + + static PooledArray CollectMergeableCollections( + ReadOnlySpan collections, out ReadOnlySpan result) + { + var pooledArray = ArrayPool.Shared.GetPooledArraySpan( + minimumLength: collections.Length, clearOnReturn: true, out var destination); + + using var _ = ChecksumSetPool.Default.GetPooledObject(out var checksums); + var index = 0; + + foreach (var collection in collections) + { + // Only add non-empty collections with unique checksums. + if (!collection.IsEmpty && checksums.Add(collection.Checksum)) + { + destination[index++] = collection; + } + } + + result = destination[..index]; + return pooledArray; + } + + static TagHelperCollection MergeMultipleCollections(ReadOnlySpan collections) + { + Debug.Assert(collections.Length >= 2); + + // Calculate number of segments to set the initial capacity of the SegmentBuilder. + var segmentCount = 0; + + foreach (var collection in collections) + { + segmentCount += collection.Segments.Count; + } + + using var builder = new SegmentBuilder(capacity: segmentCount); + + foreach (var collection in collections) + { + foreach (var segment in collection.Segments) + { + builder.AddSegment(segment); + } + } + + return builder.ToCollection(); + } + } + + /// + /// Merges multiple instances into a single collection. + /// + /// The immutable array of collections to merge. + /// + /// A new containing all unique tag helper descriptors from + /// the input collections, with duplicates removed based on checksums. + /// + /// + /// This method delegates to for efficient + /// processing. See that method's documentation for detailed behavior information. + /// + public static TagHelperCollection Merge(ImmutableArray collections) + => Merge(collections.AsSpan()); + + /// + /// Merges multiple instances into a single collection. + /// + /// The enumerable of collections to merge. + /// + /// A new containing all unique tag helper descriptors from + /// the input collections, with duplicates removed based on checksums. + /// + /// is . + /// + /// + /// This method optimizes for enumerables that provide a count by pre-allocating storage. + /// For arbitrary enumerables without a known count, it uses a growing buffer approach. + /// + /// + /// The method efficiently filters out empty collections and those with duplicate checksums, + /// maintaining the order of elements as they appear in the input collections. + /// + /// + public static TagHelperCollection Merge(IEnumerable source) + { + if (source.TryGetCount(out var count)) + { + using var _ = ArrayPool.Shared.GetPooledArraySpan( + minimumLength: count, clearOnReturn: true, out var collections); + + source.CopyTo(collections); + + return Merge(collections); + } + + // Fallback for arbitrary IEnumerable + using var builder = new MemoryBuilder(clearArray: true); + + foreach (var collection in source) + { + builder.Append(collection); + } + + return Merge(builder.AsMemory().Span); + } + + /// + /// Merges two instances into a single collection. + /// + /// The first collection to merge. + /// The second collection to merge. + /// + /// A new containing all unique tag helper descriptors from + /// both input collections, with duplicates removed based on checksums. + /// + /// + /// + /// This method provides optimized handling for the common case of merging exactly two collections. + /// It includes fast-path optimizations for empty collections and identical collections. + /// + /// + /// If either collection is empty, the other collection is returned directly. + /// If both collections are equal (same checksum), the first collection is returned. + /// + /// + public static TagHelperCollection Merge(TagHelperCollection first, TagHelperCollection second) + { + if (first.IsEmpty) + { + return second; + } + + if (second.IsEmpty) + { + return first; + } + + if (first.Equals(second)) + { + return first; + } + + using var _ = ArrayPool.Shared.GetPooledArraySpan( + minimumLength: 2, clearOnReturn: true, out var collections); + + collections[0] = first; + collections[1] = second; + + return Merge(collections); + } + + public delegate void BuildAction(ref RefBuilder builder); + public delegate void BuildAction(ref RefBuilder builder, TState state); + + /// + /// Builds a new using a builder pattern with state. + /// + /// The type of the state object passed to the build action. + /// The state object to pass to the build action. + /// The action that defines how to build the collection. + /// + /// A new built according to the specified action. + /// + /// + /// + /// This method provides a flexible way to build collections using a callback pattern. + /// The builder automatically handles deduplication and optimizes the internal structure + /// based on the final number of elements. + /// + /// + /// The state parameter allows passing data to the build action without creating closures, + /// which can improve performance by avoiding allocations. + /// + /// + public static TagHelperCollection Build(TState state, BuildAction action) + { + var builder = new RefBuilder(); + + return BuildCore(ref builder, state, action); + } + + /// + /// Builds a new using a builder pattern with state and initial capacity. + /// + /// The type of the state object passed to the build action. + /// The state object to pass to the build action. + /// The initial capacity hint for the builder. + /// The action that defines how to build the collection. + /// + /// A new built according to the specified action. + /// + /// + /// + /// This overload allows specifying an initial capacity hint to optimize memory allocation + /// when the approximate number of elements is known in advance. + /// + /// + /// The state parameter allows passing data to the build action without creating closures, + /// improving performance by avoiding allocations. + /// + /// + public static TagHelperCollection Build(TState state, int initialCapacity, BuildAction action) + { + var builder = new RefBuilder(initialCapacity); + + return BuildCore(ref builder, state, action); + } + + private static TagHelperCollection BuildCore(ref RefBuilder builder, TState state, BuildAction action) + { + try + { + action(ref builder, state); + return builder.ToCollection(); + } + finally + { + builder.Dispose(); + } + } + + /// + /// Builds a new using a builder pattern. + /// + /// The action that defines how to build the collection. + /// + /// A new built according to the specified action. + /// + /// + /// This method provides a flexible way to build collections using a callback pattern. + /// The builder automatically handles deduplication and optimizes the internal structure + /// based on the final number of elements. + /// + public static TagHelperCollection Build(BuildAction action) + { + var builder = new RefBuilder(); + + return BuildCore(ref builder, action); + } + + /// + /// Builds a new using a builder pattern with initial capacity. + /// + /// The initial capacity hint for the builder. + /// The action that defines how to build the collection. + /// + /// A new built according to the specified action. + /// + /// + /// This overload allows specifying an initial capacity hint to optimize memory allocation + /// when the approximate number of elements is known in advance. + /// + public static TagHelperCollection Build(int initialCapacity, BuildAction action) + { + var builder = new RefBuilder(initialCapacity); + + return BuildCore(ref builder, action); + } + + private static TagHelperCollection BuildCore(ref RefBuilder builder, BuildAction action) + { + try + { + action(ref builder); + return builder.ToCollection(); + } + finally + { + builder.Dispose(); + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollector.Cache.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollector.Cache.cs deleted file mode 100644 index 7bc9e56657b..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollector.Cache.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Diagnostics.CodeAnalysis; -using System.Threading; - -namespace Microsoft.AspNetCore.Razor.Language; - -public abstract partial class TagHelperCollector - where T : TagHelperCollector -{ - private sealed class Cache - { - private const int IncludeDocumentation = 1 << 0; - private const int ExcludeHidden = 1 << 1; - - // The cache needs to be large enough to handle all combinations of options. - private const int CacheSize = (IncludeDocumentation | ExcludeHidden) + 1; - - private readonly TagHelperDescriptor[]?[] _tagHelpers = new TagHelperDescriptor[CacheSize][]; - - public bool TryGet(bool includeDocumentation, bool excludeHidden, [NotNullWhen(true)] out TagHelperDescriptor[]? tagHelpers) - { - var index = CalculateIndex(includeDocumentation, excludeHidden); - - tagHelpers = Volatile.Read(ref _tagHelpers[index]); - return tagHelpers is not null; - } - - public TagHelperDescriptor[] Add(TagHelperDescriptor[] tagHelpers, bool includeDocumentation, bool excludeHidden) - { - var index = CalculateIndex(includeDocumentation, excludeHidden); - - return InterlockedOperations.Initialize(ref _tagHelpers[index], tagHelpers); - } - - private static int CalculateIndex(bool includeDocumentation, bool excludeHidden) - { - var index = 0; - - if (includeDocumentation) - { - index |= IncludeDocumentation; - } - - if (excludeHidden) - { - index |= ExcludeHidden; - } - - return index; - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollector.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollector.cs deleted file mode 100644 index 1d9baaadab7..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperCollector.cs +++ /dev/null @@ -1,143 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Threading; -using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.CodeAnalysis; - -namespace Microsoft.AspNetCore.Razor.Language; - -public abstract partial class TagHelperCollector( - Compilation compilation, - IAssemblySymbol? targetAssembly) - where T : TagHelperCollector -{ - // This type is generic to ensure that each descendent gets its own instance of this field. - private static readonly ConditionalWeakTable s_perAssemblyCaches = new(); - - private readonly Compilation _compilation = compilation; - private readonly IAssemblySymbol? _targetAssembly = targetAssembly; - - protected virtual bool IncludeNestedTypes => false; - - protected abstract bool IsCandidateType(INamedTypeSymbol type); - - protected abstract void Collect( - INamedTypeSymbol type, - ICollection results, - CancellationToken cancellationToken); - - public void Collect(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken) - { - if (_targetAssembly is not null) - { - Collect(_targetAssembly, context.Results, cancellationToken); - } - else - { - Collect(_compilation.Assembly, context.Results, cancellationToken); - - foreach (var reference in _compilation.References) - { - cancellationToken.ThrowIfCancellationRequested(); - - if (_compilation.GetAssemblyOrModuleSymbol(reference) is IAssemblySymbol assembly) - { - // Check to see if we already have tag helpers cached for this assembly - // and use the cached versions if we do. Roslyn shares PE assembly symbols - // across compilations, so this ensures that we don't produce new tag helpers - // for the same assemblies over and over again. - - var assemblySymbolData = SymbolCache.GetAssemblySymbolData(assembly); - if (!assemblySymbolData.MightContainTagHelpers) - { - continue; - } - - var includeDocumentation = context.IncludeDocumentation; - var excludeHidden = context.ExcludeHidden; - - var cache = s_perAssemblyCaches.GetValue(assembly, static assembly => new Cache()); - if (!cache.TryGet(includeDocumentation, excludeHidden, out var tagHelpers)) - { - using var _ = ListPool.GetPooledObject(out var referenceTagHelpers); - Collect(assembly, referenceTagHelpers, cancellationToken); - - tagHelpers = cache.Add(referenceTagHelpers.ToArrayOrEmpty(), includeDocumentation, excludeHidden); - } - - foreach (var tagHelper in tagHelpers) - { - context.Results.Add(tagHelper); - } - } - } - } - } - - protected virtual void Collect( - IAssemblySymbol assembly, - ICollection results, - CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - - var includeNestedTypes = IncludeNestedTypes; - - using var stack = new PooledArrayBuilder(); - - stack.Push(assembly.GlobalNamespace); - - while (stack.Count > 0) - { - cancellationToken.ThrowIfCancellationRequested(); - - var namespaceOrType = stack.Pop(); - - switch (namespaceOrType.Kind) - { - case SymbolKind.Namespace: - var members = namespaceOrType.GetMembers(); - - // Note: Push members onto the stack in reverse to ensure - // that they're popped off and processed in the correct order. - for (var i = members.Length - 1; i >= 0; i--) - { - cancellationToken.ThrowIfCancellationRequested(); - - // Namespaces members are only ever namespaces or types. - stack.Push((INamespaceOrTypeSymbol)members[i]); - } - - break; - - case SymbolKind.NamedType: - var typeSymbol = (INamedTypeSymbol)namespaceOrType; - - if (IsCandidateType(typeSymbol)) - { - // We have a candidate. Collect it. - Collect(typeSymbol, results, cancellationToken); - } - - if (includeNestedTypes && namespaceOrType.DeclaredAccessibility == Accessibility.Public) - { - var typeMembers = namespaceOrType.GetTypeMembers(); - - // Note: Push members onto the stack in reverse to ensure - // that they're popped off and processed in the correct order. - for (var i = typeMembers.Length - 1; i >= 0; i--) - { - cancellationToken.ThrowIfCancellationRequested(); - - stack.Push(typeMembers[i]); - } - } - - break; - } - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptor.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptor.cs index f50edba81aa..d20ad279acb 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptor.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptor.cs @@ -101,30 +101,30 @@ internal TagHelperDescriptor( private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData((byte)Flags); - builder.AppendData((byte)Kind); - builder.AppendData((byte)RuntimeKind); - builder.AppendData(Name); - builder.AppendData(AssemblyName); - builder.AppendData(DisplayName); - builder.AppendData(TagOutputHint); + builder.Append((byte)Flags); + builder.Append((byte)Kind); + builder.Append((byte)RuntimeKind); + builder.Append(Name); + builder.Append(AssemblyName); + builder.Append(DisplayName); + builder.Append(TagOutputHint); TypeNameObject.AppendToChecksum(in builder); DocumentationObject.AppendToChecksum(in builder); foreach (var descriptor in AllowedChildTags) { - builder.AppendData(descriptor.Checksum); + builder.Append(descriptor.Checksum); } foreach (var descriptor in BoundAttributes) { - builder.AppendData(descriptor.Checksum); + builder.Append(descriptor.Checksum); } foreach (var descriptor in TagMatchingRules) { - builder.AppendData(descriptor.Checksum); + builder.Append(descriptor.Checksum); } Metadata.AppendToChecksum(in builder); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorBuilder_Pooling.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorBuilder_Pooling.cs index 2b23da4ff9a..43a7ee992ea 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorBuilder_Pooling.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorBuilder_Pooling.cs @@ -9,7 +9,8 @@ namespace Microsoft.AspNetCore.Razor.Language; public partial class TagHelperDescriptorBuilder { - private static readonly ObjectPool s_pool = DefaultPool.Create(Policy.Instance); + private static readonly ObjectPool s_pool = + DefaultPool.Create(static () => new TagHelperDescriptorBuilder()); internal static TagHelperDescriptorBuilder GetInstance(string name, string assemblyName) => GetInstance(TagHelperKind.ITagHelper, name, assemblyName); @@ -46,17 +47,6 @@ private protected override void Reset() TagMatchingRules.Clear(); } - private sealed class Policy : PooledBuilderPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public override TagHelperDescriptorBuilder Create() => new(); - } - /// /// Retrieves a pooled instance. /// diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorProviderBase.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorProviderBase.cs deleted file mode 100644 index 9f0fe345aba..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorProviderBase.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Threading; - -namespace Microsoft.AspNetCore.Razor.Language; - -public abstract class TagHelperDescriptorProviderBase(int order = 0) : RazorEngineFeatureBase, ITagHelperDescriptorProvider -{ - public int Order { get; } = order; - - public abstract void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default); -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorProviderContext.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorProviderContext.cs deleted file mode 100644 index 7a755aaab8e..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorProviderContext.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using Microsoft.CodeAnalysis; - -namespace Microsoft.AspNetCore.Razor.Language; - -public sealed class TagHelperDescriptorProviderContext( - Compilation compilation, - IAssemblySymbol? targetAssembly, - ICollection results) -{ - public Compilation Compilation { get; } = compilation; - public IAssemblySymbol? TargetAssembly { get; } = targetAssembly; - public ICollection Results { get; } = results; - - public bool ExcludeHidden { get; init; } - public bool IncludeDocumentation { get; init; } - - public TagHelperDescriptorProviderContext(Compilation compilation, IAssemblySymbol? targetAssembly = null) - : this(compilation, targetAssembly, results: []) - { - } - - public TagHelperDescriptorProviderContext(Compilation compilation, ICollection results) - : this(compilation, targetAssembly: null, results) - { - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoverer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoverer.cs new file mode 100644 index 00000000000..9fc6f5ec5fd --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoverer.cs @@ -0,0 +1,171 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Buffers; +using System.Collections.Immutable; +using System.Diagnostics; +using System.Threading; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language; + +internal sealed class TagHelperDiscoverer(ImmutableArray producers, bool includeDocumentation, bool excludeHidden) +{ + private readonly int _cacheKey = GetCacheKey(producers, includeDocumentation, excludeHidden); + + /// + /// Generates a unique integer cache key based on the specified set of TagHelper producers and option flags. + /// + /// + /// The generated cache key is intended for efficient lookup scenarios where the combination of + /// producers and options must be uniquely identified. The method supports up to 30 distinct TagHelperProducer + /// kinds. + /// + private static int GetCacheKey(ImmutableArray producers, bool includeDocumentation, bool excludeHidden) + { + Debug.Assert(producers.Length <= 30, "Too many TagHelperProducer kinds to fit in a cache key."); + + var key = 0; + + if (includeDocumentation) + { + key |= 1 << 0; + } + + if (excludeHidden) + { + key |= 1 << 1; + } + + foreach (var producer in producers) + { + key |= 1 << ((int)producer.Kind + 2); + } + + return key; + } + + public TagHelperCollection GetTagHelpers(IAssemblySymbol assembly, CancellationToken cancellationToken = default) + { + if (producers.IsDefaultOrEmpty) + { + return TagHelperCollection.Empty; + } + + // Optimization: Check to see if this assembly might contain tag helpers before doing any work. + var assemblySymbolData = SymbolCache.GetAssemblySymbolData(assembly); + if (!assemblySymbolData.MightContainTagHelpers) + { + return TagHelperCollection.Empty; + } + + // Check to see if we already have tag helpers cached for this assembly + // and use the cached versions if we do. Roslyn shares PE assembly symbols + // across compilations, so this ensures that we don't produce new tag helpers + // for the same assemblies over and over again. + + if (assemblySymbolData.TryGetTagHelpers(_cacheKey, out var tagHelpers)) + { + return tagHelpers; + } + + // We don't have tag helpers cached for this assembly, so we have to discover them. + var builder = new TagHelperCollection.RefBuilder(); + try + { + // First, let producers add any static tag helpers they might have. + // Also, capture any producers that need to analyze types. + using var _ = ArrayPool.Shared.GetPooledArraySpan( + minimumLength: producers.Length, clearOnReturn: true, out var typeProducers); + + var index = 0; + var includeNestedTypes = false; + + foreach (var producer in producers) + { + if (producer.SupportsStaticTagHelpers) + { + producer.AddStaticTagHelpers(assembly, ref builder); + } + + if (producer.SupportsTypes) + { + typeProducers[index++] = producer; + includeNestedTypes |= producer.SupportsNestedTypes; + } + } + + typeProducers = typeProducers[..index]; + + cancellationToken.ThrowIfCancellationRequested(); + + // Did another discovery request for the same assembly finish and + // cache the result while we were producing static tag helpers? + if (assemblySymbolData.TryGetTagHelpers(_cacheKey, out tagHelpers)) + { + return tagHelpers; + } + + // Now, walk all types in the assembly and let producers add tag helpers. + using var stack = new MemoryBuilder(initialCapacity: 32, clearArray: true); + + stack.Push(assembly.GlobalNamespace); + + while (!stack.IsEmpty) + { + cancellationToken.ThrowIfCancellationRequested(); + + var namespaceOrType = stack.Pop(); + + switch (namespaceOrType.Kind) + { + case SymbolKind.Namespace: + var members = namespaceOrType.GetMembers(); + + // Note: Push members onto the stack in reverse to ensure + // that they're popped off and processed in the correct order. + for (var i = members.Length - 1; i >= 0; i--) + { + // Namespaces members are only ever namespaces or types. + stack.Push((INamespaceOrTypeSymbol)members[i]); + } + + break; + + case SymbolKind.NamedType: + var typeSymbol = (INamedTypeSymbol)namespaceOrType; + + foreach (var producer in typeProducers) + { + if (producer.IsCandidateType(typeSymbol)) + { + producer.AddTagHelpersForType(typeSymbol, ref builder, cancellationToken); + } + } + + if (includeNestedTypes && namespaceOrType.DeclaredAccessibility == Accessibility.Public) + { + var typeMembers = namespaceOrType.GetTypeMembers(); + + // Note: Push members onto the stack in reverse to ensure + // that they're popped off and processed in the correct order. + for (var i = typeMembers.Length - 1; i >= 0; i--) + { + stack.Push(typeMembers[i]); + } + } + + break; + } + } + + + return assemblySymbolData.AddTagHelpers(_cacheKey, builder.ToCollection()); + } + finally + { + builder.Dispose(); + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorBuilder.Policy.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoveryOptions.cs similarity index 63% rename from src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorBuilder.Policy.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoveryOptions.cs index 1dba4ef22c8..666bb6bc69b 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDescriptorBuilder.Policy.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoveryOptions.cs @@ -3,6 +3,8 @@ namespace Microsoft.AspNetCore.Razor.Language; -public partial class TagHelperDescriptorBuilder +internal enum TagHelperDiscoveryOptions : byte { + ExcludeHidden = 1 << 0, + IncludeDocumentation = 1 << 1 } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoveryService.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoveryService.cs new file mode 100644 index 00000000000..f3a351f5dcc --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDiscoveryService.cs @@ -0,0 +1,114 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language; + +internal sealed class TagHelperDiscoveryService : RazorEngineFeatureBase, ITagHelperDiscoveryService +{ + private ImmutableArray _producerFactories; + + protected override void OnInitialized() + { + _producerFactories = Engine.GetFeatures(); + } + + public TagHelperCollection GetTagHelpers( + Compilation compilation, + TagHelperDiscoveryOptions options, + CancellationToken cancellationToken = default) + => GetTagHelpersForCompilation(compilation, options, cancellationToken); + + public TagHelperCollection GetTagHelpers( + Compilation compilation, + CancellationToken cancellationToken = default) + => GetTagHelpersForCompilation(compilation, options: default, cancellationToken); + + private TagHelperCollection GetTagHelpersForCompilation( + Compilation compilation, + TagHelperDiscoveryOptions options, + CancellationToken cancellationToken = default) + { + ArgHelper.ThrowIfNull(compilation); + + if (!TryGetDiscoverer(compilation, options, out var discoverer)) + { + return TagHelperCollection.Empty; + } + + using var collections = new MemoryBuilder(initialCapacity: 512, clearArray: true); + + if (compilation.Assembly is { } compilationAssembly) + { + var collection = discoverer.GetTagHelpers(compilationAssembly, cancellationToken); + if (!collection.IsEmpty) + { + collections.Append(collection); + } + } + + foreach (var reference in compilation.References) + { + cancellationToken.ThrowIfCancellationRequested(); + + if (compilation.GetAssemblyOrModuleSymbol(reference) is IAssemblySymbol referenceAssembly) + { + var collection = discoverer.GetTagHelpers(referenceAssembly, cancellationToken); + if (!collection.IsEmpty) + { + collections.Append(collection); + } + } + } + + return TagHelperCollection.Merge(collections.AsMemory().Span); + } + + public bool TryGetDiscoverer(Compilation compilation, TagHelperDiscoveryOptions options, [NotNullWhen(true)] out TagHelperDiscoverer? discoverer) + { + ArgHelper.ThrowIfNull(compilation); + + var excludeHidden = options.IsFlagSet(TagHelperDiscoveryOptions.ExcludeHidden); + var includeDocumentation = options.IsFlagSet(TagHelperDiscoveryOptions.IncludeDocumentation); + + var producers = GetProducers(compilation, includeDocumentation, excludeHidden); + + if (producers.IsEmpty) + { + discoverer = default; + return false; + } + + discoverer = new TagHelperDiscoverer(producers, includeDocumentation, excludeHidden); + return true; + } + + public bool TryGetDiscoverer(Compilation compilation, [NotNullWhen(true)] out TagHelperDiscoverer? discoverer) + => TryGetDiscoverer(compilation, options: default, out discoverer); + + private ImmutableArray GetProducers(Compilation compilation, bool includeDocumentation, bool excludeHidden) + { + if (_producerFactories.IsDefaultOrEmpty) + { + return []; + } + + using var builder = new PooledArrayBuilder(_producerFactories.Length); + + foreach (var factory in _producerFactories) + { + if (factory.TryCreate(compilation, includeDocumentation, excludeHidden, out var producer)) + { + builder.Add(producer); + } + } + + return builder.ToImmutableAndClear(); + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDocumentContext.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDocumentContext.cs index 0a9409ac177..274993ae929 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDocumentContext.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperDocumentContext.cs @@ -1,8 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; -using System.Collections.Immutable; +using Microsoft.AspNetCore.Razor.Utilities; namespace Microsoft.AspNetCore.Razor.Language; @@ -11,30 +10,33 @@ namespace Microsoft.AspNetCore.Razor.Language; /// Tag Helper information after processing by directives. /// internal sealed class TagHelperDocumentContext -{ +{ + private static readonly CleanableWeakCache<(string? Prefix, Checksum), TagHelperDocumentContext> s_cache = new(cleanUpThreshold: 20); + public string? Prefix { get; } - public ImmutableArray TagHelpers { get; } + public TagHelperCollection TagHelpers { get; } private TagHelperBinder? _binder; - private TagHelperDocumentContext(string? prefix, ImmutableArray tagHelpers) + private TagHelperDocumentContext(string? prefix, TagHelperCollection tagHelpers) { Prefix = prefix; TagHelpers = tagHelpers; } - public static TagHelperDocumentContext Create(string? prefix, ImmutableArray tagHelpers) + public static TagHelperDocumentContext GetOrCreate(TagHelperCollection tagHelpers) + => GetOrCreate(prefix: null, tagHelpers); + + public static TagHelperDocumentContext GetOrCreate(string? prefix, TagHelperCollection tagHelpers) { - if (tagHelpers.IsDefault) - { - throw new ArgumentNullException(nameof(tagHelpers)); - } + ArgHelper.ThrowIfNull(tagHelpers); - return new(prefix, tagHelpers); + return s_cache.GetOrAdd( + key: (prefix, tagHelpers.Checksum), + arg: (prefix, tagHelpers), + arg => new(arg.prefix, arg.tagHelpers)); } public TagHelperBinder GetBinder() - { - return _binder ?? InterlockedOperations.Initialize(ref _binder, new TagHelperBinder(Prefix, TagHelpers)); - } + => _binder ?? InterlockedOperations.Initialize(ref _binder, new TagHelperBinder(Prefix, TagHelpers)); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperMatchingConventions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperMatchingConventions.cs index 3d6e23a4b48..4689327fc06 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperMatchingConventions.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperMatchingConventions.cs @@ -187,7 +187,7 @@ private static bool TryGetBoundAttributeParameter(string fullAttributeName, out /// for the specified attribute name. Each successful match is added to the provided matches collection. /// public static void GetAttributeMatches( - ImmutableArray tagHelpers, + TagHelperCollection tagHelpers, string name, ref PooledArrayBuilder matches) { diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObjectBuilder`1.PooledBuilderPolicy`1.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObjectBuilder`1.PooledBuilderPolicy`1.cs deleted file mode 100644 index 5e4296ea48e..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObjectBuilder`1.PooledBuilderPolicy`1.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.AspNetCore.Razor.Language; - -public abstract partial class TagHelperObjectBuilder - where T : TagHelperObject -{ - private protected abstract class PooledBuilderPolicy : IPooledObjectPolicy - where TBuilder : TagHelperObjectBuilder - { - private const int MaxSize = 32; - - public abstract TBuilder Create(); - - public bool Return(TBuilder builder) - { - builder._isBuilt = false; - - if (builder._diagnostics is { } diagnostics) - { - diagnostics.Clear(); - - if (diagnostics.Capacity > MaxSize) - { - diagnostics.Capacity = MaxSize; - } - } - - builder.Reset(); - - return true; - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObjectBuilder`1.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObjectBuilder`1.cs index 4251dcf13d5..8d7de7b83b9 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObjectBuilder`1.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObjectBuilder`1.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Razor.Language; -public abstract partial class TagHelperObjectBuilder +public abstract partial class TagHelperObjectBuilder : IPoolableObject where T : TagHelperObject { private ImmutableArray.Builder? _diagnostics; @@ -50,4 +50,23 @@ private protected virtual void CollectDiagnostics(ref PooledHashSet MaxSize) + { + diagnostics.Capacity = MaxSize; + } + } + + Reset(); + } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObject`1.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObject`1.cs index e1d11480c89..ee64b85f284 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObject`1.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelperObject`1.cs @@ -24,7 +24,7 @@ private protected TagHelperObject(ImmutableArray diagnostics) } internal Checksum Checksum - => _checksum ?? InterlockedOperations.Initialize(ref _checksum, ComputeChecksum()); + => _checksum ??= ComputeChecksum(); // Internal for benchmarks internal Checksum ComputeChecksum() @@ -35,7 +35,7 @@ internal Checksum ComputeChecksum() foreach (var diagnostic in Diagnostics) { - builder.AppendData(diagnostic.Checksum); + builder.Append(diagnostic.Checksum); } return builder.FreeAndGetChecksum(); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/BindTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/BindTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..f519a5da1ea --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/BindTagHelperProducer.Factory.cs @@ -0,0 +1,33 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class BindTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ComponentsApi.BindConverter.FullTypeName, out var bindConverterType)) + { + result = null; + return false; + } + + var bindElementAttributeType = compilation.GetTypeByMetadataName(ComponentsApi.BindElementAttribute.FullTypeName); + var bindInputElementAttributeType = compilation.GetTypeByMetadataName(ComponentsApi.BindInputElementAttribute.FullTypeName); + + result = new BindTagHelperProducer(bindConverterType, bindElementAttributeType, bindInputElementAttributeType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/BindTagHelperProducer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/BindTagHelperProducer.cs new file mode 100644 index 00000000000..af79ad9668a --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/BindTagHelperProducer.cs @@ -0,0 +1,650 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Razor; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class BindTagHelperProducer : TagHelperProducer +{ + // This provider returns tag helper information for 'bind' which doesn't necessarily + // map to any real component. Bind behaves more like a macro, which can map a single LValue to + // both a 'value' attribute and a 'value changed' attribute. + // + // User types: + // + // + // We generate: + // + // + // This isn't very different from code the user could write themselves - thus the pronouncement + // that @bind is very much like a macro. + // + // A lot of the value that provide in this case is that the associations between the + // elements, and the attributes aren't straightforward. + // + // For instance on we need to listen to 'value' and 'onchange', + // but on + // and so we have a special case for input elements and their type attributes. + // + // Additionally, our mappings tell us about cases like where + // we need to treat the value as an invariant culture value. In general the HTML5 field + // types use invariant culture values when interacting with the DOM, in contrast to + // which is free-form text and is most likely to be + // culture-sensitive. + // + // 4. For components, we have a bit of a special case. We can infer a syntax that matches + // case #2 based on property names. So if a component provides both 'Value' and 'ValueChanged' + // we will turn that into an instance of bind. + // + // So case #1 here is the most general case. Case #2 and #3 are data-driven based on attribute data + // we have. Case #4 is data-driven based on component definitions. + // + // We provide a good set of attributes that map to the HTML dom. This set is user extensible. + + private static readonly Lazy s_fallbackTagHelper = new(CreateFallbackBindTagHelper); + + private readonly INamedTypeSymbol _bindConverterType; + private readonly INamedTypeSymbol? _bindElementAttributeType; + private readonly INamedTypeSymbol? _bindInputElementAttributeType; + + private BindTagHelperProducer( + INamedTypeSymbol bindConverterType, + INamedTypeSymbol? bindElementAttributeType, + INamedTypeSymbol? bindInputElementAttributeType) + { + _bindConverterType = bindConverterType; + _bindElementAttributeType = bindElementAttributeType; + _bindInputElementAttributeType = bindInputElementAttributeType; + } + + public override TagHelperProducerKind Kind => TagHelperProducerKind.Bind; + + public override bool SupportsStaticTagHelpers => true; + + public override void AddStaticTagHelpers(IAssemblySymbol assembly, ref TagHelperCollection.RefBuilder results) + { + if (!SymbolEqualityComparer.Default.Equals(assembly, _bindConverterType.ContainingAssembly)) + { + return; + } + + // Tag Helper definition for case #1. This is the most general case. + results.Add(s_fallbackTagHelper.Value); + } + + public override bool SupportsTypes + => _bindElementAttributeType is not null && _bindInputElementAttributeType is not null; + + public override bool IsCandidateType(INamedTypeSymbol type) + => type.DeclaredAccessibility == Accessibility.Public && + type.Name == "BindAttributes"; + + public override void AddTagHelpersForType( + INamedTypeSymbol type, + ref TagHelperCollection.RefBuilder results, + CancellationToken cancellationToken) + { + // Not handling duplicates here for now since we're the primary ones extending this. + // If we see users adding to the set of 'bind' constructs we will want to add deduplication + // and potentially diagnostics. + foreach (var attribute in type.GetAttributes()) + { + var constructorArguments = attribute.ConstructorArguments; + + TagHelperDescriptor? tagHelper = null; + + // For case #2 & #3 we have a whole bunch of attribute entries on BindMethods that we can use + // to data-drive the definitions of these tag helpers. + + // We need to check the constructor argument length here, because this can show up as 0 + // if the language service fails to initialize. This is an invalid case, so skip it. + if (constructorArguments.Length == 4 && SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, _bindElementAttributeType)) + { + tagHelper = CreateElementBindTagHelper( + typeName: type.GetDefaultDisplayString(), + typeNamespace: type.ContainingNamespace.GetFullName(), + typeNameIdentifier: type.Name, + element: (string?)constructorArguments[0].Value, + typeAttribute: null, + suffix: (string?)constructorArguments[1].Value, + valueAttribute: (string?)constructorArguments[2].Value, + changeAttribute: (string?)constructorArguments[3].Value); + } + else if (constructorArguments.Length == 4 && SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, _bindInputElementAttributeType)) + { + tagHelper = CreateElementBindTagHelper( + typeName: type.GetDefaultDisplayString(), + typeNamespace: type.ContainingNamespace.GetFullName(), + typeNameIdentifier: type.Name, + element: "input", + typeAttribute: (string?)constructorArguments[0].Value, + suffix: (string?)constructorArguments[1].Value, + valueAttribute: (string?)constructorArguments[2].Value, + changeAttribute: (string?)constructorArguments[3].Value); + } + else if (constructorArguments.Length == 6 && SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, _bindInputElementAttributeType)) + { + tagHelper = CreateElementBindTagHelper( + typeName: type.GetDefaultDisplayString(), + typeNamespace: type.ContainingNamespace.GetFullName(), + typeNameIdentifier: type.Name, + element: "input", + typeAttribute: (string?)constructorArguments[0].Value, + suffix: (string?)constructorArguments[1].Value, + valueAttribute: (string?)constructorArguments[2].Value, + changeAttribute: (string?)constructorArguments[3].Value, + isInvariantCulture: (bool?)constructorArguments[4].Value ?? false, + format: (string?)constructorArguments[5].Value); + } + + if (tagHelper is not null) + { + results.Add(tagHelper); + } + } + } + + private static TagHelperDescriptor CreateElementBindTagHelper( + string typeName, + string typeNamespace, + string typeNameIdentifier, + string? element, + string? typeAttribute, + string? suffix, + string? valueAttribute, + string? changeAttribute, + bool isInvariantCulture = false, + string? format = null) + { + string name, attributeName, formatName, formatAttributeName, eventName; + + if (suffix is { } s) + { + name = "Bind_" + s; + attributeName = "@bind-" + s; + formatName = "Format_" + s; + formatAttributeName = "format-" + s; + eventName = "Event_" + s; + } + else + { + name = "Bind"; + attributeName = "@bind"; + + suffix = valueAttribute; + formatName = "Format_" + suffix; + formatAttributeName = "format-" + suffix; + eventName = "Event_" + suffix; + } + + using var _ = TagHelperDescriptorBuilder.GetPooledInstance( + TagHelperKind.Bind, name, ComponentsApi.AssemblyName, + out var builder); + + builder.SetTypeName(typeName, typeNamespace, typeNameIdentifier); + + builder.CaseSensitive = true; + builder.ClassifyAttributesOnly = true; + builder.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.BindTagHelper_Element, + valueAttribute, + changeAttribute)); + + var metadata = new BindMetadata.Builder + { + ValueAttribute = valueAttribute, + ChangeAttribute = changeAttribute, + IsInvariantCulture = isInvariantCulture, + Format = format + }; + + if (typeAttribute != null) + { + // For entries that map to the element, we need to be able to know + // the difference between and for which we + // want to use the same attributes. + // + // We provide a tag helper for that should match all input elements, + // but we only want it to be used when a more specific one is used. + // + // Therefore we use this metadata to know which one is more specific when two + // tag helpers match. + metadata.TypeAttribute = typeAttribute; + } + + builder.SetMetadata(metadata.Build()); + + builder.TagMatchingRule(rule => + { + rule.TagName = element; + if (typeAttribute != null) + { + rule.Attribute(a => + { + a.Name = "type"; + a.NameComparison = RequiredAttributeNameComparison.FullMatch; + a.Value = typeAttribute; + a.ValueComparison = RequiredAttributeValueComparison.FullMatch; + }); + } + + rule.Attribute(a => + { + a.Name = attributeName; + a.NameComparison = RequiredAttributeNameComparison.FullMatch; + a.IsDirectiveAttribute = true; + }); + }); + + builder.TagMatchingRule(rule => + { + rule.TagName = element; + if (typeAttribute != null) + { + rule.Attribute(a => + { + a.Name = "type"; + a.NameComparison = RequiredAttributeNameComparison.FullMatch; + a.Value = typeAttribute; + a.ValueComparison = RequiredAttributeValueComparison.FullMatch; + }); + } + + rule.Attribute(a => + { + a.Name = $"{attributeName}:get"; + a.NameComparison = RequiredAttributeNameComparison.FullMatch; + a.IsDirectiveAttribute = true; + }); + + rule.Attribute(a => + { + a.Name = $"{attributeName}:set"; + a.NameComparison = RequiredAttributeNameComparison.FullMatch; + a.IsDirectiveAttribute = true; + }); + }); + + builder.BindAttribute(a => + { + a.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.BindTagHelper_Element, + valueAttribute, + changeAttribute)); + + a.Name = attributeName; + a.TypeName = typeof(object).FullName; + a.IsDirectiveAttribute = true; + a.PropertyName = name; + + a.BindAttributeParameter(parameter => + { + parameter.Name = "format"; + parameter.PropertyName = formatName; + parameter.TypeName = typeof(string).FullName; + parameter.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.BindTagHelper_Element_Format, + attributeName)); + }); + + a.BindAttributeParameter(parameter => + { + parameter.Name = "event"; + parameter.PropertyName = eventName; + parameter.TypeName = typeof(string).FullName; + parameter.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.BindTagHelper_Element_Event, + attributeName)); + }); + + a.BindAttributeParameter(parameter => + { + parameter.Name = "culture"; + parameter.PropertyName = "Culture"; + parameter.TypeName = typeof(CultureInfo).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Culture); + }); + + a.BindAttributeParameter(parameter => + { + parameter.Name = "get"; + parameter.PropertyName = "Get"; + parameter.TypeName = typeof(object).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Get); + parameter.BindAttributeGetSet = true; + }); + + a.BindAttributeParameter(parameter => + { + parameter.Name = "set"; + parameter.PropertyName = "Set"; + parameter.TypeName = typeof(Delegate).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Set); + }); + + a.BindAttributeParameter(parameter => + { + parameter.Name = "after"; + parameter.PropertyName = "After"; + parameter.TypeName = typeof(Delegate).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_After); + }); + }); + + // This is no longer supported. This is just here so we can add a diagnostic later on when this matches. + builder.BindAttribute(attribute => + { + attribute.Name = formatAttributeName; + attribute.TypeName = "System.String"; + attribute.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.BindTagHelper_Element_Format, + attributeName)); + + attribute.PropertyName = formatName; + }); + + return builder.Build(); + } + + public void AddTagHelpersForComponent(TagHelperDescriptor tagHelper, ref TagHelperCollection.RefBuilder results) + { + if (tagHelper.Kind != TagHelperKind.Component || !SupportsTypes) + { + return; + } + + // We want to create a 'bind' tag helper everywhere we see a pair of properties like `Foo`, `FooChanged` + // where `FooChanged` is a delegate and `Foo` is not. + // + // The easiest way to figure this out without a lot of backtracking is to look for `FooChanged` and then + // try to find a matching "Foo". + // + // We also look for a corresponding FooExpression attribute, though its presence is optional. + foreach (var changeAttribute in tagHelper.BoundAttributes) + { + if (!changeAttribute.Name.EndsWith("Changed", StringComparison.Ordinal) || + + // Allow the ValueChanged attribute to be a delegate or EventCallback<>. + // + // We assume that the Delegate or EventCallback<> has a matching type, and the C# compiler will help + // you figure figure it out if you did it wrongly. + (!changeAttribute.IsDelegateProperty() && !changeAttribute.IsEventCallbackProperty())) + { + continue; + } + + BoundAttributeDescriptor? valueAttribute = null; + BoundAttributeDescriptor? expressionAttribute = null; + + var valueAttributeName = changeAttribute.Name[..^"Changed".Length]; + var expressionAttributeName = valueAttributeName + "Expression"; + + foreach (var attribute in tagHelper.BoundAttributes) + { + if (attribute.Name == valueAttributeName) + { + valueAttribute = attribute; + } + + if (attribute.Name == expressionAttributeName) + { + expressionAttribute = attribute; + } + + if (valueAttribute != null && expressionAttribute != null) + { + // We found both, so we can stop looking now + break; + } + } + + if (valueAttribute == null) + { + // No matching attribute found. + continue; + } + + using var _ = TagHelperDescriptorBuilder.GetPooledInstance( + TagHelperKind.Bind, tagHelper.Name, tagHelper.AssemblyName, + out var builder); + + builder.SetTypeName(tagHelper.TypeNameObject); + + builder.DisplayName = tagHelper.DisplayName; + builder.CaseSensitive = true; + builder.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.BindTagHelper_Component, + valueAttribute.Name, + changeAttribute.Name)); + + var metadata = new BindMetadata.Builder + { + ValueAttribute = valueAttribute.Name, + ChangeAttribute = changeAttribute.Name + }; + + if (expressionAttribute != null) + { + metadata.ExpressionAttribute = expressionAttribute.Name; + } + + // Match the component and attribute name + builder.TagMatchingRule(rule => + { + rule.TagName = tagHelper.TagMatchingRules.Single().TagName; + rule.Attribute(attribute => + { + attribute.Name = "@bind-" + valueAttribute.Name; + attribute.NameComparison = RequiredAttributeNameComparison.FullMatch; + attribute.IsDirectiveAttribute = true; + }); + }); + + builder.TagMatchingRule(rule => + { + rule.TagName = tagHelper.TagMatchingRules.Single().TagName; + rule.Attribute(attribute => + { + attribute.Name = "@bind-" + valueAttribute.Name + ":get"; + attribute.NameComparison = RequiredAttributeNameComparison.FullMatch; + attribute.IsDirectiveAttribute = true; + }); + rule.Attribute(attribute => + { + attribute.Name = "@bind-" + valueAttribute.Name + ":set"; + attribute.NameComparison = RequiredAttributeNameComparison.FullMatch; + attribute.IsDirectiveAttribute = true; + }); + }); + + builder.BindAttribute(attribute => + { + attribute.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.BindTagHelper_Component, + valueAttribute.Name, + changeAttribute.Name)); + + attribute.Name = "@bind-" + valueAttribute.Name; + attribute.TypeName = changeAttribute.TypeName; + attribute.IsEnum = valueAttribute.IsEnum; + attribute.ContainingType = valueAttribute.ContainingType; + attribute.IsDirectiveAttribute = true; + attribute.PropertyName = valueAttribute.PropertyName; + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "get"; + parameter.PropertyName = "Get"; + parameter.TypeName = typeof(object).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Get); + parameter.BindAttributeGetSet = true; + }); + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "set"; + parameter.PropertyName = "Set"; + parameter.TypeName = typeof(Delegate).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Set); + }); + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "after"; + parameter.PropertyName = "After"; + parameter.TypeName = typeof(Delegate).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_After); + }); + }); + + if (tagHelper.IsFullyQualifiedNameMatch) + { + builder.IsFullyQualifiedNameMatch = true; + } + + builder.SetMetadata(metadata.Build()); + + results.Add(builder.Build()); + } + } + + private static TagHelperDescriptor CreateFallbackBindTagHelper() + { + using var _ = TagHelperDescriptorBuilder.GetPooledInstance( + TagHelperKind.Bind, "Bind", ComponentsApi.AssemblyName, + out var builder); + + builder.SetTypeName( + fullName: "Microsoft.AspNetCore.Components.Bind", + typeNamespace: "Microsoft.AspNetCore.Components", + typeNameIdentifier: "Bind"); + + builder.CaseSensitive = true; + builder.ClassifyAttributesOnly = true; + builder.SetDocumentation(DocumentationDescriptor.BindTagHelper_Fallback); + + builder.SetMetadata(new BindMetadata() { IsFallback = true }); + + builder.TagMatchingRule(rule => + { + rule.TagName = "*"; + rule.Attribute(attribute => + { + attribute.Name = "@bind-"; + attribute.NameComparison = RequiredAttributeNameComparison.PrefixMatch; + attribute.IsDirectiveAttribute = true; + }); + }); + + builder.BindAttribute(attribute => + { + attribute.SetDocumentation(DocumentationDescriptor.BindTagHelper_Fallback); + + var attributeName = "@bind-..."; + attribute.Name = attributeName; + attribute.AsDictionary("@bind-", typeof(object).FullName); + attribute.IsDirectiveAttribute = true; + + attribute.PropertyName = "Bind"; + + attribute.TypeName = "System.Collections.Generic.Dictionary"; + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "format"; + parameter.PropertyName = "Format"; + parameter.TypeName = typeof(string).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Fallback_Format); + }); + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "event"; + parameter.PropertyName = "Event"; + parameter.TypeName = typeof(string).FullName; + parameter.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.BindTagHelper_Fallback_Event, attributeName)); + }); + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "culture"; + parameter.PropertyName = "Culture"; + parameter.TypeName = typeof(CultureInfo).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Culture); + }); + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "get"; + parameter.PropertyName = "Get"; + parameter.TypeName = typeof(object).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Get); + parameter.BindAttributeGetSet = true; + }); + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "set"; + parameter.PropertyName = "Set"; + parameter.TypeName = typeof(Delegate).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_Set); + }); + + attribute.BindAttributeParameter(parameter => + { + parameter.Name = "after"; + parameter.PropertyName = "After"; + parameter.TypeName = typeof(Delegate).FullName; + parameter.SetDocumentation(DocumentationDescriptor.BindTagHelper_Element_After); + }); + }); + + return builder.Build(); + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ComponentTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ComponentTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..98d5cace992 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ComponentTagHelperProducer.Factory.cs @@ -0,0 +1,34 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class ComponentTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + private BindTagHelperProducer.Factory? _bindTagHelperProducerFactory; + + protected override void OnInitialized() + { + _bindTagHelperProducerFactory = GetRequiredFeature(); + } + + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + Assumed.NotNull(_bindTagHelperProducerFactory); + + _bindTagHelperProducerFactory.TryCreate(compilation, includeDocumentation, excludeHidden, out var producer); + + result = new ComponentTagHelperProducer((BindTagHelperProducer?)producer); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ComponentTagHelperProducer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ComponentTagHelperProducer.cs new file mode 100644 index 00000000000..d454848755b --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ComponentTagHelperProducer.cs @@ -0,0 +1,764 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Threading; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Razor; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class ComponentTagHelperProducer : TagHelperProducer +{ + private readonly BindTagHelperProducer? _bindTagHelperProducer; + + private ComponentTagHelperProducer(BindTagHelperProducer? bindTagHelperProducer) + { + _bindTagHelperProducer = bindTagHelperProducer; + } + + public override TagHelperProducerKind Kind => TagHelperProducerKind.Component; + + public override bool SupportsTypes => true; + + public override bool IsCandidateType(INamedTypeSymbol type) + => ComponentDetectionConventions.IsComponent(type, ComponentsApi.IComponent.MetadataName); + + public override void AddTagHelpersForType( + INamedTypeSymbol type, + ref TagHelperCollection.RefBuilder results, + CancellationToken cancellationToken) + { + // Components have very simple matching rules. + // 1. The type name (short) matches the tag name. + // 2. The fully qualified name matches the tag name. + + // First, compute the relevant properties for this type so that we + // don't need to compute them twice. + var properties = GetProperties(type); + + var shortNameMatchingDescriptor = CreateShortNameMatchingDescriptor(type, properties); + results.Add(shortNameMatchingDescriptor); + + // If the component is in the global namespace, skip adding this descriptor which will be the same as the short name one. + TagHelperDescriptor? fullyQualifiedNameMatchingDescriptor = null; + if (!type.ContainingNamespace.IsGlobalNamespace) + { + fullyQualifiedNameMatchingDescriptor = CreateFullyQualifiedNameMatchingDescriptor(type, properties); + results.Add(fullyQualifiedNameMatchingDescriptor); + } + + // Produce bind tag helpers for the component. + if (_bindTagHelperProducer is { SupportsTypes: true }) + { + _bindTagHelperProducer.AddTagHelpersForComponent(shortNameMatchingDescriptor, ref results); + + if (fullyQualifiedNameMatchingDescriptor is not null) + { + _bindTagHelperProducer.AddTagHelpersForComponent(fullyQualifiedNameMatchingDescriptor, ref results); + } + } + + foreach (var childContent in shortNameMatchingDescriptor.GetChildContentProperties()) + { + // Synthesize a separate tag helper for each child content property that's declared. + results.Add(CreateChildContentDescriptor(shortNameMatchingDescriptor, childContent)); + if (fullyQualifiedNameMatchingDescriptor is not null) + { + results.Add(CreateChildContentDescriptor(fullyQualifiedNameMatchingDescriptor, childContent)); + } + } + } + + private static TagHelperDescriptor CreateShortNameMatchingDescriptor( + INamedTypeSymbol type, + ImmutableArray<(IPropertySymbol property, PropertyKind kind)> properties) + => CreateNameMatchingDescriptor(type, properties, fullyQualified: false); + + private static TagHelperDescriptor CreateFullyQualifiedNameMatchingDescriptor( + INamedTypeSymbol type, + ImmutableArray<(IPropertySymbol property, PropertyKind kind)> properties) + => CreateNameMatchingDescriptor(type, properties, fullyQualified: true); + + private static TagHelperDescriptor CreateNameMatchingDescriptor( + INamedTypeSymbol type, + ImmutableArray<(IPropertySymbol property, PropertyKind kind)> properties, + bool fullyQualified) + { + var typeName = TypeNameObject.From(type); + var assemblyName = type.ContainingAssembly.Identity.Name; + + using var _ = TagHelperDescriptorBuilder.GetPooledInstance( + TagHelperKind.Component, typeName.FullName.AssumeNotNull(), assemblyName, out var builder); + + builder.RuntimeKind = RuntimeKind.IComponent; + builder.SetTypeName(typeName); + + var metadata = new ComponentMetadata.Builder(); + + builder.CaseSensitive = true; + + if (fullyQualified) + { + var fullName = type.ContainingNamespace.IsGlobalNamespace + ? type.Name + : $"{type.ContainingNamespace.GetFullName()}.{type.Name}"; + + builder.TagMatchingRule(r => + { + r.TagName = fullName; + }); + + builder.IsFullyQualifiedNameMatch = true; + } + else + { + builder.TagMatchingRule(r => + { + r.TagName = type.Name; + }); + } + + if (type.IsGenericType) + { + metadata.IsGeneric = true; + + using var cascadeGenericTypeAttributes = new PooledHashSet(StringComparer.Ordinal); + + foreach (var attribute in type.GetAttributes()) + { + if (attribute.HasFullName(ComponentsApi.CascadingTypeParameterAttribute.MetadataName) && + attribute.ConstructorArguments.FirstOrDefault() is { Value: string value }) + { + cascadeGenericTypeAttributes.Add(value); + } + } + + foreach (var typeArgument in type.TypeArguments) + { + if (typeArgument is ITypeParameterSymbol typeParameter) + { + var cascade = cascadeGenericTypeAttributes.Contains(typeParameter.Name); + CreateTypeParameterProperty(builder, typeParameter, cascade); + } + } + } + + if (HasRenderModeDirective(type)) + { + metadata.HasRenderModeDirective = true; + } + + var xml = type.GetDocumentationCommentXml(); + if (!string.IsNullOrEmpty(xml)) + { + builder.SetDocumentation(xml); + } + + foreach (var (property, kind) in properties) + { + if (kind == PropertyKind.Ignored) + { + continue; + } + + CreateProperty(builder, type, property, kind); + } + + if (builder.BoundAttributes.Any(static a => a.IsParameterizedChildContentProperty()) && + !builder.BoundAttributes.Any(static a => string.Equals(a.Name, ComponentHelpers.ChildContent.ParameterAttributeName, StringComparison.OrdinalIgnoreCase))) + { + // If we have any parameterized child content parameters, synthesize a 'Context' parameter to be + // able to set the variable name (for all child content). If the developer defined a 'Context' parameter + // already, then theirs wins. + CreateContextParameter(builder, childContentName: null); + } + + builder.SetMetadata(metadata.Build()); + + return builder.Build(); + } + + private static void CreateProperty(TagHelperDescriptorBuilder builder, INamedTypeSymbol containingSymbol, IPropertySymbol property, PropertyKind kind) + { + builder.BindAttribute(pb => + { + var builder = new PropertyMetadata.Builder(); + + pb.Name = property.Name; + pb.ContainingType = containingSymbol.GetFullName(); + pb.TypeName = property.Type.GetFullName(); + pb.PropertyName = property.Name; + pb.IsEditorRequired = property.GetAttributes().Any( + static a => a.HasFullName("Microsoft.AspNetCore.Components.EditorRequiredAttribute")); + + pb.CaseSensitive = false; + + builder.GloballyQualifiedTypeName = property.Type.GetGloballyQualifiedFullName(); + + if (kind == PropertyKind.Enum) + { + pb.IsEnum = true; + } + else if (kind == PropertyKind.ChildContent) + { + builder.IsChildContent = true; + } + else if (kind == PropertyKind.EventCallback) + { + builder.IsEventCallback = true; + } + else if (kind == PropertyKind.Delegate) + { + builder.IsDelegateSignature = true; + builder.IsDelegateWithAwaitableResult = IsAwaitable(property); + } + + if (HasTypeParameter(property.Type)) + { + builder.IsGenericTyped = true; + } + + if (property.SetMethod.AssumeNotNull().IsInitOnly) + { + builder.IsInitOnlyProperty = true; + } + + pb.SetMetadata(builder.Build()); + + var xml = property.GetDocumentationCommentXml(); + if (!string.IsNullOrEmpty(xml)) + { + pb.SetDocumentation(xml); + } + }); + + static bool HasTypeParameter(ITypeSymbol type) + { + if (type is ITypeParameterSymbol) + { + return true; + } + + // We need to check for cases like: + // [Parameter] public List MyProperty { get; set; } + // AND + // [Parameter] public List MyProperty { get; set; } + // + // We need to inspect the type arguments to tell the difference between a property that + // uses the containing class' type parameter(s) and a vanilla usage of generic types like + // List<> and Dictionary<,> + // + // Since we need to handle cases like RenderFragment>, this check must be recursive. + if (type is INamedTypeSymbol namedType && namedType.IsGenericType) + { + foreach (var typeArgument in namedType.TypeArguments) + { + if (HasTypeParameter(typeArgument)) + { + return true; + } + } + + // Another case to handle - if the type being inspected is a nested type + // inside a generic containing class. The common usage for this would be a case + // where a generic templated component defines a 'context' nested class. + if (namedType.ContainingType != null && HasTypeParameter(namedType.ContainingType)) + { + return true; + } + } + // Also check for cases like: + // [Parameter] public T[] MyProperty { get; set; } + else if (type is IArrayTypeSymbol array && HasTypeParameter(array.ElementType)) + { + return true; + } + + return false; + } + } + + private static bool IsAwaitable(IPropertySymbol prop) + { + var methodSymbol = ((INamedTypeSymbol)prop.Type).DelegateInvokeMethod.AssumeNotNull(); + if (methodSymbol.ReturnsVoid) + { + return false; + } + + var members = methodSymbol.ReturnType.GetMembers(); + foreach (var candidate in members) + { + if (candidate is not IMethodSymbol method || !string.Equals(candidate.Name, "GetAwaiter", StringComparison.Ordinal)) + { + continue; + } + + if (!VerifyGetAwaiter(method)) + { + continue; + } + + return true; + } + + return methodSymbol.IsAsync; + + static bool VerifyGetAwaiter(IMethodSymbol getAwaiter) + { + var returnType = getAwaiter.ReturnType; + if (returnType == null) + { + return false; + } + + var foundIsCompleted = false; + var foundOnCompleted = false; + var foundGetResult = false; + + foreach (var member in returnType.GetMembers()) + { + if (!foundIsCompleted && + member is IPropertySymbol property && + IsProperty_IsCompleted(property)) + { + foundIsCompleted = true; + } + + if (!(foundOnCompleted && foundGetResult) && member is IMethodSymbol method) + { + if (IsMethod_OnCompleted(method)) + { + foundOnCompleted = true; + } + else if (IsMethod_GetResult(method)) + { + foundGetResult = true; + } + } + + if (foundIsCompleted && foundOnCompleted && foundGetResult) + { + return true; + } + } + + return false; + + static bool IsProperty_IsCompleted(IPropertySymbol property) + { + return property is + { + Name: WellKnownMemberNames.IsCompleted, + Type.SpecialType: SpecialType.System_Boolean, + GetMethod: not null + }; + } + + static bool IsMethod_OnCompleted(IMethodSymbol method) + { + return method is + { + Name: WellKnownMemberNames.OnCompleted, + ReturnsVoid: true, + Parameters: [{ Type.TypeKind: TypeKind.Delegate }] + }; + } + + static bool IsMethod_GetResult(IMethodSymbol method) + { + return method is + { + Name: WellKnownMemberNames.GetResult, + Parameters: [] + }; + } + } + } + + private static void CreateTypeParameterProperty(TagHelperDescriptorBuilder builder, ITypeParameterSymbol typeParameter, bool cascade) + { + builder.BindAttribute(pb => + { + pb.DisplayName = typeParameter.Name; + pb.Name = typeParameter.Name; + pb.TypeName = typeof(Type).FullName; + pb.PropertyName = typeParameter.Name; + + var metadata = new TypeParameterMetadata.Builder + { + IsCascading = cascade + }; + + // Type constraints (like "Image" or "Foo") are stored independently of + // things like constructor constraints and not null constraints in the + // type parameter so we create a single string representation of all the constraints + // here. + using var constraints = new PooledList(); + + // CS0449: The 'class', 'struct', 'unmanaged', 'notnull', and 'default' constraints + // cannot be combined or duplicated, and must be specified first in the constraints list. + if (typeParameter.HasReferenceTypeConstraint) + { + constraints.Add("class"); + } + + if (typeParameter.HasNotNullConstraint) + { + constraints.Add("notnull"); + } + + if (typeParameter.HasUnmanagedTypeConstraint) + { + constraints.Add("unmanaged"); + } + else if (typeParameter.HasValueTypeConstraint) + { + // `HasValueTypeConstraint` is also true when `unmanaged` constraint is present. + constraints.Add("struct"); + } + + foreach (var constraintType in typeParameter.ConstraintTypes) + { + constraints.Add(constraintType.GetGloballyQualifiedFullName()); + } + + // CS0401: The new() constraint must be the last constraint specified. + if (typeParameter.HasConstructorConstraint) + { + constraints.Add("new()"); + } + + if (TryGetWhereClauseText(typeParameter, constraints, out var whereClauseText)) + { + metadata.Constraints = whereClauseText; + } + + // Collect attributes that should be propagated to the type inference method. + using var _ = StringBuilderPool.GetPooledObject(out var withAttributes); + foreach (var attribute in typeParameter.GetAttributes()) + { + if (attribute.HasFullName("System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute")) + { + Debug.Assert(attribute.AttributeClass != null); + + if (withAttributes.Length > 0) + { + withAttributes.Append(", "); + } + else + { + withAttributes.Append('['); + } + + withAttributes.Append(attribute.AttributeClass.GetGloballyQualifiedFullName()); + withAttributes.Append('('); + + var first = true; + foreach (var arg in attribute.ConstructorArguments) + { + if (first) + { + first = false; + } + else + { + withAttributes.Append(", "); + } + + if (arg.Kind == TypedConstantKind.Enum) + { + withAttributes.Append("unchecked(("); + withAttributes.Append(arg.Type!.GetGloballyQualifiedFullName()); + withAttributes.Append(')'); + withAttributes.Append(SymbolDisplay.FormatPrimitive(arg.Value!, quoteStrings: true, useHexadecimalNumbers: true)); + withAttributes.Append(')'); + } + else + { + Debug.Assert(false, $"Need to add support for '{arg.Kind}' and make sure the output is 'global::' prefixed."); + withAttributes.Append(arg.ToCSharpString()); + } + } + + withAttributes.Append(')'); + } + } + + if (withAttributes.Length > 0) + { + withAttributes.Append("] "); + withAttributes.Append(typeParameter.Name); + metadata.NameWithAttributes = withAttributes.ToString(); + } + + pb.SetMetadata(metadata.Build()); + + pb.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.ComponentTypeParameter, + typeParameter.Name, + builder.Name)); + }); + + static bool TryGetWhereClauseText(ITypeParameterSymbol typeParameter, PooledList constraints, [NotNullWhen(true)] out string? constraintsText) + { + if (constraints.Count == 0) + { + constraintsText = null; + return false; + } + + using var _ = StringBuilderPool.GetPooledObject(out var builder); + + builder.Append("where "); + builder.Append(typeParameter.Name); + builder.Append(" : "); + + var addComma = false; + + foreach (var item in constraints) + { + if (addComma) + { + builder.Append(", "); + } + else + { + addComma = true; + } + + builder.Append(item); + } + + constraintsText = builder.ToString(); + return true; + } + } + + private static TagHelperDescriptor CreateChildContentDescriptor(TagHelperDescriptor component, BoundAttributeDescriptor attribute) + { + var typeName = component.TypeName + "." + attribute.Name; + var assemblyName = component.AssemblyName; + + using var _ = TagHelperDescriptorBuilder.GetPooledInstance( + TagHelperKind.ChildContent, typeName, assemblyName, + out var builder); + + builder.SetTypeName(typeName, component.TypeNamespace, component.TypeNameIdentifier); + + builder.CaseSensitive = true; + + var xml = attribute.Documentation; + if (!string.IsNullOrEmpty(xml)) + { + builder.SetDocumentation(xml); + } + + // Child content matches the property name, but only as a direct child of the component. + builder.TagMatchingRule(r => + { + r.TagName = attribute.Name; + r.ParentTag = component.TagMatchingRules[0].TagName; + }); + + if (attribute.IsParameterizedChildContentProperty()) + { + // For child content attributes with a parameter, synthesize an attribute that allows you to name + // the parameter. + CreateContextParameter(builder, attribute.Name); + } + + if (component.IsFullyQualifiedNameMatch) + { + builder.IsFullyQualifiedNameMatch = true; + } + + var descriptor = builder.Build(); + + return descriptor; + } + + private static void CreateContextParameter(TagHelperDescriptorBuilder builder, string? childContentName) + { + builder.BindAttribute(b => + { + b.Name = ComponentHelpers.ChildContent.ParameterAttributeName; + b.TypeName = typeof(string).FullName; + b.PropertyName = b.Name; + b.SetMetadata(ChildContentParameterMetadata.Default); + + var documentation = childContentName == null + ? DocumentationDescriptor.ChildContentParameterName_TopLevel + : DocumentationDescriptor.From(DocumentationId.ChildContentParameterName, childContentName); + + b.SetDocumentation(documentation); + }); + } + + // Does a walk up the inheritance chain to determine the set of parameters by using + // a dictionary keyed on property name. + // + // We consider parameters to be defined by properties satisfying all of the following: + // - are public + // - are visible (not shadowed) + // - have the [Parameter] attribute + // - have a setter, even if private + // - are not indexers + private static ImmutableArray<(IPropertySymbol property, PropertyKind kind)> GetProperties(INamedTypeSymbol type) + { + using var names = new PooledHashSet(StringComparer.Ordinal); + using var results = new PooledArrayBuilder<(IPropertySymbol, PropertyKind)>(); + + var currentType = type; + do + { + if (currentType.HasFullName(ComponentsApi.ComponentBase.MetadataName)) + { + // The ComponentBase base class doesn't have any [Parameter]. + // Bail out now to avoid walking through its many members, plus the members + // of the System.Object base class. + break; + } + + foreach (var member in currentType.GetMembers()) + { + if (member is not IPropertySymbol property) + { + // Not a property + continue; + } + + if (names.Contains(property.Name)) + { + // Not visible + continue; + } + + var kind = PropertyKind.Default; + if (property.DeclaredAccessibility != Accessibility.Public) + { + // Not public + kind = PropertyKind.Ignored; + } + + if (property.Parameters.Length != 0) + { + // Indexer + kind = PropertyKind.Ignored; + } + + if (property.SetMethod == null) + { + // No setter + kind = PropertyKind.Ignored; + } + else if (property.SetMethod.DeclaredAccessibility != Accessibility.Public) + { + // No public setter + kind = PropertyKind.Ignored; + } + + if (property.IsStatic) + { + kind = PropertyKind.Ignored; + } + + if (!property.GetAttributes().Any(static a => a.HasFullName(ComponentsApi.ParameterAttribute.MetadataName))) + { + if (property.IsOverride) + { + // This property does not contain [Parameter] attribute but it was overridden. Don't ignore it for now. + // We can ignore it if the base class does not contains a [Parameter] as well. + continue; + } + + // Does not have [Parameter] + kind = PropertyKind.Ignored; + } + + if (kind == PropertyKind.Default) + { + kind = property switch + { + var p when IsEnum(p) => PropertyKind.Enum, + var p when IsRenderFragment(p) => PropertyKind.ChildContent, + var p when IsEventCallback(p) => PropertyKind.EventCallback, + var p when IsDelegate(p) => PropertyKind.Delegate, + _ => PropertyKind.Default + }; + } + + names.Add(property.Name); + results.Add((property, kind)); + } + + currentType = currentType.BaseType; + } + while (currentType != null); + + return results.ToImmutableAndClear(); + + static bool IsEnum(IPropertySymbol property) + { + return property.Type.TypeKind == TypeKind.Enum; + } + + static bool IsRenderFragment(IPropertySymbol property) + { + return property.Type.HasFullName(ComponentsApi.RenderFragment.MetadataName) || + (property.Type is INamedTypeSymbol { IsGenericType: true } namedType && + namedType.ConstructedFrom.HasFullName(ComponentsApi.RenderFragmentOfT.DisplayName)); + } + + static bool IsEventCallback(IPropertySymbol property) + { + return property.Type.HasFullName(ComponentsApi.EventCallback.MetadataName) || + (property.Type is INamedTypeSymbol { IsGenericType: true } namedType && + namedType.ConstructedFrom.HasFullName(ComponentsApi.EventCallbackOfT.DisplayName)); + } + + static bool IsDelegate(IPropertySymbol property) + { + return property.Type.TypeKind == TypeKind.Delegate; + } + } + + private static bool HasRenderModeDirective(INamedTypeSymbol type) + { + var attributes = type.GetAttributes(); + foreach (var attribute in attributes) + { + var attributeClass = attribute.AttributeClass; + while (attributeClass is not null) + { + if (attributeClass.HasFullName(ComponentsApi.RenderModeAttribute.FullTypeName)) + { + return true; + } + + attributeClass = attributeClass.BaseType; + } + } + return false; + } + + private enum PropertyKind + { + Ignored, + Default, + Enum, + ChildContent, + Delegate, + EventCallback, + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/DefaultTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/DefaultTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..4915952bee0 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/DefaultTagHelperProducer.Factory.cs @@ -0,0 +1,34 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Razor; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class DefaultTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(TagHelperTypes.ITagHelper, out var iTagHelperType) || + iTagHelperType.TypeKind == TypeKind.Error) + { + // If we can't find ITagHelper, then just bail. We won't discover anything. + result = null; + return false; + } + + var factory = new DefaultTagHelperDescriptorFactory(includeDocumentation, excludeHidden); + + result = new DefaultTagHelperProducer(factory, iTagHelperType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/DefaultTagHelperProducer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/DefaultTagHelperProducer.cs new file mode 100644 index 00000000000..17dccc5e279 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/DefaultTagHelperProducer.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Threading; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Razor; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class DefaultTagHelperProducer : TagHelperProducer +{ + private readonly DefaultTagHelperDescriptorFactory _factory; + private readonly INamedTypeSymbol _iTagHelperType; + + private DefaultTagHelperProducer(DefaultTagHelperDescriptorFactory factory, INamedTypeSymbol iTagHelperType) + { + _factory = factory; + _iTagHelperType = iTagHelperType; + } + + public override TagHelperProducerKind Kind => TagHelperProducerKind.Default; + + public override bool SupportsTypes => true; + + public override bool IsCandidateType(INamedTypeSymbol type) + => type.IsTagHelper(_iTagHelperType); + + public override void AddTagHelpersForType( + INamedTypeSymbol type, + ref TagHelperCollection.RefBuilder results, + CancellationToken cancellationToken) + { + if (_factory.CreateDescriptor(type) is { } descriptor) + { + results.Add(descriptor); + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/EventHandlerTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/EventHandlerTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..558c1be9325 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/EventHandlerTagHelperProducer.Factory.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class EventHandlerTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ComponentsApi.EventHandlerAttribute.FullTypeName, out var eventHandlerAttributeType)) + { + // If we can't find EventHandlerAttribute, then just bail. We won't discover anything. + result = null; + return false; + } + + result = new EventHandlerTagHelperProducer(eventHandlerAttributeType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/EventHandlerTagHelperProducer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/EventHandlerTagHelperProducer.cs new file mode 100644 index 00000000000..86ae0ab6a53 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/EventHandlerTagHelperProducer.cs @@ -0,0 +1,237 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using System.Threading; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Razor; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class EventHandlerTagHelperProducer : TagHelperProducer +{ + private readonly INamedTypeSymbol _eventHandlerAttributeType; + + private EventHandlerTagHelperProducer(INamedTypeSymbol eventHandlerAttributeType) + { + _eventHandlerAttributeType = eventHandlerAttributeType; + } + + public override TagHelperProducerKind Kind => TagHelperProducerKind.EventHandler; + + public override bool SupportsTypes => true; + + public override bool IsCandidateType(INamedTypeSymbol type) + => type.DeclaredAccessibility == Accessibility.Public && + type.Name == "EventHandlers"; + + public override void AddTagHelpersForType( + INamedTypeSymbol type, + ref TagHelperCollection.RefBuilder results, + CancellationToken cancellationToken) + { + // Not handling duplicates here for now since we're the primary ones extending this. + // If we see users adding to the set of event handler constructs we will want to add deduplication + // and potentially diagnostics. + foreach (var attribute in type.GetAttributes()) + { + if (SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, _eventHandlerAttributeType)) + { + if (!AttributeArgs.TryGet(attribute, out var args)) + { + // If this occurs, the [EventHandler] was defined incorrectly, so we can't create a tag helper. + continue; + } + + var typeName = type.GetDefaultDisplayString(); + var namespaceName = type.ContainingNamespace.GetFullName(); + results.Add(CreateTagHelper(typeName, namespaceName, type.Name, args)); + } + } + } + + + private readonly record struct AttributeArgs( + string Attribute, + INamedTypeSymbol EventArgsType, + bool EnableStopPropagation = false, + bool EnablePreventDefault = false) + { + public static bool TryGet(AttributeData attribute, out AttributeArgs args) + { + // EventHandlerAttribute has two constructors: + // + // - EventHandlerAttribute(string attributeName, Type eventArgsType); + // - EventHandlerAttribute(string attributeName, Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault); + + var arguments = attribute.ConstructorArguments; + + return TryGetFromTwoArguments(arguments, out args) || + TryGetFromFourArguments(arguments, out args); + + static bool TryGetFromTwoArguments(ImmutableArray arguments, out AttributeArgs args) + { + // Ctor 1: EventHandlerAttribute(string attributeName, Type eventArgsType); + + if (arguments is [ + { Value: string attributeName }, + { Value: INamedTypeSymbol eventArgsType }]) + { + args = new(attributeName, eventArgsType); + return true; + } + + args = default; + return false; + } + + static bool TryGetFromFourArguments(ImmutableArray arguments, out AttributeArgs args) + { + // Ctor 2: EventHandlerAttribute(string attributeName, Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault); + + // TODO: The enablePreventDefault and enableStopPropagation arguments are incorrectly swapped! + // However, they have been that way since the 4-argument constructor variant was introduced + // in https://github.com/dotnet/razor/commit/7635bba6ef2d3e6798d0846ceb96da6d5908e1b0. + // Fixing this is tracked be https://github.com/dotnet/razor/issues/10497 + + if (arguments is [ + { Value: string attributeName }, + { Value: INamedTypeSymbol eventArgsType }, + { Value: bool enablePreventDefault }, + { Value: bool enableStopPropagation }]) + { + args = new(attributeName, eventArgsType, enableStopPropagation, enablePreventDefault); + return true; + } + + args = default; + return false; + } + } + } + + private static TagHelperDescriptor CreateTagHelper( + string typeName, + string typeNamespace, + string typeNameIdentifier, + AttributeArgs args) + { + var (attribute, eventArgsType, enableStopPropagation, enablePreventDefault) = args; + + var attributeName = "@" + attribute; + var eventArgType = eventArgsType.GetDefaultDisplayString(); + using var _ = TagHelperDescriptorBuilder.GetPooledInstance( + TagHelperKind.EventHandler, attribute, ComponentsApi.AssemblyName, + out var builder); + + builder.SetTypeName(typeName, typeNamespace, typeNameIdentifier); + + builder.CaseSensitive = true; + builder.ClassifyAttributesOnly = true; + builder.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.EventHandlerTagHelper, + attributeName, + eventArgType)); + + builder.SetMetadata(new EventHandlerMetadata() + { + EventArgsType = eventArgType + }); + + builder.TagMatchingRule(rule => + { + rule.TagName = "*"; + + rule.Attribute(a => + { + a.Name = attributeName; + a.NameComparison = RequiredAttributeNameComparison.FullMatch; + a.IsDirectiveAttribute = true; + }); + }); + + if (enablePreventDefault) + { + builder.TagMatchingRule(rule => + { + rule.TagName = "*"; + + rule.Attribute(a => + { + a.Name = attributeName + ":preventDefault"; + a.NameComparison = RequiredAttributeNameComparison.FullMatch; + a.IsDirectiveAttribute = true; + }); + }); + } + + if (enableStopPropagation) + { + builder.TagMatchingRule(rule => + { + rule.TagName = "*"; + + rule.Attribute(a => + { + a.Name = attributeName + ":stopPropagation"; + a.NameComparison = RequiredAttributeNameComparison.FullMatch; + a.IsDirectiveAttribute = true; + }); + }); + } + + builder.BindAttribute(a => + { + a.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.EventHandlerTagHelper, + attributeName, + eventArgType)); + + a.Name = attributeName; + + // We want event handler directive attributes to default to C# context. + a.TypeName = $"Microsoft.AspNetCore.Components.EventCallback<{eventArgType}>"; + + a.PropertyName = attribute; + + a.IsDirectiveAttribute = true; + + // Make this weakly typed (don't type check) - delegates have their own type-checking + // logic that we don't want to interfere with. + a.IsWeaklyTyped = true; + + if (enablePreventDefault) + { + a.BindAttributeParameter(parameter => + { + parameter.Name = "preventDefault"; + parameter.PropertyName = "PreventDefault"; + parameter.TypeName = typeof(bool).FullName; + parameter.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.EventHandlerTagHelper_PreventDefault, + attributeName)); + }); + } + + if (enableStopPropagation) + { + a.BindAttributeParameter(parameter => + { + parameter.Name = "stopPropagation"; + parameter.PropertyName = "StopPropagation"; + parameter.TypeName = typeof(bool).FullName; + parameter.SetDocumentation( + DocumentationDescriptor.From( + DocumentationId.EventHandlerTagHelper_StopPropagation, + attributeName)); + }); + } + }); + + return builder.Build(); + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/FormNameTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/FormNameTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..721a89a5848 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/FormNameTagHelperProducer.Factory.cs @@ -0,0 +1,45 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class FormNameTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + var renderTreeBuilderTypes = compilation.GetTypesByMetadataName(ComponentsApi.RenderTreeBuilder.FullTypeName) + .Where(IsValidRenderTreeBuilder) + .Take(2) + .ToArray(); + + if (renderTreeBuilderTypes is not [var renderTreeBuilderType]) + { + // If we can't find RenderTreeBuilder, then just bail. We won't be able to compile the generated code anyway. + result = null; + return false; + } + + result = new FormNameTagHelperProducer(renderTreeBuilderType); + return true; + + static bool IsValidRenderTreeBuilder(INamedTypeSymbol type) + { + return type.DeclaredAccessibility == Accessibility.Public && + type.GetMembers(ComponentsApi.RenderTreeBuilder.AddNamedEvent) + .Any(static m => m.DeclaredAccessibility == Accessibility.Public); + } + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/FormNameTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/FormNameTagHelperProducer.cs similarity index 55% rename from src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/FormNameTagHelperDescriptorProvider.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/FormNameTagHelperProducer.cs index b5ee133963c..82a41b38f30 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/FormNameTagHelperDescriptorProvider.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/FormNameTagHelperProducer.cs @@ -2,47 +2,35 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Linq; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; -namespace Microsoft.CodeAnalysis.Razor; +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; -// Run after the component tag helper provider -internal sealed class FormNameTagHelperDescriptorProvider() : TagHelperDescriptorProviderBase(order: 1000) +internal sealed partial class FormNameTagHelperProducer : TagHelperProducer { private static readonly Lazy s_formNameTagHelper = new(CreateFormNameTagHelper); - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) - { - ArgHelper.ThrowIfNull(context); + private readonly INamedTypeSymbol _renderTreeBuilderType; - var targetAssembly = context.TargetAssembly; - if (targetAssembly is not null && targetAssembly.Name != ComponentsApi.AssemblyName) - { - return; - } + private FormNameTagHelperProducer(INamedTypeSymbol renderTreeBuilderType) + { + _renderTreeBuilderType = renderTreeBuilderType; + } - var compilation = context.Compilation; + public override TagHelperProducerKind Kind => TagHelperProducerKind.FormName; - var renderTreeBuilders = compilation.GetTypesByMetadataName(ComponentsApi.RenderTreeBuilder.FullTypeName) - .Where(static t => t.DeclaredAccessibility == Accessibility.Public && - t.GetMembers(ComponentsApi.RenderTreeBuilder.AddNamedEvent).Any(static m => m.DeclaredAccessibility == Accessibility.Public)) - .Take(2).ToArray(); - if (renderTreeBuilders is not [var renderTreeBuilder]) - { - return; - } + public override bool SupportsStaticTagHelpers => true; - if (targetAssembly is not null && - !SymbolEqualityComparer.Default.Equals(targetAssembly, renderTreeBuilder.ContainingAssembly)) + public override void AddStaticTagHelpers(IAssemblySymbol assembly, ref TagHelperCollection.RefBuilder results) + { + if (assembly.Name != ComponentsApi.AssemblyName && + !SymbolEqualityComparer.Default.Equals(assembly, _renderTreeBuilderType.ContainingAssembly)) { return; } - context.Results.Add(s_formNameTagHelper.Value); + results.Add(s_formNameTagHelper.Value); } private static TagHelperDescriptor CreateFormNameTagHelper() diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ITagHelperProducerFactory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ITagHelperProducerFactory.cs new file mode 100644 index 00000000000..d20bbf2d508 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/ITagHelperProducerFactory.cs @@ -0,0 +1,16 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal interface ITagHelperProducerFactory : IRazorEngineFeature +{ + bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result); +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/KeyTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/KeyTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..5deee689959 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/KeyTagHelperProducer.Factory.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class KeyTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ComponentsApi.RenderTreeBuilder.FullTypeName, out var renderTreeBuilderType)) + { + // If we can't find RenderTreeBuilder, then just bail. We won't be able to compile the generated code anyway. + result = null; + return false; + } + + result = new KeyTagHelperProducer(renderTreeBuilderType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/KeyTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/KeyTagHelperProducer.cs similarity index 59% rename from src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/KeyTagHelperDescriptorProvider.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/KeyTagHelperProducer.cs index 832a2e12894..29aa9df0e35 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/KeyTagHelperDescriptorProvider.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/KeyTagHelperProducer.cs @@ -2,39 +2,34 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; -namespace Microsoft.CodeAnalysis.Razor; +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; -// Run after the component tag helper provider -internal sealed class KeyTagHelperDescriptorProvider() : TagHelperDescriptorProviderBase(order: 1000) +internal sealed partial class KeyTagHelperProducer : TagHelperProducer { private static readonly Lazy s_keyTagHelper = new(CreateKeyTagHelper); - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) + private readonly INamedTypeSymbol _renderTreeBuilderType; + + private KeyTagHelperProducer(INamedTypeSymbol renderTreeBuilderType) { - ArgHelper.ThrowIfNull(context); + _renderTreeBuilderType = renderTreeBuilderType; + } - var compilation = context.Compilation; + public override TagHelperProducerKind Kind => TagHelperProducerKind.Key; - var renderTreeBuilderType = compilation.GetTypeByMetadataName(ComponentsApi.RenderTreeBuilder.FullTypeName); - if (renderTreeBuilderType == null) - { - // If we can't find RenderTreeBuilder, then just bail. We won't be able to compile the - // generated code anyway. - return; - } + public override bool SupportsStaticTagHelpers => true; - if (context.TargetAssembly is { } targetAssembly && - !SymbolEqualityComparer.Default.Equals(targetAssembly, renderTreeBuilderType.ContainingAssembly)) + public override void AddStaticTagHelpers(IAssemblySymbol assembly, ref TagHelperCollection.RefBuilder results) + { + if (!SymbolEqualityComparer.Default.Equals(assembly, _renderTreeBuilderType.ContainingAssembly)) { return; } - context.Results.Add(s_keyTagHelper.Value); + results.Add(s_keyTagHelper.Value); } private static TagHelperDescriptor CreateKeyTagHelper() diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RefTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RefTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..c50997707d8 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RefTagHelperProducer.Factory.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class RefTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ComponentsApi.ElementReference.FullTypeName, out var elementReferenceType)) + { + // If we can't find ElementRef, then just bail. We won't be able to compile the generated code anyway. + result = null; + return false; + } + + result = new RefTagHelperProducer(elementReferenceType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/RefTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RefTagHelperProducer.cs similarity index 58% rename from src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/RefTagHelperDescriptorProvider.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RefTagHelperProducer.cs index 4a4d58c9616..17950257f52 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/RefTagHelperDescriptorProvider.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RefTagHelperProducer.cs @@ -2,39 +2,34 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; -namespace Microsoft.CodeAnalysis.Razor; +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; -// Run after the component tag helper provider, because later we may want component-type-specific variants of this -internal sealed class RefTagHelperDescriptorProvider() : TagHelperDescriptorProviderBase(order: 1000) +internal sealed partial class RefTagHelperProducer : TagHelperProducer { private static readonly Lazy s_refTagHelper = new(CreateRefTagHelper); - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) + private readonly INamedTypeSymbol _elementReferenceType; + + private RefTagHelperProducer(INamedTypeSymbol elementReferenceType) { - ArgHelper.ThrowIfNull(context); + _elementReferenceType = elementReferenceType; + } - var compilation = context.Compilation; + public override TagHelperProducerKind Kind => TagHelperProducerKind.Ref; - var elementReference = compilation.GetTypeByMetadataName(ComponentsApi.ElementReference.FullTypeName); - if (elementReference == null) - { - // If we can't find ElementRef, then just bail. We won't be able to compile the - // generated code anyway. - return; - } + public override bool SupportsStaticTagHelpers => true; - if (context.TargetAssembly is { } targetAssembly && - !SymbolEqualityComparer.Default.Equals(targetAssembly, elementReference.ContainingAssembly)) + public override void AddStaticTagHelpers(IAssemblySymbol assembly, ref TagHelperCollection.RefBuilder results) + { + if (!SymbolEqualityComparer.Default.Equals(assembly, _elementReferenceType.ContainingAssembly)) { return; } - context.Results.Add(s_refTagHelper.Value); + results.Add(s_refTagHelper.Value); } private static TagHelperDescriptor CreateRefTagHelper() diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RenderModeTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RenderModeTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..bc3dd3891ed --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RenderModeTagHelperProducer.Factory.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class RenderModeTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ComponentsApi.IComponentRenderMode.FullTypeName, out var iComponentRenderModeType)) + { + // If we can't find IComponentRenderMode, then just bail. We won't be able to compile the + // generated code anyway. + result = null; + return false; + } + + result = new RenderModeTagHelperProducer(iComponentRenderModeType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/RenderModeTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RenderModeTagHelperProducer.cs similarity index 61% rename from src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/RenderModeTagHelperDescriptorProvider.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RenderModeTagHelperProducer.cs index 393fcca4e5c..b02b318cbc3 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/RenderModeTagHelperDescriptorProvider.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/RenderModeTagHelperProducer.cs @@ -2,39 +2,34 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; -namespace Microsoft.CodeAnalysis.Razor; +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; -// Run after the component tag helper provider -internal sealed class RenderModeTagHelperDescriptorProvider() : TagHelperDescriptorProviderBase(order: 1000) +internal sealed partial class RenderModeTagHelperProducer : TagHelperProducer { private static readonly Lazy s_renderModeTagHelper = new(CreateRenderModeTagHelper); - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) + private readonly INamedTypeSymbol _iComponentRenderModeType; + + private RenderModeTagHelperProducer(INamedTypeSymbol iComponentRenderModeType) { - ArgHelper.ThrowIfNull(context); + _iComponentRenderModeType = iComponentRenderModeType; + } - var compilation = context.Compilation; + public override TagHelperProducerKind Kind => TagHelperProducerKind.RenderMode; - var iComponentRenderMode = compilation.GetTypeByMetadataName(ComponentsApi.IComponentRenderMode.FullTypeName); - if (iComponentRenderMode == null) - { - // If we can't find IComponentRenderMode, then just bail. We won't be able to compile the - // generated code anyway. - return; - } + public override bool SupportsStaticTagHelpers => true; - if (context.TargetAssembly is { } targetAssembly && - !SymbolEqualityComparer.Default.Equals(targetAssembly, iComponentRenderMode.ContainingAssembly)) + public override void AddStaticTagHelpers(IAssemblySymbol assembly, ref TagHelperCollection.RefBuilder results) + { + if (!SymbolEqualityComparer.Default.Equals(assembly, _iComponentRenderModeType.ContainingAssembly)) { return; } - context.Results.Add(s_renderModeTagHelper.Value); + results.Add(s_renderModeTagHelper.Value); } private static TagHelperDescriptor CreateRenderModeTagHelper() diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/SplatTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/SplatTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..7fb8dd8fef7 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/SplatTagHelperProducer.Factory.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal sealed partial class SplatTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ComponentsApi.RenderTreeBuilder.FullTypeName, out var renderTreeBuilderType)) + { + // If we can't find RenderTreeBuilder, then just bail. We won't be able to compile the generated code anyway. + result = null; + return false; + } + + result = new SplatTagHelperProducer(renderTreeBuilderType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/SplatTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/SplatTagHelperProducer.cs similarity index 62% rename from src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/SplatTagHelperDescriptorProvider.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/SplatTagHelperProducer.cs index 945f8587298..85db8147aaf 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/CSharp/SplatTagHelperDescriptorProvider.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/SplatTagHelperProducer.cs @@ -2,38 +2,34 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.CodeAnalysis; -namespace Microsoft.CodeAnalysis.Razor; +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; -internal sealed class SplatTagHelperDescriptorProvider : TagHelperDescriptorProviderBase +internal sealed partial class SplatTagHelperProducer : TagHelperProducer { private static readonly Lazy s_splatTagHelper = new(CreateSplatTagHelper); - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) + private readonly INamedTypeSymbol _renderTreeBuilderType; + + private SplatTagHelperProducer(INamedTypeSymbol renderTreeBuilderType) { - ArgHelper.ThrowIfNull(context); + _renderTreeBuilderType = renderTreeBuilderType; + } - var compilation = context.Compilation; + public override TagHelperProducerKind Kind => TagHelperProducerKind.Splat; - var renderTreeBuilder = compilation.GetTypeByMetadataName(ComponentsApi.RenderTreeBuilder.FullTypeName); - if (renderTreeBuilder == null) - { - // If we can't find RenderTreeBuilder, then just bail. We won't be able to compile the - // generated code anyway. - return; - } + public override bool SupportsStaticTagHelpers => true; - if (context.TargetAssembly is { } targetAssembly && - !SymbolEqualityComparer.Default.Equals(targetAssembly, renderTreeBuilder.ContainingAssembly)) + public override void AddStaticTagHelpers(IAssemblySymbol assembly, ref TagHelperCollection.RefBuilder results) + { + if (!SymbolEqualityComparer.Default.Equals(assembly, _renderTreeBuilderType.ContainingAssembly)) { return; } - context.Results.Add(s_splatTagHelper.Value); + results.Add(s_splatTagHelper.Value); } private static TagHelperDescriptor CreateSplatTagHelper() diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/TagHelperProducer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/TagHelperProducer.cs new file mode 100644 index 00000000000..6925a6fb271 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/TagHelperProducer.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal abstract class TagHelperProducer +{ + public abstract class FactoryBase : RazorEngineFeatureBase, IRazorEngineFeature, ITagHelperProducerFactory + { + public bool TryCreate(Compilation compilation, [NotNullWhen(true)] out TagHelperProducer? result) + => TryCreate(compilation, includeDocumentation: false, excludeHidden: false, out result); + + public abstract bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result); + } + + public abstract TagHelperProducerKind Kind { get; } + + public virtual bool SupportsStaticTagHelpers => false; + + public virtual void AddStaticTagHelpers(IAssemblySymbol assembly, ref TagHelperCollection.RefBuilder results) + { + } + + public virtual bool SupportsTypes => false; + + public virtual bool SupportsNestedTypes => false; + + public virtual bool IsCandidateType(INamedTypeSymbol type) => false; + + public virtual void AddTagHelpersForType( + INamedTypeSymbol type, + ref TagHelperCollection.RefBuilder results, + CancellationToken cancellationToken) + { + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/TagHelperProducerKind.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/TagHelperProducerKind.cs new file mode 100644 index 00000000000..6d9fca39b12 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/Producers/TagHelperProducerKind.cs @@ -0,0 +1,20 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; + +internal enum TagHelperProducerKind : ushort +{ + Default = 0, + Bind, + Component, + EventHandler, + FormName, + Key, + Ref, + RenderMode, + Splat, + MvcViewComponent, + Mvc1_X_ViewComponent, + Mvc2_X_ViewComponent +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/RoslynExtensions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/RoslynExtensions.cs new file mode 100644 index 00000000000..025c4ed4f58 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagHelpers/RoslynExtensions.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Language.TagHelpers; + +internal static class RoslynExtensions +{ + public static bool TryGetTypeByMetadataName( + this Compilation compilation, + string fullyQualifiedMetadataName, + [NotNullWhen(true)] out INamedTypeSymbol? result) + { + result = compilation.GetTypeByMetadataName(fullyQualifiedMetadataName); + return result is not null; + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagMatchingRuleDescriptor.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagMatchingRuleDescriptor.cs index b010dca678c..8492a5362f2 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagMatchingRuleDescriptor.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagMatchingRuleDescriptor.cs @@ -44,15 +44,15 @@ internal TagMatchingRuleDescriptor( private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData(TagName); - builder.AppendData(ParentTag); - builder.AppendData((int)TagStructure); + builder.Append(TagName); + builder.Append(ParentTag); + builder.Append((int)TagStructure); - builder.AppendData(CaseSensitive); + builder.Append(CaseSensitive); foreach (var descriptor in Attributes) { - builder.AppendData(descriptor.Checksum); + builder.Append(descriptor.Checksum); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagMatchingRuleDescriptorBuilder_Pooling.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagMatchingRuleDescriptorBuilder_Pooling.cs index 902e156c5da..58e3f099dfb 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagMatchingRuleDescriptorBuilder_Pooling.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TagMatchingRuleDescriptorBuilder_Pooling.cs @@ -8,7 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language; public partial class TagMatchingRuleDescriptorBuilder { - internal static readonly ObjectPool Pool = DefaultPool.Create(Policy.Instance); + internal static readonly ObjectPool Pool = + DefaultPool.Create(static () => new TagMatchingRuleDescriptorBuilder()); internal static TagMatchingRuleDescriptorBuilder GetInstance(TagHelperDescriptorBuilder parent) { @@ -28,15 +29,4 @@ private protected override void Reset() TagStructure = default; Attributes.Clear(); } - - private sealed class Policy : PooledBuilderPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public override TagMatchingRuleDescriptorBuilder Create() => new(); - } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TypeNameObject.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TypeNameObject.cs index bd5e145ca46..063d07af936 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TypeNameObject.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/TypeNameObject.cs @@ -224,13 +224,13 @@ public void AppendToChecksum(in Checksum.Builder builder) { if (_index is byte index) { - builder.AppendData(index); + builder.Append(index); } else if (_info is TypeNameInfo info) { - builder.AppendData(info.FullName); - builder.AppendData(info.Namespace); - builder.AppendData(info.Name); + builder.Append(info.FullName); + builder.Append(info.Namespace); + builder.Append(info.Name); } else { diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/RazorExtensions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/RazorExtensions.cs index 153c0d78b0d..cbb891b4156 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/RazorExtensions.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/RazorExtensions.cs @@ -1,13 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - -using System; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Extensions; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Razor; namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X; @@ -15,17 +13,14 @@ public static class RazorExtensions { public static void Register(RazorProjectEngineBuilder builder) { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } + ArgHelper.ThrowIfNull(builder); InjectDirective.Register(builder, considerNullabilityEnforcement: false); ModelDirective.Register(builder); InheritsDirective.Register(builder); - builder.Features.Add(new DefaultTagHelperDescriptorProvider()); + builder.Features.Add(new DefaultTagHelperProducer.Factory()); // Register section directive with the 1.x compatible target extension. builder.AddDirective(SectionDirective.Directive); @@ -48,12 +43,9 @@ public static void Register(RazorProjectEngineBuilder builder) public static void RegisterViewComponentTagHelpers(RazorProjectEngineBuilder builder) { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } + ArgHelper.ThrowIfNull(builder); - builder.Features.Add(new ViewComponentTagHelperDescriptorProvider()); + builder.Features.Add(new ViewComponentTagHelperProducer.Factory()); builder.Features.Add(new ViewComponentTagHelperPass()); builder.AddTargetExtension(new ViewComponentTagHelperTargetExtension()); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperDescriptorProvider.cs deleted file mode 100644 index e411ec8aeb9..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperDescriptorProvider.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.CodeAnalysis; - -namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X; - -public sealed class ViewComponentTagHelperDescriptorProvider : TagHelperDescriptorProviderBase -{ - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) - { - ArgHelper.ThrowIfNull(context); - - var compilation = context.Compilation; - - var vcAttribute = compilation.GetTypeByMetadataName(ViewComponentTypes.ViewComponentAttribute); - var nonVCAttribute = compilation.GetTypeByMetadataName(ViewComponentTypes.NonViewComponentAttribute); - if (vcAttribute == null || vcAttribute.TypeKind == TypeKind.Error) - { - // Could not find attributes we care about in the compilation. Nothing to do. - return; - } - - var factory = new ViewComponentTagHelperDescriptorFactory(compilation); - var collector = new Collector(compilation, factory, vcAttribute, nonVCAttribute); - - collector.Collect(context, cancellationToken); - } - - private class Collector( - Compilation compilation, - ViewComponentTagHelperDescriptorFactory factory, - INamedTypeSymbol vcAttribute, - INamedTypeSymbol? nonVCAttribute) - : TagHelperCollector(compilation, targetAssembly: null) - { - private readonly ViewComponentTagHelperDescriptorFactory _factory = factory; - private readonly INamedTypeSymbol _vcAttribute = vcAttribute; - private readonly INamedTypeSymbol? _nonVCAttribute = nonVCAttribute; - - protected override bool IncludeNestedTypes => true; - - protected override bool IsCandidateType(INamedTypeSymbol type) - => type.IsViewComponent(_vcAttribute, _nonVCAttribute); - - protected override void Collect( - INamedTypeSymbol type, - ICollection results, - CancellationToken cancellationToken) - { - var descriptor = _factory.CreateDescriptor(type); - - if (descriptor != null) - { - results.Add(descriptor); - } - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..ea0082fe3d0 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperProducer.Factory.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.TagHelpers; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X; + +internal sealed partial class ViewComponentTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ViewComponentTypes.ViewComponentAttribute, out var viewComponentAttributeType) || + viewComponentAttributeType.TypeKind == TypeKind.Error) + { + result = null; + return false; + } + + var nonViewComponentAttributeType = compilation.GetTypeByMetadataName(ViewComponentTypes.NonViewComponentAttribute); + + var factory = new ViewComponentTagHelperDescriptorFactory(compilation); + result = new ViewComponentTagHelperProducer(factory, viewComponentAttributeType, nonViewComponentAttributeType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperProducer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperProducer.cs new file mode 100644 index 00000000000..6d4215197d0 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version1_X/ViewComponentTagHelperProducer.cs @@ -0,0 +1,45 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Threading; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X; + +internal sealed partial class ViewComponentTagHelperProducer : TagHelperProducer +{ + private readonly ViewComponentTagHelperDescriptorFactory _factory; + private readonly INamedTypeSymbol _viewComponentAttributeType; + private readonly INamedTypeSymbol? _nonViewComponentAttributeType; + + private ViewComponentTagHelperProducer( + ViewComponentTagHelperDescriptorFactory factory, + INamedTypeSymbol viewComponentAttributeType, + INamedTypeSymbol? nonViewComponentAttributeType) + { + _factory = factory; + _viewComponentAttributeType = viewComponentAttributeType; + _nonViewComponentAttributeType = nonViewComponentAttributeType; + } + + public override TagHelperProducerKind Kind => TagHelperProducerKind.Mvc1_X_ViewComponent; + + public override bool SupportsTypes => true; + public override bool SupportsNestedTypes => true; + + public override bool IsCandidateType(INamedTypeSymbol type) + => type.IsViewComponent(_viewComponentAttributeType, _nonViewComponentAttributeType); + + public override void AddTagHelpersForType( + INamedTypeSymbol type, + ref TagHelperCollection.RefBuilder results, + CancellationToken cancellationToken) + { + if (_factory.CreateDescriptor(type) is { } descriptor) + { + results.Add(descriptor); + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/RazorExtensions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/RazorExtensions.cs index 31d4a578270..5452130a4dd 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/RazorExtensions.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/RazorExtensions.cs @@ -1,13 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - -using System; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Extensions; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Razor; namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X; @@ -15,10 +13,7 @@ public static class RazorExtensions { public static void Register(RazorProjectEngineBuilder builder) { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } + ArgHelper.ThrowIfNull(builder); FunctionsDirective.Register(builder); InjectDirective.Register(builder, considerNullabilityEnforcement: false); @@ -29,8 +24,8 @@ public static void Register(RazorProjectEngineBuilder builder) InheritsDirective.Register(builder); SectionDirective.Register(builder); - builder.Features.Add(new DefaultTagHelperDescriptorProvider()); - builder.Features.Add(new ViewComponentTagHelperDescriptorProvider()); + builder.Features.Add(new DefaultTagHelperProducer.Factory()); + builder.Features.Add(new ViewComponentTagHelperProducer.Factory()); builder.AddTargetExtension(new ViewComponentTagHelperTargetExtension()); builder.AddTargetExtension(new TemplateTargetExtension() diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/RazorPageDocumentClassifierPass.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/RazorPageDocumentClassifierPass.cs index 285df68f473..24567288362 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/RazorPageDocumentClassifierPass.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/RazorPageDocumentClassifierPass.cs @@ -123,10 +123,10 @@ private void EnsureValidPageDirective(RazorCodeDocument codeDocument, PageDirect // We are going to do that by re-parsing the document until the very first line that is not Razor comment // or whitespace. We then make sure the page directive still exists in the re-parsed IR tree. var leadingDirectiveCodeDocument = LeadingDirectiveParsingEngine.CreateCodeDocument(codeDocument.Source); - LeadingDirectiveParsingEngine.Engine.Process(leadingDirectiveCodeDocument); + leadingDirectiveCodeDocument = LeadingDirectiveParsingEngine.Engine.Process(leadingDirectiveCodeDocument); var leadingDirectiveDocumentNode = leadingDirectiveCodeDocument.GetRequiredDocumentNode(); - if (!PageDirective.TryGetPageDirective(leadingDirectiveDocumentNode, out var _)) + if (!PageDirective.TryGetPageDirective(leadingDirectiveDocumentNode, out _)) { // The page directive is not the leading directive. Add an error. pageDirective.DirectiveNode.AddDiagnostic( diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperDescriptorProvider.cs deleted file mode 100644 index 3423015b5af..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperDescriptorProvider.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.CodeAnalysis; - -namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X; - -public sealed class ViewComponentTagHelperDescriptorProvider : TagHelperDescriptorProviderBase -{ - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) - { - ArgHelper.ThrowIfNull(context); - - var compilation = context.Compilation; - - var vcAttribute = compilation.GetTypeByMetadataName(ViewComponentTypes.ViewComponentAttribute); - var nonVCAttribute = compilation.GetTypeByMetadataName(ViewComponentTypes.NonViewComponentAttribute); - if (vcAttribute == null || vcAttribute.TypeKind == TypeKind.Error) - { - // Could not find attributes we care about in the compilation. Nothing to do. - return; - } - - var factory = new ViewComponentTagHelperDescriptorFactory(compilation); - var collector = new Collector(compilation, factory, vcAttribute, nonVCAttribute); - - collector.Collect(context, cancellationToken); - } - - private class Collector( - Compilation compilation, - ViewComponentTagHelperDescriptorFactory factory, - INamedTypeSymbol vcAttribute, - INamedTypeSymbol? nonVCAttribute) - : TagHelperCollector(compilation, targetAssembly: null) - { - private readonly ViewComponentTagHelperDescriptorFactory _factory = factory; - private readonly INamedTypeSymbol _vcAttribute = vcAttribute; - private readonly INamedTypeSymbol? _nonVCAttribute = nonVCAttribute; - - protected override bool IncludeNestedTypes => true; - - protected override bool IsCandidateType(INamedTypeSymbol type) - => type.IsViewComponent(_vcAttribute, _nonVCAttribute); - - protected override void Collect( - INamedTypeSymbol type, - ICollection results, - CancellationToken cancellationToken) - { - var descriptor = _factory.CreateDescriptor(type); - - if (descriptor != null) - { - results.Add(descriptor); - } - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..1e9d4e9d28d --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperProducer.Factory.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.TagHelpers; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X; + +internal sealed partial class ViewComponentTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ViewComponentTypes.ViewComponentAttribute, out var viewComponentAttributeType) || + viewComponentAttributeType.TypeKind == TypeKind.Error) + { + result = null; + return false; + } + + var nonViewComponentAttributeType = compilation.GetTypeByMetadataName(ViewComponentTypes.NonViewComponentAttribute); + + var factory = new ViewComponentTagHelperDescriptorFactory(compilation); + result = new ViewComponentTagHelperProducer(factory, viewComponentAttributeType, nonViewComponentAttributeType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperProducer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperProducer.cs new file mode 100644 index 00000000000..aabf2e36852 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc.Version2_X/ViewComponentTagHelperProducer.cs @@ -0,0 +1,45 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Threading; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X; + +internal sealed partial class ViewComponentTagHelperProducer : TagHelperProducer +{ + private readonly ViewComponentTagHelperDescriptorFactory _factory; + private readonly INamedTypeSymbol _viewComponentAttributeType; + private readonly INamedTypeSymbol? _nonViewComponentAttributeType; + + private ViewComponentTagHelperProducer( + ViewComponentTagHelperDescriptorFactory factory, + INamedTypeSymbol viewComponentAttributeType, + INamedTypeSymbol? nonViewComponentAttributeType) + { + _factory = factory; + _viewComponentAttributeType = viewComponentAttributeType; + _nonViewComponentAttributeType = nonViewComponentAttributeType; + } + + public override TagHelperProducerKind Kind => TagHelperProducerKind.Mvc2_X_ViewComponent; + + public override bool SupportsTypes => true; + public override bool SupportsNestedTypes => true; + + public override bool IsCandidateType(INamedTypeSymbol type) + => type.IsViewComponent(_viewComponentAttributeType, _nonViewComponentAttributeType); + + public override void AddTagHelpersForType( + INamedTypeSymbol type, + ref TagHelperCollection.RefBuilder results, + CancellationToken cancellationToken) + { + if (_factory.CreateDescriptor(type) is { } descriptor) + { + results.Add(descriptor); + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/RazorExtensions.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/RazorExtensions.cs index 317a5f387b0..027d6998f99 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/RazorExtensions.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/RazorExtensions.cs @@ -1,15 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - -using System; -using System.Diagnostics; -using System.Threading; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Extensions; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Razor; namespace Microsoft.AspNetCore.Mvc.Razor.Extensions; @@ -17,10 +13,7 @@ public static class RazorExtensions { public static void Register(RazorProjectEngineBuilder builder) { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } + ArgHelper.ThrowIfNull(builder); InjectDirective.Register(builder, considerNullabilityEnforcement: true); ModelDirective.Register(builder); @@ -28,8 +21,8 @@ public static void Register(RazorProjectEngineBuilder builder) SectionDirective.Register(builder); - builder.Features.Add(new DefaultTagHelperDescriptorProvider()); - builder.Features.Add(new ViewComponentTagHelperDescriptorProvider()); + builder.Features.Add(new DefaultTagHelperProducer.Factory()); + builder.Features.Add(new ViewComponentTagHelperProducer.Factory()); builder.AddTargetExtension(new ViewComponentTagHelperTargetExtension()); builder.AddTargetExtension(new TemplateTargetExtension() diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/RazorPageDocumentClassifierPass.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/RazorPageDocumentClassifierPass.cs index c3b9f9f6198..2bb98f87518 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/RazorPageDocumentClassifierPass.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/RazorPageDocumentClassifierPass.cs @@ -50,7 +50,7 @@ public RazorPageDocumentClassifierPass(bool useConsolidatedMvcViews) protected override bool IsMatch(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode) { - return PageDirective.TryGetPageDirective(documentNode, out var _); + return PageDirective.TryGetPageDirective(documentNode, out _); } protected override void OnDocumentStructureCreated( @@ -142,10 +142,10 @@ private void EnsureValidPageDirective(RazorCodeDocument codeDocument, PageDirect // We are going to do that by re-parsing the document until the very first line that is not Razor comment // or whitespace. We then make sure the page directive still exists in the re-parsed IR tree. var leadingDirectiveCodeDocument = LeadingDirectiveParsingEngine.CreateCodeDocument(codeDocument.Source); - LeadingDirectiveParsingEngine.Engine.Process(leadingDirectiveCodeDocument); + leadingDirectiveCodeDocument = LeadingDirectiveParsingEngine.Engine.Process(leadingDirectiveCodeDocument); var leadingDirectiveDocumentNode = leadingDirectiveCodeDocument.GetRequiredDocumentNode(); - if (!PageDirective.TryGetPageDirective(leadingDirectiveDocumentNode, out var _)) + if (!PageDirective.TryGetPageDirective(leadingDirectiveDocumentNode, out _)) { // The page directive is not the leading directive. Add an error. pageDirective.DirectiveNode.AddDiagnostic( diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentMetadata.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentMetadata.cs index 6b0f531395c..25ecb8abc1e 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentMetadata.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentMetadata.cs @@ -19,21 +19,21 @@ internal ViewComponentMetadata(string name, TypeNameObject originalTypeNameObjec public string Name { get; } internal TypeNameObject OriginalTypeNameObject { get; } - public string OriginalTypeName => OriginalTypeNameObject.FullName.AssumeNotNull(); + public string? OriginalTypeName => OriginalTypeNameObject.FullName; internal override bool HasDefaultValue => false; private protected override void BuildChecksum(in Checksum.Builder builder) { - builder.AppendData(Name); + builder.Append(Name); } public ref struct Builder { public string? Name { get; set; } - internal TypeNameObject? OriginalTypeNameObject { get; set; } + internal TypeNameObject OriginalTypeNameObject { get; set; } public readonly ViewComponentMetadata Build() - => new(Name.AssumeNotNull(), OriginalTypeNameObject.AssumeNotNull()); + => new(Name.AssumeNotNull(), OriginalTypeNameObject); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperDescriptorProvider.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperDescriptorProvider.cs deleted file mode 100644 index 5b75ed3cc0a..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperDescriptorProvider.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.CodeAnalysis; - -namespace Microsoft.AspNetCore.Mvc.Razor.Extensions; - -public sealed class ViewComponentTagHelperDescriptorProvider : TagHelperDescriptorProviderBase -{ - public override void Execute(TagHelperDescriptorProviderContext context, CancellationToken cancellationToken = default) - { - ArgHelper.ThrowIfNull(context); - - var compilation = context.Compilation; - - var vcAttribute = compilation.GetTypeByMetadataName(ViewComponentTypes.ViewComponentAttribute); - var nonVCAttribute = compilation.GetTypeByMetadataName(ViewComponentTypes.NonViewComponentAttribute); - if (vcAttribute == null || vcAttribute.TypeKind == TypeKind.Error) - { - // Could not find attributes we care about in the compilation. Nothing to do. - return; - } - - var factory = new ViewComponentTagHelperDescriptorFactory(compilation); - var collector = new Collector(compilation, factory, vcAttribute, nonVCAttribute); - - collector.Collect(context, cancellationToken); - } - - private class Collector( - Compilation compilation, - ViewComponentTagHelperDescriptorFactory factory, - INamedTypeSymbol vcAttribute, - INamedTypeSymbol? nonVCAttribute) - : TagHelperCollector(compilation, targetAssembly: null) - { - private readonly ViewComponentTagHelperDescriptorFactory _factory = factory; - private readonly INamedTypeSymbol _vcAttribute = vcAttribute; - private readonly INamedTypeSymbol? _nonVCAttribute = nonVCAttribute; - - protected override bool IncludeNestedTypes => true; - - protected override bool IsCandidateType(INamedTypeSymbol type) - => type.IsViewComponent(_vcAttribute, _nonVCAttribute); - - protected override void Collect( - INamedTypeSymbol type, - ICollection results, - CancellationToken cancellationToken) - { - var descriptor = _factory.CreateDescriptor(type); - - if (descriptor != null) - { - results.Add(descriptor); - } - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperProducer.Factory.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperProducer.Factory.cs new file mode 100644 index 00000000000..57d19df3724 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperProducer.Factory.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Razor.Language.TagHelpers; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Mvc.Razor.Extensions; + +internal sealed partial class ViewComponentTagHelperProducer +{ + public sealed class Factory : FactoryBase + { + public override bool TryCreate( + Compilation compilation, + bool includeDocumentation, + bool excludeHidden, + [NotNullWhen(true)] out TagHelperProducer? result) + { + if (!compilation.TryGetTypeByMetadataName(ViewComponentTypes.ViewComponentAttribute, out var viewComponentAttributeType) || + viewComponentAttributeType.TypeKind == TypeKind.Error) + { + result = null; + return false; + } + + var nonViewComponentAttributeType = compilation.GetTypeByMetadataName(ViewComponentTypes.NonViewComponentAttribute); + + var factory = new ViewComponentTagHelperDescriptorFactory(compilation); + result = new ViewComponentTagHelperProducer(factory, viewComponentAttributeType, nonViewComponentAttributeType); + return true; + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperProducer.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperProducer.cs new file mode 100644 index 00000000000..c3cbe2f3253 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Mvc/ViewComponentTagHelperProducer.cs @@ -0,0 +1,45 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Threading; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Mvc.Razor.Extensions; + +internal sealed partial class ViewComponentTagHelperProducer : TagHelperProducer +{ + private readonly ViewComponentTagHelperDescriptorFactory _factory; + private readonly INamedTypeSymbol _viewComponentAttributeType; + private readonly INamedTypeSymbol? _nonViewComponentAttributeType; + + private ViewComponentTagHelperProducer( + ViewComponentTagHelperDescriptorFactory factory, + INamedTypeSymbol viewComponentAttributeType, + INamedTypeSymbol? nonViewComponentAttributeType) + { + _factory = factory; + _viewComponentAttributeType = viewComponentAttributeType; + _nonViewComponentAttributeType = nonViewComponentAttributeType; + } + + public override TagHelperProducerKind Kind => TagHelperProducerKind.MvcViewComponent; + + public override bool SupportsTypes => true; + public override bool SupportsNestedTypes => true; + + public override bool IsCandidateType(INamedTypeSymbol type) + => type.IsViewComponent(_viewComponentAttributeType, _nonViewComponentAttributeType); + + public override void AddTagHelpersForType( + INamedTypeSymbol type, + ref TagHelperCollection.RefBuilder results, + CancellationToken cancellationToken) + { + if (_factory.CreateDescriptor(type) is { } descriptor) + { + results.Add(descriptor); + } + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/Diagnostics/RazorSourceGeneratorResources.resx b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/Diagnostics/RazorSourceGeneratorResources.resx index f589cf9f855..9ce6a9a2f0b 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/Diagnostics/RazorSourceGeneratorResources.resx +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/Diagnostics/RazorSourceGeneratorResources.resx @@ -121,7 +121,7 @@ Invalid RazorLangVersion - Invalid value '{0}'' for RazorLangVersion. Valid values include 'Latest' or a valid version in range 1.0 to 8.0. + Invalid value '{0}' for RazorLangVersion. Valid values include 'Latest', 'Preview', or a valid version in range 1.0 to {1}. Recomputing tag helpers diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorGeneratorResult.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorGeneratorResult.cs index 943913aa799..b7aab9a94ab 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorGeneratorResult.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorGeneratorResult.cs @@ -1,15 +1,14 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; +using System.Collections.Immutable; namespace Microsoft.NET.Sdk.Razor.SourceGenerators { - internal sealed class RazorGeneratorResult(IReadOnlyList tagHelpers, ImmutableDictionary filePathToDocument, ImmutableDictionary hintNameToFilePath) + internal sealed class RazorGeneratorResult(TagHelperCollection tagHelpers, ImmutableDictionary filePathToDocument, ImmutableDictionary hintNameToFilePath) { - public IReadOnlyList TagHelpers => tagHelpers; + public TagHelperCollection TagHelpers => tagHelpers; public RazorCodeDocument? GetCodeDocument(string physicalPath) => filePathToDocument.TryGetValue(physicalPath, out var pair) ? pair.document : null; diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.AllTagHelpers.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.AllTagHelpers.cs deleted file mode 100644 index 6852d7c9053..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.AllTagHelpers.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using Microsoft.AspNetCore.Razor.Language; - -namespace Microsoft.NET.Sdk.Razor.SourceGenerators -{ - public partial class RazorSourceGenerator - { - /// - /// Helper class that joins together two lists of tag helpers to avoid allocating - /// a new array to copy them to. - /// - private sealed class AllTagHelpers : IReadOnlyList - { - private static readonly List s_emptyList = new(); - - public static readonly AllTagHelpers Empty = new( - tagHelpersFromCompilation: null, - tagHelpersFromReferences: null); - - private readonly List _tagHelpersFromCompilation; - private readonly List _tagHelpersFromReferences; - - private AllTagHelpers( - List? tagHelpersFromCompilation, - List? tagHelpersFromReferences) - { - _tagHelpersFromCompilation = tagHelpersFromCompilation ?? s_emptyList; - _tagHelpersFromReferences = tagHelpersFromReferences ?? s_emptyList; - } - - public static AllTagHelpers Create( - List? tagHelpersFromCompilation, - List? tagHelpersFromReferences) - { - return tagHelpersFromCompilation is null or [] && tagHelpersFromReferences is null or [] - ? Empty - : new(tagHelpersFromCompilation, tagHelpersFromReferences); - } - - public TagHelperDescriptor this[int index] - { - get - { - if (index >= 0) - { - return index < _tagHelpersFromCompilation.Count - ? _tagHelpersFromCompilation[index] - : _tagHelpersFromReferences[index - _tagHelpersFromCompilation.Count]; - } - - throw new IndexOutOfRangeException(); - } - } - - public int Count - => _tagHelpersFromCompilation.Count + _tagHelpersFromReferences.Count; - - public IEnumerator GetEnumerator() - { - foreach (var tagHelper in _tagHelpersFromCompilation) - { - yield return tagHelper; - } - - foreach (var tagHelper in _tagHelpersFromReferences) - { - yield return tagHelper; - } - } - - IEnumerator IEnumerable.GetEnumerator() - => GetEnumerator(); - } - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.Helpers.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.Helpers.cs index a5ccb5691fe..5cf04b61a67 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.Helpers.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.Helpers.cs @@ -21,7 +21,13 @@ internal static string GetIdentifierFromPath(ReadOnlySpan filePath) { switch (filePath[i]) { - case ':' or '\\' or '/': + case '\\' or '/' when i + 1 < filePath.Length && filePath[i + 1] is '\\' or '/': + // Roslyn will throw on '//', but some weird Uri's have them, so sanitize to '_/' + builder.Append('_'); + break; + case '\\' or '/' when i > 0: + builder.Append('/'); + break; case char ch when !char.IsLetterOrDigit(ch): builder.Append('_'); break; @@ -78,11 +84,11 @@ private static StaticCompilationTagHelperFeature GetStaticTagHelperFeature(Compi { var tagHelperFeature = new StaticCompilationTagHelperFeature(compilation); - // the tagHelperFeature will have its Engine property set as part of adding it to the engine, which is used later when doing the actual discovery + // the tagHelperFeature will have its Engine property set as part of adding it to the engine, + // which is used later when doing the actual discovery var discoveryProjectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, new VirtualRazorProjectFileSystem(), b => { b.Features.Add(tagHelperFeature); - b.Features.Add(new DefaultTagHelperDescriptorProvider()); CompilerFeatures.Register(b); RazorExtensions.Register(b); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.RazorProviders.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.RazorProviders.cs index eb089d0a7f4..20320759d8d 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.RazorProviders.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.RazorProviders.cs @@ -41,7 +41,8 @@ public partial class RazorSourceGenerator diagnostic = Diagnostic.Create( RazorDiagnostics.InvalidRazorLangVersionDescriptor, Location.None, - razorLanguageVersionString); + razorLanguageVersionString, + RazorLanguageVersion.Preview.ToString()); razorLanguageVersion = RazorLanguageVersion.Latest; } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.cs index 55687253d01..a9cf2656d7c 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGenerator.cs @@ -125,21 +125,19 @@ public void Initialize(IncrementalGeneratorInitializationContext context) .Select(static (pair, cancellationToken) => { var ((compilation, razorSourceGeneratorOptions), isGeneratorSuppressed) = pair; - var results = new List(); - if (isGeneratorSuppressed) { - return results; + return []; } RazorSourceGeneratorEventSource.Log.DiscoverTagHelpersFromCompilationStart(); var tagHelperFeature = GetStaticTagHelperFeature(compilation); - tagHelperFeature.CollectDescriptors(compilation.Assembly, results, cancellationToken); + var collection = tagHelperFeature.GetTagHelpers(compilation.Assembly, cancellationToken); RazorSourceGeneratorEventSource.Log.DiscoverTagHelpersFromCompilationStop(); - return results; + return collection; }) .WithLambdaComparer(static (a, b) => a!.SequenceEqual(b!)); @@ -173,16 +171,37 @@ public void Initialize(IncrementalGeneratorInitializationContext context) return true; } - if (oldSymbol is IAssemblySymbol oldAssembly && newSymbol is IAssemblySymbol newAssembly) + if (oldSymbol is not IAssemblySymbol oldAssembly || newSymbol is not IAssemblySymbol newAssembly) { - var oldModuleMVIDs = oldAssembly.Modules.Select(GetMVID); - var newModuleMVIDs = newAssembly.Modules.Select(GetMVID); - return oldModuleMVIDs.SequenceEqual(newModuleMVIDs); + return false; + } - static Guid GetMVID(IModuleSymbol m) => m.GetMetadata()?.GetModuleVersionId() ?? Guid.Empty; + // Compare the MVIDs of the modules in each assembly. If they aren't present or don't match we don't consider them equal + var oldModules = oldAssembly.Modules.ToArray(); + var newModules = newAssembly.Modules.ToArray(); + if (oldModules.Length != newModules.Length) + { + return false; } - return false; + for (int i = 0; i < oldModules.Length; i++) + { + var oldMetadata = oldModules[i].GetMetadata(); + var newMetadata = newModules[i].GetMetadata(); + + if (oldMetadata is null || newMetadata is null) + { + return false; + } + + if (oldMetadata.GetModuleVersionId() != newMetadata.GetModuleVersionId()) + { + return false; + } + } + + // All module MVIDs matched. + return true; }))) { return false; @@ -201,34 +220,36 @@ public void Initialize(IncrementalGeneratorInitializationContext context) if (!hasRazorFiles) { // If there's no razor code in this app, don't do anything. - return null; + return []; } RazorSourceGeneratorEventSource.Log.DiscoverTagHelpersFromReferencesStart(); var tagHelperFeature = GetStaticTagHelperFeature(compilation); - // Typically a project with Razor files will have many tag helpers in references. - // So, we start with a larger capacity to avoid extra array copies. - var results = new List(capacity: 128); + using var collections = new MemoryBuilder(initialCapacity: 512, clearArray: true); foreach (var reference in compilation.References) { if (compilation.GetAssemblyOrModuleSymbol(reference) is IAssemblySymbol assembly) { - tagHelperFeature.CollectDescriptors(assembly, results, cancellationToken); + var collection = tagHelperFeature.GetTagHelpers(assembly, cancellationToken); + if (!collection.IsEmpty) + { + collections.Append(collection); + } } } RazorSourceGeneratorEventSource.Log.DiscoverTagHelpersFromReferencesStop(); - return results; + return TagHelperCollection.Merge(collections.AsMemory().Span); }); var allTagHelpers = tagHelpersFromCompilation .Combine(tagHelpersFromReferences) .Select(static (pair, _) => { - return AllTagHelpers.Create(tagHelpersFromCompilation: pair.Left, tagHelpersFromReferences: pair.Right); + return TagHelperCollection.Merge(pair.Left, pair.Right); }); var withOptions = sourceItems diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGeneratorEventSource.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGeneratorEventSource.cs index a4c91059ce7..cf2abcba664 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGeneratorEventSource.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/RazorSourceGeneratorEventSource.cs @@ -6,12 +6,10 @@ namespace Microsoft.NET.Sdk.Razor.SourceGenerators { [EventSource(Name = "Microsoft-DotNet-SDK-Razor-SourceGenerator")] - internal sealed class RazorSourceGeneratorEventSource : EventSource + internal sealed partial class RazorSourceGeneratorEventSource : EventSource { public static readonly RazorSourceGeneratorEventSource Log = new(); - private RazorSourceGeneratorEventSource() { } - private const int ComputeRazorSourceGeneratorOptionsId = 1; [Event(ComputeRazorSourceGeneratorOptionsId, Level = EventLevel.Informational)] public void ComputeRazorSourceGeneratorOptions() => WriteEvent(ComputeRazorSourceGeneratorOptionsId); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/SourceGeneratorProjectEngine.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/SourceGeneratorProjectEngine.cs index 120c2d5f666..c6e72b75cbe 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/SourceGeneratorProjectEngine.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/SourceGeneratorProjectEngine.cs @@ -1,12 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using Microsoft.AspNetCore.Razor.Language; using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using System.Threading; -using Microsoft.AspNetCore.Razor.Language; namespace Microsoft.NET.Sdk.Razor.SourceGenerators; @@ -58,14 +56,18 @@ public SourceGeneratorRazorCodeDocument ProcessInitialParse(RazorProjectItem pro { var codeDocument = _projectEngine.CreateCodeDocument(projectItem, designTime); - ExecutePhases(Phases[.._discoveryPhaseIndex], codeDocument, cancellationToken); + codeDocument = ExecutePhases(Phases[.._discoveryPhaseIndex], codeDocument, cancellationToken); // record the syntax tree, before the tag helper re-writing occurs - codeDocument.SetPreTagHelperSyntaxTree(codeDocument.GetSyntaxTree()); + codeDocument = codeDocument.WithPreTagHelperSyntaxTree(codeDocument.GetSyntaxTree()); return new SourceGeneratorRazorCodeDocument(codeDocument); } - public SourceGeneratorRazorCodeDocument ProcessTagHelpers(SourceGeneratorRazorCodeDocument sgDocument, IReadOnlyList tagHelpers, bool checkForIdempotency, CancellationToken cancellationToken) + public SourceGeneratorRazorCodeDocument ProcessTagHelpers( + SourceGeneratorRazorCodeDocument sgDocument, + TagHelperCollection tagHelpers, + bool checkForIdempotency, + CancellationToken cancellationToken) { Debug.Assert(sgDocument.CodeDocument.GetPreTagHelperSyntaxTree() is not null); @@ -75,60 +77,109 @@ public SourceGeneratorRazorCodeDocument ProcessTagHelpers(SourceGeneratorRazorCo if (checkForIdempotency && codeDocument.TryGetTagHelpers(out var previousTagHelpers)) { // compare the tag helpers with the ones the document last used - if (Enumerable.SequenceEqual(tagHelpers, previousTagHelpers)) + if (tagHelpers.Equals(previousTagHelpers)) { // tag helpers are the same, nothing to do! return sgDocument; } - else + + // tag helpers have changed, figure out if we need to re-write + var previousTagHelpersInScope = codeDocument.GetRequiredTagHelperContext().TagHelpers; + var previousUsedTagHelpers = codeDocument.GetRequiredReferencedTagHelpers(); + + // re-run discovery to figure out which tag helpers are now in scope for this document + codeDocument = codeDocument.WithTagHelpers(tagHelpers); + codeDocument = _discoveryPhase.Execute(codeDocument, cancellationToken); + + var newTagHelpersInScope = codeDocument.GetRequiredTagHelperContext().TagHelpers; + + // Check if any new tag helpers were added or ones we previously used were removed + if (!RequiresRewrite(newTagHelpersInScope, previousTagHelpersInScope, previousUsedTagHelpers)) { - // tag helpers have changed, figure out if we need to re-write - var previousTagHelpersInScope = codeDocument.GetRequiredTagHelperContext().TagHelpers; - var previousUsedTagHelpers = codeDocument.GetRequiredReferencedTagHelpers(); - - // re-run discovery to figure out which tag helpers are now in scope for this document - codeDocument.SetTagHelpers(tagHelpers); - _discoveryPhase.Execute(codeDocument, cancellationToken); - var tagHelpersInScope = codeDocument.GetRequiredTagHelperContext().TagHelpers; - - // Check if any new tag helpers were added or ones we previously used were removed - var newVisibleTagHelpers = tagHelpersInScope.Except(previousTagHelpersInScope); - var newUnusedTagHelpers = previousUsedTagHelpers.Except(tagHelpersInScope); - if (!newVisibleTagHelpers.Any() && !newUnusedTagHelpers.Any()) - { - // No newly visible tag helpers, and any that got removed weren't used by this document anyway - return sgDocument; - } - - // We need to re-write the document, but can skip the scoping as we just performed it - startIndex = _rewritePhaseIndex; + // No newly visible tag helpers, and any that got removed weren't used by this document anyway + return sgDocument; } + + // We need to re-write the document, but can skip the scoping as we just performed it + startIndex = _rewritePhaseIndex; } else { - codeDocument.SetTagHelpers(tagHelpers); + codeDocument = codeDocument.WithTagHelpers(tagHelpers); } - ExecutePhases(Phases[startIndex..(_rewritePhaseIndex + 1)], codeDocument, cancellationToken); + codeDocument = ExecutePhases(Phases[startIndex..(_rewritePhaseIndex + 1)], codeDocument, cancellationToken); return new SourceGeneratorRazorCodeDocument(codeDocument); } + private static bool RequiresRewrite( + TagHelperCollection newTagHelpers, + TagHelperCollection previousTagHelpers, + TagHelperCollection previousUsedTagHelpers) + { + // Check if any new tag helpers were added (that weren't in scope before) + // Check if any previously used tag helpers were removed (no longer in scope) + return HasAnyNotIn(newTagHelpers, previousTagHelpers) || + HasAnyNotIn(previousUsedTagHelpers, newTagHelpers); + } + + /// + /// Determines whether the first collection contains any tag helper descriptors that are not present + /// in the second collection. + /// + /// The collection to check for unique items. + /// The collection to compare against. + /// + /// if contains any descriptors not present in + /// ; otherwise, . + /// + private static bool HasAnyNotIn(TagHelperCollection first, TagHelperCollection second) + { + if (first.IsEmpty) + { + return false; + } + + if (second.IsEmpty) + { + return true; + } + + if (first.Equals(second)) + { + return false; + } + + // For each item in the first collection, check if it exists in the second collection + foreach (var item in first) + { + if (!second.Contains(item)) + { + return true; + } + } + + return false; + } + public SourceGeneratorRazorCodeDocument ProcessRemaining(SourceGeneratorRazorCodeDocument sgDocument, CancellationToken cancellationToken) { var codeDocument = sgDocument.CodeDocument; Debug.Assert(codeDocument.GetReferencedTagHelpers() is not null); - ExecutePhases(Phases[_rewritePhaseIndex..], codeDocument, cancellationToken); + codeDocument = ExecutePhases(Phases[_rewritePhaseIndex..], codeDocument, cancellationToken); return new SourceGeneratorRazorCodeDocument(codeDocument); } - private static void ExecutePhases(ReadOnlySpan phases, RazorCodeDocument codeDocument, CancellationToken cancellationToken) + private static RazorCodeDocument ExecutePhases(ReadOnlySpan phases, RazorCodeDocument codeDocument, CancellationToken cancellationToken) { + var currentDocument = codeDocument; foreach (var phase in phases) { - phase.Execute(codeDocument, cancellationToken); + currentDocument = phase.Execute(currentDocument, cancellationToken); } + return currentDocument; } } \ No newline at end of file diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/StaticCompilationTagHelperFeature.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/StaticCompilationTagHelperFeature.cs index 5f5a67e224a..79d08eaad3d 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/StaticCompilationTagHelperFeature.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/SourceGenerators/StaticCompilationTagHelperFeature.cs @@ -3,46 +3,47 @@ using System.Collections.Generic; using System.Collections.Immutable; +using System.Linq; using System.Threading; using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; namespace Microsoft.NET.Sdk.Razor.SourceGenerators { - internal sealed class StaticCompilationTagHelperFeature(Compilation compilation) - : RazorEngineFeatureBase, ITagHelperFeature + internal sealed class StaticCompilationTagHelperFeature(Compilation compilation) : RazorEngineFeatureBase, ITagHelperFeature { - private ImmutableArray _providers; + private ITagHelperDiscoveryService? _discoveryService; + private TagHelperDiscoverer? _discoverer; - public void CollectDescriptors( - IAssemblySymbol? targetAssembly, - List results, - CancellationToken cancellationToken) + public TagHelperCollection GetTagHelpers(IAssemblySymbol assembly, CancellationToken cancellationToken) { - if (_providers.IsDefaultOrEmpty) + if (_discoveryService is null) { - return; + return []; } - var context = new TagHelperDescriptorProviderContext(compilation, targetAssembly, results); - - foreach (var provider in _providers) + if (_discoverer is null && + !_discoveryService.TryGetDiscoverer(compilation, out _discoverer)) { - provider.Execute(context, cancellationToken); + return []; } + + return _discoverer.GetTagHelpers(assembly, cancellationToken); } - IReadOnlyList ITagHelperFeature.GetDescriptors(CancellationToken cancellationToken) + TagHelperCollection ITagHelperFeature.GetTagHelpers(CancellationToken cancellationToken) { - var results = new List(); - CollectDescriptors(targetAssembly: null, results, cancellationToken); + if (_discoveryService is null) + { + return []; + } - return results; + return _discoveryService.GetTagHelpers(compilation, cancellationToken); } protected override void OnInitialized() { - _providers = Engine.GetFeatures().OrderByAsArray(static x => x.Order); + _discoveryService = Engine.GetFeatures().FirstOrDefault(); } } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BaseTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BaseTagHelperDescriptorProviderTest.cs deleted file mode 100644 index 30567502e75..00000000000 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BaseTagHelperDescriptorProviderTest.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable disable - -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.Test.Common; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Test.Utilities; -using Xunit; - -namespace Microsoft.CodeAnalysis.Razor; - -public abstract class TagHelperDescriptorProviderTestBase -{ - protected TagHelperDescriptorProviderTestBase(string additionalCodeOpt = null) - { - CSharpParseOptions = new CSharpParseOptions(LanguageVersion.CSharp7_3); - var testTagHelpers = CSharpCompilation.Create( - assemblyName: AssemblyName, - syntaxTrees: - [ - Parse(TagHelperDescriptorFactoryTagHelpers.Code), - ..(additionalCodeOpt != null ? [Parse(additionalCodeOpt)] : Enumerable.Empty()), - ], - references: ReferenceUtil.AspNetLatestAll, - options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); - BaseCompilation = TestCompilation.Create( - syntaxTrees: [], - references: [testTagHelpers.VerifyDiagnostics().EmitToImageReference()]); - } - - protected Compilation BaseCompilation { get; } - - protected CSharpParseOptions CSharpParseOptions { get; } - - protected static string AssemblyName { get; } = "Microsoft.CodeAnalysis.Razor.Test"; - - protected CSharpSyntaxTree Parse(string text) - { - return (CSharpSyntaxTree)CSharpSyntaxTree.ParseText(text, CSharpParseOptions); - } - - // For simplicity in testing, exclude the built-in components. We'll add more and we - // don't want to update the tests when that happens. - protected static TagHelperDescriptor[] ExcludeBuiltInComponents(TagHelperDescriptorProviderContext context) - { - var results = - context.Results - .Where(c => !c.DisplayName.StartsWith("Microsoft.AspNetCore.Components.", StringComparison.Ordinal)) - .OrderBy(c => c.Name) - .ToArray(); - - return results; - } - - protected static TagHelperDescriptor[] AssertAndExcludeFullyQualifiedNameMatchComponents( - TagHelperDescriptor[] components, - int expectedCount) - { - var componentLookup = new Dictionary>(); - var fullyQualifiedNameMatchComponents = components.Where(c => c.IsFullyQualifiedNameMatch).ToArray(); - Assert.Equal(expectedCount, fullyQualifiedNameMatchComponents.Length); - - var shortNameMatchComponents = components.Where(c => !c.IsFullyQualifiedNameMatch).ToArray(); - - // For every fully qualified name component, we want to make sure we have a corresponding short name component. - foreach (var fullNameComponent in fullyQualifiedNameMatchComponents) - { - Assert.Contains(shortNameMatchComponents, component => - { - return component.Name == fullNameComponent.Name && - component.Kind == fullNameComponent.Kind && - component.BoundAttributes.SequenceEqual(fullNameComponent.BoundAttributes); - }); - } - - return shortNameMatchComponents; - } -} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BaseTagHelperProducerTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BaseTagHelperProducerTest.cs new file mode 100644 index 00000000000..42c632059a5 --- /dev/null +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BaseTagHelperProducerTest.cs @@ -0,0 +1,131 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Test.Common; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Test.Utilities; +using Xunit; + +namespace Microsoft.CodeAnalysis.Razor; + +public abstract class TagHelperDescriptorProviderTestBase +{ + protected TagHelperDescriptorProviderTestBase(string? additionalCode = null) + { + CSharpParseOptions = new CSharpParseOptions(LanguageVersion.CSharp7_3); + + var testTagHelpers = CSharpCompilation.Create( + assemblyName: AssemblyName, + syntaxTrees: + [ + Parse(TagHelperDescriptorFactoryTagHelpers.Code), + .. additionalCode != null ? [Parse(additionalCode)] : Array.Empty(), + ], + references: ReferenceUtil.AspNetLatestAll, + options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + + BaseCompilation = TestCompilation.Create( + syntaxTrees: [], + references: [testTagHelpers.VerifyDiagnostics().EmitToImageReference()]); + + var projectEngine = RazorProjectEngine.CreateEmpty(builder => + { + builder.Features.Add(new TagHelperDiscoveryService()); + + ConfigureEngine(builder); + }); + + Engine = projectEngine.Engine; + } + + protected RazorEngine Engine { get; } + + protected Compilation BaseCompilation { get; } + + protected CSharpParseOptions CSharpParseOptions { get; } + + protected static string AssemblyName { get; } = "Microsoft.CodeAnalysis.Razor.Test"; + + protected virtual void ConfigureEngine(RazorProjectEngineBuilder builder) + { + } + + private protected TagHelperCollection GetTagHelpers(Compilation compilation, TagHelperDiscoveryOptions options) + => GetDiscoveryService().GetTagHelpers(compilation, options); + + private protected TagHelperCollection GetTagHelpers(Compilation compilation) + => GetDiscoveryService().GetTagHelpers(compilation); + + private protected bool TryGetDiscoverer( + Compilation compilation, TagHelperDiscoveryOptions options, [NotNullWhen(true)] out TagHelperDiscoverer? discoverer) + => GetDiscoveryService().TryGetDiscoverer(compilation, options, out discoverer); + + private protected bool TryGetDiscoverer( + Compilation compilation, [NotNullWhen(true)] out TagHelperDiscoverer? discoverer) + => GetDiscoveryService().TryGetDiscoverer(compilation, out discoverer); + + private protected ITagHelperDiscoveryService GetDiscoveryService() + { + Assert.True(Engine.TryGetFeature(out ITagHelperDiscoveryService? discoveryService)); + return discoveryService; + } + + protected CSharpSyntaxTree Parse(string text) + { + return (CSharpSyntaxTree)CSharpSyntaxTree.ParseText(text, CSharpParseOptions); + } + + protected static bool IsBuiltInComponent(TagHelperDescriptor tagHelper) + => tagHelper.DisplayName.StartsWith("Microsoft.AspNetCore.Components.", StringComparison.Ordinal); + + protected static TagHelperDescriptor[] AssertAndExcludeFullyQualifiedNameMatchComponents( + TagHelperDescriptor[] components, + int expectedCount) + { + var fullyQualifiedNameMatchComponents = components.Where(c => c.IsFullyQualifiedNameMatch).ToArray(); + Assert.Equal(expectedCount, fullyQualifiedNameMatchComponents.Length); + + var shortNameMatchComponents = components.Where(c => !c.IsFullyQualifiedNameMatch).ToArray(); + + // For every fully qualified name component, we want to make sure we have a corresponding short name component. + foreach (var fullNameComponent in fullyQualifiedNameMatchComponents) + { + Assert.Contains(shortNameMatchComponents, component => + { + return component.Name == fullNameComponent.Name && + component.Kind == fullNameComponent.Kind && + component.BoundAttributes.SequenceEqual(fullNameComponent.BoundAttributes); + }); + } + + return shortNameMatchComponents; + } + + protected static TagHelperCollection AssertAndExcludeFullyQualifiedNameMatchComponents( + TagHelperCollection collection, + int expectedCount) + { + var fullyQualifiedNameMatchComponents = collection.Where(c => c.IsFullyQualifiedNameMatch); + Assert.Equal(expectedCount, fullyQualifiedNameMatchComponents.Count); + + var shortNameMatchComponents = collection.Where(c => !c.IsFullyQualifiedNameMatch); + + // For every fully qualified name component, we want to make sure we have a corresponding short name component. + foreach (var fullNameComponent in fullyQualifiedNameMatchComponents) + { + Assert.Contains(shortNameMatchComponents, component => + { + return component.Name == fullNameComponent.Name && + component.Kind == fullNameComponent.Kind && + component.BoundAttributes.SequenceEqual(fullNameComponent.BoundAttributes); + }); + } + + return shortNameMatchComponents; + } +} diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BindTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BindTagHelperProducerTest.cs similarity index 88% rename from src/Compiler/Microsoft.CodeAnalysis.Razor/test/BindTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor/test/BindTagHelperProducerTest.cs index 0d66261992c..b1f39de8005 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BindTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/BindTagHelperProducerTest.cs @@ -1,20 +1,25 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - using System; using System.Linq; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Xunit; namespace Microsoft.CodeAnalysis.Razor; -public class BindTagHelperDescriptorProviderTest : TagHelperDescriptorProviderTestBase +public class BindTagHelperProducerTest : TagHelperDescriptorProviderTestBase { + protected override void ConfigureEngine(RazorProjectEngineBuilder builder) + { + builder.Features.Add(new BindTagHelperProducer.Factory()); + builder.Features.Add(new ComponentTagHelperProducer.Factory()); + } + [Fact] - public void Execute_FindsBindTagHelperOnComponentType_Delegate_CreatesDescriptor() + public void GetTagHelpers_FindsBindTagHelperOnComponentType_Delegate_CreatesTagHelper() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -48,19 +53,11 @@ public Task SetParametersAsync(ParameterView parameters) Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - - // We run after component discovery and depend on the results. - var componentProvider = new ComponentTagHelperDescriptorProvider(); - componentProvider.Execute(context); - - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 1); var bind = Assert.Single(matches); @@ -171,56 +168,7 @@ public Task SetParametersAsync(ParameterView parameters) } [Fact] - public void Execute_BindTagHelperReturnsValuesWhenProvidedNoTargetSymbol() - { - // When BindTagHelperDescriptorProvider is given a compilation that references - // API assemblies with "BindConverter" and "BindAttributes", but no target symbol, - // it will find the expected tag helpers. - - // Arrange - var compilation = BaseCompilation; - - Assert.Empty(compilation.GetDiagnostics()); - - var context = new TagHelperDescriptorProviderContext(compilation); - - var bindTagHelperProvider = new BindTagHelperDescriptorProvider(); - - // Act - bindTagHelperProvider.Execute(context); - - // Assert - var matches = context.Results.Where(static t => t.Kind == TagHelperKind.Bind); - Assert.NotEmpty(matches); - } - - [Fact] - public void Execute_BindTagHelperReturnsValuesWhenProvidedCorrectAssemblyTargetSymbol() - { - // When BindTagHelperDescriptorProvider is given a compilation that references - // API assemblies with "BindConverter", and a target symbol matching the assembly - // containing "BindConverter", it will find the expected tag helpers. - - // Arrange - var compilation = BaseCompilation; - - Assert.Empty(compilation.GetDiagnostics()); - - var bindConverterSymbol = compilation.GetTypeByMetadataName(ComponentsApi.BindConverter.FullTypeName); - var context = new TagHelperDescriptorProviderContext(compilation, bindConverterSymbol.ContainingAssembly); - - var bindTagHelperProvider = new BindTagHelperDescriptorProvider(); - - // Act - bindTagHelperProvider.Execute(context); - - // Assert - var matches = context.Results.Where(static t => t.Kind == TagHelperKind.Bind); - Assert.NotEmpty(matches); - } - - [Fact] - public void Execute_BindTagHelperReturnsEmptyWhenCompilationAssemblyTargetSymbol() + public void GetTagHelpers_BindTagHelperReturnsEmptyWhenCompilationAssemblyTargetSymbol() { // When BindTagHelperDescriptorProvider is given a compilation that references // API assemblies with "BindConverter", and a target symbol that does not match the @@ -231,20 +179,16 @@ public void Execute_BindTagHelperReturnsEmptyWhenCompilationAssemblyTargetSymbol Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation, compilation.Assembly); - - var bindTagHelperProvider = new BindTagHelperDescriptorProvider(); - // Act - bindTagHelperProvider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); Assert.Empty(matches); } [Fact] - public void Execute_FindsBindTagHelperOnComponentType_EventCallback_CreatesDescriptor() + public void GetTagHelpers_FindsBindTagHelperOnComponentType_EventCallback_CreatesTagHelper() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -273,19 +217,11 @@ public Task SetParametersAsync(ParameterView parameters) Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - - // We run after component discovery and depend on the results. - var componentProvider = new ComponentTagHelperDescriptorProvider(); - componentProvider.Execute(context); - - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 1); var bind = Assert.Single(matches); @@ -395,7 +331,7 @@ public Task SetParametersAsync(ParameterView parameters) } [Fact] - public void Execute_NoMatchedPropertiesOnComponent_IgnoresComponent() + public void GetTagHelpers_NoMatchedPropertiesOnComponent_IgnoresComponent() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -423,25 +359,17 @@ public Task SetParametersAsync(ParameterView parameters) Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - - // We run after component discovery and depend on the results. - var componentProvider = new ComponentTagHelperDescriptorProvider(); - componentProvider.Execute(context); - - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 0); Assert.Empty(matches); } [Fact] - public void Execute_BindOnElement_CreatesDescriptor() + public void GetTagHelpers_BindOnElement_CreatesTagHelper() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -458,14 +386,11 @@ public class BindAttributes Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 0); var bind = Assert.Single(matches); @@ -700,7 +625,7 @@ static void AssertAttribute(BoundAttributeDescriptor attribute) } [Fact] - public void Execute_BindOnElementWithSuffix_CreatesDescriptor() + public void GetTagHelpers_BindOnElementWithSuffix_CreatesTagHelper() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -717,14 +642,11 @@ public class BindAttributes Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 0); var bind = Assert.Single(matches); @@ -783,7 +705,7 @@ public class BindAttributes } [Fact] - public void Execute_BindOnInputElementWithoutTypeAttribute_CreatesDescriptor() + public void GetTagHelpers_BindOnInputElementWithoutTypeAttribute_CreatesTagHelper() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -800,14 +722,11 @@ public class BindAttributes Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 0); var bind = Assert.Single(matches); @@ -857,7 +776,7 @@ public class BindAttributes } [Fact] - public void Execute_BindOnInputElementWithTypeAttribute_CreatesDescriptor() + public void GetTagHelpers_BindOnInputElementWithTypeAttribute_CreatesTagHelper() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -874,14 +793,11 @@ public class BindAttributes Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 0); var bind = Assert.Single(matches); @@ -952,7 +868,7 @@ public class BindAttributes } [Fact] - public void Execute_BindOnInputElementWithTypeAttributeAndSuffix_CreatesDescriptor() + public void GetTagHelpers_BindOnInputElementWithTypeAttributeAndSuffix_CreatesTagHelper() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -969,14 +885,11 @@ public class BindAttributes Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 0); var bind = Assert.Single(matches); @@ -1049,7 +962,7 @@ public class BindAttributes } [Fact] - public void Execute_BindOnInputElementWithTypeAttributeAndSuffixAndInvariantCultureAndFormat_CreatesDescriptor() + public void GetTagHelpers_BindOnInputElementWithTypeAttributeAndSuffixAndInvariantCultureAndFormat_CreatesTagHelper() { // Arrange var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" @@ -1066,14 +979,11 @@ public class BindAttributes Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetBindTagHelpers(context); + var matches = GetBindTagHelpers(result); matches = AssertAndExcludeFullyQualifiedNameMatchComponents(matches, expectedCount: 0); var bind = Assert.Single(matches); @@ -1087,20 +997,17 @@ public class BindAttributes } [Fact] - public void Execute_BindFallback_CreatesDescriptor() + public void GetTagHelpers_BindFallback_CreatesTagHelper() { // Arrange var compilation = BaseCompilation; Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new BindTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var bind = Assert.Single(context.Results, r => r.IsFallbackBindTagHelper()); + var bind = Assert.Single(result, r => r.IsFallbackBindTagHelper()); // These are features Bind Tags Helpers don't use. Verifying them once here and // then ignoring them. @@ -1233,6 +1140,6 @@ public void Execute_BindFallback_CreatesDescriptor() Assert.False(parameter.IsEnum); } - private static TagHelperDescriptor[] GetBindTagHelpers(TagHelperDescriptorProviderContext context) - => [.. ExcludeBuiltInComponents(context).Where(static t => t.Kind == TagHelperKind.Bind)]; + private static TagHelperCollection GetBindTagHelpers(TagHelperCollection collection) + => collection.Where(static t => t.Kind == TagHelperKind.Bind && !IsBuiltInComponent(t)); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/CompilationTagHelperFeatureTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/CompilationTagHelperFeatureTest.cs index bb4fd061db3..ba19e13c1de 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/CompilationTagHelperFeatureTest.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/CompilationTagHelperFeatureTest.cs @@ -1,8 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - using System.Linq; using System.Threading; using Microsoft.AspNetCore.Razor.Language; @@ -23,6 +21,7 @@ public void IsValidCompilation_ReturnsTrueIfTagHelperInterfaceCannotBeFound() { ReferenceUtil.NetLatestSystemRuntime, }; + var compilation = CSharpCompilation.Create("Test", references: references); // Act @@ -40,6 +39,7 @@ public void IsValidCompilation_ReturnsFalseIfSystemStringCannotBeFound() { ReferenceUtil.AspNetLatestRazor, }; + var compilation = CSharpCompilation.Create("Test", references: references); // Act @@ -58,6 +58,7 @@ public void IsValidCompilation_ReturnsTrueIfWellKnownTypesAreFound() ReferenceUtil.NetLatestSystemRuntime, ReferenceUtil.AspNetLatestRazor, }; + var compilation = CSharpCompilation.Create("Test", references: references); // Act @@ -68,44 +69,49 @@ public void IsValidCompilation_ReturnsTrueIfWellKnownTypesAreFound() } [Fact] - public void GetDescriptors_DoesNotSetCompilation_IfCompilationIsInvalid() + public void GetTagHelpers_DoesNotSetCompilation_IfCompilationIsInvalid() { // Arrange - var provider = new Mock(); - provider.Setup(c => c.Execute(It.IsAny(), It.IsAny())); + var serviceMock = new Mock(); + serviceMock + .Setup(service => service.GetTagHelpers(It.IsAny(), It.IsAny())) + .Returns(TagHelperCollection.Empty); var engine = RazorProjectEngine.Create( - configure => + builder => { - configure.ConfigureParserOptions(builder => + builder.ConfigureParserOptions(static builder => { builder.UseRoslynTokenizer = true; }); - configure.Features.Add(new DefaultMetadataReferenceFeature()); - configure.Features.Add(provider.Object); - configure.Features.Add(new CompilationTagHelperFeature()); + builder.Features.Add(new DefaultMetadataReferenceFeature()); + builder.Features.Add(new CompilationTagHelperFeature()); + + var oldFeature = builder.Features.OfType().Single(); + builder.Features.Replace(oldFeature, serviceMock.Object); }); var feature = engine.Engine.GetFeatures().First(); // Act - var result = feature.GetDescriptors(); + var result = feature.GetTagHelpers(); // Assert Assert.Empty(result); - provider.Verify(c => c.Execute(It.IsAny(), It.IsAny()), Times.Never); + serviceMock.Verify(c => c.GetTagHelpers(It.IsAny(), It.IsAny()), Times.Never); } [Fact] - public void GetDescriptors_SetsCompilation_IfCompilationIsValid() + public void GetTagHelpers_SetsCompilation_IfCompilationIsValid() { // Arrange - Compilation compilation = null; - var provider = new Mock(); - provider - .Setup(c => c.Execute(It.IsAny(), It.IsAny())) - .Callback((TagHelperDescriptorProviderContext c, CancellationToken ct) => compilation = c.Compilation) + Compilation? compilation = null; + var serviceMock = new Mock(); + serviceMock + .Setup(service => service.GetTagHelpers(It.IsAny(), It.IsAny())) + .Callback((Compilation c, CancellationToken ct) => compilation = c) + .Returns(TagHelperCollection.Empty) .Verifiable(); var references = new[] @@ -115,26 +121,28 @@ public void GetDescriptors_SetsCompilation_IfCompilationIsValid() }; var engine = RazorProjectEngine.Create( - configure => + builder => { - configure.ConfigureParserOptions(builder => + builder.ConfigureParserOptions(static builder => { builder.UseRoslynTokenizer = true; }); - configure.Features.Add(new DefaultMetadataReferenceFeature { References = references }); - configure.Features.Add(provider.Object); - configure.Features.Add(new CompilationTagHelperFeature()); + builder.Features.Add(new DefaultMetadataReferenceFeature { References = references }); + builder.Features.Add(new CompilationTagHelperFeature()); + + var oldFeature = builder.Features.OfType().Single(); + builder.Features.Replace(oldFeature, serviceMock.Object); }); var feature = engine.Engine.GetFeatures().First(); // Act - var result = feature.GetDescriptors(); + var result = feature.GetTagHelpers(); // Assert Assert.Empty(result); - provider.Verify(); + serviceMock.Verify(); Assert.NotNull(compilation); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperProducerTest.cs similarity index 87% rename from src/Compiler/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperProducerTest.cs index 88038cefa21..9afe4a064d3 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperProducerTest.cs @@ -1,17 +1,22 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - using System.Linq; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Xunit; namespace Microsoft.CodeAnalysis.Razor; -public class ComponentTagHelperDescriptorProviderTest : TagHelperDescriptorProviderTestBase +public class ComponentTagHelperProducerTest : TagHelperDescriptorProviderTestBase { + protected override void ConfigureEngine(RazorProjectEngineBuilder builder) + { + builder.Features.Add(new BindTagHelperProducer.Factory()); + builder.Features.Add(new ComponentTagHelperProducer.Factory()); + } + [Fact] public void Execute_FindsIComponentType_CreatesDescriptor() { @@ -41,14 +46,11 @@ public Task SetParametersAsync(ParameterView parameters) Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -152,14 +154,11 @@ public Task SetParametersAsync(ParameterView parameters) Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -214,14 +213,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -254,14 +250,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -292,14 +285,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -330,14 +320,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -381,14 +368,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -427,14 +411,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -473,14 +454,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -535,14 +513,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -608,14 +583,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -656,14 +628,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -716,14 +685,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -765,14 +731,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -818,14 +781,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -879,14 +839,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 2); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -934,14 +891,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 2); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -1007,14 +961,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 2); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -1077,14 +1028,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 2); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -1157,14 +1105,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 2); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -1237,14 +1182,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 2); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -1321,14 +1263,11 @@ public class Context Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 2); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -1405,14 +1344,11 @@ public class MyComponent : ComponentBase Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 4); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -1495,14 +1431,11 @@ public string this[int i] Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components); @@ -1549,14 +1482,11 @@ public class MyDerivedComponent2 : MyDerivedComponent1 Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var components = ExcludeBuiltInComponents(context); + var components = result.Where(c => !IsBuiltInComponent(c)); components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); var component = Assert.Single(components, c => c.Kind == TagHelperKind.Component); @@ -1607,20 +1537,19 @@ public Task SetParametersAsync(ParameterView parameters) Assert.Empty(compilation.GetDiagnostics()); - var targetAssembly = (IAssemblySymbol)compilation.GetAssemblyOrModuleSymbol( - compilation.References.First(static r => r.Display.Contains("Microsoft.CodeAnalysis.Razor.Test"))); - - var context = new TagHelperDescriptorProviderContext(compilation, targetAssembly); - var provider = new ComponentTagHelperDescriptorProvider(); + var targetAssembly = (IAssemblySymbol?)compilation.GetAssemblyOrModuleSymbol( + compilation.References.First(static r => r.Display?.Contains("Microsoft.CodeAnalysis.Razor.Test") == true)); + Assert.NotNull(targetAssembly); // Act - provider.Execute(context); + Assert.True(TryGetDiscoverer(compilation, out var discoverer)); + var result = discoverer.GetTagHelpers(targetAssembly); // Assert Assert.NotNull(compilation.GetTypeByMetadataName(testComponent)); - Assert.Empty(context.Results); // Target assembly contains no components - Assert.Empty(context.Results.Where(f => f.TypeName == testComponent)); - Assert.Empty(context.Results.Where(f => f.TypeName == routerComponent)); + Assert.Empty(result); // Target assembly contains no components + Assert.Empty(result.Where(f => f.TypeName == testComponent)); + Assert.Empty(result.Where(f => f.TypeName == routerComponent)); } [Fact] @@ -1654,16 +1583,13 @@ public Task SetParametersAsync(ParameterView parameters) Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new ComponentTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert Assert.NotNull(compilation.GetTypeByMetadataName(testComponent)); - Assert.NotEmpty(context.Results); - Assert.NotEmpty(context.Results.Where(f => f.TypeName == testComponent)); - Assert.NotEmpty(context.Results.Where(f => f.TypeName == routerComponent)); + Assert.NotEmpty(result); + Assert.NotEmpty(result.Where(f => f.TypeName == testComponent)); + Assert.NotEmpty(result.Where(f => f.TypeName == routerComponent)); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/DefaultTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/DefaultTagHelperProducerTest.cs similarity index 55% rename from src/Compiler/Microsoft.CodeAnalysis.Razor/test/DefaultTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor/test/DefaultTagHelperProducerTest.cs index 39e8febc96d..be7f3796f02 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/DefaultTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/DefaultTagHelperProducerTest.cs @@ -1,37 +1,33 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable disable - using System.Linq; using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Xunit; namespace Microsoft.CodeAnalysis.Razor; -public class DefaultTagHelperDescriptorProviderTest : TagHelperDescriptorProviderTestBase +public class DefaultTagHelperProducerTest : TagHelperDescriptorProviderTestBase { + protected override void ConfigureEngine(RazorProjectEngineBuilder builder) + { + builder.Features.Add(new DefaultTagHelperProducer.Factory()); + } + [Fact] public void Execute_DoesNotAddEditorBrowsableNeverDescriptorsAtDesignTime() { // Arrange var editorBrowsableTypeName = "TestNamespace.EditorBrowsableTagHelper"; var compilation = BaseCompilation; - var descriptorProvider = new DefaultTagHelperDescriptorProvider(); - - var context = new TagHelperDescriptorProviderContext(compilation) - { - ExcludeHidden = true - }; // Act - descriptorProvider.Execute(context); + var result = GetTagHelpers(compilation, TagHelperDiscoveryOptions.ExcludeHidden); // Assert Assert.NotNull(compilation.GetTypeByMetadataName(editorBrowsableTypeName)); - var nullDescriptors = context.Results.Where(descriptor => descriptor == null); - Assert.Empty(nullDescriptors); - var editorBrowsableDescriptor = context.Results.Where(descriptor => descriptor.TypeName == editorBrowsableTypeName); + var editorBrowsableDescriptor = result.Where(descriptor => descriptor.TypeName == editorBrowsableTypeName); Assert.Empty(editorBrowsableDescriptor); } @@ -51,18 +47,15 @@ public override void Process(TagHelperContext context, TagHelperOutput output) { } }"; var compilation = BaseCompilation.AddSyntaxTrees(Parse(csharp)); - var descriptorProvider = new DefaultTagHelperDescriptorProvider(); - - var context = new TagHelperDescriptorProviderContext(compilation); // Act - descriptorProvider.Execute(context); + var result = GetTagHelpers(compilation); // Assert Assert.NotNull(compilation.GetTypeByMetadataName(testTagHelper)); - Assert.NotEmpty(context.Results); - Assert.NotEmpty(context.Results.Where(f => f.TypeName == testTagHelper)); - Assert.NotEmpty(context.Results.Where(f => f.TypeName == enumTagHelper)); + Assert.NotEmpty(result); + Assert.NotEmpty(result.Where(f => f.TypeName == testTagHelper)); + Assert.NotEmpty(result.Where(f => f.TypeName == enumTagHelper)); } [Fact] @@ -81,20 +74,21 @@ public override void Process(TagHelperContext context, TagHelperOutput output) { } }"; var compilation = BaseCompilation.AddSyntaxTrees(Parse(csharp)); - var descriptorProvider = new DefaultTagHelperDescriptorProvider(); - var targetAssembly = (IAssemblySymbol)compilation.GetAssemblyOrModuleSymbol( - compilation.References.First(static r => r.Display.Contains("Microsoft.CodeAnalysis.Razor.Test"))); + var targetAssembly = (IAssemblySymbol?)compilation.GetAssemblyOrModuleSymbol( + compilation.References.First(static r => r.Display?.Contains("Microsoft.CodeAnalysis.Razor.Test") == true)); + + Assert.NotNull(targetAssembly); - var context = new TagHelperDescriptorProviderContext(compilation, targetAssembly); + Assert.True(TryGetDiscoverer(compilation, out var discoverer)); // Act - descriptorProvider.Execute(context); + var result = discoverer.GetTagHelpers(targetAssembly); // Assert Assert.NotNull(compilation.GetTypeByMetadataName(testTagHelper)); - Assert.NotEmpty(context.Results); - Assert.Empty(context.Results.Where(f => f.TypeName == testTagHelper)); - Assert.NotEmpty(context.Results.Where(f => f.TypeName == enumTagHelper)); + Assert.NotEmpty(result); + Assert.Empty(result.Where(f => f.TypeName == testTagHelper)); + Assert.NotEmpty(result.Where(f => f.TypeName == enumTagHelper)); } } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperProducerTest.cs similarity index 89% rename from src/Compiler/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperProducerTest.cs index d615ac0c469..2d6223d3ab0 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperProducerTest.cs @@ -1,16 +1,20 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; -using System.Linq; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Xunit; namespace Microsoft.CodeAnalysis.Razor; -public class EventHandlerTagHelperDescriptorProviderTest : TagHelperDescriptorProviderTestBase +public class EventHandlerTagHelperProducerTest : TagHelperDescriptorProviderTestBase { + protected override void ConfigureEngine(RazorProjectEngineBuilder builder) + { + builder.Features.Add(new EventHandlerTagHelperProducer.Factory()); + } + [Fact] public void Execute_EventHandler_TwoArgumentsCreatesDescriptor() { @@ -31,14 +35,11 @@ public class EventHandlers Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new EventHandlerTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetEventHandlerTagHelpers(context); + var matches = GetEventHandlerTagHelpers(result); var item = Assert.Single(matches); // These are features Event Handler Tag Helpers don't use. Verifying them once here and @@ -137,14 +138,11 @@ public class EventHandlers Assert.Empty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new EventHandlerTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetEventHandlerTagHelpers(context); + var matches = GetEventHandlerTagHelpers(result); var item = Assert.Single(matches); // These are features Event Handler Tag Helpers don't use. Verifying them once here and @@ -274,14 +272,11 @@ public class EventHandlers Assert.NotEmpty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new EventHandlerTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetEventHandlerTagHelpers(context); + var matches = GetEventHandlerTagHelpers(result); Assert.Empty(matches); } @@ -305,14 +300,11 @@ public class EventHandlers Assert.NotEmpty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new EventHandlerTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetEventHandlerTagHelpers(context); + var matches = GetEventHandlerTagHelpers(result); Assert.Empty(matches); } @@ -336,17 +328,14 @@ public class EventHandlers Assert.NotEmpty(compilation.GetDiagnostics()); - var context = new TagHelperDescriptorProviderContext(compilation); - var provider = new EventHandlerTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(compilation); // Assert - var matches = GetEventHandlerTagHelpers(context); + var matches = GetEventHandlerTagHelpers(result); Assert.Empty(matches); } - private static TagHelperDescriptor[] GetEventHandlerTagHelpers(TagHelperDescriptorProviderContext context) - => [.. ExcludeBuiltInComponents(context).Where(static t => t.Kind == TagHelperKind.EventHandler)]; + private static TagHelperCollection GetEventHandlerTagHelpers(TagHelperCollection collection) + => collection.Where(static t => t.Kind == TagHelperKind.EventHandler && !IsBuiltInComponent(t)); } diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperProducerTest.cs similarity index 87% rename from src/Compiler/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperProducerTest.cs index ff76acc9162..1602324a796 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperProducerTest.cs @@ -1,27 +1,28 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Linq; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Xunit; namespace Microsoft.CodeAnalysis.Razor; -public class KeyTagHelperDescriptorProviderTest : TagHelperDescriptorProviderTestBase +public class KeyTagHelperProducerTest : TagHelperDescriptorProviderTestBase { - [Fact] - public void Execute_CreatesDescriptor() + protected override void ConfigureEngine(RazorProjectEngineBuilder builder) { - // Arrange - var context = new TagHelperDescriptorProviderContext(BaseCompilation); - var provider = new KeyTagHelperDescriptorProvider(); + builder.Features.Add(new KeyTagHelperProducer.Factory()); + } + [Fact] + public void GetTagHelpers_CreatesTagHelper() + { // Act - provider.Execute(context); + var result = GetTagHelpers(BaseCompilation); // Assert - var matches = context.Results.Where(static result => result.Kind == TagHelperKind.Key); + var matches = result.Where(static result => result.Kind == TagHelperKind.Key); var item = Assert.Single(matches); Assert.Empty(item.AllowedChildTags); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/RefTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/RefTagHelperProducerTest.cs similarity index 87% rename from src/Compiler/Microsoft.CodeAnalysis.Razor/test/RefTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor/test/RefTagHelperProducerTest.cs index 22ba76006e0..f950c3f1459 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/RefTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/RefTagHelperProducerTest.cs @@ -1,27 +1,28 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Linq; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Components; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Xunit; namespace Microsoft.CodeAnalysis.Razor; -public class RefTagHelperDescriptorProviderTest : TagHelperDescriptorProviderTestBase +public class RefTagHelperProducerTest : TagHelperDescriptorProviderTestBase { - [Fact] - public void Execute_CreatesDescriptor() + protected override void ConfigureEngine(RazorProjectEngineBuilder builder) { - // Arrange - var context = new TagHelperDescriptorProviderContext(BaseCompilation); - var provider = new RefTagHelperDescriptorProvider(); + builder.Features.Add(new RefTagHelperProducer.Factory()); + } + [Fact] + public void GetTagHelpers_CreatesTagHelper() + { // Act - provider.Execute(context); + var result = GetTagHelpers(BaseCompilation); // Assert - var matches = context.Results.Where(static result => result.Kind == TagHelperKind.Ref); + var matches = result.Where(static result => result.Kind == TagHelperKind.Ref); var item = Assert.Single(matches); Assert.Empty(item.AllowedChildTags); diff --git a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/SplatTagHelperDescriptorProviderTest.cs b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/SplatTagHelperProducerTest.cs similarity index 87% rename from src/Compiler/Microsoft.CodeAnalysis.Razor/test/SplatTagHelperDescriptorProviderTest.cs rename to src/Compiler/Microsoft.CodeAnalysis.Razor/test/SplatTagHelperProducerTest.cs index f5504025dea..237f03b3e28 100644 --- a/src/Compiler/Microsoft.CodeAnalysis.Razor/test/SplatTagHelperDescriptorProviderTest.cs +++ b/src/Compiler/Microsoft.CodeAnalysis.Razor/test/SplatTagHelperProducerTest.cs @@ -1,26 +1,27 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Linq; using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.TagHelpers.Producers; using Xunit; namespace Microsoft.CodeAnalysis.Razor; -public class SplatTagHelperDescriptorProviderTest : TagHelperDescriptorProviderTestBase +public class SplatTagHelperProducerTest : TagHelperDescriptorProviderTestBase { + protected override void ConfigureEngine(RazorProjectEngineBuilder builder) + { + builder.Features.Add(new SplatTagHelperProducer.Factory()); + } + [Fact] public void Execute_CreatesDescriptor() { - // Arrange - var context = new TagHelperDescriptorProviderContext(BaseCompilation); - var provider = new SplatTagHelperDescriptorProvider(); - // Act - provider.Execute(context); + var result = GetTagHelpers(BaseCompilation); // Assert - var matches = context.Results.Where(static result => result.Kind == TagHelperKind.Splat); + var matches = result.Where(static result => result.Kind == TagHelperKind.Splat); var item = Assert.Single(matches); Assert.Empty(item.AllowedChildTags); diff --git a/src/Compiler/perf/.gitignore b/src/Compiler/perf/.gitignore new file mode 100644 index 00000000000..883ea41a3ca --- /dev/null +++ b/src/Compiler/perf/.gitignore @@ -0,0 +1 @@ +BenchmarkDotNet.Artifacts diff --git a/src/Compiler/perf/Microbenchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler.csproj b/src/Compiler/perf/Microbenchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler.csproj index bf093e40c21..9717040cc84 100644 --- a/src/Compiler/perf/Microbenchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler.csproj +++ b/src/Compiler/perf/Microbenchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler.csproj @@ -26,8 +26,8 @@ - - + + diff --git a/src/Compiler/perf/Microbenchmarks/RazorTagHelperParsingBenchmark.cs b/src/Compiler/perf/Microbenchmarks/RazorTagHelperParsingBenchmark.cs index eeec0a1226b..98c1bf61b01 100644 --- a/src/Compiler/perf/Microbenchmarks/RazorTagHelperParsingBenchmark.cs +++ b/src/Compiler/perf/Microbenchmarks/RazorTagHelperParsingBenchmark.cs @@ -2,8 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Collections.Generic; -using System.Collections.Immutable; using System.IO; using System.Threading; using BenchmarkDotNet.Attributes; @@ -63,18 +61,18 @@ public void TagHelper_ComponentDirectiveVisitor() ComponentDirectiveVisitor.Visit(SyntaxTree); } - private static ImmutableArray ReadTagHelpers(string filePath) + private static TagHelperCollection ReadTagHelpers(string filePath) { using var reader = new StreamReader(filePath); - return JsonDataConvert.DeserializeTagHelperArray(reader); + var array = JsonDataConvert.DeserializeTagHelperArray(reader); + + return TagHelperCollection.Create(array); } - private sealed class StaticTagHelperFeature(IReadOnlyList descriptors) + private sealed class StaticTagHelperFeature(TagHelperCollection tagHelpers) : RazorEngineFeatureBase, ITagHelperFeature { - public IReadOnlyList Descriptors { get; } = descriptors; - - public IReadOnlyList GetDescriptors(CancellationToken cancellationToken = default) - => Descriptors; + public TagHelperCollection GetTagHelpers(CancellationToken cancellationToken = default) + => tagHelpers; } } diff --git a/src/Compiler/perf/Microbenchmarks/Resources.Tooling.cs b/src/Compiler/perf/Microbenchmarks/Resources.Tooling.cs new file mode 100644 index 00000000000..27b73149ffe --- /dev/null +++ b/src/Compiler/perf/Microbenchmarks/Resources.Tooling.cs @@ -0,0 +1,28 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using Microsoft.AspNetCore.Razor.Language; + +namespace Microsoft.AspNetCore.Razor.Microbenchmarks; + +internal static partial class Resources +{ + internal static class Tooling + { + private const string Prefix = $"{Resources.Prefix}.Tooling"; + + private static ImmutableArray? s_blazorServerApp; + private static ImmutableArray? s_telerikMvc; + private static ImmutableArray? s_legacy; + + public static ImmutableArray BlazorServerApp + => s_blazorServerApp ??= ReadTagHelpersFromResource($"{Prefix}.BlazorServerApp.TagHelpers.json"); + + public static ImmutableArray TelerikMvc + => s_telerikMvc ??= ReadTagHelpersFromResource($"{Prefix}.Telerik.Kendo.Mvc.Examples.taghelpers.json"); + + public static ImmutableArray Legacy + => s_legacy ??= ReadTagHelpersFromResource($"{Prefix}.taghelpers.json"); + } +} diff --git a/src/Compiler/perf/Microbenchmarks/Resources.cs b/src/Compiler/perf/Microbenchmarks/Resources.cs new file mode 100644 index 00000000000..b51da6ec26d --- /dev/null +++ b/src/Compiler/perf/Microbenchmarks/Resources.cs @@ -0,0 +1,27 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Immutable; +using System.Reflection; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Serialization.Json; + +namespace Microsoft.AspNetCore.Razor.Microbenchmarks; + +internal static partial class Resources +{ + private const string Prefix = "Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler.Resources"; + + private static ImmutableArray ReadTagHelpersFromResource(string resourceName) + { + using var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); + Assumed.NotNull(resourceStream); + + var length = (int)resourceStream.Length; + var bytes = new byte[length]; + resourceStream.ReadExactly(bytes.AsSpan(0, length)); + + return JsonDataConvert.DeserializeTagHelperArray(bytes); + } +} diff --git a/src/Compiler/perf/Microbenchmarks/TagHelperBinderBenchmark.cs b/src/Compiler/perf/Microbenchmarks/TagHelperBinderBenchmark.cs index c9f60b1f19c..dc50584e42c 100644 --- a/src/Compiler/perf/Microbenchmarks/TagHelperBinderBenchmark.cs +++ b/src/Compiler/perf/Microbenchmarks/TagHelperBinderBenchmark.cs @@ -6,7 +6,7 @@ using BenchmarkDotNet.Attributes; using Microsoft.AspNetCore.Razor.Language; -namespace Microsoft.AspNetCore.Razor.Microbenchmarks; +namespace Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler; public class TagHelperBinderBenchmark { @@ -17,15 +17,16 @@ public class TagHelperBinderBenchmark private ImmutableArray _tagHelpers; [ParamsAllValues] - public TagHelpers TagHelpers { get; set; } + public TagHelperSet TagHelpers { get; set; } [IterationSetup] public void IterationSetup() { _tagHelpers = TagHelpers switch { - TagHelpers.BlazorServerApp => TagHelperResources.BlazorServerApp, - TagHelpers.TelerikMvc => TagHelperResources.TelerikMvc, + TagHelperSet.BlazorServerApp => Resources.Tooling.BlazorServerApp, + TagHelperSet.TelerikMvc => Resources.Tooling.TelerikMvc, + TagHelperSet.Legacy => Resources.Tooling.Legacy, _ => Assumed.Unreachable>() }; } @@ -41,7 +42,7 @@ public void ConstructTagHelperBinders() { for (var i = 0; i < Count; i++) { - _binders[i] = new TagHelperBinder(tagNamePrefix: null, _tagHelpers); + _binders[i] = new TagHelperBinder(tagNamePrefix: null, [.. _tagHelpers]); } } @@ -50,7 +51,7 @@ public void ConstructTagHelperBinderWithPrefix() { for (var i = 0; i < Count; i++) { - _binders[i] = new TagHelperBinder(tagNamePrefix: "abc", _tagHelpers); + _binders[i] = new TagHelperBinder(tagNamePrefix: "abc", [.. _tagHelpers]); } } } diff --git a/src/Compiler/perf/Microbenchmarks/TagHelperChecksumBenchmark.cs b/src/Compiler/perf/Microbenchmarks/TagHelperChecksumBenchmark.cs new file mode 100644 index 00000000000..a79271f264e --- /dev/null +++ b/src/Compiler/perf/Microbenchmarks/TagHelperChecksumBenchmark.cs @@ -0,0 +1,59 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using BenchmarkDotNet.Attributes; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler; + +public class TagHelperChecksumBenchmarks +{ + private const int OperationsPerInvoke = 1000; + + private Checksum[]? _checksums; + private ImmutableArray _tagHelpers; + + [ParamsAllValues] + public TagHelperSet TagHelperSet { get; set; } + + [GlobalSetup] + public void GlobalSetup() + { + // Cache the TagHelpers for this ResourceSet to avoid repeated property access + _tagHelpers = TagHelperSet switch + { + TagHelperSet.BlazorServerApp => Resources.Tooling.BlazorServerApp, + TagHelperSet.TelerikMvc => Resources.Tooling.TelerikMvc, + TagHelperSet.Legacy => Resources.Tooling.Legacy, + _ => Assumed.Unreachable>() + }; + + // Warm up to ensure consistent measurements + _checksums = new Checksum[_tagHelpers.Length]; + + for (var i = 0; i < _tagHelpers.Length; i++) + { + _checksums[i] = _tagHelpers[i].ComputeChecksum(); + } + } + + [IterationSetup] + public void Setup() + { + _checksums = new Checksum[_tagHelpers.Length]; + } + + [Benchmark(Description = "Create Checksums", OperationsPerInvoke = OperationsPerInvoke)] + public void CreateChecksums() + { + for (var operation = 0; operation < OperationsPerInvoke; operation++) + { + for (var i = 0; i < _tagHelpers.Length; i++) + { + _checksums![i] = _tagHelpers[i].ComputeChecksum(); + } + } + } +} diff --git a/src/Compiler/perf/Microbenchmarks/TagHelperCollectionAccessBenchmark.cs b/src/Compiler/perf/Microbenchmarks/TagHelperCollectionAccessBenchmark.cs new file mode 100644 index 00000000000..78464fcf838 --- /dev/null +++ b/src/Compiler/perf/Microbenchmarks/TagHelperCollectionAccessBenchmark.cs @@ -0,0 +1,117 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using BenchmarkDotNet.Attributes; +using Microsoft.AspNetCore.Razor.Language; + +namespace Microsoft.AspNetCore.Razor.Microbenchmarks; + +public class TagHelperCollectionAccessBenchmark +{ + private ImmutableArray _tagHelpers; + private TagHelperCollection? _collection1; + private TagHelperCollection? _collection2; + + [Params(10, 100, 1000)] + public int Count { get; set; } + + [GlobalSetup] + public void GlobalSetup() + { + _tagHelpers = TagHelperCollectionHelpers.CreateTagHelpers(Count); + _collection1 = TagHelperCollection.Create(_tagHelpers); + _collection2 = TagHelperCollection.Create(_tagHelpers); + } + + [Benchmark(Description = "Collection Indexer Access")] + public TagHelperDescriptor IndexerAccess() + { + var collection = _collection1.AssumeNotNull(); + + TagHelperDescriptor result = null!; + var count = collection.Count; + + for (var i = 0; i < count; i++) + { + result = collection[i]; + } + + return result; + } + + [Benchmark(Description = "Collection Contains")] + public bool ContainsCheck() + { + var collection = _collection1.AssumeNotNull(); + var result = false; + + foreach (var helper in _tagHelpers) + { + result = collection.Contains(helper); + } + + return result; + } + + [Benchmark(Description = "Collection IndexOf")] + public int IndexOfCheck() + { + var collection = _collection1.AssumeNotNull(); + var result = -1; + + foreach (var helper in _tagHelpers) + { + result = collection.IndexOf(helper); + } + + return result; + } + + [Benchmark(Description = "Collection Enumeration")] + public int EnumerateCollection() + { + var collection = _collection1.AssumeNotNull(); + var count = 0; + + foreach (var item in collection) + { + count++; + } + + return count; + } + + [Benchmark(Description = "Collection CopyTo")] + public TagHelperDescriptor[] CopyToArray() + { + var collection = _collection1.AssumeNotNull(); + var destination = new TagHelperDescriptor[collection.Count]; + collection.CopyTo(destination); + + return destination; + } + + [Benchmark(Description = "Collection Equality")] + public bool EqualityCheck() + { + var collection1 = _collection1.AssumeNotNull(); + var collection2 = _collection2.AssumeNotNull(); + + return collection1.Equals(collection2); + } + + [Benchmark(Description = "Collection GetHashCode")] + public int GetHashCodeCheck() + { + var collection = _collection1.AssumeNotNull(); + return collection.GetHashCode(); + } + + [Benchmark(Description = "Collection Where")] + public TagHelperCollection WhereFilter() + { + var collection = _collection1.AssumeNotNull(); + return collection.Where(th => th.Name.Contains("TagHelper")); + } +} diff --git a/src/Compiler/perf/Microbenchmarks/TagHelperCollectionCreationBenchmark.cs b/src/Compiler/perf/Microbenchmarks/TagHelperCollectionCreationBenchmark.cs new file mode 100644 index 00000000000..3b0307d440d --- /dev/null +++ b/src/Compiler/perf/Microbenchmarks/TagHelperCollectionCreationBenchmark.cs @@ -0,0 +1,51 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Collections.Immutable; +using BenchmarkDotNet.Attributes; +using Microsoft.AspNetCore.Razor.Language; + +namespace Microsoft.AspNetCore.Razor.Microbenchmarks; + +public class TagHelperCollectionCreationBenchmark +{ + private ImmutableArray _tagHelpers; + private ImmutableArray _duplicateTagHelpers; + + [Params(10, 100, 1000)] + public int Count { get; set; } + + [GlobalSetup] + public void GlobalSetup() + { + _tagHelpers = TagHelperCollectionHelpers.CreateTagHelpers(Count); + _duplicateTagHelpers = TagHelperCollectionHelpers.CreateTagHelpersWithDuplicates(Count); + } + + [Benchmark(Description = "Create from ImmutableArray")] + public TagHelperCollection CreateFromImmutableArray() + { + return TagHelperCollection.Create(_tagHelpers); + } + + [Benchmark(Description = "Create from ReadOnlySpan")] + public TagHelperCollection CreateFromReadOnlySpan() + { + var span = _tagHelpers.AsSpan(); + return TagHelperCollection.Create(span); + } + + [Benchmark(Description = "Create from IEnumerable")] + public TagHelperCollection CreateFromIEnumerable() + { + var enumerable = (IEnumerable)_tagHelpers; + return TagHelperCollection.Create(enumerable); + } + + [Benchmark(Description = "Create with Duplicates")] + public TagHelperCollection CreateWithDuplicates() + { + return TagHelperCollection.Create(_duplicateTagHelpers); + } +} diff --git a/src/Compiler/perf/Microbenchmarks/TagHelperCollectionHelpers.cs b/src/Compiler/perf/Microbenchmarks/TagHelperCollectionHelpers.cs new file mode 100644 index 00000000000..9dc95a748b5 --- /dev/null +++ b/src/Compiler/perf/Microbenchmarks/TagHelperCollectionHelpers.cs @@ -0,0 +1,67 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.PooledObjects; + +namespace Microsoft.AspNetCore.Razor.Microbenchmarks; + +internal static class TagHelperCollectionHelpers +{ + public static ImmutableArray CreateTagHelpers(int count) + { + using var result = new PooledArrayBuilder(count); + + for (var i = 0; i < count; i++) + { + var builder = TagHelperDescriptorBuilder.Create($"TestTagHelper{i}", "TestAssembly"); + builder.TypeName = $"TestTagHelper{i}"; + builder.TagMatchingRule(rule => rule.TagName = $"test{i}"); + + result.Add(builder.Build()); + } + + return result.ToImmutableAndClear(); + } + + public static ImmutableArray CreateTagHelpersWithDuplicates(int count) + { + using var result = new PooledArrayBuilder(count); + var uniqueHelpers = CreateTagHelpers(count / 2); + + for (var i = 0; i < uniqueHelpers.Length; i++) + { + result.Add(uniqueHelpers[i]); + } + + for (var i = uniqueHelpers.Length; i < count; i++) + { + result.Add(uniqueHelpers[i % uniqueHelpers.Length]); + } + + return result.ToImmutableAndClear(); + } + + public static ImmutableArray CreateTagHelperCollections(int collectionCount, int helpersPerCollection) + { + using var result = new PooledArrayBuilder(collectionCount); + using var helpers = new PooledArrayBuilder(helpersPerCollection); + + for (var i = 0; i < collectionCount; i++) + { + for (var j = 0; j < helpersPerCollection; j++) + { + var builder = TagHelperDescriptorBuilder.Create($"Collection{i}TagHelper{j}", "TestAssembly"); + builder.TypeName = $"Collection{i}TagHelper{j}"; + builder.TagMatchingRule(rule => rule.TagName = $"collection{i}test{j}"); + + helpers.Add(builder.Build()); + } + + result.Add(TagHelperCollection.Create(helpers.ToImmutableAndClear())); + } + + return result.ToImmutableAndClear(); + } +} diff --git a/src/Compiler/perf/Microbenchmarks/TagHelperCollectionMergeBenchmark.cs b/src/Compiler/perf/Microbenchmarks/TagHelperCollectionMergeBenchmark.cs new file mode 100644 index 00000000000..3b2849942a0 --- /dev/null +++ b/src/Compiler/perf/Microbenchmarks/TagHelperCollectionMergeBenchmark.cs @@ -0,0 +1,82 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Collections.Immutable; +using BenchmarkDotNet.Attributes; +using Microsoft.AspNetCore.Razor.Language; + +namespace Microsoft.AspNetCore.Razor.Microbenchmarks; + +public class TagHelperCollectionMergeBenchmark +{ + private ImmutableArray _tagHelpers; + private ImmutableArray _collections; + private TagHelperCollection? _collection1; + private TagHelperCollection? _collection2; + + [Params(10, 50, 100)] + public int Count { get; set; } + + [GlobalSetup] + public void GlobalSetup() + { + var collectionCount = Count switch + { + 10 => 2, + 50 => 10, + 100 => 20, + _ => Assumed.Unreachable() + }; + + _tagHelpers = TagHelperCollectionHelpers.CreateTagHelpers(Count); + _collections = TagHelperCollectionHelpers.CreateTagHelperCollections(collectionCount, helpersPerCollection: Count); + + var span = _tagHelpers.AsSpan(); + _collection1 = TagHelperCollection.Create(span[..(Count / 2)]); + _collection2 = TagHelperCollection.Create(span[..(Count / 4)]); + + // Warm up to ensure consistent measurements + _ = TagHelperCollection.Merge(_collections); + } + + [Benchmark(Description = "Merge Two Collections")] + public TagHelperCollection MergeTwoCollections() + { + if (_collections.Length >= 2) + { + return TagHelperCollection.Merge(_collections[0], _collections[1]); + } + + return TagHelperCollection.Empty; + } + + [Benchmark(Description = "Merge Collections ImmutableArray")] + public TagHelperCollection MergeCollectionsImmutableArray() + { + return TagHelperCollection.Merge(_collections); + } + + [Benchmark(Description = "Merge Collections ReadOnlySpan")] + public TagHelperCollection MergeCollectionsReadOnlySpan() + { + var span = _collections.AsSpan(); + return TagHelperCollection.Merge(span); + } + + [Benchmark(Description = "Merge Collections IEnumerable")] + public TagHelperCollection MergeCollectionsIEnumerable() + { + var enumerable = (IEnumerable)_collections; + return TagHelperCollection.Merge(enumerable); + } + + [Benchmark(Description = "Merge with Duplicates")] + public TagHelperCollection MergeWithDuplicates() + { + var collection1 = _collection1.AssumeNotNull(); + var collection2 = _collection2.AssumeNotNull(); + + return TagHelperCollection.Merge(collection1, collection2); + } +} diff --git a/src/Compiler/perf/Microbenchmarks/TagHelperResources.cs b/src/Compiler/perf/Microbenchmarks/TagHelperResources.cs deleted file mode 100644 index 48e9d762297..00000000000 --- a/src/Compiler/perf/Microbenchmarks/TagHelperResources.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Immutable; -using System.Reflection; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.Serialization.Json; - -namespace Microsoft.AspNetCore.Razor.Microbenchmarks; - -internal static class TagHelperResources -{ - private const string ResourceNameBase = "Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler.Resources"; - private const string BlazorServerAppResourceName = $"{ResourceNameBase}.BlazorServerApp.TagHelpers.json"; - private const string TelerikMvcResourceName = $"{ResourceNameBase}.Telerik.Kendo.Mvc.Examples.taghelpers.json"; - - private static readonly Lazy> s_lazyBlazorServerApp = new(() => ReadTagHelpersFromResource(BlazorServerAppResourceName)); - private static readonly Lazy> s_lazyTelerikMvc = new(() => ReadTagHelpersFromResource(TelerikMvcResourceName)); - - private static ImmutableArray ReadTagHelpersFromResource(string resourceName) - { - using var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); - Assumed.NotNull(resourceStream); - - var length = (int)resourceStream.Length; - var bytes = new byte[length]; - resourceStream.ReadExactly(bytes.AsSpan(0, length)); - - return JsonDataConvert.DeserializeTagHelperArray(bytes); - } - - public static ImmutableArray BlazorServerApp => s_lazyBlazorServerApp.Value; - public static ImmutableArray TelerikMvc => s_lazyTelerikMvc.Value; -} diff --git a/src/Compiler/perf/Microbenchmarks/TagHelpers.cs b/src/Compiler/perf/Microbenchmarks/TagHelperSet.cs similarity index 59% rename from src/Compiler/perf/Microbenchmarks/TagHelpers.cs rename to src/Compiler/perf/Microbenchmarks/TagHelperSet.cs index 05a78af6567..4c6c7eb62fb 100644 --- a/src/Compiler/perf/Microbenchmarks/TagHelpers.cs +++ b/src/Compiler/perf/Microbenchmarks/TagHelperSet.cs @@ -1,10 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -namespace Microsoft.AspNetCore.Razor.Microbenchmarks; +namespace Microsoft.AspNetCore.Razor.Microbenchmarks.Compiler; -public enum TagHelpers +public enum TagHelperSet { + Legacy, BlazorServerApp, - TelerikMvc + TelerikMvc, } diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTests.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTests.cs index 8c78aaec0db..115da85f650 100644 --- a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTests.cs +++ b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTests.cs @@ -10,7 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.Language.Syntax; +using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Test.Utilities; @@ -238,8 +238,8 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Counter.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Counter.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Index_razor.g.cs"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Counter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Index_razor.g.cs"), + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Counter_razor.g.cs") ); } @@ -456,7 +456,7 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. e => e.AssertSingleItem("CheckAndRewriteTagHelpersStop", "Pages/Counter.razor"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Counter.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Counter.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Counter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Counter_razor.g.cs") ); } @@ -843,7 +843,7 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. e => e.AssertSingleItem("CheckAndRewriteTagHelpersStop", "Pages/Counter.razor"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Counter.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Counter.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Counter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Counter_razor.g.cs") ); } @@ -1017,7 +1017,7 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Counter.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Counter.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Counter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Counter_razor.g.cs") ); } @@ -1172,7 +1172,7 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Counter.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Counter.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Index_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Index_razor.g.cs") ); // Verify caching @@ -1381,8 +1381,8 @@ internal sealed class Views_Shared__Layout : global::Microsoft.AspNetCore.Mvc.Ra e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.cshtml", "Runtime"), e => e.AssertPair("RazorCodeGenerateStart", "Views/Shared/_Layout.cshtml", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Views/Shared/_Layout.cshtml", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Index_cshtml.g.cs"), - e => e.AssertSingleItem("AddSyntaxTrees", "Views_Shared__Layout_cshtml.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Index_cshtml.g.cs"), + e => e.AssertSingleItem("AddSyntaxTrees", "Views/Shared/_Layout_cshtml.g.cs") ); } @@ -1423,14 +1423,7 @@ public override void Process(TagHelperContext context, TagHelperOutput output) var driver = await GetDriverAsync(project); // Act - var result = RunGenerator(compilation!, ref driver, - // Microsoft.NET.Sdk.Razor.SourceGenerators/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Pages_Index_cshtml.g.cs(68,167): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. - // __tagHelperExecutionContext = __tagHelperScopeManager.Begin("email", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.StartTagAndEndTag, "test", async() => { - Diagnostic(ErrorCode.WRN_AsyncLacksAwaits, "=>").WithLocation(68, 167), - // Microsoft.NET.Sdk.Razor.SourceGenerators/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Pages_Index_cshtml.g.cs(84,171): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. - // __tagHelperExecutionContext = __tagHelperScopeManager.Begin("email", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.StartTagAndEndTag, "test", async() => { - Diagnostic(ErrorCode.WRN_AsyncLacksAwaits, "=>").WithLocation(84, 171) - ); + var result = RunGenerator(compilation!, ref driver); // Assert Assert.Empty(result.Diagnostics); @@ -1729,7 +1722,7 @@ internal sealed class Views_Shared__Layout : global::Microsoft.AspNetCore.Mvc.Ra e => e.AssertSingleItem("CheckAndRewriteTagHelpersStop", "Views/Shared/_Layout.cshtml"), e => e.AssertPair("RazorCodeGenerateStart", "Views/Shared/_Layout.cshtml", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Views/Shared/_Layout.cshtml", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Views_Shared__Layout_cshtml.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Views/Shared/_Layout_cshtml.g.cs") ); } @@ -2063,7 +2056,7 @@ public override void Process(TagHelperContext context, TagHelperOutput output) e => e.AssertSingleItem("CheckAndRewriteTagHelpersStop", "Views/Shared/_Layout.cshtml"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Index.cshtml", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.cshtml", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Index_cshtml.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Index_cshtml.g.cs") ); } @@ -2611,7 +2604,7 @@ public async Task SourceGenerator_DoesNotUpdateSources_WhenSourceGeneratorIsSupp }); var compilation = await project.GetCompilationAsync(); - var (driver, additionalTexts, optionsProvider) = await GetDriverWithAdditionalTextAndProviderAsync(project); + var (driver, additionalTexts, optionsProvider) = await GetDriverWithAdditionalTextAndProviderAsync(project, trackSteps: true); // start with the generator suppressed (this is the default state in VS) driver = SetSuppressionState(true); @@ -2730,8 +2723,8 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Counter.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Counter.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Index_razor.g.cs"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Counter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Index_razor.g.cs"), + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Counter_razor.g.cs") ); // flip the suppression state back to off @@ -2852,8 +2845,8 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. e => e.AssertSingleItem("CheckAndRewriteTagHelpersStop", "Pages/Index.razor"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Index.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Index_razor.g.cs"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Counter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Index_razor.g.cs"), + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Counter_razor.g.cs") ); // Flip suppression on, change the compilation, no changes @@ -2881,8 +2874,8 @@ public class MyViewComponent : Microsoft.AspNetCore.Mvc.ViewComponent{} e => e.AssertSingleItem("CheckAndRewriteTagHelpersStop", "Pages/Index.razor"), e => e.AssertSingleItem("CheckAndRewriteTagHelpersStart", "Pages/Counter.razor"), e => e.AssertSingleItem("CheckAndRewriteTagHelpersStop", "Pages/Counter.razor"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Index_razor.g.cs"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Counter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Index_razor.g.cs"), + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Counter_razor.g.cs") ); // Flip suppression on, change the parse options, no changes @@ -2924,8 +2917,8 @@ public class MyViewComponent : Microsoft.AspNetCore.Mvc.ViewComponent{} e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/Counter.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/Counter.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Index_razor.g.cs"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_Counter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Index_razor.g.cs"), + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/Counter_razor.g.cs") ); GeneratorDriver SetSuppressionState(bool state) @@ -3108,8 +3101,8 @@ public async Task RazorLangVersion_Incorrect([CombinatorialValues("incorrect", " var result = RunGenerator(compilation!, ref driver); result.Diagnostics.Verify( - // error RZ3600: Invalid value '{0}'' for RazorLangVersion. Valid values include 'Latest' or a valid version in range 1.0 to 8.0. - Diagnostic("RZ3600").WithArguments(langVersion).WithLocation(1, 1)); + // error RZ3600: Invalid value '{0}' for RazorLangVersion. Valid values include 'Latest', 'Preview', or a valid version in range 1.0 to {1}. + Diagnostic("RZ3600").WithArguments(langVersion, RazorLanguageVersion.Preview.ToString()).WithLocation(1, 1)); Assert.Single(result.GeneratedSources); } @@ -3279,7 +3272,7 @@ public async Task IncrementalCompilation_OnlyCompilationRuns_When_MetadataRefere Assert.Equal(2, result.GeneratedSources.Length); Assert.Empty(eventListener.Events); - var reference = (PortableExecutableReference) project.MetadataReferences[^1]; + var reference = (PortableExecutableReference)project.MetadataReferences[^1]; project = project.RemoveMetadataReference(reference) .AddMetadataReference(MetadataReference.CreateFromFile(reference.FilePath!)); @@ -3577,7 +3570,7 @@ public async Task IncrementalCompilation_RerunsGenerator_When_AdditionalFileRena e => e.AssertPair("RazorCodeGenerateStop", "Pages/Index.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStart", "Pages/NewCounter.razor", "Runtime"), e => e.AssertPair("RazorCodeGenerateStop", "Pages/NewCounter.razor", "Runtime"), - e => e.AssertSingleItem("AddSyntaxTrees", "Pages_NewCounter_razor.g.cs") + e => e.AssertSingleItem("AddSyntaxTrees", "Pages/NewCounter_razor.g.cs") ); // Verify the generated source has the correct namespace and class name @@ -3603,5 +3596,85 @@ public async Task IncrementalCompilation_RerunsGenerator_When_AdditionalFileRena var newCouNterSource = result.GeneratedSources.FirstOrDefault(s => s.HintName.Contains("NewCouNter")); Assert.Contains("public partial class NewCouNter", newCouNterSource.SourceText.ToString()); } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/12316")] + public async Task RazorClassLibrary_Change_Updates_DependentProject_WhenReferencedAsCompilation() + { + var rclProject = CreateTestProject(new() + { + ["LibComponent.razor"] = "

                  Library component

                  ", + }); + rclProject = rclProject.WithAssemblyName("RazorClassLibrary"); + + var rclCompilation = await rclProject.GetCompilationAsync(); + var rclDriver = await GetDriverAsync(rclProject); + var rclRun = RunGenerator(rclCompilation!, ref rclDriver, out var rclOutputCompilation); + Assert.Empty(rclRun.Diagnostics); + Assert.Single(rclRun.GeneratedSources); // LibComponent + + // Explicitly use a CompilationReference + var rclReference = rclOutputCompilation.ToMetadataReference(); + + // Create the main project that references the RCL and uses its component. + var mainProject = CreateTestProject(new() + { + ["Pages/Index.razor"] = "", + }); + mainProject = mainProject.AddMetadataReference(rclReference); + + var mainCompilation = await mainProject.GetCompilationAsync(); + var (mainDriver, mainAdditionalTexts) = await GetDriverWithAdditionalTextAsync(mainProject); + var mainRun = RunGenerator(mainCompilation!, ref mainDriver); + Assert.Empty(mainRun.Diagnostics); + Assert.Single(mainRun.GeneratedSources); + + // Rename the component in the RCL: LibComponent -> RenamedComponent + rclProject = CreateTestProject(new() + { + ["RenamedComponent.razor"] = "

                  Library component

                  ", + }).WithAssemblyName("RazorClassLibrary"); + + rclCompilation = await rclProject.GetCompilationAsync()!; + rclDriver = await GetDriverAsync(rclProject); + rclRun = RunGenerator(rclCompilation!, ref rclDriver, out rclOutputCompilation); + Assert.Empty(rclRun.Diagnostics); + Assert.Single(rclRun.GeneratedSources); // RenamedComponent + + var rclReference2 = rclOutputCompilation.ToMetadataReference(); + + // Update main project to point to the new reference (with renamed component). + mainProject = mainProject.RemoveMetadataReference(rclReference) + .AddMetadataReference(rclReference2); + mainCompilation = await mainProject.GetCompilationAsync(); + + // Re-run generator: expect missing component diagnostic (RZ10012). + mainRun = RunGenerator(mainCompilation!, ref mainDriver); + var missing = Assert.Single(mainRun.Diagnostics); + Assert.Equal("RZ10012", missing.Id); + + // Update main project's Index.razor to use the renamed component. + var updatedIndex = new TestAdditionalText("Pages/Index.razor", SourceText.From("", Encoding.UTF8)); + mainDriver = mainDriver.ReplaceAdditionalText( + mainAdditionalTexts.First(t => t.Path.EndsWith("Index.razor", StringComparison.OrdinalIgnoreCase)), + updatedIndex); + + // Re-run generator: should compile cleanly again. + mainRun = RunGenerator(mainCompilation!, ref mainDriver); + Assert.Empty(mainRun.Diagnostics); + Assert.Single(mainRun.GeneratedSources); + + // Update the compilation, which will cause us to re-run. + RazorEventListener eventListener = new RazorEventListener(); + + mainCompilation = mainCompilation!.WithOptions(mainCompilation.Options.WithModuleName("newMain")); + mainRun = RunGenerator(mainCompilation!, ref mainDriver); + Assert.Empty(mainRun.Diagnostics); + Assert.Single(mainRun.GeneratedSources); + + // Confirm that the tag helpers from metadata refs _didn't_ re-run + Assert.Collection(eventListener.Events, + e => Assert.Equal("DiscoverTagHelpersFromCompilationStart", e.EventName), + e => Assert.Equal("DiscoverTagHelpersFromCompilationStop", e.EventName)); + } } } diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTestsBase.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTestsBase.cs index 527a44e5232..1e46970a951 100644 --- a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTestsBase.cs +++ b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTestsBase.cs @@ -57,11 +57,11 @@ protected static async ValueTask GetDriverAsync(Project project return (result.Item1, result.Item2); } - protected static async ValueTask<(GeneratorDriver, ImmutableArray, TestAnalyzerConfigOptionsProvider)> GetDriverWithAdditionalTextAndProviderAsync(Project project, Action? configureGlobalOptions = null, bool hostOutputs = false) + protected static async ValueTask<(GeneratorDriver, ImmutableArray, TestAnalyzerConfigOptionsProvider)> GetDriverWithAdditionalTextAndProviderAsync(Project project, Action? configureGlobalOptions = null, bool hostOutputs = false, bool trackSteps = false) { var razorSourceGenerator = new RazorSourceGenerator(testUniqueIds: "test").AsSourceGenerator(); var disabledOutputs = hostOutputs ? IncrementalGeneratorOutputKind.None : (IncrementalGeneratorOutputKind)0b100000; - var driver = (GeneratorDriver)CSharpGeneratorDriver.Create(new[] { razorSourceGenerator }, parseOptions: (CSharpParseOptions)project.ParseOptions!, driverOptions: new GeneratorDriverOptions(disabledOutputs, true)); + var driver = (GeneratorDriver)CSharpGeneratorDriver.Create(new[] { razorSourceGenerator }, parseOptions: (CSharpParseOptions)project.ParseOptions!, driverOptions: new GeneratorDriverOptions(disabledOutputs, trackSteps)); var optionsProvider = new TestAnalyzerConfigOptionsProvider(); optionsProvider.TestGlobalOptions["build_property.RazorConfiguration"] = "Default"; @@ -150,9 +150,13 @@ protected static async Task RenderRazorPageAsync(Compilation compilation } }); var app = appBuilder.Build(); + + // Create a service scope to properly handle scoped services like IViewBufferScope. + // ASP.NET Core's DI validation prevents resolving scoped services from the root provider. + using var scope = app.Services.CreateScope(); var httpContext = new DefaultHttpContext { - RequestServices = app.Services + RequestServices = scope.ServiceProvider }; var requestFeature = new HttpRequestFeature { @@ -184,7 +188,7 @@ protected static async Task RenderRazorPageAsync(Compilation compilation .ToImmutableArray(); // Render the page. - var view = ActivatorUtilities.CreateInstance(app.Services, + var view = ActivatorUtilities.CreateInstance(scope.ServiceProvider, /* IReadOnlyList viewStartPages */ viewStarts, /* IRazorPage razorPage */ page); await view.RenderAsync(viewContext); @@ -479,6 +483,9 @@ public static void VerifyTextMatchesBaseline(string actualText, string fileName, [Conditional("GENERATE_BASELINES")] private static void GenerateOutputBaseline(string baselinePath, string text) { + var directory = Path.GetDirectoryName(baselinePath)!; + Directory.CreateDirectory(directory); + text = text.Replace("\r", "").Replace("\n", "\r\n"); File.WriteAllText(baselinePath, text, _baselineEncoding); } diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/EmptyRootNamespace/Shared_Component1_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/EmptyRootNamespace/Shared/Component1_razor.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/EmptyRootNamespace/Shared_Component1_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/EmptyRootNamespace/Shared/Component1_razor.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/EmptyRootNamespace/Views_Home_Index_cshtml.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/EmptyRootNamespace/Views/Home/Index_cshtml.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/EmptyRootNamespace/Views_Home_Index_cshtml.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/EmptyRootNamespace/Views/Home/Index_cshtml.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder1_Component1_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder1/Component1_razor.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder1_Component1_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder1/Component1_razor.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder1__Imports_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder1/_Imports_razor.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder1__Imports_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder1/_Imports_razor.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder2_Component2_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder2/Component2_razor.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder2_Component2_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor/Folder2/Component2_razor.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor_SystemInNamespace/System__Imports_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor_SystemInNamespace/System/_Imports_razor.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor_SystemInNamespace/System__Imports_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ImportsRazor_SystemInNamespace/System/_Imports_razor.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/Inject/Shared_Component1_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/Inject/Shared/Component1_razor.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/Inject/Shared_Component1_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/Inject/Shared/Component1_razor.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping/Shared_Component1_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping/Shared/Component1_razor.g.cs similarity index 99% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping/Shared_Component1_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping/Shared/Component1_razor.g.cs index d7d347fa84d..eb73914a8f1 100644 --- a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping/Shared_Component1_razor.g.cs +++ b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping/Shared/Component1_razor.g.cs @@ -23,6 +23,7 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. #nullable restore #line (1,39)-(1,50) 24 "Shared/Component1.razor" __builder.AddContent(2, RaiseHere() + #line default #line hidden #nullable disable diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping_Tabs/Shared_Component1_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping_Tabs/Shared/Component1_razor.g.cs similarity index 99% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping_Tabs/Shared_Component1_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping_Tabs/Shared/Component1_razor.g.cs index ed76deade83..a2ff4c3130b 100644 --- a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping_Tabs/Shared_Component1_razor.g.cs +++ b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/LineMapping_Tabs/Shared/Component1_razor.g.cs @@ -31,7 +31,7 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. #line (2,3)-(4,3) "Shared/Component1.razor" if (true) { - + #line default #line hidden @@ -40,6 +40,7 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. #nullable restore #line (4,5)-(4,11) 24 "Shared/Component1.razor" __builder.AddContent(1, "code" + #line default #line hidden #nullable disable diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/7/Shared_Component1_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/7/Shared/Component1_razor.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/7/Shared_Component1_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/7/Shared/Component1_razor.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/7/Views_Home_Index_cshtml.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/7/Views/Home/Index_cshtml.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/7/Views_Home_Index_cshtml.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/7/Views/Home/Index_cshtml.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/8/Shared_Component1_razor.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/8/Shared/Component1_razor.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/8/Shared_Component1_razor.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/8/Shared/Component1_razor.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/8/Views_Home_Index_cshtml.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/8/Views/Home/Index_cshtml.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/8/Views_Home_Index_cshtml.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorComponentTests/ScriptTag_WithVariable/8/Views/Home/Index_cshtml.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/CustomTagHelper/Views_Home_Index_cshtml.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/CustomTagHelper/Views/Home/Index_cshtml.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/CustomTagHelper/Views_Home_Index_cshtml.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/CustomTagHelper/Views/Home/Index_cshtml.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/ViewComponent/Views_Home_Index_cshtml.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/ViewComponent/Views/Home/Index_cshtml.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/ViewComponent/Views_Home_Index_cshtml.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/ViewComponent/Views/Home/Index_cshtml.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/VoidTagName/Views_Home_Index_cshtml.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/VoidTagName/Views/Home/Index_cshtml.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/VoidTagName/Views_Home_Index_cshtml.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/VoidTagName/Views/Home/Index_cshtml.g.cs diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/VoidTagName_NoMatchingTagHelper/Views_Home_Index_cshtml.g.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/VoidTagName_NoMatchingTagHelper/Views/Home/Index_cshtml.g.cs similarity index 100% rename from src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/VoidTagName_NoMatchingTagHelper/Views_Home_Index_cshtml.g.cs rename to src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTagHelperTests/VoidTagName_NoMatchingTagHelper/Views/Home/Index_cshtml.g.cs diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Checksums/TagHelperChecksumBenchmark.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Checksums/TagHelperChecksumBenchmark.cs deleted file mode 100644 index abd29d25f08..00000000000 --- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Checksums/TagHelperChecksumBenchmark.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using BenchmarkDotNet.Attributes; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.Utilities; - -namespace Microsoft.AspNetCore.Razor.Microbenchmarks.Checksums; - -public class TagHelperChecksumBenchmarks -{ - private Checksum[]? _checksums; - - [ParamsAllValues] - public ResourceSet ResourceSet { get; set; } - - private IReadOnlyList TagHelpers - => ResourceSet switch - { - ResourceSet.Telerik => CommonResources.TelerikTagHelpers, - _ => CommonResources.LegacyTagHelpers - }; - - [IterationSetup] - public void Setup() - { - _checksums = new Checksum[TagHelpers.Count]; - } - - [Benchmark(Description = "Create Checksums")] - public void CreateChecksums() - { - for (var i = 0; i < TagHelpers.Count; i++) - { - _checksums![i] = TagHelpers[i].ComputeChecksum(); - } - } -} diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Helpers.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Helpers.cs index 21aeb148f55..55513c1a1f8 100644 --- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Helpers.cs +++ b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Helpers.cs @@ -18,12 +18,12 @@ public static string GetRepoRootPath() static string GetRepoRootPathCore() { var current = new DirectoryInfo(AppContext.BaseDirectory); - while (current is not null && !File.Exists(Path.Combine(current.FullName, "Razor.sln"))) + while (current is not null && !File.Exists(Path.Combine(current.FullName, "Razor.slnx"))) { current = current.Parent; } - return current?.FullName ?? throw new InvalidOperationException("Could not find Razor.sln"); + return current?.FullName ?? throw new InvalidOperationException("Could not find Razor.slnx"); } } diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorCompletionBenchmark.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorCompletionBenchmark.cs index 6b1112f6b7b..2260e98a55d 100644 --- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorCompletionBenchmark.cs +++ b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorCompletionBenchmark.cs @@ -18,7 +18,6 @@ using Microsoft.CodeAnalysis.Razor.Logging; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Razor.Telemetry; -using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Text; namespace Microsoft.AspNetCore.Razor.Microbenchmarks.LanguageServer; @@ -42,13 +41,12 @@ public async Task SetupAsync() var completionListCache = RazorLanguageServerHost.GetRequiredService(); var triggerAndCommitCharacters = RazorLanguageServerHost.GetRequiredService(); var loggerFactory = RazorLanguageServerHost.GetRequiredService(); - var languageServerFeatureOptions = RazorLanguageServerHost.GetRequiredService(); var delegatedCompletionListProvider = new TestDelegatedCompletionListProvider(documentMappingService, clientConnection, completionListCache, triggerAndCommitCharacters); var completionListProvider = new CompletionListProvider(razorCompletionListProvider, delegatedCompletionListProvider, triggerAndCommitCharacters); var configurationService = new DefaultRazorConfigurationService(clientConnection, loggerFactory); var optionsMonitor = new RazorLSPOptionsMonitor(configurationService, RazorLSPOptions.Default); - CompletionEndpoint = new RazorCompletionEndpoint(completionListProvider, triggerAndCommitCharacters, NoOpTelemetryReporter.Instance, optionsMonitor, languageServerFeatureOptions); + CompletionEndpoint = new RazorCompletionEndpoint(completionListProvider, triggerAndCommitCharacters, NoOpTelemetryReporter.Instance, optionsMonitor); var clientCapabilities = new VSInternalClientCapabilities { diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorDiagnosticsBenchmark.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorDiagnosticsBenchmark.cs index 1db18fea053..07707d9f06c 100644 --- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorDiagnosticsBenchmark.cs +++ b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorDiagnosticsBenchmark.cs @@ -64,9 +64,7 @@ public void Setup() SourceMappings, linePragmas: []); - codeDocument.SetCSharpDocument(csharpDocument); - - RazorCodeDocument = codeDocument; + RazorCodeDocument = codeDocument.WithCSharpDocument(csharpDocument); SourceText = RazorCodeDocument.Source.Text; var documentContext = new Mock( @@ -88,7 +86,7 @@ public void Setup() var optionsMonitor = Mock.Of(MockBehavior.Strict); var translateDiagnosticsService = new RazorTranslateDiagnosticsService(documentMappingService, loggerFactory); - DocumentPullDiagnosticsEndpoint = new VSDocumentDiagnosticsEndpoint(languageServerFeatureOptions, translateDiagnosticsService, optionsMonitor, languageServer, telemetryReporter: null); + DocumentPullDiagnosticsEndpoint = new VSDocumentDiagnosticsEndpoint(translateDiagnosticsService, optionsMonitor, languageServer, telemetryReporter: null); } private object BuildDiagnostics() @@ -104,10 +102,7 @@ private object BuildDiagnostics() private protected override LanguageServerFeatureOptions BuildFeatureOptions() { return Mock.Of(options => - options.SupportsFileManipulation == true && - options.SingleServerSupport == true && - options.CSharpVirtualDocumentSuffix == ".ide.g.cs" && - options.HtmlVirtualDocumentSuffix == "__virtual.html", + options.SupportsFileManipulation == true, MockBehavior.Strict); } diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorLanguageServerBenchmarkBase.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorLanguageServerBenchmarkBase.cs index c964397698c..7ad2bd45e2d 100644 --- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorLanguageServerBenchmarkBase.cs +++ b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorLanguageServerBenchmarkBase.cs @@ -71,7 +71,7 @@ await projectManager.UpdateAsync( updater => { updater.AddProject(hostProject); - var projectWorkspaceState = ProjectWorkspaceState.Create(CommonResources.LegacyTagHelpers); + var projectWorkspaceState = ProjectWorkspaceState.Create([.. CommonResources.LegacyTagHelpers]); updater.UpdateProjectWorkspaceState(hostProject.Key, projectWorkspaceState); updater.AddDocument(hostProject.Key, hostDocument, text); }, diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/TagHelperCompletionBenchmark.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/TagHelperCompletionBenchmark.cs index 962fd66b8d7..96c56f4761d 100644 --- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/TagHelperCompletionBenchmark.cs +++ b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/TagHelperCompletionBenchmark.cs @@ -31,7 +31,7 @@ public object GetAttributeCompletions() { var tagHelperCompletionService = new TagHelperCompletionService(); var context = new AttributeCompletionContext( - TagHelperDocumentContext.Create(prefix: null, CommonResources.TelerikTagHelpers), + TagHelperDocumentContext.GetOrCreate([.. CommonResources.TelerikTagHelpers]), existingCompletions: [], currentTagName: "PageTitle", currentAttributeName: null, @@ -48,7 +48,7 @@ public object GetElementCompletions() { var tagHelperCompletionService = new TagHelperCompletionService(); var context = new ElementCompletionContext( - TagHelperDocumentContext.Create(prefix: null, CommonResources.TelerikTagHelpers), + TagHelperDocumentContext.GetOrCreate([.. CommonResources.TelerikTagHelpers]), existingCompletions: s_existingElementCompletions, containingTagName: null, attributes: [], diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/CompletionListSerializationBenchmark.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/CompletionListSerializationBenchmark.cs index 07f643b524d..f2fd3c6ee0e 100644 --- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/CompletionListSerializationBenchmark.cs +++ b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/CompletionListSerializationBenchmark.cs @@ -6,9 +6,6 @@ using BenchmarkDotNet.Attributes; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Syntax; -using Microsoft.AspNetCore.Razor.LanguageServer; -using Microsoft.AspNetCore.Razor.LanguageServer.Completion; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting; using Microsoft.CodeAnalysis.Razor.Completion; namespace Microsoft.AspNetCore.Razor.Microbenchmarks.Serialization; @@ -69,7 +66,7 @@ private CompletionList GenerateCompletionList(string documentContent, int queryI var sourceDocument = RazorSourceDocument.Create(documentContent, RazorSourceDocumentProperties.Default); var codeDocument = RazorCodeDocument.Create(sourceDocument); var syntaxTree = RazorSyntaxTree.Parse(sourceDocument); - var tagHelperDocumentContext = TagHelperDocumentContext.Create(prefix: string.Empty, CommonResources.LegacyTagHelpers); + var tagHelperDocumentContext = TagHelperDocumentContext.GetOrCreate([.. CommonResources.LegacyTagHelpers]); var owner = syntaxTree.Root.FindInnermostNode(queryIndex, includeWhitespace: true, walkMarkersBack: true); var context = new RazorCompletionContext(codeDocument, queryIndex, owner, syntaxTree, tagHelperDocumentContext); diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/RazorProjectInfoSerializationBenchmark.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/RazorProjectInfoSerializationBenchmark.cs index 8db3ea53989..6b4c3dde1dc 100644 --- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/RazorProjectInfoSerializationBenchmark.cs +++ b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/RazorProjectInfoSerializationBenchmark.cs @@ -67,7 +67,7 @@ public void Deserialize_Json() var projectInfo = DeserializeProjectInfo_Json(reader); if (projectInfo.ProjectWorkspaceState is null || - projectInfo.ProjectWorkspaceState.TagHelpers.Length != ProjectInfo.ProjectWorkspaceState?.TagHelpers.Length) + projectInfo.ProjectWorkspaceState.TagHelpers.Count != ProjectInfo.ProjectWorkspaceState.TagHelpers.Count) { throw new InvalidDataException(); } @@ -89,7 +89,7 @@ public void RoundTrip_Json() var projectInfo = DeserializeProjectInfo_Json(reader); if (projectInfo.ProjectWorkspaceState is null || - projectInfo.ProjectWorkspaceState.TagHelpers.Length != ProjectInfo.ProjectWorkspaceState?.TagHelpers.Length) + projectInfo.ProjectWorkspaceState.TagHelpers.Count != ProjectInfo.ProjectWorkspaceState.TagHelpers.Count) { throw new InvalidDataException(); } @@ -128,7 +128,7 @@ public void Deserialize_MessagePack() var projectInfo = DeserializeProjectInfo_MessagePack(_projectInfoMessagePackBytes); if (projectInfo.ProjectWorkspaceState is null || - projectInfo.ProjectWorkspaceState.TagHelpers.Length != ProjectInfo.ProjectWorkspaceState?.TagHelpers.Length) + projectInfo.ProjectWorkspaceState.TagHelpers.Count != ProjectInfo.ProjectWorkspaceState.TagHelpers.Count) { throw new InvalidDataException(); } @@ -142,7 +142,7 @@ public void RoundTrip_MessagePack() _buffer.Clear(); if (projectInfo.ProjectWorkspaceState is null || - projectInfo.ProjectWorkspaceState.TagHelpers.Length != ProjectInfo.ProjectWorkspaceState?.TagHelpers.Length) + projectInfo.ProjectWorkspaceState.TagHelpers.Count != ProjectInfo.ProjectWorkspaceState.TagHelpers.Count) { throw new InvalidDataException(); } diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.CodeDocumentWrapper.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.CodeDocumentWrapper.cs index 21f88c0e7b2..5139552f838 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.CodeDocumentWrapper.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.CodeDocumentWrapper.cs @@ -47,7 +47,7 @@ public ImmutableArray GetTagHelperSpans() { builder.Add(new TagHelperSpan( ConvertSourceSpan(item.Span), - WrapAll(item.Binding.Descriptors, Wrap))); + WrapAll(item.Binding.TagHelpers, Wrap))); } return builder.ToImmutableAndClear(); diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.TagHelperBindingWrapper.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.TagHelperBindingWrapper.cs index f28d39881aa..9ad1f5b3167 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.TagHelperBindingWrapper.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.TagHelperBindingWrapper.cs @@ -10,10 +10,10 @@ internal static partial class RazorWrapperFactory { private class TagHelperBindingWrapper(TagHelperBinding obj) : Wrapper(obj), IRazorTagHelperBinding { - private ImmutableArray _descriptors; + private ImmutableArray _tagHelpers; public ImmutableArray Descriptors - => InitializeArrayWithWrappedItems(ref _descriptors, Object.Descriptors, Wrap); + => InitializeArrayWithWrappedItems(ref _tagHelpers, Object.TagHelpers, Wrap); public ImmutableArray GetBoundRules(IRazorTagHelperDescriptor descriptor) { diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.cs index 13ae732235f..19610b602e6 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor/RazorWrapperFactory.cs @@ -87,6 +87,21 @@ private static ImmutableArray InitializeArrayWithWrappedItems InitializeArrayWithWrappedItems( + ref ImmutableArray location, + IEnumerable list, + Func createWrapper) + where TInner : class + where TResult : class + { + if (location.IsDefault) + { + ImmutableInterlocked.InterlockedInitialize(ref location, WrapAll(list, createWrapper)); + } + + return location; + } + private static T Unwrap(object obj) where T : class => ((Wrapper)obj).Object; diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/AbstractRazorDelegatingEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/AbstractRazorDelegatingEndpoint.cs index 0090d82fc09..20e3045c2a5 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/AbstractRazorDelegatingEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/AbstractRazorDelegatingEndpoint.cs @@ -18,13 +18,11 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer; internal abstract class AbstractRazorDelegatingEndpoint( - LanguageServerFeatureOptions languageServerFeatureOptions, IDocumentMappingService documentMappingService, IClientConnection clientConnection, ILogger logger) : IRazorRequestHandler where TRequest : ITextDocumentPositionParams { - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; protected readonly IDocumentMappingService DocumentMappingService = documentMappingService; private readonly IClientConnection _clientConnection = clientConnection; protected readonly ILogger Logger = logger; @@ -34,10 +32,6 @@ internal abstract class AbstractRazorDelegatingEndpoint( /// protected virtual IDocumentPositionInfoStrategy DocumentPositionInfoStrategy { get; } = DefaultDocumentPositionInfoStrategy.Instance; - protected bool SingleServerSupport => _languageServerFeatureOptions.SingleServerSupport; - - protected virtual bool OnlySingleServer { get; } = true; - /// /// When , we'll try to map the cursor position to C# even when it is in a Html context, for example /// for component attributes that are fully within a Html context, but map to a C# property write in the generated document. @@ -77,8 +71,7 @@ protected virtual Task HandleDelegatedResponseAsync(TResponse delegat /// /// Returns true if the configuration supports this operation being handled, otherwise returns false. Use to - /// handle cases where other than - /// need to be checked to validate that the operation can be done. + /// handle cases where need to be checked to validate that the operation can be done. /// protected virtual bool IsSupported() => true; @@ -117,11 +110,6 @@ protected virtual Task HandleDelegatedResponseAsync(TResponse delegat return response; } - if (OnlySingleServer && !_languageServerFeatureOptions.SingleServerSupport) - { - return default; - } - if (positionInfo.LanguageKind == RazorLanguageKind.Razor) { // We can only delegate to C# and HTML, so if we're in a Razor context and our inheritor didn't want to provide diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/AutoInsert/OnAutoInsertEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/AutoInsert/OnAutoInsertEndpoint.cs index a470033fae3..5f300cb9c96 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/AutoInsert/OnAutoInsertEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/AutoInsert/OnAutoInsertEndpoint.cs @@ -25,16 +25,14 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.AutoInsert; [RazorLanguageServerEndpoint(VSInternalMethods.OnAutoInsertName)] internal class OnAutoInsertEndpoint( - LanguageServerFeatureOptions languageServerFeatureOptions, IDocumentMappingService documentMappingService, IClientConnection clientConnection, IAutoInsertService autoInsertService, RazorLSPOptionsMonitor optionsMonitor, IRazorFormattingService razorFormattingService, ILoggerFactory loggerFactory) - : AbstractRazorDelegatingEndpoint(languageServerFeatureOptions, documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()), ICapabilitiesProvider + : AbstractRazorDelegatingEndpoint(documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()), ICapabilitiesProvider { - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; private readonly RazorLSPOptionsMonitor _optionsMonitor = optionsMonitor; private readonly IRazorFormattingService _razorFormattingService = razorFormattingService; private readonly IAutoInsertService _autoInsertService = autoInsertService; @@ -50,17 +48,10 @@ internal class OnAutoInsertEndpoint( public void ApplyCapabilities(VSInternalServerCapabilities serverCapabilities, VSInternalClientCapabilities clientCapabilities) { - var triggerCharacters = _autoInsertService.TriggerCharacters; - - if (_languageServerFeatureOptions.SingleServerSupport) - { - triggerCharacters = [ - .. triggerCharacters, - .. AutoInsertService.HtmlAllowedAutoInsertTriggerCharacters, - .. AutoInsertService.CSharpAllowedAutoInsertTriggerCharacters]; - } - - serverCapabilities.EnableOnAutoInsert(triggerCharacters); + serverCapabilities.EnableOnAutoInsert([ + .. _autoInsertService.TriggerCharacters, + .. AutoInsertService.HtmlAllowedAutoInsertTriggerCharacters, + .. AutoInsertService.CSharpAllowedAutoInsertTriggerCharacters]); } protected override async Task TryHandleAsync(VSInternalDocumentOnAutoInsertParams request, RazorRequestContext requestContext, DocumentPositionInfo positionInfo, CancellationToken cancellationToken) diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/RazorCompletionEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/RazorCompletionEndpoint.cs index 9163f87be2f..49e89eae3b2 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/RazorCompletionEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/RazorCompletionEndpoint.cs @@ -19,15 +19,13 @@ internal class RazorCompletionEndpoint( CompletionListProvider completionListProvider, CompletionTriggerAndCommitCharacters triggerAndCommitCharacters, ITelemetryReporter telemetryReporter, - RazorLSPOptionsMonitor optionsMonitor, - LanguageServerFeatureOptions featureOptions) + RazorLSPOptionsMonitor optionsMonitor) : IRazorRequestHandler, ICapabilitiesProvider { private readonly CompletionListProvider _completionListProvider = completionListProvider; private readonly CompletionTriggerAndCommitCharacters _triggerAndCommitCharacters = triggerAndCommitCharacters; private readonly ITelemetryReporter _telemetryReporter = telemetryReporter; private readonly RazorLSPOptionsMonitor _optionsMonitor = optionsMonitor; - private readonly LanguageServerFeatureOptions _featureOptions = featureOptions; private VSInternalClientCapabilities? _clientCapabilities; @@ -40,8 +38,8 @@ public void ApplyCapabilities(VSInternalServerCapabilities serverCapabilities, V serverCapabilities.CompletionProvider = new CompletionOptions() { ResolveProvider = true, - TriggerCharacters = [.. _triggerAndCommitCharacters.AllTriggerCharacters], - AllCommitCharacters = [.. _triggerAndCommitCharacters.AllCommitCharacters] + TriggerCharacters = _triggerAndCommitCharacters.AllTriggerCharacters, + AllCommitCharacters = _triggerAndCommitCharacters.AllCommitCharacters }; } @@ -78,7 +76,7 @@ public TextDocumentIdentifier GetTextDocumentIdentifier(CompletionParams request SnippetsSupported: true, AutoInsertAttributeQuotes: options.AutoInsertAttributeQuotes, CommitElementsWithSpace: options.CommitElementsWithSpace, - UseVsCodeCompletionCommitCharacters: _featureOptions.UseVsCodeCompletionCommitCharacters); + UseVsCodeCompletionCommitCharacters: !_clientCapabilities.AssumeNotNull().SupportsVisualStudioExtensions); var result = await _completionListProvider .GetCompletionListAsync( diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/DataTipRangeHandlerEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/DataTipRangeHandlerEndpoint.cs index cca06bb34c4..12fc528b8dc 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/DataTipRangeHandlerEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/DataTipRangeHandlerEndpoint.cs @@ -17,17 +17,13 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Debugging; [RazorLanguageServerEndpoint(VSInternalMethods.TextDocumentDataTipRangeName)] internal sealed class DataTipRangeHandlerEndpoint( IDocumentMappingService documentMappingService, - LanguageServerFeatureOptions languageServerFeatureOptions, IClientConnection clientConnection, ILoggerFactory loggerFactory) : AbstractRazorDelegatingEndpoint( - languageServerFeatureOptions, documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()), ICapabilitiesProvider { - protected override bool OnlySingleServer => false; - protected override string CustomMessageTarget => CustomMessageNames.RazorDataTipRangeName; public void ApplyCapabilities(VSInternalServerCapabilities serverCapabilities, VSInternalClientCapabilities clientCapabilities) diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/RazorBreakpointSpanEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/RazorBreakpointSpanEndpoint.cs index e45dc1dbd55..0f4b1b05c50 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/RazorBreakpointSpanEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/RazorBreakpointSpanEndpoint.cs @@ -67,7 +67,7 @@ public Uri GetTextDocumentIdentifier(RazorBreakpointSpanParams request) } // Now ask Roslyn to adjust the breakpoint to a valid location in the code - var syntaxTree = codeDocument.GetOrParseCSharpSyntaxTree(cancellationToken); + var syntaxTree = await documentContext.Snapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); if (!RazorBreakpointSpans.TryGetBreakpointSpan(syntaxTree, projectedIndex, cancellationToken, out var csharpBreakpointSpan)) { return null; diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/RazorProximityExpressionsEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/RazorProximityExpressionsEndpoint.cs index 15592e9e9fd..f8760b0625d 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/RazorProximityExpressionsEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/RazorProximityExpressionsEndpoint.cs @@ -68,7 +68,7 @@ public Uri GetTextDocumentIdentifier(RazorProximityExpressionsParams request) } // Now ask Roslyn to adjust the breakpoint to a valid location in the code - var syntaxTree = codeDocument.GetOrParseCSharpSyntaxTree(cancellationToken); + var syntaxTree = await documentContext.Snapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); var expressions = RazorCSharpProximityExpressionResolverService.GetProximityExpressions(syntaxTree, projectedIndex, cancellationToken)?.ToList(); if (expressions == null) { diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/ValidateBreakpointRangeEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/ValidateBreakpointRangeEndpoint.cs index ca85d52dc4f..9a6e459c98e 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/ValidateBreakpointRangeEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Debugging/ValidateBreakpointRangeEndpoint.cs @@ -17,19 +17,15 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Debugging; [RazorLanguageServerEndpoint(VSInternalMethods.TextDocumentValidateBreakableRangeName)] internal class ValidateBreakpointRangeEndpoint( IDocumentMappingService documentMappingService, - LanguageServerFeatureOptions languageServerFeatureOptions, IClientConnection clientConnection, ILoggerFactory loggerFactory) : AbstractRazorDelegatingEndpoint( - languageServerFeatureOptions, documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()), ICapabilitiesProvider { private readonly IDocumentMappingService _documentMappingService = documentMappingService; - protected override bool OnlySingleServer => false; - protected override string CustomMessageTarget => CustomMessageNames.RazorValidateBreakpointRangeName; public void ApplyCapabilities(VSInternalServerCapabilities serverCapabilities, VSInternalClientCapabilities clientCapabilities) diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DefaultLanguageServerFeatureOptions.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DefaultLanguageServerFeatureOptions.cs index acab661c166..b80c6b71773 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DefaultLanguageServerFeatureOptions.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DefaultLanguageServerFeatureOptions.cs @@ -8,34 +8,13 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer; internal class DefaultLanguageServerFeatureOptions : LanguageServerFeatureOptions { - public const string DefaultCSharpVirtualDocumentSuffix = ".ide.g.cs"; - public const string DefaultHtmlVirtualDocumentSuffix = "__virtual.html"; - public override bool SupportsFileManipulation => true; - public override string CSharpVirtualDocumentSuffix => DefaultCSharpVirtualDocumentSuffix; - - public override string HtmlVirtualDocumentSuffix => DefaultHtmlVirtualDocumentSuffix; - - public override bool SingleServerSupport => false; - - public override bool DelegateToCSharpOnDiagnosticPublish => false; - - public override bool UpdateBuffersForClosedDocuments => false; - // Code action and rename paths in Windows VS Code need to be prefixed with '/': // https://github.com/dotnet/razor/issues/8131 public override bool ReturnCodeActionAndRenamePathsWithPrefixedSlash => PlatformInformation.IsWindows; public override bool ShowAllCSharpCodeActions => false; - public override bool IncludeProjectKeyInGeneratedFilePath => false; - public override bool UseRazorCohostServer => false; - - public override bool SupportsSoftSelectionInCompletion => true; - - public override bool UseVsCodeCompletionCommitCharacters => false; - - public override bool DoNotInitializeMiscFilesProjectFromWorkspace => false; } diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Definition/DefinitionEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Definition/DefinitionEndpoint.cs index efb46f1b2f2..12f4b504a82 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Definition/DefinitionEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Definition/DefinitionEndpoint.cs @@ -29,11 +29,9 @@ internal sealed class DefinitionEndpoint( IDefinitionService definitionService, IDocumentMappingService documentMappingService, ProjectSnapshotManager projectManager, - LanguageServerFeatureOptions languageServerFeatureOptions, IClientConnection clientConnection, ILoggerFactory loggerFactory) : AbstractRazorDelegatingEndpoint( - languageServerFeatureOptions, documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()), ICapabilitiesProvider @@ -67,9 +65,8 @@ public void ApplyCapabilities(VSInternalServerCapabilities serverCapabilities, V return null; } - // If single server support is on, then we ignore attributes, as they are better handled by delegating to Roslyn var results = await _definitionService - .GetDefinitionAsync(documentContext.Snapshot, positionInfo, _projectManager.GetQueryOperations(), ignoreComponentAttributes: SingleServerSupport, includeMvcTagHelpers: false, cancellationToken) + .GetDefinitionAsync(documentContext.Snapshot, positionInfo, _projectManager.GetQueryOperations(), includeMvcTagHelpers: false, cancellationToken) .ConfigureAwait(false); // We know there will only be one result, because without tag helper support there can't be anything else diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Diagnostics/MissingTagHelperTelemetryReporter.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Diagnostics/MissingTagHelperTelemetryReporter.cs index e6a3944d3cc..2b4b95ff0da 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Diagnostics/MissingTagHelperTelemetryReporter.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Diagnostics/MissingTagHelperTelemetryReporter.cs @@ -32,7 +32,7 @@ public async ValueTask ReportRZ10012TelemetryAsync(DocumentContext documentConte } var tagHelpers = await documentContext.Project.GetTagHelpersAsync(cancellationToken).ConfigureAwait(false); - var tagHelperCount = tagHelpers.Length; + var tagHelperCount = tagHelpers.Count; var shouldReport = false; ImmutableInterlocked.AddOrUpdate( diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Diagnostics/VSDocumentDiagnosticsEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Diagnostics/VSDocumentDiagnosticsEndpoint.cs index 5f5e803e749..b83dd5ac34c 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Diagnostics/VSDocumentDiagnosticsEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Diagnostics/VSDocumentDiagnosticsEndpoint.cs @@ -20,13 +20,11 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Diagnostics; [RazorLanguageServerEndpoint(VSInternalMethods.DocumentPullDiagnosticName)] internal class VSDocumentDiagnosticsEndpoint( - LanguageServerFeatureOptions languageServerFeatureOptions, RazorTranslateDiagnosticsService translateDiagnosticsService, RazorLSPOptionsMonitor razorLSPOptionsMonitor, IClientConnection clientConnection, ITelemetryReporter? telemetryReporter) : IRazorRequestHandler?>, ICapabilitiesProvider { - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; private readonly IClientConnection _clientConnection = clientConnection; private readonly RazorTranslateDiagnosticsService _translateDiagnosticsService = translateDiagnosticsService; private readonly RazorLSPOptionsMonitor _razorLSPOptionsMonitor = razorLSPOptionsMonitor; @@ -56,11 +54,6 @@ public TextDocumentIdentifier GetTextDocumentIdentifier(VSInternalDocumentDiagno public async Task?> HandleRequestAsync(VSInternalDocumentDiagnosticsParams request, RazorRequestContext context, CancellationToken cancellationToken) { - if (!_languageServerFeatureOptions.SingleServerSupport) - { - Debug.WriteLine("Pull diagnostics without single server"); - } - var documentContext = context.DocumentContext; if (documentContext is null) { diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentHighlighting/DocumentHighlightEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentHighlighting/DocumentHighlightEndpoint.cs index 4a8fef8c5fe..0c7b5a88be0 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentHighlighting/DocumentHighlightEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentHighlighting/DocumentHighlightEndpoint.cs @@ -21,11 +21,10 @@ internal class DocumentHighlightEndpoint : AbstractRazorDelegatingEndpoint()) + : base(documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()) { _documentMappingService = documentMappingService ?? throw new ArgumentNullException(nameof(documentMappingService)); } diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentPresentation/AbstractTextDocumentPresentationEndpointBase.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentPresentation/AbstractTextDocumentPresentationEndpointBase.cs index 10ea717e52d..8d04cd74e9d 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentPresentation/AbstractTextDocumentPresentationEndpointBase.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentPresentation/AbstractTextDocumentPresentationEndpointBase.cs @@ -109,14 +109,14 @@ internal abstract class AbstractTextDocumentPresentationEndpointBase( // The responses we get back will be for virtual documents, so we have to map them back to the real // document, and in the case of C#, map the returned ranges too - var edit = MapWorkspaceEdit(response, mapRanges: languageKind == RazorLanguageKind.CSharp, codeDocument); + MapWorkspaceEdit(response, mapRanges: languageKind == RazorLanguageKind.CSharp, codeDocument); - return edit; + return response; } - private Dictionary MapChanges(Dictionary changes, bool mapRanges, RazorCodeDocument codeDocument) + private Dictionary MapDocumentEdits(Dictionary changes, bool mapRanges, RazorCodeDocument codeDocument) { - var remappedChanges = new Dictionary(); + var mappedChanges = new Dictionary(); foreach (var entry in changes) { var uri = new Uri(entry.Key); @@ -124,61 +124,26 @@ private Dictionary MapChanges(Dictionary if (!_filePathService.IsVirtualDocumentUri(uri)) { - // This location doesn't point to a background razor file. No need to remap. - remappedChanges[entry.Key] = entry.Value; + // This location doesn't point to a background razor file. No need to map. + mappedChanges[entry.Key] = entry.Value; continue; } - var remappedEdits = MapTextEdits(mapRanges, codeDocument, edits.Select(e => (SumType)e)); - if (remappedEdits.Length == 0) + var mappedEdits = GetMappedTextEdits(mapRanges, codeDocument, edits.Select(e => (SumType)e)); + if (mappedEdits.Length == 0) { // Nothing to do. continue; } var razorDocumentUri = _filePathService.GetRazorDocumentUri(uri); - remappedChanges[razorDocumentUri.AbsoluteUri] = remappedEdits; + mappedChanges[razorDocumentUri.AbsoluteUri] = mappedEdits; } - return remappedChanges; + return mappedChanges; } - private TextDocumentEdit[] MapDocumentChanges(TextDocumentEdit[] documentEdits, bool mapRanges, RazorCodeDocument codeDocument) - { - using var remappedDocumentEdits = new PooledArrayBuilder(documentEdits.Length); - foreach (var entry in documentEdits) - { - var uri = entry.TextDocument.DocumentUri.GetRequiredParsedUri(); - if (!_filePathService.IsVirtualDocumentUri(uri)) - { - // This location doesn't point to a background razor file. No need to remap. - remappedDocumentEdits.Add(entry); - continue; - } - - var edits = entry.Edits; - var remappedEdits = MapTextEdits(mapRanges, codeDocument, edits); - if (remappedEdits is null || remappedEdits.Length == 0) - { - // Nothing to do. - continue; - } - - var razorDocumentUri = _filePathService.GetRazorDocumentUri(uri); - remappedDocumentEdits.Add(new TextDocumentEdit() - { - TextDocument = new OptionalVersionedTextDocumentIdentifier() - { - DocumentUri = new(razorDocumentUri), - }, - Edits = [.. remappedEdits] - }); - } - - return remappedDocumentEdits.ToArray(); - } - - private TextEdit[] MapTextEdits(bool mapRanges, RazorCodeDocument codeDocument, IEnumerable> edits) + private TextEdit[] GetMappedTextEdits(bool mapRanges, RazorCodeDocument codeDocument, IEnumerable> edits) { using var mappedEdits = new PooledArrayBuilder(); if (!mapRanges) @@ -202,27 +167,44 @@ private TextEdit[] MapTextEdits(bool mapRanges, RazorCodeDocument codeDocument, return mappedEdits.ToArray(); } - private WorkspaceEdit? MapWorkspaceEdit(WorkspaceEdit workspaceEdit, bool mapRanges, RazorCodeDocument codeDocument) + private void MapWorkspaceEdit(WorkspaceEdit workspaceEdit, bool mapRanges, RazorCodeDocument codeDocument) { - if (workspaceEdit.TryGetTextDocumentEdits(out var documentEdits)) + // Handle DocumentChanges - iterate through TextDocumentEdits and modify them in-place. + // This preserves CreateFile, RenameFile, DeleteFile operations automatically since we don't create a new array. + if (workspaceEdit.DocumentChanges is not null) { - // The LSP spec says, we should prefer `DocumentChanges` property over `Changes` if available. - var remappedEdits = MapDocumentChanges(documentEdits, mapRanges, codeDocument); - return new WorkspaceEdit() + foreach (var textDocumentEdit in workspaceEdit.EnumerateTextDocumentEdits()) { - DocumentChanges = remappedEdits - }; + MapTextDocumentEditInPlace(textDocumentEdit, mapRanges, codeDocument); + } } - else if (workspaceEdit.Changes != null) + + if (workspaceEdit.Changes is not null) { - var remappedEdits = MapChanges(workspaceEdit.Changes, mapRanges, codeDocument); - return new WorkspaceEdit() - { - Changes = remappedEdits - }; + workspaceEdit.Changes = MapDocumentEdits(workspaceEdit.Changes, mapRanges, codeDocument); } + } - return workspaceEdit; + private void MapTextDocumentEditInPlace(TextDocumentEdit entry, bool mapRanges, RazorCodeDocument codeDocument) + { + var uri = entry.TextDocument.DocumentUri.GetRequiredParsedUri(); + if (!_filePathService.IsVirtualDocumentUri(uri)) + { + // This location doesn't point to a background razor file. No need to map. + return; + } + + var edits = entry.Edits; + var mappedEdits = GetMappedTextEdits(mapRanges, codeDocument, edits); + + var razorDocumentUri = _filePathService.GetRazorDocumentUri(uri); + + // Update the entry in-place + entry.TextDocument = new OptionalVersionedTextDocumentIdentifier() + { + DocumentUri = new(razorDocumentUri), + }; + entry.Edits = [.. mappedEdits]; } protected record DocumentSnapshotAndVersion(IDocumentSnapshot Snapshot, int Version); diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentSymbols/DocumentSymbolEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentSymbols/DocumentSymbolEndpoint.cs index ddddeefd3d5..ff4640f3121 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentSymbols/DocumentSymbolEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/DocumentSymbols/DocumentSymbolEndpoint.cs @@ -20,24 +20,15 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.DocumentSymbols; [RazorLanguageServerEndpoint(Methods.TextDocumentDocumentSymbolName)] internal class DocumentSymbolEndpoint( IClientConnection clientConnection, - IDocumentSymbolService documentSymbolService, - LanguageServerFeatureOptions languageServerFeatureOptions) : IRazorRequestHandler?>, ICapabilitiesProvider + IDocumentSymbolService documentSymbolService) : IRazorRequestHandler?>, ICapabilitiesProvider { private readonly IClientConnection _clientConnection = clientConnection; private readonly IDocumentSymbolService _documentSymbolService = documentSymbolService; - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; public bool MutatesSolutionState => false; public void ApplyCapabilities(VSInternalServerCapabilities serverCapabilities, VSInternalClientCapabilities clientCapabilities) { - // TODO: Add an option for this that the client can configure. This turns this off for - // VS Code but keeps it on for VS by depending on SingleServerSupport signifying the client. - if (!_languageServerFeatureOptions.SingleServerSupport) - { - return; - } - serverCapabilities.DocumentSymbolProvider = new DocumentSymbolOptions() { WorkDoneProgress = false @@ -69,6 +60,6 @@ public TextDocumentIdentifier GetTextDocumentIdentifier(DocumentSymbolParams req var codeDocument = await documentContext.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); var csharpDocument = codeDocument.GetRequiredCSharpDocument(); - return _documentSymbolService.GetDocumentSymbols(documentContext.Uri, csharpDocument, symbols); + return _documentSymbolService.GetDocumentSymbols(documentContext.FileKind, documentContext.Uri, csharpDocument, symbols); } } diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Extensions/IServiceCollectionExtensions.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Extensions/IServiceCollectionExtensions.cs index f3ee8b157e4..ec66cf3a5b7 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Extensions/IServiceCollectionExtensions.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Extensions/IServiceCollectionExtensions.cs @@ -87,9 +87,9 @@ public static void AddCompletionServices(this IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); @@ -153,6 +153,7 @@ public static void AddCodeActionsServices(this IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/FindAllReferences/FindAllReferencesEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/FindAllReferences/FindAllReferencesEndpoint.cs index d6ab1a3e77d..6c4b56448dd 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/FindAllReferences/FindAllReferencesEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/FindAllReferences/FindAllReferencesEndpoint.cs @@ -30,13 +30,12 @@ internal sealed class FindAllReferencesEndpoint : AbstractRazorDelegatingEndpoin private readonly IDocumentMappingService _documentMappingService; public FindAllReferencesEndpoint( - LanguageServerFeatureOptions languageServerFeatureOptions, IDocumentMappingService documentMappingService, IClientConnection clientConnection, ILoggerFactory loggerFactory, IFilePathService filePathService, ProjectSnapshotManager projectSnapshotManager) - : base(languageServerFeatureOptions, documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()) + : base(documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()) { _filePathService = filePathService ?? throw new ArgumentNullException(nameof(filePathService)); _projectSnapshotManager = projectSnapshotManager; diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/GeneratedDocumentPublisher.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/GeneratedDocumentPublisher.cs index 93b5d7328f0..7299700ed55 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/GeneratedDocumentPublisher.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/GeneratedDocumentPublisher.cs @@ -24,18 +24,15 @@ internal sealed class GeneratedDocumentPublisher : IGeneratedDocumentPublisher, private readonly Dictionary _publishedHtmlData; private readonly ProjectSnapshotManager _projectManager; private readonly IClientConnection _clientConnection; - private readonly LanguageServerFeatureOptions _options; private readonly ILogger _logger; public GeneratedDocumentPublisher( ProjectSnapshotManager projectManager, IClientConnection clientConnection, - LanguageServerFeatureOptions options, ILoggerFactory loggerFactory) { _projectManager = projectManager; _clientConnection = clientConnection; - _options = options; _logger = loggerFactory.GetOrCreateLogger(); _publishedCSharpData = []; @@ -54,9 +51,7 @@ public void PublishCSharp(ProjectKey projectKey, string filePath, SourceText sou // For example, when a document moves from the Misc Project to a real project, we will update it here, and each version would // have a different project key. On the receiving end however, there is only one file path, therefore one version of the contents, // so we must ensure we only have a single document to compute diffs from, or things get out of sync. - var documentKey = _options.IncludeProjectKeyInGeneratedFilePath - ? new DocumentKey(projectKey, filePath) - : new DocumentKey(ProjectKey.Unknown, filePath); + var documentKey = new DocumentKey(projectKey, filePath); PublishData? previouslyPublishedData; ImmutableArray textChanges; @@ -166,11 +161,6 @@ private void ProjectManager_Changed(object? sender, ProjectChangeEventArgs args) { case ProjectChangeKind.DocumentRemoved: { - if (!_options.IncludeProjectKeyInGeneratedFilePath) - { - break; - } - // When a C# document is removed we remove it from the publishing, because it could come back with the same name var key = new DocumentKey(args.ProjectKey, args.DocumentFilePath.AssumeNotNull()); @@ -190,17 +180,7 @@ private void ProjectManager_Changed(object? sender, ProjectChangeEventArgs args) if (!_projectManager.IsDocumentOpen(documentFilePath)) { - // Document closed, evict published source text, unless the server doesn't want us to. - if (_options.UpdateBuffersForClosedDocuments) - { - // Some clients want us to keep generating code even if the document is closed, so if we evict our data, - // even though we don't send a didChange for it, the next didChange will be wrong. - return; - } - - var documentKey = _options.IncludeProjectKeyInGeneratedFilePath - ? new DocumentKey(args.ProjectKey, documentFilePath) - : new DocumentKey(ProjectKey.Unknown, documentFilePath); + var documentKey = new DocumentKey(args.ProjectKey, documentFilePath); lock (_publishedCSharpData) { @@ -226,11 +206,6 @@ private void ProjectManager_Changed(object? sender, ProjectChangeEventArgs args) // When a project is removed, we have to remove all published C# source for files in the project because if it comes back, // or a new one comes back with the same name, we want it to start with a clean slate. We only do this if the project key // is part of the generated file name though, because otherwise a project with the same name is effectively the same project. - if (!_options.IncludeProjectKeyInGeneratedFilePath) - { - break; - } - lock (_publishedCSharpData) { using var keysToRemove = new PooledArrayBuilder(); diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/GeneratedDocumentSynchronizer.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/GeneratedDocumentSynchronizer.cs index 5cbcee5e04a..5d43428e74d 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/GeneratedDocumentSynchronizer.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/GeneratedDocumentSynchronizer.cs @@ -9,11 +9,9 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer; internal class GeneratedDocumentSynchronizer( IGeneratedDocumentPublisher publisher, - LanguageServerFeatureOptions languageServerFeatureOptions, ProjectSnapshotManager projectManager) : IDocumentProcessedListener { private readonly IGeneratedDocumentPublisher _publisher = publisher; - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; private readonly ProjectSnapshotManager _projectManager = projectManager; public void DocumentProcessed(RazorCodeDocument codeDocument, DocumentSnapshot document) @@ -21,9 +19,8 @@ public void DocumentProcessed(RazorCodeDocument codeDocument, DocumentSnapshot d var hostDocumentVersion = document.Version; var filePath = document.FilePath; - // If the document isn't open, and we're not updating buffers for closed documents, then we don't need to do anything. - if (!_projectManager.IsDocumentOpen(filePath) && - !_languageServerFeatureOptions.UpdateBuffersForClosedDocuments) + // If the document isn't open then we don't need to do anything. + if (!_projectManager.IsDocumentOpen(filePath)) { return; } @@ -34,7 +31,7 @@ public void DocumentProcessed(RazorCodeDocument codeDocument, DocumentSnapshot d return; } - var htmlText = codeDocument.GetHtmlSourceText(); + var htmlText = codeDocument.GetHtmlSourceText(cancellationToken: System.Threading.CancellationToken.None); _publisher.PublishHtml(document.Project.Key, filePath, htmlText, hostDocumentVersion); diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Hosting/ConfigurableLanguageServerFeatureOptions.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Hosting/ConfigurableLanguageServerFeatureOptions.cs deleted file mode 100644 index d05d28421b2..00000000000 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Hosting/ConfigurableLanguageServerFeatureOptions.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using Microsoft.CodeAnalysis.Razor.Workspaces; - -namespace Microsoft.AspNetCore.Razor.LanguageServer.Hosting; - -internal class ConfigurableLanguageServerFeatureOptions : LanguageServerFeatureOptions -{ - private readonly LanguageServerFeatureOptions _defaults = new DefaultLanguageServerFeatureOptions(); - - private readonly bool? _supportsFileManipulation; - private readonly string? _csharpVirtualDocumentSuffix; - private readonly string? _htmlVirtualDocumentSuffix; - private readonly bool? _singleServerSupport; - private readonly bool? _delegateToCSharpOnDiagnosticPublish; - private readonly bool? _returnCodeActionAndRenamePathsWithPrefixedSlash; - private readonly bool? _showAllCSharpCodeActions; - private readonly bool? _updateBuffersForClosedDocuments; - private readonly bool? _includeProjectKeyInGeneratedFilePath; - private readonly bool? _useRazorCohostServer; - private readonly bool? _doNotInitializeMiscFilesProjectFromWorkspace; - - public override bool SupportsFileManipulation => _supportsFileManipulation ?? _defaults.SupportsFileManipulation; - public override string CSharpVirtualDocumentSuffix => _csharpVirtualDocumentSuffix ?? DefaultLanguageServerFeatureOptions.DefaultCSharpVirtualDocumentSuffix; - public override string HtmlVirtualDocumentSuffix => _htmlVirtualDocumentSuffix ?? DefaultLanguageServerFeatureOptions.DefaultHtmlVirtualDocumentSuffix; - public override bool SingleServerSupport => _singleServerSupport ?? _defaults.SingleServerSupport; - public override bool DelegateToCSharpOnDiagnosticPublish => _delegateToCSharpOnDiagnosticPublish ?? _defaults.DelegateToCSharpOnDiagnosticPublish; - public override bool ReturnCodeActionAndRenamePathsWithPrefixedSlash => _returnCodeActionAndRenamePathsWithPrefixedSlash ?? _defaults.ReturnCodeActionAndRenamePathsWithPrefixedSlash; - public override bool ShowAllCSharpCodeActions => _showAllCSharpCodeActions ?? _defaults.ShowAllCSharpCodeActions; - public override bool UpdateBuffersForClosedDocuments => _updateBuffersForClosedDocuments ?? _defaults.UpdateBuffersForClosedDocuments; - public override bool IncludeProjectKeyInGeneratedFilePath => _includeProjectKeyInGeneratedFilePath ?? _defaults.IncludeProjectKeyInGeneratedFilePath; - public override bool UseRazorCohostServer => _useRazorCohostServer ?? _defaults.UseRazorCohostServer; - public override bool SupportsSoftSelectionInCompletion => false; - public override bool UseVsCodeCompletionCommitCharacters => true; - - // Note: This option is defined in the negative because the default behavior should be to add documents to misc files project - // when the language server is initialized. Adding the option at the command-line should disable that behavior. - // - // This is a temporary option and should be removed as part of https://github.com/dotnet/razor/issues/11594. - public override bool DoNotInitializeMiscFilesProjectFromWorkspace => _doNotInitializeMiscFilesProjectFromWorkspace ?? _defaults.DoNotInitializeMiscFilesProjectFromWorkspace; - - public ConfigurableLanguageServerFeatureOptions(string[] args) - { - for (var i = 0; i < args.Length; i++) - { - if (args[i] is not ['-', '-', .. var option]) - { - continue; - } - - TryProcessBoolOption(nameof(SupportsFileManipulation), ref _supportsFileManipulation, option, args, i); - TryProcessStringOption(nameof(CSharpVirtualDocumentSuffix), ref _csharpVirtualDocumentSuffix, option, args, i); - TryProcessStringOption(nameof(HtmlVirtualDocumentSuffix), ref _htmlVirtualDocumentSuffix, option, args, i); - TryProcessBoolOption(nameof(SingleServerSupport), ref _singleServerSupport, option, args, i); - TryProcessBoolOption(nameof(DelegateToCSharpOnDiagnosticPublish), ref _delegateToCSharpOnDiagnosticPublish, option, args, i); - TryProcessBoolOption(nameof(ReturnCodeActionAndRenamePathsWithPrefixedSlash), ref _returnCodeActionAndRenamePathsWithPrefixedSlash, option, args, i); - TryProcessBoolOption(nameof(ShowAllCSharpCodeActions), ref _showAllCSharpCodeActions, option, args, i); - TryProcessBoolOption(nameof(UpdateBuffersForClosedDocuments), ref _updateBuffersForClosedDocuments, option, args, i); - TryProcessBoolOption(nameof(IncludeProjectKeyInGeneratedFilePath), ref _includeProjectKeyInGeneratedFilePath, option, args, i); - TryProcessBoolOption(nameof(UseRazorCohostServer), ref _useRazorCohostServer, option, args, i); - TryProcessBoolOption(nameof(DoNotInitializeMiscFilesProjectFromWorkspace), ref _doNotInitializeMiscFilesProjectFromWorkspace, option, args, i); - } - } - - private static void TryProcessStringOption(string optionName, ref string? field, string option, string[] args, int i) - { - // String properties must have at least one option following this one - if (i >= args.Length - 1) - { - return; - } - - if (string.Equals(option, optionName, StringComparison.OrdinalIgnoreCase)) - { - field = args[++i]; - } - } - - private static void TryProcessBoolOption(string optionName, ref bool? field, string option, string[] args, int i) - { - if (string.Equals(option, optionName, StringComparison.OrdinalIgnoreCase)) - { - // bool properties are true if they're the last thing in the args, or the next thing is another option - if (i >= args.Length - 1 || args[i + 1] is ['-', '-', ..]) - { - field = true; - } - else - { - field = bool.Parse(args[++i]); - } - } - } -} diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Hover/HoverEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Hover/HoverEndpoint.cs index 36880aa0305..4c8a57f1b78 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Hover/HoverEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Hover/HoverEndpoint.cs @@ -21,12 +21,10 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Hover; internal sealed class HoverEndpoint( IComponentAvailabilityService componentAvailabilityService, IClientCapabilitiesService clientCapabilitiesService, - LanguageServerFeatureOptions languageServerFeatureOptions, IDocumentMappingService documentMappingService, IClientConnection clientConnection, ILoggerFactory loggerFactory) : AbstractRazorDelegatingEndpoint( - languageServerFeatureOptions, documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()), ICapabilitiesProvider @@ -77,8 +75,7 @@ public void ApplyCapabilities(VSInternalServerCapabilities serverCapabilities, V var codeDocument = await documentContext.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); // Sometimes what looks like a html attribute can actually map to C#, in which case its better to let Roslyn try to handle this. - // We can only do this if we're in single server mode though, otherwise we won't be delegating to Roslyn at all - if (SingleServerSupport && DocumentMappingService.TryMapToCSharpDocumentPosition(codeDocument.GetRequiredCSharpDocument(), positionInfo.HostDocumentIndex, out _, out _)) + if (DocumentMappingService.TryMapToCSharpDocumentPosition(codeDocument.GetRequiredCSharpDocument(), positionInfo.HostDocumentIndex, out _, out _)) { return null; } diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/IFileSystemExtensions.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/IFileSystemExtensions.cs deleted file mode 100644 index d5c0883a946..00000000000 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/IFileSystemExtensions.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.CodeAnalysis.Razor.Logging; -using Microsoft.CodeAnalysis.Razor.Workspaces; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -internal static class IFileSystemExtensions -{ - /// - /// Finds all the files in a directory which meet the given criteria. - /// - /// The directory to be searched. - /// The pattern to apply when searching. - /// List of directories to skip when recursing. - /// Exists for tests only. DO NOT PROVIDE outside of tests. - /// An optional logger to report on exceptional situations such as . - /// A list of files within the given directory that meet the search criteria. - /// This method is needed to avoid problematic folders such as "node_modules" which are known not to yield the desired results or may cause performance issues. - internal static IEnumerable GetFilteredFiles( - this IFileSystem fileSystem, - string workspaceDirectory, - string searchPattern, - IReadOnlyCollection ignoredDirectories, - ILogger logger) - { - IEnumerable files; - try - { - files = fileSystem.GetFiles(workspaceDirectory, searchPattern, SearchOption.TopDirectoryOnly); - } - catch (DirectoryNotFoundException) - { - // The filesystem may have deleted the directory between us finding it and searching for files in it. - // This can also happen if the directory is too long for windows. - files = []; - } - catch (UnauthorizedAccessException ex) - { - logger.LogWarning($"UnauthorizedAccess: {ex.Message}"); - yield break; - } - catch (PathTooLongException ex) - { - logger.LogWarning($"PathTooLong: {ex.Message}"); - yield break; - } - catch (IOException ex) - { - logger.LogWarning($"IOException: {ex.Message}"); - yield break; - } - - foreach (var file in files) - { - yield return file; - } - - IEnumerable directories; - try - { - directories = fileSystem.GetDirectories(workspaceDirectory); - } - catch (DirectoryNotFoundException) - { - // The filesystem may have deleted the directory between us finding it and searching for directories in it. - // This can also happen if the directory is too long for windows. - directories = []; - } - catch (UnauthorizedAccessException ex) - { - logger.LogWarning($"UnauthorizedAccess: {ex.Message}"); - yield break; - } - catch (PathTooLongException ex) - { - logger.LogWarning($"PathTooLong: {ex.Message}"); - yield break; - } - catch (IOException ex) - { - logger.LogWarning($"IOException: {ex.Message}"); - yield break; - } - - foreach (var path in directories) - { - var directory = Path.GetFileName(path); - if (!ignoredDirectories.Contains(directory, PathUtilities.OSSpecificPathComparer)) - { - foreach (var result in GetFilteredFiles(fileSystem, path, searchPattern, ignoredDirectories, logger)) - { - yield return result; - } - } - } - } -} diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Implementation/ImplementationEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Implementation/ImplementationEndpoint.cs index 6d593aa1b5c..af0ad53f0f1 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Implementation/ImplementationEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Implementation/ImplementationEndpoint.cs @@ -24,11 +24,10 @@ internal sealed class ImplementationEndpoint : AbstractRazorDelegatingEndpoint()) + : base(documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()) { _documentMappingService = documentMappingService ?? throw new ArgumentNullException(nameof(documentMappingService)); } diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/LspEditMappingService.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/LspEditMappingService.cs index 9fd30009ae3..256b23decc5 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/LspEditMappingService.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/LspEditMappingService.cs @@ -11,14 +11,16 @@ using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.ProjectSystem; +using Microsoft.CodeAnalysis.Razor.Telemetry; using Microsoft.CodeAnalysis.Razor.Workspaces; namespace Microsoft.AspNetCore.Razor.LanguageServer; internal sealed class LspEditMappingService( IDocumentMappingService documentMappingService, + ITelemetryReporter telemetryReporter, IFilePathService filePathService, - IDocumentContextFactory documentContextFactory) : AbstractEditMappingService(documentMappingService, filePathService) + IDocumentContextFactory documentContextFactory) : AbstractEditMappingService(documentMappingService, telemetryReporter, filePathService) { private readonly IFilePathService _filePathService = filePathService; private readonly IDocumentContextFactory _documentContextFactory = documentContextFactory; diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Microsoft.AspNetCore.Razor.LanguageServer.csproj b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Microsoft.AspNetCore.Razor.LanguageServer.csproj index 186426906fa..67bd5694abf 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Microsoft.AspNetCore.Razor.LanguageServer.csproj +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Microsoft.AspNetCore.Razor.LanguageServer.csproj @@ -82,10 +82,8 @@ - - diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/OpenDocumentGenerator.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/OpenDocumentGenerator.cs index d7873ee33cf..81e58ccd0fb 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/OpenDocumentGenerator.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/OpenDocumentGenerator.cs @@ -29,7 +29,6 @@ internal partial class OpenDocumentGenerator : IRazorStartupService, IDisposable private readonly ImmutableArray _listeners; private readonly ProjectSnapshotManager _projectManager; - private readonly LanguageServerFeatureOptions _options; private readonly ILogger _logger; private readonly AsyncBatchingWorkQueue _workQueue; @@ -45,12 +44,10 @@ internal partial class OpenDocumentGenerator : IRazorStartupService, IDisposable public OpenDocumentGenerator( IEnumerable listeners, ProjectSnapshotManager projectManager, - LanguageServerFeatureOptions options, ILoggerFactory loggerFactory) { _listeners = [.. listeners]; _projectManager = projectManager; - _options = options; _workerSet = []; _disposeTokenSource = new(); @@ -192,8 +189,7 @@ private void ProjectManager_Changed(object? sender, ProjectChangeEventArgs args) void EnqueueIfNecessary(DocumentKey documentKey) { - if (!_options.UpdateBuffersForClosedDocuments && - !_projectManager.IsDocumentOpen(documentKey.FilePath)) + if (!_projectManager.IsDocumentOpen(documentKey.FilePath)) { return; } diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/IRazorProjectService.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/IRazorProjectService.cs index e820e20404b..b2a4640a8a8 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/IRazorProjectService.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/IRazorProjectService.cs @@ -10,7 +10,6 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem; internal interface IRazorProjectService { - Task AddDocumentsToMiscProjectAsync(ImmutableArray filePaths, CancellationToken cancellationToken); Task AddDocumentToMiscProjectAsync(string filePath, CancellationToken cancellationToken); Task OpenDocumentAsync(string filePath, SourceText sourceText, CancellationToken cancellationToken); Task UpdateDocumentAsync(string filePath, SourceText sourceText, CancellationToken cancellationToken); diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/RazorProjectService.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/RazorProjectService.cs index 24891410954..90e4f0f479a 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/RazorProjectService.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/RazorProjectService.cs @@ -137,48 +137,6 @@ await AddOrUpdateProjectCoreAsync( .ConfigureAwait(false); } - public async Task AddDocumentsToMiscProjectAsync(ImmutableArray filePaths, CancellationToken cancellationToken) - { - await WaitForInitializationAsync().ConfigureAwait(false); - - await _projectManager - .UpdateAsync( - (updater, cancellationToken) => - { - var projects = _projectManager.GetProjects(); - - // For each file, check to see if it's already in a project. - // If it is, we don't want to add it to the misc project. - foreach (var filePath in filePaths) - { - var add = true; - - foreach (var project in projects) - { - if (project.ContainsDocument(filePath)) - { - // The file is already in a project, so we shouldn't add it to the misc project. - add = false; - break; - } - } - - if (cancellationToken.IsCancellationRequested) - { - break; - } - - if (add) - { - AddDocumentToMiscProjectCore(updater, filePath); - } - } - }, - state: cancellationToken, - cancellationToken) - .ConfigureAwait(false); - } - public async Task AddDocumentToMiscProjectAsync(string filePath, CancellationToken cancellationToken) { await WaitForInitializationAsync().ConfigureAwait(false); @@ -400,9 +358,9 @@ private Task AddOrUpdateProjectCoreAsync( UpdateProjectDocuments(updater, documents, project.Key); - if (!projectWorkspaceState.Equals(ProjectWorkspaceState.Default)) + if (!projectWorkspaceState.IsDefault) { - _logger.LogInformation($"Updating project '{project.Key}' TagHelpers ({projectWorkspaceState.TagHelpers.Length})."); + _logger.LogInformation($"Updating project '{project.Key}' TagHelpers ({projectWorkspaceState.TagHelpers.Count})."); } updater.UpdateProjectWorkspaceState(project.Key, projectWorkspaceState); diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Refactoring/RenameEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Refactoring/RenameEndpoint.cs index 737452b506d..b9cce274cf1 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Refactoring/RenameEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Refactoring/RenameEndpoint.cs @@ -26,7 +26,6 @@ internal sealed class RenameEndpoint( IClientConnection clientConnection, ILoggerFactory loggerFactory) : AbstractRazorDelegatingEndpoint( - languageServerFeatureOptions, documentMappingService, clientConnection, loggerFactory.GetOrCreateLogger()), ICapabilitiesProvider @@ -48,15 +47,16 @@ public void ApplyCapabilities(VSInternalServerCapabilities serverCapabilities, V protected override string CustomMessageTarget => CustomMessageNames.RazorRenameEndpointName; - protected override Task TryHandleAsync(RenameParams request, RazorRequestContext requestContext, DocumentPositionInfo positionInfo, CancellationToken cancellationToken) + protected override async Task TryHandleAsync(RenameParams request, RazorRequestContext requestContext, DocumentPositionInfo positionInfo, CancellationToken cancellationToken) { var documentContext = requestContext.DocumentContext; if (documentContext is null) { - return SpecializedTasks.Null(); + return null; } - return _renameService.TryGetRazorRenameEditsAsync(documentContext, positionInfo, request.NewName, _projectManager.GetQueryOperations(), cancellationToken); + var result = await _renameService.TryGetRazorRenameEditsAsync(documentContext, positionInfo, request.NewName, _projectManager.GetQueryOperations(), cancellationToken).ConfigureAwait(false); + return result.Edit; } protected override bool IsSupported() @@ -85,6 +85,8 @@ protected override bool IsSupported() } var documentContext = requestContext.DocumentContext.AssumeNotNull(); - return await _editMappingService.RemapWorkspaceEditAsync(documentContext.Snapshot, response, cancellationToken).ConfigureAwait(false); + await _editMappingService.MapWorkspaceEditAsync(documentContext.Snapshot, response, cancellationToken).ConfigureAwait(false); + + return response; } } diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/SignatureHelp/SignatureHelpEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/SignatureHelp/SignatureHelpEndpoint.cs index 4d41ce7471e..2a34bc934a6 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/SignatureHelp/SignatureHelpEndpoint.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/SignatureHelp/SignatureHelpEndpoint.cs @@ -15,13 +15,11 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.SignatureHelp; [RazorLanguageServerEndpoint(Methods.TextDocumentSignatureHelpName)] internal sealed class SignatureHelpEndpoint( - LanguageServerFeatureOptions languageServerFeatureOptions, IDocumentMappingService documentMappingService, IClientConnection clientConnection, RazorLSPOptionsMonitor optionsMonitor, ILoggerFactory loggerProvider) : AbstractRazorDelegatingEndpoint( - languageServerFeatureOptions, documentMappingService, clientConnection, loggerProvider.GetOrCreateLogger()), diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/SpellCheck/LspCSharpSpellCheckRangeProvider.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/SpellCheck/LspCSharpSpellCheckRangeProvider.cs index b891d147700..930397bac67 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/SpellCheck/LspCSharpSpellCheckRangeProvider.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/SpellCheck/LspCSharpSpellCheckRangeProvider.cs @@ -19,19 +19,12 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.SpellCheck; internal sealed class LspCSharpSpellCheckRangeProvider( - LanguageServerFeatureOptions languageServerFeatureOptions, IClientConnection clientConnection) : ICSharpSpellCheckRangeProvider { - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; private readonly IClientConnection _clientConnection = clientConnection; public async Task> GetCSharpSpellCheckRangesAsync(DocumentContext documentContext, CancellationToken cancellationToken) { - if (!_languageServerFeatureOptions.SingleServerSupport) - { - return []; - } - var delegatedParams = new DelegatedSpellCheckParams(documentContext.GetTextDocumentIdentifierAndVersion()); var delegatedResponse = await _clientConnection.SendRequestAsync( CustomMessageNames.RazorSpellCheckEndpoint, diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/WorkspaceRootPathWatcher.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/WorkspaceRootPathWatcher.cs index c40806ae5bd..2a5ae4b9909 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/WorkspaceRootPathWatcher.cs +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/WorkspaceRootPathWatcher.cs @@ -21,49 +21,36 @@ internal partial class WorkspaceRootPathWatcher : IOnInitialized, IDisposable { private static readonly TimeSpan s_delay = TimeSpan.FromSeconds(1); private static readonly ImmutableArray s_filters = ["*.razor", "*.cshtml"]; - private static readonly string[] s_ignoredDirectories = ["node_modules"]; private readonly IWorkspaceRootPathProvider _workspaceRootPathProvider; private readonly IRazorProjectService _projectService; - private readonly LanguageServerFeatureOptions _options; private readonly CancellationTokenSource _disposeTokenSource; private readonly AsyncBatchingWorkQueue<(string, RazorFileChangeKind)> _workQueue; private readonly Dictionary _filePathToChangeMap; private readonly HashSet _indicesToSkip; private readonly List _watchers; - private readonly IFileSystem _fileSystem; - private readonly ILogger _logger; public WorkspaceRootPathWatcher( IWorkspaceRootPathProvider workspaceRootPathProvider, - IRazorProjectService projectService, - LanguageServerFeatureOptions options, - IFileSystem fileSystem, - ILoggerFactory loggerFactory) - : this(workspaceRootPathProvider, projectService, options, fileSystem, loggerFactory, s_delay) + IRazorProjectService projectService) + : this(workspaceRootPathProvider, projectService, s_delay) { } protected WorkspaceRootPathWatcher( IWorkspaceRootPathProvider workspaceRootPathProvider, IRazorProjectService projectService, - LanguageServerFeatureOptions options, - IFileSystem fileSystem, - ILoggerFactory loggerFactory, TimeSpan delay) { _workspaceRootPathProvider = workspaceRootPathProvider; _projectService = projectService; - _options = options; _disposeTokenSource = new(); _workQueue = new AsyncBatchingWorkQueue<(string, RazorFileChangeKind)>(delay, ProcessBatchAsync, _disposeTokenSource.Token); _filePathToChangeMap = new(PathUtilities.OSSpecificPathComparer); _indicesToSkip = []; _watchers = []; - _fileSystem = fileSystem; - _logger = loggerFactory.GetOrCreateLogger(); } public void Dispose() @@ -181,18 +168,6 @@ protected virtual async Task StartAsync(string workspaceDirectory, CancellationT workspaceDirectory = FilePathNormalizer.Normalize(workspaceDirectory); - // There's a double negative below because we want to initialize the misc project unless the option is set to *not* initialize it. - // This is slightly awkward but is more convenient for command-line configuration. - // - // https://github.com/dotnet/razor/issues/11594 tracks removing this option and the code to support it. - - if (!_options.DoNotInitializeMiscFilesProjectFromWorkspace) - { - var existingRazorFiles = GetExistingRazorFiles(workspaceDirectory); - - await _projectService.AddDocumentsToMiscProjectAsync(existingRazorFiles, cancellationToken).ConfigureAwait(false); - } - if (cancellationToken.IsCancellationRequested || !InitializeFileWatchers) { return; @@ -248,18 +223,4 @@ private void StopFileWatchers() // Protected virtual for testing protected virtual bool InitializeFileWatchers => true; - - // Protected virtual for testing - protected virtual ImmutableArray GetExistingRazorFiles(string workspaceDirectory) - { - using var result = new PooledArrayBuilder(); - - foreach (var filter in s_filters) - { - var existingFiles = _fileSystem.GetFilteredFiles(workspaceDirectory, filter, s_ignoredDirectories, _logger); - result.AddRange(existingFiles); - } - - return result.ToImmutableAndClear(); - } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/CodeActions/CohostCodeActionsEndpoint.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/CodeActions/CohostCodeActionsEndpoint.cs index eadfd782a61..8ac93df4eb5 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/CodeActions/CohostCodeActionsEndpoint.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/CodeActions/CohostCodeActionsEndpoint.cs @@ -103,7 +103,14 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie private async Task GetCSharpCodeActionsAsync(TextDocument razorDocument, VSCodeActionParams request, Guid correlationId, CancellationToken cancellationToken) { - var generatedDocument = await razorDocument.Project.TryGetCSharpDocumentFromGeneratedDocumentUriAsync(request.TextDocument.DocumentUri.GetRequiredParsedUri(), cancellationToken).ConfigureAwait(false); + var solution = razorDocument.Project.Solution; + if (!solution.TryGetSourceGeneratedDocumentIdentity(request.TextDocument.DocumentUri.GetRequiredParsedUri(), out var identity) || + !solution.TryGetProject(identity.DocumentId.ProjectId, out var project)) + { + return []; + } + + var generatedDocument = await project.TryGetCSharpDocumentForGeneratedDocumentAsync(identity, cancellationToken).ConfigureAwait(false); if (generatedDocument is null) { return []; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/CodeActions/CohostCodeActionsResolveEndpoint.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/CodeActions/CohostCodeActionsResolveEndpoint.cs index 9c2f1baede3..1e2f376c4cf 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/CodeActions/CohostCodeActionsResolveEndpoint.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/CodeActions/CohostCodeActionsResolveEndpoint.cs @@ -104,7 +104,14 @@ private async Task ResolveCSharpCodeActionAsync(TextDocument razorDo var uri = resolveParams.DelegatedDocumentUri.AssumeNotNull(); - var generatedDocument = await razorDocument.Project.TryGetCSharpDocumentFromGeneratedDocumentUriAsync(uri, cancellationToken).ConfigureAwait(false); + var solution = razorDocument.Project.Solution; + if (!solution.TryGetSourceGeneratedDocumentIdentity(uri, out var identity) || + !solution.TryGetProject(identity.DocumentId.ProjectId, out var project)) + { + return codeAction; + } + + var generatedDocument = await project.TryGetCSharpDocumentForGeneratedDocumentAsync(identity, cancellationToken).ConfigureAwait(false); if (generatedDocument is null) { return codeAction; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Completion/CohostDocumentCompletionEndpoint.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Completion/CohostDocumentCompletionEndpoint.cs index 089193b03ab..0d490f2085b 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Completion/CohostDocumentCompletionEndpoint.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Completion/CohostDocumentCompletionEndpoint.cs @@ -20,7 +20,6 @@ using Microsoft.CodeAnalysis.Razor.Protocol.Completion; using Microsoft.CodeAnalysis.Razor.Remote; using Microsoft.CodeAnalysis.Razor.Telemetry; -using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Razor.Workspaces.Settings; using Response = Microsoft.CodeAnalysis.Razor.Remote.RemoteResponse; @@ -41,7 +40,6 @@ internal sealed class CohostDocumentCompletionEndpoint( #pragma warning disable RS0030 // Do not use banned APIs [Import(AllowDefault = true)] ISnippetCompletionItemProvider? snippetCompletionItemProvider, #pragma warning restore RS0030 // Do not use banned APIs - LanguageServerFeatureOptions languageServerFeatureOptions, IHtmlRequestInvoker requestInvoker, CompletionListCache completionListCache, ITelemetryReporter telemetryReporter, @@ -52,8 +50,7 @@ internal sealed class CohostDocumentCompletionEndpoint( private readonly IClientSettingsManager _clientSettingsManager = clientSettingsManager; private readonly IClientCapabilitiesService _clientCapabilitiesService = clientCapabilitiesService; private readonly ISnippetCompletionItemProvider? _snippetCompletionItemProvider = snippetCompletionItemProvider; - private readonly CompletionTriggerAndCommitCharacters _triggerAndCommitCharacters = new(languageServerFeatureOptions); - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; + private readonly CompletionTriggerAndCommitCharacters _triggerAndCommitCharacters = new(clientCapabilitiesService); private readonly IHtmlRequestInvoker _requestInvoker = requestInvoker; private readonly CompletionListCache _completionListCache = completionListCache; private readonly ITelemetryReporter _telemetryReporter = telemetryReporter; @@ -73,8 +70,8 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie RegisterOptions = new CompletionRegistrationOptions() { ResolveProvider = true, - TriggerCharacters = [.. _triggerAndCommitCharacters.AllTriggerCharacters], - AllCommitCharacters = [.. _triggerAndCommitCharacters.AllCommitCharacters] + TriggerCharacters = _triggerAndCommitCharacters.AllTriggerCharacters, + AllCommitCharacters = _triggerAndCommitCharacters.AllCommitCharacters } }]; } @@ -125,13 +122,9 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie } var documentPositionInfo = completionPositionInfo.DocumentPositionInfo; - if (documentPositionInfo.LanguageKind != RazorLanguageKind.Razor) + if (documentPositionInfo.LanguageKind != RazorLanguageKind.Razor && + DelegatedCompletionHelper.RewriteContext(completionContext, documentPositionInfo.LanguageKind, _triggerAndCommitCharacters) is { } rewrittenContext) { - if (DelegatedCompletionHelper.RewriteContext(completionContext, documentPositionInfo.LanguageKind, _triggerAndCommitCharacters) is not { } rewrittenContext) - { - return null; - } - completionContext = rewrittenContext; } @@ -143,21 +136,19 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie SnippetsSupported: true, // always true in non-legacy Razor, always false in legacy Razor AutoInsertAttributeQuotes: clientSettings.AdvancedSettings.AutoInsertAttributeQuotes, CommitElementsWithSpace: clientSettings.AdvancedSettings.CommitElementsWithSpace, - UseVsCodeCompletionCommitCharacters: _languageServerFeatureOptions.UseVsCodeCompletionCommitCharacters); + UseVsCodeCompletionCommitCharacters: !_clientCapabilitiesService.ClientCapabilities.SupportsVisualStudioExtensions); using var _ = HashSetPool.GetPooledObject(out var existingHtmlCompletions); - if (_triggerAndCommitCharacters.IsValidHtmlTrigger(completionContext)) + // We can just blindly call HTML LSP because if we are in C#, generated HTML seen by HTML LSP may return + // results we don't want to show. So we want to call HTML LSP only if we know we are in HTML content. + if (documentPositionInfo.LanguageKind == RazorLanguageKind.Html && + _triggerAndCommitCharacters.IsValidHtmlTrigger(completionContext)) { - // We can just blindly call HTML LSP because if we are in C#, generated HTML seen by HTML LSP may return - // results we don't want to show. So we want to call HTML LSP only if we know we are in HTML content. - if (documentPositionInfo.LanguageKind == RazorLanguageKind.Html) - { - htmlCompletionList = await GetHtmlCompletionListAsync(request, razorDocument, razorCompletionOptions, correlationId, cancellationToken).ConfigureAwait(false); + htmlCompletionList = await GetHtmlCompletionListAsync(request, razorDocument, razorCompletionOptions, correlationId, cancellationToken).ConfigureAwait(false); - if (htmlCompletionList is not null) - { - existingHtmlCompletions.UnionWith(htmlCompletionList.Items.Select(i => i.Label)); - } + if (htmlCompletionList is not null) + { + existingHtmlCompletions.UnionWith(htmlCompletionList.Items.Select(i => i.Label)); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Hover/CohostHoverEndpoint.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Hover/CohostHoverEndpoint.cs index e31ec4e1f0c..6c470af58b9 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Hover/CohostHoverEndpoint.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Hover/CohostHoverEndpoint.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.Collections.Immutable; using System.Composition; using System.Threading; @@ -10,6 +11,7 @@ using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; using Microsoft.CodeAnalysis.Razor.Cohost; using Microsoft.CodeAnalysis.Razor.Remote; +using Roslyn.Text.Adornments; namespace Microsoft.VisualStudio.Razor.LanguageClient.Cohost; @@ -54,7 +56,7 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie { var position = LspFactory.CreatePosition(request.Position.ToLinePosition()); - var response = await _remoteServiceInvoker + var razorResponse = await _remoteServiceInvoker .TryInvokeAsync>( razorDocument.Project.Solution, (service, solutionInfo, cancellationToken) => @@ -62,21 +64,81 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie cancellationToken) .ConfigureAwait(false); - if (response.Result is LspHover hover) + if (razorResponse.StopHandling) { - return hover; + return razorResponse.Result; } - if (response.StopHandling) - { - return null; - } - - return await _requestInvoker.MakeHtmlLspRequestAsync( + var htmlHover = await _requestInvoker.MakeHtmlLspRequestAsync( razorDocument, Methods.TextDocumentHoverName, request, cancellationToken).ConfigureAwait(false); + + return MergeHtmlAndRazorHoverResponses(razorResponse.Result, htmlHover); + } + + private static LspHover? MergeHtmlAndRazorHoverResponses(LspHover? razorHover, LspHover? htmlHover) + { + if (razorHover is null) + { + return htmlHover; + } + + if (htmlHover is null + || htmlHover.Range != razorHover.Range) + { + return razorHover; + } + + var htmlStringResponse = htmlHover.Contents.Match( + static s => s, + static markedString => null, + static stringOrMarkedStringArray => null, + static markupContent => markupContent.Value + ); + + if (htmlStringResponse is null) + { + return razorHover; + } + + // This logic is to prepend HTML hover content to the razor hover content if both exist. + // The razor content comes through as a ContainerElement, while the html content comes + // through as MarkupContent. We need to extract the html content and insert it at the + // start of the combined ContainerElement. + if (razorHover is VSInternalHover razorVsInternalHover + && razorVsInternalHover.RawContent is ContainerElement razorContainerElement) + { + var htmlStringClassifiedTextElement = ClassifiedTextElement.CreatePlainText(htmlStringResponse); + var verticalSpacingTextElement = ClassifiedTextElement.CreatePlainText(string.Empty); + var htmlContainerElement = new ContainerElement( + ContainerElementStyle.Stacked, + [htmlStringClassifiedTextElement, verticalSpacingTextElement]); + + // Modify the existing hover's RawContent to prepend the HTML content. + razorVsInternalHover.RawContent = new ContainerElement(razorContainerElement.Style, [htmlContainerElement, .. razorContainerElement.Elements]); + } + else + { + var razorStringResponse = razorHover.Contents.Match( + static s => s, + static markedString => throw new NotImplementedException(), + static stringOrMarkedStringArray => throw new NotImplementedException(), + static markupContent => markupContent.Value + ); + + if (razorStringResponse is not null) + { + razorHover.Contents = new MarkupContent() + { + Kind = MarkupKind.Markdown, + Value = htmlStringResponse + "\n\n---\n\n" + razorStringResponse + }; + } + } + + return razorHover; } internal TestAccessor GetTestAccessor() => new(this); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/HtmlDocumentServices/HtmlDocumentSynchronizer.SynchronizationRequest.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/HtmlDocumentServices/HtmlDocumentSynchronizer.SynchronizationRequest.cs index de373335069..4253842abbf 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/HtmlDocumentServices/HtmlDocumentSynchronizer.SynchronizationRequest.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/HtmlDocumentServices/HtmlDocumentSynchronizer.SynchronizationRequest.cs @@ -32,7 +32,6 @@ private void Start(TextDocument document, Func { diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Microsoft.CodeAnalysis.Razor.CohostingShared.projitems b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Microsoft.CodeAnalysis.Razor.CohostingShared.projitems index c2098e6518f..6eafb4de990 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Microsoft.CodeAnalysis.Razor.CohostingShared.projitems +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/Microsoft.CodeAnalysis.Razor.CohostingShared.projitems @@ -35,6 +35,7 @@ + diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/RazorSourceGeneratedDocumentExcerptService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/RazorSourceGeneratedDocumentExcerptService.cs new file mode 100644 index 00000000000..5ec2925bf99 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/RazorSourceGeneratedDocumentExcerptService.cs @@ -0,0 +1,54 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.ComponentModel.Composition; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; +using Microsoft.CodeAnalysis.Razor.DocumentExcerpt; +using Microsoft.CodeAnalysis.Razor.Remote; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.Razor.CohostingShared; + +[Export(typeof(IRazorSourceGeneratedDocumentExcerptService))] +[method: ImportingConstructor] +internal sealed class RazorSourceGeneratedDocumentExcerptService(IRemoteServiceInvoker remoteServiceInvoker) : IRazorSourceGeneratedDocumentExcerptService +{ + private readonly IRemoteServiceInvoker _remoteServiceInvoker = remoteServiceInvoker; + + public async Task TryExcerptAsync(SourceGeneratedDocument document, TextSpan span, RazorExcerptMode mode, RazorClassificationOptionsWrapper options, CancellationToken cancellationToken) + { + if (!document.IsRazorSourceGeneratedDocument()) + { + return null; + } + + var result = await _remoteServiceInvoker.TryInvokeAsync( + document.Project.Solution, + (service, solutionInfo, cancellationToken) => service.TryExcerptAsync(solutionInfo, document.Id, span, mode, options, cancellationToken), + cancellationToken).ConfigureAwait(false); + + if (result is null) + { + return null; + } + + // Source text can't be sent back from OOP, so we have to do the translation here. Fortunately this doesn't need + // anything we can't access + var razorDocument = document.Project.GetAdditionalDocument(result.RazorDocumentId); + if (razorDocument is null) + { + return null; + } + + var razorSourceText = await razorDocument.GetTextAsync(cancellationToken).ConfigureAwait(false); + var builder = result.ClassifiedSpans.ToBuilder(); + + var razorDocumentSpan = result.RazorDocumentSpan; + var excerptSpan = result.ExcerptSpan; + var excerptText = DocumentExcerptHelper.GetTranslatedExcerptText(razorSourceText, ref razorDocumentSpan, ref excerptSpan, builder); + + return new RazorExcerptResult(excerptText, razorDocumentSpan, builder.ToImmutable(), document, span); + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AbstractFilePathService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AbstractFilePathService.cs index bd7add51762..6df96a2bc5e 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AbstractFilePathService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AbstractFilePathService.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using System.Text; using Microsoft.CodeAnalysis.Razor.ProjectSystem; +using Microsoft.CodeAnalysis.Razor.Protocol; namespace Microsoft.CodeAnalysis.Razor.Workspaces; @@ -13,7 +14,7 @@ internal abstract class AbstractFilePathService(LanguageServerFeatureOptions lan private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; public string GetRazorCSharpFilePath(ProjectKey projectKey, string razorFilePath) - => GetGeneratedFilePath(projectKey, razorFilePath, _languageServerFeatureOptions.CSharpVirtualDocumentSuffix); + => GetGeneratedFilePath(projectKey, razorFilePath, LanguageServerConstants.CSharpVirtualDocumentSuffix); public virtual Uri GetRazorDocumentUri(Uri virtualDocumentUri) { @@ -24,10 +25,10 @@ public virtual Uri GetRazorDocumentUri(Uri virtualDocumentUri) } public virtual bool IsVirtualCSharpFile(Uri uri) - => CheckIfFileUriAndExtensionMatch(uri, _languageServerFeatureOptions.CSharpVirtualDocumentSuffix); + => CheckIfFileUriAndExtensionMatch(uri, LanguageServerConstants.CSharpVirtualDocumentSuffix); public bool IsVirtualHtmlFile(Uri uri) - => CheckIfFileUriAndExtensionMatch(uri, _languageServerFeatureOptions.HtmlVirtualDocumentSuffix); + => CheckIfFileUriAndExtensionMatch(uri, LanguageServerConstants.HtmlVirtualDocumentSuffix); public bool IsVirtualDocumentUri(Uri uri) => IsVirtualCSharpFile(uri) || IsVirtualHtmlFile(uri); @@ -37,13 +38,13 @@ private static bool CheckIfFileUriAndExtensionMatch(Uri uri, string extension) private string GetRazorFilePath(string filePath) { - var trimIndex = filePath.LastIndexOf(_languageServerFeatureOptions.HtmlVirtualDocumentSuffix); + var trimIndex = filePath.LastIndexOf(LanguageServerConstants.HtmlVirtualDocumentSuffix); // We don't check for C# in cohosting, as it will throw, and people might call this method on any // random path. if (trimIndex == -1 && !_languageServerFeatureOptions.UseRazorCohostServer) { - trimIndex = filePath.LastIndexOf(_languageServerFeatureOptions.CSharpVirtualDocumentSuffix); + trimIndex = filePath.LastIndexOf(LanguageServerConstants.CSharpVirtualDocumentSuffix); if (trimIndex == -1) { @@ -51,15 +52,11 @@ private string GetRazorFilePath(string filePath) return filePath; } - // If this is a C# generated file, and we're including the project suffix, then filename will be - // .razor. - if (_languageServerFeatureOptions.IncludeProjectKeyInGeneratedFilePath) - { - // We can remove the project key easily, by just looking for the last '.'. The project - // slug itself cannot a '.', enforced by the assert below in GetProjectSuffix - trimIndex = filePath.LastIndexOf('.', trimIndex - 1); - Debug.Assert(trimIndex != -1, "There was no project element to the generated file name?"); - } + // If this is a C# generated file, then filename will be .razor. + // We can remove the project key easily, by just looking for the last '.'. The project + // slug itself cannot a '.', enforced by the assert below in GetProjectSuffix + trimIndex = filePath.LastIndexOf('.', trimIndex - 1); + Debug.Assert(trimIndex != -1, "There was no project element to the generated file name?"); } if (trimIndex != -1) @@ -79,11 +76,6 @@ private string GetGeneratedFilePath(ProjectKey projectKey, string razorFilePath, private string GetProjectSuffix(ProjectKey projectKey) { - if (!_languageServerFeatureOptions.IncludeProjectKeyInGeneratedFilePath) - { - return string.Empty; - } - // If there is no project key, we still want to generate something as otherwise the GetRazorFilePath method // would end up unnecessarily overcomplicated if (projectKey.IsUnknown) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AutoInsert/AutoInsertService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AutoInsert/AutoInsertService.cs index 3eee29c2391..95d6f9b4fad 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AutoInsert/AutoInsertService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AutoInsert/AutoInsertService.cs @@ -18,14 +18,14 @@ internal class AutoInsertService(IEnumerable onAutoInsert public static FrozenSet HtmlAllowedAutoInsertTriggerCharacters { get; } = new string[] { "=" }.ToFrozenSet(StringComparer.Ordinal); public static FrozenSet CSharpAllowedAutoInsertTriggerCharacters { get; } - = new string[] { "'", "/", "\n" }.ToFrozenSet(StringComparer.Ordinal); + = new string[] { "'", "/", "\n", "\"" }.ToFrozenSet(StringComparer.Ordinal); private readonly ImmutableArray _triggerCharacters = CalculateTriggerCharacters(onAutoInsertProviders); private static ImmutableArray CalculateTriggerCharacters(IEnumerable onAutoInsertProviders) { using var builder = new PooledArrayBuilder(); - using var _ = StringHashSetPool.Ordinal.GetPooledObject(out var set); + using var _ = SpecializedPools.GetPooledStringHashSet(out var set); foreach (var provider in onAutoInsertProviders) { var triggerCharacter = provider.TriggerCharacter; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/CodeActionResolveService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/CodeActionResolveService.cs index d960d27e2ac..111ba8c5e72 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/CodeActionResolveService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/CodeActionResolveService.cs @@ -152,7 +152,7 @@ private bool TryGetResolver(RazorCodeActionResolutionParams resolutio private static FrozenDictionary CreateResolverMap(IEnumerable codeActionResolvers) where T : ICodeActionResolver { - using var _ = StringDictionaryPool.GetPooledObject(out var resolverMap); + using var _ = SpecializedPools.GetPooledStringDictionary(out var resolverMap); foreach (var resolver in codeActionResolvers) { diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Html/HtmlCodeActionProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Html/HtmlCodeActionProvider.cs index f3deccaba56..8bfa445d442 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Html/HtmlCodeActionProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Html/HtmlCodeActionProvider.cs @@ -28,7 +28,7 @@ public async Task> ProvideAsync( { if (codeAction.Edit is not null) { - await RemapAndFixHtmlCodeActionEditAsync(_editMappingService, context.DocumentSnapshot, codeAction, cancellationToken).ConfigureAwait(false); + await MapAndFixHtmlCodeActionEditAsync(_editMappingService, context.DocumentSnapshot, codeAction, cancellationToken).ConfigureAwait(false); results.Add(codeAction); } @@ -41,26 +41,21 @@ public async Task> ProvideAsync( return results.ToImmutable(); } - public static async Task RemapAndFixHtmlCodeActionEditAsync(IEditMappingService editMappingService, IDocumentSnapshot documentSnapshot, CodeAction codeAction, CancellationToken cancellationToken) + public static async Task MapAndFixHtmlCodeActionEditAsync(IEditMappingService editMappingService, IDocumentSnapshot documentSnapshot, CodeAction codeAction, CancellationToken cancellationToken) { Assumes.NotNull(codeAction.Edit); - codeAction.Edit = await editMappingService.RemapWorkspaceEditAsync(documentSnapshot, codeAction.Edit, cancellationToken).ConfigureAwait(false); + await editMappingService.MapWorkspaceEditAsync(documentSnapshot, codeAction.Edit, cancellationToken).ConfigureAwait(false); - if (codeAction.Edit.TryGetTextDocumentEdits(out var documentEdits)) - { - var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); - var htmlSourceText = codeDocument.GetHtmlSourceText(); - - foreach (var edit in documentEdits) - { - edit.Edits = FormattingUtilities.FixHtmlTextEdits(htmlSourceText, edit.Edits); - } + var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); + var htmlSourceText = codeDocument.GetHtmlSourceText(cancellationToken); - codeAction.Edit = new WorkspaceEdit - { - DocumentChanges = documentEdits - }; + // NOTE: We iterate over just the TextDocumentEdit objects and modify them in place. + // We intentionally do NOT create a new WorkspaceEdit here to avoid losing any + // CreateFile, RenameFile, or DeleteFile operations that may be in DocumentChanges. + foreach (var edit in codeAction.Edit.EnumerateTextDocumentEdits()) + { + edit.Edits = FormattingUtilities.FixHtmlTextEdits(htmlSourceText, edit.Edits); } } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Html/HtmlCodeActionResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Html/HtmlCodeActionResolver.cs index 6a85bf3f7bb..02fb3056875 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Html/HtmlCodeActionResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Html/HtmlCodeActionResolver.cs @@ -20,7 +20,7 @@ public async Task ResolveAsync( CodeAction codeAction, CancellationToken cancellationToken) { - await HtmlCodeActionProvider.RemapAndFixHtmlCodeActionEditAsync(_editMappingService, documentContext.Snapshot, codeAction, cancellationToken).ConfigureAwait(false); + await HtmlCodeActionProvider.MapAndFixHtmlCodeActionEditAsync(_editMappingService, documentContext.Snapshot, codeAction, cancellationToken).ConfigureAwait(false); return codeAction; } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Models/CodeActionExtensions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Models/CodeActionExtensions.cs index 9295e5638ff..569ce3561fe 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Models/CodeActionExtensions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Models/CodeActionExtensions.cs @@ -6,12 +6,19 @@ using System.Text.Json; using System.Text.Json.Nodes; using Microsoft.AspNetCore.Razor; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor.Protocol; namespace Microsoft.CodeAnalysis.Razor.CodeActions.Models; internal static class CodeActionExtensions { + private const string NestedCodeActionCommand = Constants.RunNestedCodeActionCommandName; + private const string NestedCodeActionsProperty = Constants.NestedCodeActionsPropertyName; + private const string CodeActionPathProperty = Constants.CodeActionPathPropertyName; + private const string FixAllFlavorsProperty = Constants.FixAllFlavorsPropertyName; + public static SumType AsVSCodeCommandOrCodeAction(this VSInternalCodeAction razorCodeAction, VSTextDocumentIdentifier textDocument, Uri? delegatedDocumentUri) { if (razorCodeAction.Data is null) @@ -53,15 +60,18 @@ public static RazorVSInternalCodeAction WrapResolvableCodeAction( RazorLanguageKind language = RazorLanguageKind.CSharp, bool isOnAllowList = true) { - var resolutionParams = new RazorCodeActionResolutionParams() + if (!TryHandleNestedCodeAction(razorCodeAction, context, action, language)) { - TextDocument = context.Request.TextDocument, - Action = action, - Language = language, - DelegatedDocumentUri = context.DelegatedDocumentUri, - Data = razorCodeAction.Data - }; - razorCodeAction.Data = JsonSerializer.SerializeToElement(resolutionParams); + var resolutionParams = new RazorCodeActionResolutionParams() + { + TextDocument = context.Request.TextDocument, + Action = action, + Language = language, + DelegatedDocumentUri = context.DelegatedDocumentUri, + Data = razorCodeAction.Data + }; + razorCodeAction.Data = JsonSerializer.SerializeToElement(resolutionParams); + } if (!isOnAllowList) { @@ -79,6 +89,60 @@ public static RazorVSInternalCodeAction WrapResolvableCodeAction( return razorCodeAction; } + private static bool TryHandleNestedCodeAction(RazorVSInternalCodeAction razorCodeAction, RazorCodeActionContext context, string action, RazorLanguageKind language) + { + if (language != RazorLanguageKind.CSharp || + razorCodeAction.Command is not { CommandIdentifier: NestedCodeActionCommand, Arguments: [JsonElement arg] }) + { + return false; + } + + // For nested code actions in VS Code, we want to not wrap the data from this code action with our context, + // but wrap all of the nested code actions in the first argument. That way, the custom command in the C# + // Extension will work (it expects Data to be unwrapped), and when it tries to resolve the children, they + // will come to us because they're wrapped, and we'll send them on to Roslyn. + // + // We extract each nested code action, wrap its data with our context, then copy across a couple of things + // from its data to our new wrapped data, and we're done. We end up with data that is an odd hybrid of Razor + // and Roslyn expectations, but thanks to the dynamic nature of JSON, it works out. + using var mappedNestedActions = new PooledArrayBuilder(); + var nestedCodeActions = arg.GetProperty(NestedCodeActionsProperty); + foreach (var nestedAction in nestedCodeActions.EnumerateArray()) + { + var nestedCodeAction = nestedAction.Deserialize(JsonHelpers.JsonSerializerOptions).AssumeNotNull(); + var resolutionParams = new RazorCodeActionResolutionParams() + { + TextDocument = context.Request.TextDocument, + Action = action, + Language = language, + DelegatedDocumentUri = context.DelegatedDocumentUri, + Data = nestedCodeAction.Data + }; + + // We have to set two extra properties that Roslyn requires for nested code actions, copied from it's data object + var newActionData = JsonSerializer.SerializeToNode(resolutionParams).AssumeNotNull(); + var nestedData = nestedAction.GetProperty("data"); + if (nestedData.TryGetProperty(CodeActionPathProperty, out var codeActionPath)) + { + newActionData[CodeActionPathProperty] = JsonSerializer.SerializeToNode(codeActionPath, JsonHelpers.JsonSerializerOptions); + } + + if (nestedData.TryGetProperty(FixAllFlavorsProperty, out var fixAllFlavors)) + { + newActionData[FixAllFlavorsProperty] = JsonSerializer.SerializeToNode(fixAllFlavors, JsonHelpers.JsonSerializerOptions); + } + + nestedCodeAction.Data = newActionData; + mappedNestedActions.Add(nestedCodeAction); + } + + // We can't update NestedCodeActions directly, because JsonElement is immutable, so we have to convert to a node + var newArg = JsonSerializer.SerializeToNode(arg, JsonHelpers.JsonSerializerOptions).AssumeNotNull(); + newArg.AsObject()[NestedCodeActionsProperty] = JsonSerializer.SerializeToNode(mappedNestedActions.ToArray(), JsonHelpers.JsonSerializerOptions); + razorCodeAction.Command.Arguments[0] = newArg; + return true; + } + private static VSInternalCodeAction WrapResolvableCodeAction( this VSInternalCodeAction razorCodeAction, RazorCodeActionContext context, diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/AddUsingsCodeActionResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/AddUsingsCodeActionResolver.cs index da852edaa91..4accc59cbed 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/AddUsingsCodeActionResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/AddUsingsCodeActionResolver.cs @@ -62,13 +62,19 @@ internal static bool TryCreateAddUsingResolutionParams(string fullyQualifiedName return false; } + resolutionParams = CreateAddUsingResolutionParams(@namespace, textDocument, additionalEdit, delegatedDocumentUri); + return true; + } + + internal static RazorCodeActionResolutionParams CreateAddUsingResolutionParams(string @namespace, VSTextDocumentIdentifier textDocument, TextDocumentEdit? additionalEdit, Uri? delegatedDocumentUri) + { var actionParams = new AddUsingsCodeActionParams { Namespace = @namespace, AdditionalEdit = additionalEdit }; - resolutionParams = new RazorCodeActionResolutionParams + return new RazorCodeActionResolutionParams { TextDocument = textDocument, Action = LanguageServerConstants.CodeActions.AddUsing, @@ -76,8 +82,6 @@ internal static bool TryCreateAddUsingResolutionParams(string fullyQualifiedName DelegatedDocumentUri = delegatedDocumentUri, Data = actionParams, }; - - return true; } // Internal for testing diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToComponentCodeActionResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToComponentCodeActionResolver.cs index 7f0a3eb7d50..96d82e6882a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToComponentCodeActionResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToComponentCodeActionResolver.cs @@ -1,9 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#if !NET -using System; -#endif using System.IO; using System.Text.Json; using System.Threading; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/GenerateMethodCodeActionProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/GenerateMethodCodeActionProvider.cs index a0db39d014f..20f840812dc 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/GenerateMethodCodeActionProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/GenerateMethodCodeActionProvider.cs @@ -116,20 +116,20 @@ private static bool TryGetEventNameAndMethodName( } var found = false; - foreach (var tagHelperDescriptor in binding.Descriptors) + foreach (var tagHelper in binding.TagHelpers) { - foreach (var attribute in tagHelperDescriptor.BoundAttributes) + foreach (var attribute in tagHelper.BoundAttributes) { if (attribute.Name == attributeName) { // We found the attribute that matches the directive attribute, now we need to check if the // tag helper it's bound to is an event handler. This filters out things like @ref and @rendermode - if (tagHelperDescriptor.Kind == TagHelperKind.EventHandler) + if (tagHelper.Kind == TagHelperKind.EventHandler) { // An event handler like "@onclick" - eventParameterType = tagHelperDescriptor.GetEventArgsType() ?? ""; + eventParameterType = tagHelper.GetEventArgsType() ?? ""; } - else if (tagHelperDescriptor.Kind == TagHelperKind.Bind) + else if (tagHelper.Kind == TagHelperKind.Bind) { // A bind tag helper, so either @bind-XX:after or @bind-XX:set, the latter of which has a parameter if (markupTagHelperDirectiveAttribute.TagHelperAttributeInfo.ParameterName == "set" && @@ -181,9 +181,9 @@ private static bool TryGetEventNameAndMethodName( eventParameterType = null; allowAsync = true; - foreach (var tagHelperDescriptor in binding.Descriptors) + foreach (var tagHelper in binding.TagHelpers) { - foreach (var attribute in tagHelperDescriptor.BoundAttributes) + foreach (var attribute in tagHelper.BoundAttributes) { if (attribute.Name == markupTagHelperDirectiveAttribute.TagHelperAttributeInfo.Name) { @@ -202,7 +202,7 @@ private static bool TryGetEventNameAndMethodName( if (attribute.IsGenericTypedProperty()) { - if (tagHelperDescriptor.TryGetGenericTypeNameFromComponent(binding, out var genericType) && + if (tagHelper.TryGetGenericTypeNameFromComponent(binding, out var genericType) && ComponentAttributeIntermediateNode.TryGetGenericActionArgument(attribute.TypeName.AsMemory(), genericType, out var argument)) { eventParameterType = argument.ToString(); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/GenerateMethodCodeActionResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/GenerateMethodCodeActionResolver.cs index 9a87271c8fc..0d44955b109 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/GenerateMethodCodeActionResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/GenerateMethodCodeActionResolver.cs @@ -131,7 +131,8 @@ private async Task GenerateMethodInCodeBlockAsync( if (edits.Length == 3 && razorClassName is not null && (razorNamespace is not null || code.TryGetNamespace(fallbackToRootNamespace: true, out razorNamespace)) - && GetCSharpClassDeclarationSyntax(code.GetOrParseCSharpSyntaxTree(cancellationToken), razorNamespace, razorClassName) is { } @class) + && await documentContext.Snapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false) is { } csharpSyntaxTree + && GetCSharpClassDeclarationSyntax(csharpSyntaxTree, razorNamespace, razorClassName) is { } @class) { // There is no existing @code block. This means that there is no code block source mapping in the generated C# document // to place the code, so we cannot utilize the document mapping service and the formatting service. diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/SimplifyFullyQualifiedComponentCodeActionProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/SimplifyFullyQualifiedComponentCodeActionProvider.cs index ae8fdba5709..7aeabc4e1c0 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/SimplifyFullyQualifiedComponentCodeActionProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/SimplifyFullyQualifiedComponentCodeActionProvider.cs @@ -123,8 +123,8 @@ private static bool IsFullyQualifiedComponent(MarkupTagHelperElementSyntax eleme @namespace = string.Empty; componentName = string.Empty; - var descriptors = element.TagHelperInfo.BindingResult.Descriptors; - var boundTagHelper = descriptors.FirstOrDefault(static d => d.Kind == TagHelperKind.Component); + var tagHelpers = element.TagHelperInfo.BindingResult.TagHelpers; + var boundTagHelper = tagHelpers.FirstOrDefault(static d => d.Kind == TagHelperKind.Component); if (boundTagHelper is null) { return false; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/SimplifyTagToSelfClosingCodeActionProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/SimplifyTagToSelfClosingCodeActionProvider.cs index e412ae97b03..5afe590e988 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/SimplifyTagToSelfClosingCodeActionProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/SimplifyTagToSelfClosingCodeActionProvider.cs @@ -89,7 +89,7 @@ internal static bool IsApplicableTo(MarkupTagHelperElementSyntax markupElementSy return false; } - if (markupElementSyntax is not { TagHelperInfo.BindingResult.Descriptors: [.. var descriptors] }) + if (markupElementSyntax is not { TagHelperInfo.BindingResult.TagHelpers: { Count: > 0 } tagHelpers }) { return false; } @@ -101,7 +101,7 @@ internal static bool IsApplicableTo(MarkupTagHelperElementSyntax markupElementSy } // Get symbols for the markup element - var boundTagHelper = descriptors.FirstOrDefault(static d => d.Kind == TagHelperKind.Component); + var boundTagHelper = tagHelpers.FirstOrDefault(static d => d.Kind == TagHelperKind.Component); if (boundTagHelper == null) { return false; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/UnboundDirectiveAttributeAddUsingCodeActionProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/UnboundDirectiveAttributeAddUsingCodeActionProvider.cs new file mode 100644 index 00000000000..2712c9d74a6 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/UnboundDirectiveAttributeAddUsingCodeActionProvider.cs @@ -0,0 +1,139 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.Syntax; +using Microsoft.AspNetCore.Razor.Threading; +using Microsoft.CodeAnalysis.Razor.CodeActions.Models; +using Microsoft.CodeAnalysis.Razor.CodeActions.Razor; +using Microsoft.CodeAnalysis.Razor.Workspaces; + +namespace Microsoft.CodeAnalysis.Razor.CodeActions; + +internal class UnboundDirectiveAttributeAddUsingCodeActionProvider : IRazorCodeActionProvider +{ + public Task> ProvideAsync(RazorCodeActionContext context, CancellationToken cancellationToken) + { + if (context.HasSelection) + { + return SpecializedTasks.EmptyImmutableArray(); + } + + // Only work in component files + if (!FileKinds.IsComponent(context.CodeDocument.FileKind)) + { + return SpecializedTasks.EmptyImmutableArray(); + } + + if (!context.CodeDocument.TryGetSyntaxRoot(out var syntaxRoot)) + { + return SpecializedTasks.EmptyImmutableArray(); + } + + // Find the node at the cursor position + var owner = syntaxRoot.FindInnermostNode(context.StartAbsoluteIndex, includeWhitespace: false); + if (owner is null) + { + return SpecializedTasks.EmptyImmutableArray(); + } + + // Find a regular markup attribute (not a tag helper attribute) that starts with '@' + // Unbound directive attributes are just regular attributes that happen to start with '@' + var attributeBlock = owner.FirstAncestorOrSelf(); + if (attributeBlock is null) + { + return SpecializedTasks.EmptyImmutableArray(); + } + + // Make sure the cursor is actually on the name part, since the attribute block is the whole attribute, including + // value and even some whitespace + var nameSpan = attributeBlock.Name.Span; + if (context.StartAbsoluteIndex < nameSpan.Start || context.StartAbsoluteIndex > nameSpan.End) + { + return SpecializedTasks.EmptyImmutableArray(); + } + + // Try to find the missing namespace for this directive attribute + if (!TryGetMissingDirectiveAttributeNamespace(context.CodeDocument, attributeBlock, out var missingNamespace)) + { + return SpecializedTasks.EmptyImmutableArray(); + } + + // Create the code action + var resolutionParams = AddUsingsCodeActionResolver.CreateAddUsingResolutionParams( + missingNamespace, + context.Request.TextDocument, + additionalEdit: null, + context.DelegatedDocumentUri); + + var addUsingCodeAction = RazorCodeActionFactory.CreateAddComponentUsing( + missingNamespace, + newTagName: null, + resolutionParams); + + return Task.FromResult>([addUsingCodeAction]); + } + + private static bool TryGetMissingDirectiveAttributeNamespace( + RazorCodeDocument codeDocument, + MarkupAttributeBlockSyntax attributeBlock, + [NotNullWhen(true)] out string? missingNamespace) + { + missingNamespace = null; + + // Check if this is a directive attribute (starts with '@') + var attributeName = attributeBlock.Name.GetContent(); + if (attributeName is not ['@', ..]) + { + return false; + } + + // Get all tag helpers, not just those in scope, since we want to suggest adding a using + if (!codeDocument.TryGetTagHelpers(out var tagHelpers)) + { + return false; + } + + // For attributes with parameters (e.g., @bind:after), extract just the base attribute name + var baseAttributeName = attributeName.AsSpan(); + var colonIndex = baseAttributeName.IndexOf(':'); + if (colonIndex > 0) + { + baseAttributeName = baseAttributeName[..colonIndex]; + } + + // Search for matching bound attribute descriptors in all available tag helpers + foreach (var tagHelper in tagHelpers) + { + if (!tagHelper.IsAttributeDescriptor()) + { + continue; + } + + foreach (var boundAttribute in tagHelper.BoundAttributes) + { + // No need to worry about multiple matches, because Razor syntax has no way to disambiguate anyway. + // Currently only compiler can create directive attribute tag helpers anyway. + if (boundAttribute.IsDirectiveAttribute && + boundAttribute.Name.AsSpan().SequenceEqual(baseAttributeName)) + { + if (boundAttribute.Parent.TypeNamespace is { } typeNamespace) + { + missingNamespace = typeNamespace; + return true; + } + + // This is unexpected, but if for some reason we can't find a namespace, there is no point looking further + break; + } + } + } + + return false; + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/BlazorDataAttributeCompletionItemProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/BlazorDataAttributeCompletionItemProvider.cs index e6a23043cca..b1d2ad6fd8d 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/BlazorDataAttributeCompletionItemProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/BlazorDataAttributeCompletionItemProvider.cs @@ -1,7 +1,9 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +#if !NET using System; +#endif using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Syntax; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CSharpRazorKeywordCompletionDescription.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CSharpRazorKeywordCompletionDescription.cs new file mode 100644 index 00000000000..e66b9106b8e --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CSharpRazorKeywordCompletionDescription.cs @@ -0,0 +1,9 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.CodeAnalysis.Razor.Completion; + +internal sealed class CSharpRazorKeywordCompletionDescription(string description) : CompletionDescription +{ + public override string Description { get; } = string.Format(SR.KeywordDescription, description); +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CSharpRazorKeywordCompletionItemProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CSharpRazorKeywordCompletionItemProvider.cs new file mode 100644 index 00000000000..775622c3020 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CSharpRazorKeywordCompletionItemProvider.cs @@ -0,0 +1,89 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Runtime.InteropServices; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.Syntax; + +namespace Microsoft.CodeAnalysis.Razor.Completion; + +internal class CSharpRazorKeywordCompletionItemProvider : IRazorCompletionItemProvider +{ + internal static readonly ImmutableArray KeywordCommitCharacters = RazorCommitCharacter.CreateArray([" "]); + + // internal for testing + internal static readonly ImmutableArray CSharpRazorKeywords = + [ + "do", "for", "foreach", "if", "lock", "switch", "try", "while" + ]; + + // Internal for testing + internal static readonly ImmutableArray CSharpRazorKeywordCompletionItems = GetCSharpRazorKeywordCompletionItems(); + + public ImmutableArray GetCompletionItems(RazorCompletionContext context) + { + return ShouldProvideCompletions(context) + ? CSharpRazorKeywordCompletionItems + : []; + } + + // Internal for testing + internal static bool ShouldProvideCompletions(RazorCompletionContext context) + { + var owner = context.Owner; + if (owner is null) + { + return false; + } + + // Do not provide IntelliSense for explicit expressions. Explicit expressions will usually look like: + // @(DateTime.Now) + var implicitExpression = owner.FirstAncestorOrSelf(); + if (implicitExpression is null) + { + return false; + } + + if (implicitExpression.Width > 2 && context.Reason != CompletionReason.Invoked) + { + // We only want to provide razor csharp keyword completions if the implicit expression is empty "@|" or at the beginning of a word "@i|", this ensures + // we're consistent with how C# typically provides completion items. + return false; + } + + if (owner.ChildNodesAndTokens().Any(static x => !x.AsToken(out var token) || !IsCSharpRazorKeywordCompletableToken(token))) + { + // Implicit expression contains nodes or tokens that aren't completable by a csharp razor keyword + return false; + } + + return true; + } + + private static bool IsCSharpRazorKeywordCompletableToken(AspNetCore.Razor.Language.Syntax.SyntaxToken token) + { + return token is { Kind: SyntaxKind.Identifier or SyntaxKind.Marker or SyntaxKind.Keyword } + or { Kind: SyntaxKind.Transition, Parent.Kind: SyntaxKind.CSharpTransition }; + } + + private static ImmutableArray GetCSharpRazorKeywordCompletionItems() + { + var completionItems = new RazorCompletionItem[CSharpRazorKeywords.Length]; + + for (var i = 0; i < CSharpRazorKeywords.Length; i++) + { + var keyword = CSharpRazorKeywords[i]; + + var keywordCompletionItem = RazorCompletionItem.CreateKeyword( + displayText: keyword, + insertText: keyword, + KeywordCommitCharacters); + + completionItems[i] = keywordCompletionItem; + } + + return ImmutableCollectionsMarshal.AsImmutableArray(completionItems); + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CompletionTriggerAndCommitCharacters.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CompletionTriggerAndCommitCharacters.cs index 29f5ed0728e..0cddba4d43e 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CompletionTriggerAndCommitCharacters.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/CompletionTriggerAndCommitCharacters.cs @@ -1,99 +1,85 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections.Frozen; using System.Collections.Generic; -using System.Collections.Immutable; -using Microsoft.CodeAnalysis.Razor.Workspaces; +using System.Linq; +using Microsoft.CodeAnalysis.Razor.Protocol; namespace Microsoft.CodeAnalysis.Razor.Completion; -internal class CompletionTriggerAndCommitCharacters +internal class CompletionTriggerAndCommitCharacters(IClientCapabilitiesService clientCapabilitiesService) { /// /// Trigger character that can trigger both Razor and Delegation completion /// private const char TransitionCharacter = '@'; - private static readonly char[] s_vsHtmlTriggerCharacters = [':', '#', '.', '!', '*', ',', '(', '[', '-', '<', '&', '\\', '/', '\'', '"', '=', ':', ' ', '`']; - private static readonly char[] s_vsCodeHtmlTriggerCharacters = ['#', '.', '!', ',', '<']; - private static readonly char[] s_razorTriggerCharacters = ['<', ':', ' ']; - private static readonly char[] s_csharpTriggerCharacters = [' ', '(', '=', '#', '.', '<', '[', '{', '"', '/', ':', '~']; - private static readonly ImmutableArray s_commitCharacters = [" ", ">", ";", "="]; + private static readonly string[] s_commitCharacters = [" ", ">", ";", "="]; - private readonly HashSet _csharpTriggerCharacters; - private readonly HashSet _delegationTriggerCharacters; - private readonly HashSet _htmlTriggerCharacters; - private readonly HashSet _razorTriggerCharacters; + private readonly IClientCapabilitiesService _clientCapabilitiesService = clientCapabilitiesService; - public ImmutableArray AllTriggerCharacters { get; } + private static readonly FrozenSet _csharpTriggerCharacters = [' ', '(', '=', '#', '.', '<', '[', '{', '"', '/', ':', '~']; + private static readonly FrozenSet _vsHtmlTriggerCharacters = [TransitionCharacter, ':', '#', '.', '!', '*', ',', '(', '[', '-', '<', '&', '\\', '/', '\'', '"', '=', ':', ' ', '`']; + private static readonly FrozenSet _vsCodeHtmlTriggerCharacters = [TransitionCharacter, '#', '.', '!', ',', '<']; + private static readonly FrozenSet _razorTriggerCharacters = [TransitionCharacter, '<', ':', ' ']; + + private FrozenSet HtmlTriggerCharacters => _clientCapabilitiesService.ClientCapabilities.SupportsVisualStudioExtensions + ? _vsHtmlTriggerCharacters + : _vsCodeHtmlTriggerCharacters; + + private FrozenSet DelegationTriggerCharacters => field ??= ComputeDelegationTriggerCharacters(); + + public string[] AllTriggerCharacters => field ??= ComputeAllTriggerCharacters(); /// /// This is the intersection of C# and HTML commit characters. /// - // We need to specify it so that platform can correctly calculate ApplicableToSpan in - // https://devdiv.visualstudio.com/DevDiv/_git/VSLanguageServerClient?path=/src/product/RemoteLanguage/Impl/Features/Completion/AsyncCompletionSource.cs&version=GBdevelop&line=855&lineEnd=855&lineStartColumn=9&lineEndColumn=49&lineStyle=plain&_a=contents - // This is needed to fix https://github.com/dotnet/razor/issues/10787 in particular - public ImmutableArray AllCommitCharacters { get; } - - public CompletionTriggerAndCommitCharacters(LanguageServerFeatureOptions languageServerFeatureOptions) + /// + /// + /// We need to specify it so that platform can correctly calculate ApplicableToSpan + /// This is needed to fix https://github.com/dotnet/razor/issues/10787 in particular + /// + /// + /// However we shouldn't specify commit characters for VSCode, as it doesn't appear to need + /// them and they interfere with normal item commit. e.g. see https://github.com/dotnet/vscode-csharp/issues/7678 + /// + /// + public string[] AllCommitCharacters => _clientCapabilitiesService.ClientCapabilities.SupportsVisualStudioExtensions ? s_commitCharacters : []; + + private FrozenSet ComputeDelegationTriggerCharacters() { - // C# trigger characters (do NOT include '@') - var csharpTriggerCharacters = new HashSet(); - csharpTriggerCharacters.UnionWith(s_csharpTriggerCharacters); - - // HTML trigger characters (include '@' + HTML trigger characters) - var htmlTriggerCharacters = new HashSet() { TransitionCharacter }; - - // In VS Code we want to use a smaller set of Html trigger characters, and rather than have another - // flag for it, we can just re-use the flag we have for commit characters - if (languageServerFeatureOptions.UseVsCodeCompletionCommitCharacters) - { - htmlTriggerCharacters.UnionWith(s_vsCodeHtmlTriggerCharacters); - } - else - { - htmlTriggerCharacters.UnionWith(s_vsHtmlTriggerCharacters); - } - // Delegation trigger characters (include '@' + C# and HTML trigger characters) var delegationTriggerCharacters = new HashSet { TransitionCharacter }; - delegationTriggerCharacters.UnionWith(csharpTriggerCharacters); - delegationTriggerCharacters.UnionWith(htmlTriggerCharacters); + delegationTriggerCharacters.UnionWith(_csharpTriggerCharacters); + delegationTriggerCharacters.UnionWith(HtmlTriggerCharacters); - // Razor trigger characters (include '@' + Razor trigger characters) - var razorTriggerCharacters = new HashSet() { TransitionCharacter }; - razorTriggerCharacters.UnionWith(s_razorTriggerCharacters); + return delegationTriggerCharacters.ToFrozenSet(); + } + private string[] ComputeAllTriggerCharacters() + { // All trigger characters (include Razor + Delegation trigger characters) var allTriggerCharacters = new HashSet(); - allTriggerCharacters.UnionWith(razorTriggerCharacters); - allTriggerCharacters.UnionWith(delegationTriggerCharacters); - - _csharpTriggerCharacters = csharpTriggerCharacters; - _htmlTriggerCharacters = htmlTriggerCharacters; - _razorTriggerCharacters = razorTriggerCharacters; - _delegationTriggerCharacters = delegationTriggerCharacters; - - // We shouldn't specify commit characters for VSCode. - // It doesn't appear to need them and they interfere with normal item commit. - // E.g. see https://github.com/dotnet/vscode-csharp/issues/7678 - AllCommitCharacters = languageServerFeatureOptions.UseVsCodeCompletionCommitCharacters ? [] : s_commitCharacters; - AllTriggerCharacters = allTriggerCharacters.SelectAsArray(static c => c.ToString()); + allTriggerCharacters.UnionWith(_razorTriggerCharacters); + allTriggerCharacters.UnionWith(DelegationTriggerCharacters); + + return allTriggerCharacters.Select(static c => c.ToString()).ToArray(); } public bool IsValidCSharpTrigger(CompletionContext completionContext) => IsValidTrigger(completionContext, _csharpTriggerCharacters); public bool IsValidDelegationTrigger(CompletionContext completionContext) - => IsValidTrigger(completionContext, _delegationTriggerCharacters); + => IsValidTrigger(completionContext, DelegationTriggerCharacters); public bool IsValidHtmlTrigger(CompletionContext completionContext) - => IsValidTrigger(completionContext, _htmlTriggerCharacters); + => IsValidTrigger(completionContext, HtmlTriggerCharacters); public bool IsValidRazorTrigger(CompletionContext completionContext) => IsValidTrigger(completionContext, _razorTriggerCharacters); - private static bool IsValidTrigger(CompletionContext completionContext, HashSet triggerCharacters) + private static bool IsValidTrigger(CompletionContext completionContext, FrozenSet triggerCharacters) => completionContext.TriggerKind != CompletionTriggerKind.TriggerCharacter || completionContext.TriggerCharacter is not [var c] || triggerCharacters.Contains(c); @@ -102,10 +88,10 @@ public bool IsCSharpTriggerCharacter(string ch) => ch is [var c] && _csharpTriggerCharacters.Contains(c); public bool IsDelegationTriggerCharacter(string ch) - => ch is [var c] && _delegationTriggerCharacters.Contains(c); + => ch is [var c] && DelegationTriggerCharacters.Contains(c); public bool IsHtmlTriggerCharacter(string ch) - => ch is [var c] && _htmlTriggerCharacters.Contains(c); + => ch is [var c] && HtmlTriggerCharacters.Contains(c); public bool IsRazorTriggerCharacter(string ch) => ch is [var c] && _razorTriggerCharacters.Contains(c); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/Delegation/DelegatedCompletionHelper.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/Delegation/DelegatedCompletionHelper.cs index a75ddcf8645..4fd830ad193 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/Delegation/DelegatedCompletionHelper.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/Delegation/DelegatedCompletionHelper.cs @@ -71,7 +71,7 @@ internal static class DelegatedCompletionHelper if (languageKind == RazorLanguageKind.Html) { - // For HTML we don't want to delegate to HTML language server is completion is due to a trigger characters that is not + // For HTML we don't want to delegate to HTML language server if completion is due to a trigger characters that is not // HTML trigger character. Doing so causes bad side effects in VSCode HTML client as we will end up with non-matching // completion entries return triggerAndCommitCharacters.IsHtmlTriggerCharacter(triggerCharacter) ? context : null; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionContext.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionContext.cs new file mode 100644 index 00000000000..f55360f696a --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionContext.cs @@ -0,0 +1,27 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using Microsoft.AspNetCore.Razor.Language; + +namespace Microsoft.CodeAnalysis.Razor.Completion; + +internal sealed record DirectiveAttributeCompletionContext +{ + public required string SelectedAttributeName { get; init; } + public string? SelectedParameterName { get; init; } + public ImmutableArray ExistingAttributes { get; init => field = value.NullToEmpty(); } = []; + public bool UseSnippets { get; init; } = true; + public bool InAttributeName { get; init; } = true; + public bool InParameterName { get; init; } + public RazorCompletionOptions Options { get; init; } + + public bool AlreadySatisfiesParameter(BoundAttributeParameterDescriptor parameter, BoundAttributeDescriptor attribute) + => ExistingAttributes.Any( + (parameter, attribute), + static (name, arg) => + TagHelperMatchingConventions.SatisfiesBoundAttributeWithParameter(arg.parameter, name, arg.attribute)); + + public bool CanSatisfyAttribute(BoundAttributeDescriptor attribute) + => TagHelperMatchingConventions.CanSatisfyBoundAttribute(SelectedAttributeName, attribute); +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.AttributeCompletionDetails.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.AttributeCompletionDetails.cs new file mode 100644 index 00000000000..564cb17646f --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.AttributeCompletionDetails.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using Microsoft.CodeAnalysis.Razor.Tooltip; + +namespace Microsoft.CodeAnalysis.Razor.Completion; + +internal partial class DirectiveAttributeCompletionItemProvider +{ + private readonly struct AttributeCompletionDetails( + RazorCompletionItemKind kind, + ImmutableArray descriptions = default, + ImmutableArray commitCharacters = default) + { + public RazorCompletionItemKind Kind => kind; + + public ImmutableArray Descriptions => descriptions.NullToEmpty(); + public ImmutableArray CommitCharacters => commitCharacters.NullToEmpty(); + + public void Deconstruct( + out RazorCompletionItemKind kind, + out ImmutableArray descriptions, + out ImmutableArray commitCharacters) + => (kind, descriptions, commitCharacters) = (Kind, Descriptions, CommitCharacters); + + public void Deconstruct( + out ImmutableArray descriptions, + out ImmutableArray commitCharacters) + => (descriptions, commitCharacters) = (Descriptions, CommitCharacters); + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.DefaultCommitCharacters.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.DefaultCommitCharacters.cs new file mode 100644 index 00000000000..72236580200 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.DefaultCommitCharacters.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; + +namespace Microsoft.CodeAnalysis.Razor.Completion; + +internal partial class DirectiveAttributeCompletionItemProvider +{ + private static class DefaultCommitCharacters + { + private static readonly ImmutableArray s_equalsCommitCharacters = [EqualsCommit(false)]; + private static readonly ImmutableArray s_equalsSpaceCommitCharacters = [EqualsCommit(false), SpaceCommit]; + private static readonly ImmutableArray s_snippetEqualsCommitCharacters = [EqualsCommit(true)]; + private static readonly ImmutableArray s_snippetEqualsSpaceCommitCharacters = [EqualsCommit(true), SpaceCommit]; + private static readonly ImmutableArray s_spaceCommitCharacters = [SpaceCommit]; + + private static RazorCommitCharacter EqualsCommit(bool snippet) => new("=", Insert: !snippet); + private static RazorCommitCharacter SpaceCommit => new(" "); + + public static ImmutableArray Get(bool useEquals, bool useSpace, bool useSnippets) + => (useEquals, useSpace, useSnippets) switch + { + // Use equals with or without space (no snippets) + (true, false, false) => s_equalsCommitCharacters, + (true, true, false) => s_equalsSpaceCommitCharacters, + + // Use equals with or without space (using snippets) + (true, false, true) => s_snippetEqualsCommitCharacters, + (true, true, true) => s_snippetEqualsSpaceCommitCharacters, + + // No equals and with or without space (snippets not relevant) + (false, true, _) => s_spaceCommitCharacters, + (false, false, _) => [] + }; + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.cs index ed40d77c300..ceeef3f3321 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeCompletionItemProvider.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; using System.Linq; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.AspNetCore.Razor.PooledObjects; @@ -14,15 +16,11 @@ namespace Microsoft.CodeAnalysis.Razor.Completion; -internal class DirectiveAttributeCompletionItemProvider : DirectiveAttributeCompletionItemProviderBase +internal partial class DirectiveAttributeCompletionItemProvider : DirectiveAttributeCompletionItemProviderBase { - private static ReadOnlyMemory QuotedAttributeValueSnippet => "=\"$0\"".AsMemory(); - private static ReadOnlyMemory UnquotedAttributeValueSnippet => "=$0".AsMemory(); - - private static readonly ImmutableArray EqualsCommitCharacters = [new("=")]; - private static readonly ImmutableArray EqualsAndColonCommitCharacters = [new("="), new(":")]; - private static readonly ImmutableArray SnippetEqualsCommitCharacters = [new("=", Insert: false)]; - private static readonly ImmutableArray SnippetEqualsAndColonCommitCharacters = [new("=", Insert: false), new(":")]; + private const string Ellipsis = "..."; + private const string QuotedAttributeValueSnippetSuffix = "=\"$0\""; + private const string UnquotedAttributeValueSnippetSuffix = "=$0"; public override ImmutableArray GetCompletionItems(RazorCompletionContext context) { @@ -38,260 +36,381 @@ public override ImmutableArray GetCompletionItems(RazorComp return []; } - if (!TryGetAttributeInfo(owner, out _, out var attributeName, out var attributeNameLocation, out _, out _)) + if (!TryGetAttributeInfo(owner, out _, out var attributeName, out var attributeNameLocation, out var parameterName, out var parameterNameLocation)) { // Either we're not in an attribute or the attribute is so malformed that we can't provide proper completions. return []; } - if (!attributeNameLocation.IntersectsWith(context.AbsoluteIndex)) - { - // We're trying to retrieve completions on a portion of the name that is not supported (such as a parameter). - return []; - } - if (!TryGetElementInfo(owner.Parent.Parent, out var containingTagName, out var attributes)) { // This should never be the case, it means that we're operating on an attribute that doesn't have a tag. return []; } - // At this point we've determined that completions have been requested for the name portion of the selected attribute. - - var completionItems = GetAttributeCompletions(owner, attributeName, containingTagName, attributes, context.TagHelperDocumentContext, context.Options); - // We don't provide Directive Attribute completions when we're in the middle of // another unrelated (doesn't start with @) partially completed attribute. // (attributeName = "xml:") should not get any directive attribute completions. - if (attributeName.IsNullOrWhiteSpace() || attributeName.StartsWith('@')) + if (!attributeName.IsNullOrWhiteSpace() && !attributeName.StartsWith('@')) + { + return []; + } + + var isAttributeRequest = attributeNameLocation.IntersectsWith(context.AbsoluteIndex); + var isParameterRequest = parameterNameLocation.IntersectsWith(context.AbsoluteIndex); + + if (!isAttributeRequest && !isParameterRequest) { - return completionItems; + // This class only provides completions on attribute/parameter names. + return []; } - return []; + var inSnippetContext = InSnippetContext(owner, context.Options); + + var completionContext = new DirectiveAttributeCompletionContext() + { + SelectedAttributeName = attributeName, + SelectedParameterName = parameterName, + ExistingAttributes = attributes, + UseSnippets = inSnippetContext, + InAttributeName = isAttributeRequest, + InParameterName = isParameterRequest, + Options = context.Options + }; + + return GetAttributeCompletions(containingTagName, completionContext, context.TagHelperDocumentContext); + + static bool InSnippetContext(RazorSyntaxNode owner, RazorCompletionOptions options) + { + return options.SnippetsSupported + // Don't create snippet text when attribute is already in the tag and we are trying to replace it + // Otherwise you could have something like @onabort=""="" + && owner is not (MarkupTagHelperDirectiveAttributeSyntax or MarkupAttributeBlockSyntax) + && owner.Parent is not (MarkupTagHelperDirectiveAttributeSyntax or MarkupAttributeBlockSyntax); + } } // Internal for testing internal static ImmutableArray GetAttributeCompletions( - RazorSyntaxNode containingAttribute, - string selectedAttributeName, string containingTagName, - ImmutableArray attributes, - TagHelperDocumentContext tagHelperDocumentContext, - RazorCompletionOptions razorCompletionOptions) + DirectiveAttributeCompletionContext completionContext, + TagHelperDocumentContext documentContext) { - var descriptorsForTag = TagHelperFacts.GetTagHelpersGivenTag(tagHelperDocumentContext, containingTagName, parentTag: null); - if (descriptorsForTag.Length == 0) + var tagHelpersForTag = TagHelperFacts.GetTagHelpersGivenTag(documentContext, containingTagName, parentTag: null); + if (tagHelpersForTag.IsEmpty) { - // If the current tag has no possible descriptors then we can't have any directive attributes. + // If the current tag has no possible tag helpers then we can't have any directive attributes. return []; } // Use ordinal dictionary because attributes are case sensitive when matching - using var _ = StringDictionaryPool<(ImmutableArray, ImmutableArray)>.Ordinal.GetPooledObject(out var attributeCompletions); - var inSnippetContext = InSnippetContext(containingAttribute, razorCompletionOptions); - - foreach (var descriptor in descriptorsForTag) + using var _ = SpecializedPools.GetPooledStringDictionary(out var attributeCompletions); + + // Collect indexer bound attributes and their parent tag helper type names. Indexer attributes indicate an attribute prefix + // for which they apply. That can be used in an attribute name context to determine potential parameters. E.g., + // there exists an indexer indicating it applies to attributes that start with "@bind-" and specifies six different + // parameters applicable for those attributes (":format", ":event", ":culture", ":get", ":set", ":after") + var indexerAttributes = new MemoryBuilder(initialCapacity: 8, clearArray: true); + try { - foreach (var attributeDescriptor in descriptor.BoundAttributes) - { - if (!attributeDescriptor.IsDirectiveAttribute) - { - // We don't care about non-directive attributes - continue; - } + CollectIndexerDescriptors(tagHelpersForTag, completionContext, ref indexerAttributes); - if (!TryAddCompletion(attributeDescriptor.Name, attributeDescriptor, descriptor, razorCompletionOptions, selectedAttributeName, attributes, inSnippetContext, attributeCompletions) && attributeDescriptor.Parameters.Length > 0) + foreach (var tagHelper in tagHelpersForTag) + { + foreach (var attribute in tagHelper.BoundAttributes) { - // This attribute has parameters and the base attribute name (@bind) is already satisfied. We need to check if there are any valid - // parameters left to be provided, if so, we need to still represent the base attribute name in the completion list. - - foreach (var parameterDescriptor in attributeDescriptor.Parameters) + if (attribute.IsDirectiveAttribute) { - if (!attributes.Any(name => TagHelperMatchingConventions.SatisfiesBoundAttributeWithParameter(parameterDescriptor, name, attributeDescriptor))) - { - // This bound attribute parameter has not had a completion entry added for it, re-represent the base attribute name in the completion list - AddCompletion(attributeDescriptor.Name, attributeDescriptor, descriptor, razorCompletionOptions, inSnippetContext, attributeCompletions); - break; - } + AddAttributeNameCompletions(attribute, completionContext, attributeCompletions); + AddParameterNameCompletions(attribute, indexerAttributes.AsMemory().Span, completionContext, attributeCompletions); } } + } + + // Use the mapping populated above to create completion items + return CreateCompletionItems(completionContext, attributeCompletions); + } + finally + { + indexerAttributes.Dispose(); + } + } + + private static void CollectIndexerDescriptors( + TagHelperCollection tagHelpersForTag, + DirectiveAttributeCompletionContext completionContext, + ref MemoryBuilder builder) + { + if (completionContext.InParameterName) + { + // No need to calculate the indexers When in a parameter name + return; + } - if (!attributeDescriptor.IndexerNamePrefix.IsNullOrEmpty()) + foreach (var tagHelper in tagHelpersForTag) + { + foreach (var attribute in tagHelper.BoundAttributes) + { + if (attribute.IsDirectiveAttribute && !attribute.IndexerNamePrefix.IsNullOrEmpty()) { - TryAddCompletion(attributeDescriptor.IndexerNamePrefix + "...", attributeDescriptor, descriptor, razorCompletionOptions, selectedAttributeName, attributes, inSnippetContext, attributeCompletions); + builder.Append(attribute); } } } + } - using var completionItems = new PooledArrayBuilder(capacity: attributeCompletions.Count); - - foreach (var (displayText, (attributeDescriptions, commitCharacters)) in attributeCompletions) + private static void AddAttributeNameCompletions( + BoundAttributeDescriptor attribute, + DirectiveAttributeCompletionContext completionContext, + Dictionary attributeCompletions) + { + if (!completionContext.InAttributeName) { - var insertTextSpan = displayText.AsSpan(); - var originalInsertTextSpan = insertTextSpan; + // Only add attribute name completions when in an attribute name context + return; + } - // Strip off the @ from the insertion text. This change is here to align the insertion text with the - // completion hooks into VS and VSCode. Basically, completion triggers when `@` is typed so we don't - // want to insert `@bind` because `@` already exists. - if (insertTextSpan.StartsWith('@')) - { - insertTextSpan = insertTextSpan[1..]; - } + var isIndexer = completionContext.SelectedAttributeName.EndsWith(Ellipsis, StringComparison.Ordinal); + var descriptionInfo = BoundAttributeDescriptionInfo.From(attribute, isIndexer, attribute.Parent.TypeName); - var isSnippet = false; - // Indexer attribute, we don't want to insert with the triple dot. - if (MemoryExtensions.EndsWith(insertTextSpan, "...".AsSpan())) - { - insertTextSpan = insertTextSpan[..^3]; - } - else + var tagHelper = attribute.Parent; + + if (!TryAddAttributeCompletion(attribute.Name, descriptionInfo, tagHelper, completionContext, attributeCompletions) && + attribute.Parameters.Length > 0) + { + // This attribute has parameters and the base attribute name (@bind) is already satisfied. We need to check if there are any valid + // parameters left to be provided, if so, we need to still represent the base attribute name in the completion list. + + foreach (var parameter in attribute.Parameters) { - // We are trying for snippet text only for non-indexer attributes, e.g. *not* something like "@bind-..." - if (inSnippetContext) + if (!completionContext.AlreadySatisfiesParameter(parameter, attribute)) { - GetSnippetText(insertTextSpan, razorCompletionOptions, out insertTextSpan); - isSnippet = true; + // This bound attribute parameter has not had a completion entry added for it, re-represent the base attribute name in the completion list + AddAttributeCompletion(attribute.Name, descriptionInfo, tagHelper, completionContext, attributeCompletions); + break; } } - - // Don't create another string unnecessarily, even though ReadOnlySpan.ToString() special-cases the string to avoid allocation - var insertText = insertTextSpan == originalInsertTextSpan ? displayText : insertTextSpan.ToString(); - - var razorCompletionItem = RazorCompletionItem.CreateDirectiveAttribute( - displayText, - insertText, - descriptionInfo: new(attributeDescriptions), - commitCharacters, - isSnippet); - - completionItems.Add(razorCompletionItem); } - return completionItems.ToImmutableAndClear(); - - static bool InSnippetContext( - RazorSyntaxNode owner, - RazorCompletionOptions razorCompletionOptions) + if (!attribute.IndexerNamePrefix.IsNullOrEmpty()) { - return razorCompletionOptions.SnippetsSupported - // Don't create snippet text when attribute is already in the tag and we are trying to replace it - // Otherwise you could have something like @onabort=""="" - && owner is not (MarkupTagHelperDirectiveAttributeSyntax or MarkupAttributeBlockSyntax) - && owner.Parent is not (MarkupTagHelperDirectiveAttributeSyntax or MarkupAttributeBlockSyntax); + TryAddAttributeCompletion( + attribute.IndexerNamePrefix + Ellipsis, descriptionInfo, tagHelper, completionContext, attributeCompletions); } + } - static void GetSnippetText( - ReadOnlySpan baseTextSpan, - RazorCompletionOptions razorCompletionOptions, - out ReadOnlySpan snippetTextSpan) + private static void AddParameterNameCompletions( + BoundAttributeDescriptor attribute, + ReadOnlySpan indexerAttributes, + DirectiveAttributeCompletionContext completionContext, + Dictionary attributeCompletions) + { + if (completionContext.InAttributeName && !attribute.IndexerNamePrefix.IsNullOrEmpty()) { - var suffixTextSpan = razorCompletionOptions.AutoInsertAttributeQuotes ? QuotedAttributeValueSnippet : UnquotedAttributeValueSnippet; - - var buffer = new char[baseTextSpan.Length + suffixTextSpan.Length]; - baseTextSpan.CopyTo(buffer); - suffixTextSpan.CopyTo(buffer.AsMemory()[baseTextSpan.Length..]); + // Don't add parameters on indexers in attribute name contexts + return; + } - snippetTextSpan = buffer.AsSpan(); + if (completionContext.InParameterName && !completionContext.CanSatisfyAttribute(attribute)) + { + // Don't add parameters when the selected attribute name can't satisfy the given attribute descriptor in parameter name contexts + return; } - static bool TryAddCompletion( - string attributeName, - BoundAttributeDescriptor boundAttributeDescriptor, - TagHelperDescriptor tagHelperDescriptor, - RazorCompletionOptions razorCompletionOptions, - string selectedAttributeName, - ImmutableArray attributes, - bool inSnippetContext, - Dictionary, ImmutableArray)> attributeCompletions) + // Add indexer parameter completions first so they display first in completion descriptions. + foreach (var indexerAttribute in indexerAttributes) { - if (selectedAttributeName != attributeName && - attributes.Any(attributeName, static (name, attributeName) => name == attributeName)) + var indexerNamePrefix = indexerAttribute.IndexerNamePrefix.AssumeNotNull(); + + if (!attribute.Name.StartsWith(indexerNamePrefix)) { - // Attribute is already present on this element and it is not the selected attribute. - // It shouldn't exist in the completion list. - return false; + continue; } - AddCompletion(attributeName, boundAttributeDescriptor, tagHelperDescriptor, razorCompletionOptions, inSnippetContext, attributeCompletions); - return true; + AddCompletionsForParameters(attribute, indexerAttribute.Parameters, completionContext, attributeCompletions); } - static void AddCompletion( - string attributeName, - BoundAttributeDescriptor boundAttributeDescriptor, - TagHelperDescriptor tagHelperDescriptor, - RazorCompletionOptions razorCompletionOptions, - bool inSnippetContext, - Dictionary, ImmutableArray)> attributeCompletions) + // Then add regular parameter completions + AddCompletionsForParameters(attribute, attribute.Parameters, completionContext, attributeCompletions); + + return; + + static void AddCompletionsForParameters( + BoundAttributeDescriptor attribute, + ImmutableArray parameters, + DirectiveAttributeCompletionContext completionContext, + Dictionary attributeCompletions) { - if (!attributeCompletions.TryGetValue(attributeName, out var attributeDetails)) + var tagHelper = attribute.Parent; + + foreach (var parameter in parameters) { - attributeDetails = ([], []); + if (completionContext.AlreadySatisfiesParameter(parameter, attribute)) + { + // There's already an existing attribute that satisfies this parameter, don't show it in the completion list. + continue; + } + + var displayName = completionContext.InParameterName + ? parameter.Name + : $"{attribute.Name}:{parameter.Name}"; + + AddParameterCompletion( + displayName, + descriptionInfo: BoundAttributeDescriptionInfo.From(parameter), + tagHelper, + completionContext, + attributeCompletions); } + } + } + + private static ImmutableArray CreateCompletionItems( + DirectiveAttributeCompletionContext completionContext, + Dictionary attributeCompletions) + { + using var completionItems = new PooledArrayBuilder(capacity: attributeCompletions.Count); - (var attributeDescriptions, var commitCharacters) = attributeDetails; + foreach (var (displayText, (kind, descriptions, commitCharacters)) in attributeCompletions) + { + var isIndexer = displayText.EndsWith(Ellipsis, StringComparison.Ordinal); + var isSnippet = !isIndexer && completionContext.UseSnippets; + var autoInsertAttributeQuotes = completionContext.Options.AutoInsertAttributeQuotes; - var indexerCompletion = attributeName.EndsWith("...", StringComparison.Ordinal); - var tagHelperTypeName = tagHelperDescriptor.TypeName; - var descriptionInfo = BoundAttributeDescriptionInfo.From(boundAttributeDescriptor, isIndexer: indexerCompletion, tagHelperTypeName); + var insertText = ComputeInsertText(displayText, isIndexer, isSnippet, autoInsertAttributeQuotes); - if (!attributeDescriptions.Contains(descriptionInfo)) - { - attributeDescriptions = attributeDescriptions.Add(descriptionInfo); - } + Debug.Assert(kind is RazorCompletionItemKind.DirectiveAttribute or RazorCompletionItemKind.DirectiveAttributeParameter); - // Verify not an indexer attribute, as those don't commit with standard chars - if (!indexerCompletion) - { - var equalsAdded = commitCharacters.Any(static c => c.Character == "="); - var spaceAdded = commitCharacters.Any(static c => c.Character == " "); - var colonAdded = commitCharacters.Any(static c => c.Character == ":"); + var razorCompletionItem = kind == RazorCompletionItemKind.DirectiveAttribute + ? RazorCompletionItem.CreateDirectiveAttribute(displayText, insertText, descriptionInfo: new(descriptions), commitCharacters, isSnippet) + : RazorCompletionItem.CreateDirectiveAttributeParameter(displayText, insertText, descriptionInfo: new(descriptions), commitCharacters, isSnippet); - // We don't add "=" as a commit character when using VSCode trigger characters. - equalsAdded |= !razorCompletionOptions.UseVsCodeCompletionCommitCharacters; + completionItems.Add(razorCompletionItem); + } - foreach (var boundAttribute in tagHelperDescriptor.BoundAttributes) - { - spaceAdded |= boundAttribute.IsBooleanProperty; - colonAdded |= boundAttribute.Parameters.Length > 0; + return completionItems.ToImmutableAndClear(); + } - if (spaceAdded && colonAdded) - { - break; - } - } + private static string ComputeInsertText(string displayText, bool isIndexer, bool isSnippet, bool autoInsertAttributeQuotes) + { + var originalInsertText = displayText.AsMemory(); - // Determine if we have a common commit character set - commitCharacters = (equalsAdded, spaceAdded, colonAdded, inSnippetContext) switch - { - (true, false, false, false) => EqualsCommitCharacters, - (true, false, true, false) => EqualsAndColonCommitCharacters, - (true, false, false, true) => SnippetEqualsCommitCharacters, - (true, false, true, true) => SnippetEqualsAndColonCommitCharacters, - _ => [] - }; - - if (commitCharacters.IsEmpty) + // Strip off the @ from the insertion text. This change is here to align the insertion text with the + // completion hooks into VS and VSCode. Basically, completion triggers when `@` is typed so we don't + // want to insert `@bind` because `@` already exists. + var insertText = originalInsertText.Span.StartsWith('@') + ? originalInsertText[1..] + : originalInsertText; + + // Indexer attribute, we don't want to insert with the triple dot. + if (isIndexer) + { + Debug.Assert(insertText.Span.EndsWith(Ellipsis, StringComparison.Ordinal)); + return insertText[..^3].ToString(); + } + + if (isSnippet) + { + var suffixText = autoInsertAttributeQuotes + ? QuotedAttributeValueSnippetSuffix + : UnquotedAttributeValueSnippetSuffix; + + // We are trying for snippet text only for non-indexer attributes, e.g. *not* something like "@bind-..." + return string.Create( + length: insertText.Length + suffixText.Length, + state: (insertText, suffixText), + static (destination, state) => { - if (equalsAdded) - { - commitCharacters = commitCharacters.Add(new("=", Insert: !inSnippetContext)); - } + var (insertText, suffixText) = state; - if (spaceAdded) - { - commitCharacters = commitCharacters.Add(new(" ")); - } + insertText.Span.CopyTo(destination); + suffixText.AsSpan().CopyTo(destination[insertText.Length..]); + }); + } - if (colonAdded) - { - commitCharacters = commitCharacters.Add(new(":")); - } - } + // Don't create another string unnecessarily, even though ReadOnlySpan.ToString() special-cases + // the string to avoid allocation. + return insertText.Span == originalInsertText.Span + ? displayText + : insertText.ToString(); + } + + private static bool TryAddAttributeCompletion( + string attributeName, + BoundAttributeDescriptionInfo descriptionInfo, + TagHelperDescriptor tagHelper, + DirectiveAttributeCompletionContext completionContext, + Dictionary attributeCompletions) + { + if (completionContext.SelectedAttributeName != attributeName && + completionContext.ExistingAttributes.Contains(attributeName)) + { + // Attribute is already present on this element and it is not the selected attribute. + // It shouldn't exist in the completion list. + return false; + } + + AddAttributeCompletion(attributeName, descriptionInfo, tagHelper, completionContext, attributeCompletions); + return true; + } + + private static void AddAttributeCompletion( + string attributeName, + BoundAttributeDescriptionInfo descriptionInfo, + TagHelperDescriptor tagHelper, + DirectiveAttributeCompletionContext completionContext, + Dictionary attributeCompletions) + => AddCompletion(RazorCompletionItemKind.DirectiveAttribute, + attributeName, descriptionInfo, tagHelper, completionContext, attributeCompletions); + + private static void AddParameterCompletion( + string attributeName, + BoundAttributeDescriptionInfo descriptionInfo, + TagHelperDescriptor tagHelper, + DirectiveAttributeCompletionContext completionContext, + Dictionary attributeCompletions) + => AddCompletion(RazorCompletionItemKind.DirectiveAttributeParameter, + attributeName, descriptionInfo, tagHelper, completionContext, attributeCompletions); + + private static void AddCompletion( + RazorCompletionItemKind kind, + string attributeName, + BoundAttributeDescriptionInfo descriptionInfo, + TagHelperDescriptor tagHelper, + DirectiveAttributeCompletionContext completionContext, + Dictionary attributeCompletions) + { + ImmutableArray descriptions; + ImmutableArray commitCharacters; + + if (attributeCompletions.TryGetValue(attributeName, out var existingDetails)) + { + (descriptions, commitCharacters) = existingDetails; + + if (!descriptions.Contains(descriptionInfo)) + { + descriptions = descriptions.Add(descriptionInfo); } + } + else + { + descriptions = [descriptionInfo]; + commitCharacters = []; + } - attributeCompletions[attributeName] = (attributeDescriptions, commitCharacters); + // Verify not an indexer attribute, as those don't commit with standard chars + if (!attributeName.EndsWith(Ellipsis, StringComparison.Ordinal)) + { + // We always add "=" as a commit character in Visual Studio. + var useEqualsCommit = !completionContext.Options.UseVsCodeCompletionCommitCharacters || + commitCharacters.Any(static c => c.Character == "="); + + var useSpaceCommit = commitCharacters.Any(static c => c.Character == " ") || + tagHelper.BoundAttributes.Any(static a => a.IsBooleanProperty); + + commitCharacters = DefaultCommitCharacters.Get(useEqualsCommit, useSpaceCommit, completionContext.UseSnippets); } + + attributeCompletions[attributeName] = new(kind, descriptions, commitCharacters); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeParameterCompletionItemProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeParameterCompletionItemProvider.cs deleted file mode 100644 index 3baea7f5008..00000000000 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeParameterCompletionItemProvider.cs +++ /dev/null @@ -1,127 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.CodeAnalysis.Razor.Tooltip; -using Microsoft.VisualStudio.Editor.Razor; - -namespace Microsoft.CodeAnalysis.Razor.Completion; - -internal class DirectiveAttributeParameterCompletionItemProvider : DirectiveAttributeCompletionItemProviderBase -{ - public override ImmutableArray GetCompletionItems(RazorCompletionContext context) - { - if (!context.SyntaxTree.Options.FileKind.IsComponent()) - { - // Directive attribute parameters are only supported in components - return []; - } - - var owner = context.Owner; - if (owner is null) - { - return []; - } - - if (!TryGetAttributeInfo(owner, out _, out var attributeName, out _, out var parameterName, out var parameterNameLocation)) - { - // Either we're not in an attribute or the attribute is so malformed that we can't provide proper completions. - return []; - } - - if (!parameterNameLocation.IntersectsWith(context.AbsoluteIndex)) - { - // We're trying to retrieve completions on a portion of the name that is not supported (such as the name, i.e., |@bind|:format). - return []; - } - - if (!TryGetElementInfo(owner.Parent.Parent, out var containingTagName, out var attributes)) - { - // This should never be the case, it means that we're operating on an attribute that doesn't have a tag. - return []; - } - - return GetAttributeParameterCompletions(attributeName, parameterName, containingTagName, attributes, context.TagHelperDocumentContext); - } - - // Internal for testing - internal static ImmutableArray GetAttributeParameterCompletions( - string attributeName, - string? parameterName, - string containingTagName, - ImmutableArray attributes, - TagHelperDocumentContext tagHelperDocumentContext) - { - var descriptorsForTag = TagHelperFacts.GetTagHelpersGivenTag(tagHelperDocumentContext, containingTagName, parentTag: null); - if (descriptorsForTag.Length == 0) - { - // If the current tag has no possible descriptors then we can't have any additional attributes. - return []; - } - - // Use ordinal dictionary because attributes are case sensitive when matching - using var _ = StringDictionaryPool>.Ordinal.GetPooledObject(out var attributeCompletions); - - foreach (var descriptor in descriptorsForTag) - { - foreach (var attributeDescriptor in descriptor.BoundAttributes) - { - var boundAttributeParameters = attributeDescriptor.Parameters; - if (boundAttributeParameters.Length == 0) - { - continue; - } - - if (TagHelperMatchingConventions.CanSatisfyBoundAttribute(attributeName, attributeDescriptor)) - { - foreach (var parameterDescriptor in boundAttributeParameters) - { - if (attributes.Any( - (parameterDescriptor, attributeDescriptor), - static (name, arg) => - TagHelperMatchingConventions.SatisfiesBoundAttributeWithParameter(arg.parameterDescriptor, name, arg.attributeDescriptor))) - { - // There's already an existing attribute that satisfies this parameter, don't show it in the completion list. - continue; - } - - if (!attributeCompletions.TryGetValue(parameterDescriptor.Name, out var attributeDescriptions)) - { - attributeDescriptions = []; - attributeCompletions[parameterDescriptor.Name] = attributeDescriptions; - } - - var tagHelperTypeName = descriptor.TypeName; - var descriptionInfo = BoundAttributeDescriptionInfo.From(parameterDescriptor, tagHelperTypeName); - attributeDescriptions.Add(descriptionInfo); - } - } - } - } - - using var completionItems = new PooledArrayBuilder(capacity: attributeCompletions.Count); - - foreach (var (displayText, value) in attributeCompletions) - { - if (displayText == parameterName) - { - // This completion is identical to the selected parameter, don't provide for completions for what's already - // present in the document. - continue; - } - - var razorCompletionItem = RazorCompletionItem.CreateDirectiveAttributeParameter( - displayText: displayText, - insertText: displayText, - descriptionInfo: new([.. value])); - - completionItems.Add(razorCompletionItem); - } - - return completionItems.ToImmutableAndClear(); - } -} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeTransitionCompletionItemProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeTransitionCompletionItemProvider.cs index b3d037849c3..c874fdd27ec 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeTransitionCompletionItemProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveAttributeTransitionCompletionItemProvider.cs @@ -7,12 +7,12 @@ using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Syntax; -using Microsoft.CodeAnalysis.Razor.Workspaces; +using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Text; namespace Microsoft.CodeAnalysis.Razor.Completion; -internal class DirectiveAttributeTransitionCompletionItemProvider(LanguageServerFeatureOptions languageServerFeatureOptions) : DirectiveAttributeCompletionItemProviderBase +internal class DirectiveAttributeTransitionCompletionItemProvider(IClientCapabilitiesService clientCapabilitiesService) : DirectiveAttributeCompletionItemProviderBase { private const string DisplayText = "@..."; private static readonly DirectiveCompletionDescription s_descriptionInfo = new(SR.Blazor_directive_attributes); @@ -35,7 +35,7 @@ public RazorCompletionItem TransitionCompletionItem // However, in VS Code explicit commit characters like these cause issues, e.g. "@..." gets committed when trying to type "/" in a // self-closing tag. So in VS Code we have SupportSoftSelectionInCompletion set to false and we will // use empty commit character set in that case. - commitCharacters: _languageServerFeatureOptions.SupportsSoftSelectionInCompletion ? RazorCommitCharacter.CreateArray(["@", "/", ">"]) : [], + commitCharacters: _clientCapabilitiesService.ClientCapabilities.SupportsVisualStudioExtensions ? RazorCommitCharacter.CreateArray(["@", "/", ">"]) : [], isSnippet: false); public static bool IsTransitionCompletionItem(RazorCompletionItem completionItem) @@ -47,7 +47,7 @@ public static bool IsTransitionCompletionItem(RazorCompletionItem completionItem private ImmutableArray Completions => _completions ??= [TransitionCompletionItem]; - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; + private readonly IClientCapabilitiesService _clientCapabilitiesService = clientCapabilitiesService; public override ImmutableArray GetCompletionItems(RazorCompletionContext context) { diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveCompletionDescription.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveCompletionDescription.cs index 3376012d7f0..c84af2a5ae7 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveCompletionDescription.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/DirectiveCompletionDescription.cs @@ -1,21 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; - namespace Microsoft.CodeAnalysis.Razor.Completion; -internal class DirectiveCompletionDescription : CompletionDescription +internal sealed class DirectiveCompletionDescription(string description) : CompletionDescription { - public override string Description { get; } - - public DirectiveCompletionDescription(string description) - { - if (description is null) - { - throw new ArgumentNullException(nameof(description)); - } - - Description = description; - } + public override string Description { get; } = description; } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/MarkupTransitionCompletionDescription.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/MarkupTransitionCompletionDescription.cs index d62c495dd5e..91cd25c54cc 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/MarkupTransitionCompletionDescription.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/MarkupTransitionCompletionDescription.cs @@ -1,21 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; - namespace Microsoft.CodeAnalysis.Razor.Completion; -internal class MarkupTransitionCompletionDescription : CompletionDescription +internal sealed class MarkupTransitionCompletionDescription(string description) : CompletionDescription { - public override string Description { get; } - - public MarkupTransitionCompletionDescription(string description) - { - if (description is null) - { - throw new ArgumentNullException(nameof(description)); - } - - Description = description; - } + public override string Description { get; } = description; } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItem.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItem.cs index 8e4717f15ff..e10ddb5336c 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItem.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItem.cs @@ -3,11 +3,13 @@ using System; using System.Collections.Immutable; +using System.Diagnostics; using Microsoft.AspNetCore.Razor; using Microsoft.CodeAnalysis.Razor.Tooltip; namespace Microsoft.CodeAnalysis.Razor.Completion; +[DebuggerDisplay($"{{{nameof(GetDebuggerDisplay)}(),nq}}")] internal sealed class RazorCompletionItem { public RazorCompletionItemKind Kind { get; } @@ -24,6 +26,9 @@ internal sealed class RazorCompletionItem public bool IsSnippet { get; } public TextEdit[]? AdditionalTextEdits { get; } + private string GetDebuggerDisplay() + => $"{Kind}: {DisplayText}"; + /// /// Creates a new Razor completion item /// @@ -74,8 +79,10 @@ public static RazorCompletionItem CreateDirectiveAttribute( public static RazorCompletionItem CreateDirectiveAttributeParameter( string displayText, string insertText, - AggregateBoundAttributeDescription descriptionInfo) - => new(RazorCompletionItemKind.DirectiveAttributeParameter, displayText, insertText, sortText: null, descriptionInfo, commitCharacters: [], isSnippet: false); + AggregateBoundAttributeDescription descriptionInfo, + ImmutableArray commitCharacters, + bool isSnippet) + => new(RazorCompletionItemKind.DirectiveAttributeParameter, displayText, insertText, sortText: null, descriptionInfo, commitCharacters, isSnippet); public static RazorCompletionItem CreateMarkupTransition( string displayText, string insertText, @@ -107,4 +114,9 @@ public static RazorCompletionItem CreateAttribute( AttributeDescriptionInfo descriptionInfo, ImmutableArray commitCharacters, bool isSnippet) => new(RazorCompletionItemKind.Attribute, displayText, insertText, sortText: null, descriptionInfo, commitCharacters, isSnippet); + + public static RazorCompletionItem CreateKeyword( + string displayText, string insertText, + ImmutableArray commitCharacters) + => new(RazorCompletionItemKind.CSharpRazorKeyword, displayText, insertText, sortText: null, new CSharpRazorKeywordCompletionDescription(displayText), commitCharacters, isSnippet: false); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItemKind.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItemKind.cs index 25bd967d9ff..e6825e76970 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItemKind.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItemKind.cs @@ -5,6 +5,7 @@ namespace Microsoft.CodeAnalysis.Razor.Completion; internal enum RazorCompletionItemKind { + CSharpRazorKeyword, Directive, DirectiveAttribute, DirectiveAttributeParameter, diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItemResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItemResolver.cs index ca657ccebee..92a6f2b889b 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItemResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionItemResolver.cs @@ -142,6 +142,15 @@ internal class RazorCompletionItemResolver : CompletionItemResolver .ConfigureAwait(false); } + break; + } + case RazorCompletionItemKind.CSharpRazorKeyword: + { + if (associatedRazorCompletion.DescriptionInfo is CSharpRazorKeywordCompletionDescription descriptionInfo) + { + completionItem.Documentation = descriptionInfo.Description; + } + break; } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionListProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionListProvider.cs index f1e4677e78f..cf1e3bf1920 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionListProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/RazorCompletionListProvider.cs @@ -276,6 +276,23 @@ internal static bool TryConvert( completionItem = attributeCompletionItem; return true; } + case RazorCompletionItemKind.CSharpRazorKeyword: + { + var csharpRazorKeywordCompletionItem = new VSInternalCompletionItem() + { + Label = razorCompletionItem.DisplayText, + InsertText = razorCompletionItem.InsertText, + FilterText = razorCompletionItem.DisplayText, + SortText = razorCompletionItem.SortText, + InsertTextFormat = insertTextFormat, + Kind = CompletionItemKind.Keyword, + }; + + csharpRazorKeywordCompletionItem.UseCommitCharactersFrom(razorCompletionItem, clientCapabilities); + + completionItem = csharpRazorKeywordCompletionItem; + return true; + } } completionItem = null; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/TagHelperCompletionProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/TagHelperCompletionProvider.cs index 11ec80c3498..1a51a0533e9 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/TagHelperCompletionProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/TagHelperCompletionProvider.cs @@ -114,9 +114,9 @@ private ImmutableArray GetAttributeCompletions( RazorCompletionOptions options) { var ancestors = containingAttribute.Parent.Ancestors(); - var nonDirectiveAttributeTagHelpers = tagHelperDocumentContext.TagHelpers.WhereAsArray( + var nonDirectiveAttributeTagHelpers = tagHelperDocumentContext.TagHelpers.Where( static tagHelper => !tagHelper.BoundAttributes.Any(static attribute => attribute.IsDirectiveAttribute)); - var filteredContext = TagHelperDocumentContext.Create(tagHelperDocumentContext.Prefix, nonDirectiveAttributeTagHelpers); + var filteredContext = TagHelperDocumentContext.GetOrCreate(tagHelperDocumentContext.Prefix, nonDirectiveAttributeTagHelpers); var (ancestorTagName, ancestorIsTagHelper) = TagHelperFacts.GetNearestAncestorTagInfo(ancestors); var attributeCompletionContext = new AttributeCompletionContext( filteredContext, diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/TagHelperCompletionService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/TagHelperCompletionService.cs index 35688f57f74..45853c1e04a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/TagHelperCompletionService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/TagHelperCompletionService.cs @@ -6,6 +6,7 @@ using System.Collections.Immutable; using System.Diagnostics; using System.Linq; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis.Razor.Workspaces; @@ -15,6 +16,9 @@ namespace Microsoft.CodeAnalysis.Razor.Completion; internal class TagHelperCompletionService : ITagHelperCompletionService { + private static readonly HashSetPool s_shortNameSetPool = + HashSetPool.Create(ShortNameToFullyQualifiedComparer.Instance); + private static readonly HashSet s_emptyHashSet = new(); // This API attempts to understand a users context as they're typing in a Razor file to provide TagHelper based attribute IntelliSense. @@ -29,10 +33,7 @@ internal class TagHelperCompletionService : ITagHelperCompletionService // BoundAttributeDescriptor. By doing this a user can see what C# type a TagHelper expects for the attribute. public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionContext completionContext) { - if (completionContext is null) - { - throw new ArgumentNullException(nameof(completionContext)); - } + ArgHelper.ThrowIfNull(completionContext); var attributeCompletions = completionContext.ExistingCompletions.ToDictionary( completion => completion, @@ -40,8 +41,8 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont StringComparer.OrdinalIgnoreCase); var documentContext = completionContext.DocumentContext; - var descriptorsForTag = TagHelperFacts.GetTagHelpersGivenTag(documentContext, completionContext.CurrentTagName, completionContext.CurrentParentTagName); - if (descriptorsForTag.Length == 0) + var tagHelpersForTag = TagHelperFacts.GetTagHelpersGivenTag(documentContext, completionContext.CurrentTagName, completionContext.CurrentParentTagName); + if (tagHelpersForTag.IsEmpty) { // If the current tag has no possible descriptors then we can't have any additional attributes. return AttributeCompletionResult.Create(attributeCompletions); @@ -59,9 +60,9 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont using var _ = HashSetPool.GetPooledObject(out var applicableDescriptors); - if (applicableTagHelperBinding is { Descriptors: var descriptors }) + if (applicableTagHelperBinding is { TagHelpers: var tagHelpers }) { - applicableDescriptors.UnionWith(descriptors); + applicableDescriptors.UnionWith(tagHelpers); } var unprefixedTagName = completionContext.CurrentTagName[prefix.Length..]; @@ -73,11 +74,11 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont attributeCompletions.Clear(); } - foreach (var descriptor in descriptorsForTag) + foreach (var tagHelper in tagHelpersForTag) { - if (applicableDescriptors.Contains(descriptor)) + if (applicableDescriptors.Contains(tagHelper)) { - foreach (var attributeDescriptor in descriptor.BoundAttributes) + foreach (var attributeDescriptor in tagHelper.BoundAttributes) { if (!attributeDescriptor.Name.IsNullOrEmpty()) { @@ -93,7 +94,7 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont else { var htmlNameToBoundAttribute = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (var attributeDescriptor in descriptor.BoundAttributes) + foreach (var attributeDescriptor in tagHelper.BoundAttributes) { if (attributeDescriptor.Name != null) { @@ -106,7 +107,7 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont } } - foreach (var rule in descriptor.TagMatchingRules) + foreach (var rule in tagHelper.TagMatchingRules) { foreach (var requiredAttribute in rule.Attributes) { @@ -152,10 +153,7 @@ void UpdateCompletions(string attributeName, BoundAttributeDescriptor? possibleD public ElementCompletionResult GetElementCompletions(ElementCompletionContext completionContext) { - if (completionContext is null) - { - throw new ArgumentNullException(nameof(completionContext)); - } + ArgHelper.ThrowIfNull(completionContext); var elementCompletions = new Dictionary>(StringComparer.Ordinal); @@ -170,11 +168,16 @@ public ElementCompletionResult GetElementCompletions(ElementCompletionContext co var tagAttributes = completionContext.Attributes; - var catchAllDescriptors = new HashSet(); + var catchAllTagHelpers = new HashSet(); var prefix = completionContext.DocumentContext.Prefix ?? string.Empty; - var possibleChildDescriptors = TagHelperFacts.GetTagHelpersGivenParent(completionContext.DocumentContext, completionContext.ContainingParentTagName); - possibleChildDescriptors = FilterFullyQualifiedCompletions(possibleChildDescriptors); - foreach (var possibleDescriptor in possibleChildDescriptors) + + var possibleChildTagHelpers = TagHelperFacts.GetTagHelpersGivenParent( + completionContext.DocumentContext, + completionContext.ContainingParentTagName); + + possibleChildTagHelpers = FilterFullyQualifiedTagHelpers(possibleChildTagHelpers); + + foreach (var possibleDescriptor in possibleChildTagHelpers) { var addRuleCompletions = false; var checkAttributeRules = true; @@ -182,14 +185,14 @@ public ElementCompletionResult GetElementCompletions(ElementCompletionContext co foreach (var rule in possibleDescriptor.TagMatchingRules) { - if (!TagHelperMatchingConventions.SatisfiesParentTag(rule, completionContext.ContainingParentTagName.AsSpanOrDefault())) + if (!TagHelperMatchingConventions.SatisfiesParentTag(rule, completionContext.ContainingParentTagName.AsSpan())) { continue; } if (rule.TagName == TagHelperMatchingConventions.ElementCatchAllName) { - catchAllDescriptors.Add(possibleDescriptor); + catchAllTagHelpers.Add(possibleDescriptor); } else if (elementCompletions.ContainsKey(rule.TagName)) { @@ -233,19 +236,16 @@ public ElementCompletionResult GetElementCompletions(ElementCompletionContext co // We needed to track all catch-alls and update their completions after all other completions have been completed. // This way, any TagHelper added completions will also have catch-alls listed under their entries. - foreach (var catchAllDescriptor in catchAllDescriptors) + foreach (var catchAllTagHelper in catchAllTagHelpers) { - foreach (var kvp in elementCompletions) + foreach (var (completionTagName, completionTagHelpers) in elementCompletions) { - var completionTagName = kvp.Key; - var tagHelperDescriptors = kvp.Value; - - if (tagHelperDescriptors.Count > 0 || + if (completionTagHelpers.Count > 0 || (!string.IsNullOrEmpty(prefix) && completionTagName.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))) { // The current completion either has other TagHelper's associated with it or is prefixed with a non-empty // TagHelper prefix. - UpdateCompletions(completionTagName, catchAllDescriptor, elementCompletions, tagHelperDescriptors); + UpdateCompletions(completionTagName, catchAllTagHelper, elementCompletions, completionTagHelpers); } } } @@ -303,17 +303,17 @@ private void AddAllowedChildrenCompletions( return; } - foreach (var descriptor in binding.Descriptors) + foreach (var tagHelper in binding.TagHelpers) { - foreach (var childTag in descriptor.AllowedChildTags) + foreach (var childTag in tagHelper.AllowedChildTags) { var prefixedName = string.Concat(prefix, childTag.Name); - var descriptors = TagHelperFacts.GetTagHelpersGivenTag( + var tagHelpersForTag = TagHelperFacts.GetTagHelpersGivenTag( completionContext.DocumentContext, prefixedName, completionContext.ContainingParentTagName); - if (descriptors.Length == 0) + if (tagHelpersForTag.IsEmpty) { if (!elementCompletions.ContainsKey(prefixedName)) { @@ -329,47 +329,33 @@ private void AddAllowedChildrenCompletions( elementCompletions[prefixedName] = existingRuleDescriptors; } - existingRuleDescriptors.AddRange(descriptors); + existingRuleDescriptors.UnionWith(tagHelpersForTag); } } } - private static ImmutableArray FilterFullyQualifiedCompletions(ImmutableArray possibleChildDescriptors) + private static TagHelperCollection FilterFullyQualifiedTagHelpers(TagHelperCollection tagHelpers) { - // Iterate once through the list to tease apart fully qualified and short name TagHelpers - using var fullyQualifiedTagHelpers = new PooledArrayBuilder(); - var shortNameTagHelpers = new HashSet(ShortNameToFullyQualifiedComparer.Instance); - - foreach (var descriptor in possibleChildDescriptors) - { - if (descriptor.IsFullyQualifiedNameMatch) - { - fullyQualifiedTagHelpers.Add(descriptor); - } - else - { - shortNameTagHelpers.Add(descriptor); - } - } + // We want to filter 'tagHelpers' and remove any tag helpers that require a fully-qualified name match + // but have a short name match present. - // Re-combine the short named & fully qualified TagHelpers but filter out any fully qualified TagHelpers that have a short - // named representation already. - using var filteredList = new PooledArrayBuilder(capacity: shortNameTagHelpers.Count); - filteredList.AddRange(shortNameTagHelpers); + // First, collect all "short name" tag helpers, i.e. those that do not require a fully qualified name match. + using var _ = s_shortNameSetPool.GetPooledObject(out var shortNameSet); - foreach (var fullyQualifiedTagHelper in fullyQualifiedTagHelpers) + foreach (var tagHelper in tagHelpers) { - if (!shortNameTagHelpers.Contains(fullyQualifiedTagHelper)) + if (!tagHelper.IsFullyQualifiedNameMatch) { - // Unimported completion item that isn't represented in a short named form. - filteredList.Add(fullyQualifiedTagHelper); - } - else - { - // There's already a shortname variant of this item, don't include it. + shortNameSet.Add(tagHelper); } } - return filteredList.ToImmutableAndClear(); + return tagHelpers.Where(shortNameSet, static (tagHelper, shortNameSet) => + { + // We want to keep tag helpers that either: + // 1. Do not require a fully qualified name match (i.e., short name tag helpers). + // 2. Are fully qualified tag helpers that do not have a corresponding short name tag helper. + return !tagHelper.IsFullyQualifiedNameMatch || !shortNameSet.Contains(tagHelper); + }); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentExcerpt/DocumentExcerptHelper.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentExcerpt/DocumentExcerptHelper.cs new file mode 100644 index 00000000000..7bc06100f2e --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentExcerpt/DocumentExcerptHelper.cs @@ -0,0 +1,176 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Immutable; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.CodeAnalysis.Classification; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.Razor.DocumentExcerpt; + +internal static class DocumentExcerptHelper +{ + public static async Task.Builder> ClassifyPreviewAsync( + TextSpan excerptSpan, + Document generatedDocument, + ImmutableArray mappings, + RazorClassificationOptionsWrapper options, + CancellationToken cancellationToken) + { + var builder = ImmutableArray.CreateBuilder(); + + var sorted = mappings.Sort((x, y) => x.OriginalSpan.AbsoluteIndex.CompareTo(y.OriginalSpan.AbsoluteIndex)); + + // The algorithm here is to iterate through the source mappings (sorted) and use the C# classifier + // on the spans that are known to be C#. For the spans that are not known to be C# then + // we just treat them as text since we'd don't currently have our own classifications. + + var remainingSpan = excerptSpan; + foreach (var span in sorted) + { + if (excerptSpan.Length == 0) + { + break; + } + + var primarySpan = span.OriginalSpan.AsTextSpan(); + if (primarySpan.Intersection(remainingSpan) is not TextSpan intersection) + { + // This span is outside the area we're interested in. + continue; + } + + // OK this span intersects with the excerpt span, so we will process it. Let's compute + // the secondary span that matches the intersection. + var secondarySpan = span.GeneratedSpan.AsTextSpan(); + secondarySpan = new TextSpan(secondarySpan.Start + intersection.Start - primarySpan.Start, intersection.Length); + primarySpan = intersection; + + if (remainingSpan.Start < primarySpan.Start) + { + // The position is before the next C# span. Classify everything up to the C# start + // as text. + builder.Add(new ClassifiedSpan(ClassificationTypeNames.Text, new TextSpan(remainingSpan.Start, primarySpan.Start - remainingSpan.Start))); + + // Advance to the start of the C# span. + remainingSpan = new TextSpan(primarySpan.Start, remainingSpan.Length - (primarySpan.Start - remainingSpan.Start)); + } + + // We should be able to process this whole span as C#, so classify it. + // + // However, we'll have to translate it to the the generated document's coordinates to do that. + Debug.Assert(remainingSpan.Contains(primarySpan) && remainingSpan.Start == primarySpan.Start); + var classifiedSecondarySpans = await RazorClassifierAccessor.GetClassifiedSpansAsync( + generatedDocument, + secondarySpan, + options, + cancellationToken).ConfigureAwait(false); + + // NOTE: The Classifier will only returns spans for things that it understands. That means + // that whitespace is not classified. The preview expects us to provide contiguous spans, + // so we are going to have to fill in the gaps. + + // Now we have to translate back to the primary document's coordinates. + var offset = primarySpan.Start - secondarySpan.Start; + foreach (var classifiedSecondarySpan in classifiedSecondarySpans) + { + // It's possible for the classified span to extend past our secondary span, so we cap it + var classifiedSpan = classifiedSecondarySpan.TextSpan.End > secondarySpan.End + ? TextSpan.FromBounds(classifiedSecondarySpan.TextSpan.Start, secondarySpan.End) + : classifiedSecondarySpan.TextSpan; + Debug.Assert(secondarySpan.Contains(classifiedSpan)); + + var updated = new TextSpan(classifiedSpan.Start + offset, classifiedSpan.Length); + Debug.Assert(primarySpan.Contains(updated)); + + // Make sure that we're not introducing a gap. Remember, we need to fill in the whitespace. + if (remainingSpan.Start < updated.Start) + { + builder.Add(new ClassifiedSpan( + ClassificationTypeNames.Text, + new TextSpan(remainingSpan.Start, updated.Start - remainingSpan.Start))); + remainingSpan = new TextSpan(updated.Start, remainingSpan.Length - (updated.Start - remainingSpan.Start)); + } + + builder.Add(new ClassifiedSpan(classifiedSecondarySpan.ClassificationType, updated)); + remainingSpan = new TextSpan(updated.End, remainingSpan.Length - (updated.End - remainingSpan.Start)); + } + + // Make sure that we're not introducing a gap. Remember, we need to fill in the whitespace. + if (remainingSpan.Start < primarySpan.End) + { + builder.Add(new ClassifiedSpan( + ClassificationTypeNames.Text, + new TextSpan(remainingSpan.Start, primarySpan.End - remainingSpan.Start))); + remainingSpan = new TextSpan(primarySpan.End, remainingSpan.Length - (primarySpan.End - remainingSpan.Start)); + } + } + + // Deal with residue + if (remainingSpan.Length > 0) + { + // Trailing Razor/markup text. + builder.Add(new ClassifiedSpan(ClassificationTypeNames.Text, remainingSpan)); + } + + return builder; + } + + public static TextSpan ChooseExcerptSpan(SourceText text, TextSpan span, RazorExcerptMode mode) + { + var startLine = text.Lines.GetLineFromPosition(span.Start); + var endLine = text.Lines.GetLineFromPosition(span.End); + + if (mode == RazorExcerptMode.Tooltip) + { + // Expand the range by 3 in each direction (if possible). + var startIndex = Math.Max(startLine.LineNumber - 3, 0); + startLine = text.Lines[startIndex]; + + var endIndex = Math.Min(endLine.LineNumber + 3, text.Lines.Count - 1); + endLine = text.Lines[endIndex]; + return CreateTextSpan(startLine, endLine); + } + else + { + // Trim leading whitespace in a single line excerpt + var excerptSpan = CreateTextSpan(startLine, endLine); + var trimmedExcerptSpan = excerptSpan.TrimLeadingWhitespace(text); + return trimmedExcerptSpan; + } + + static TextSpan CreateTextSpan(TextLine startLine, TextLine endLine) + { + return new TextSpan(startLine.Start, endLine.End - startLine.Start); + } + } + + public static SourceText GetTranslatedExcerptText( + SourceText razorDocumentText, + ref TextSpan razorDocumentSpan, + ref TextSpan excerptSpan, + ImmutableArray.Builder classifiedSpans) + { + // Now translate everything to be relative to the excerpt + var offset = 0 - excerptSpan.Start; + var excerptText = razorDocumentText.GetSubText(excerptSpan); + excerptSpan = new TextSpan(0, excerptSpan.Length); + razorDocumentSpan = new TextSpan(razorDocumentSpan.Start + offset, razorDocumentSpan.Length); + + for (var i = 0; i < classifiedSpans.Count; i++) + { + var classifiedSpan = classifiedSpans[i]; + var updated = new TextSpan(classifiedSpan.TextSpan.Start + offset, classifiedSpan.TextSpan.Length); + Debug.Assert(excerptSpan.Contains(updated)); + + classifiedSpans[i] = new ClassifiedSpan(classifiedSpan.ClassificationType, updated); + } + + return excerptText; + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/AbstractDocumentMappingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/AbstractDocumentMappingService.cs index 4d3ad34a23b..062ed5683a3 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/AbstractDocumentMappingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/AbstractDocumentMappingService.cs @@ -226,13 +226,13 @@ public bool TryMapToCSharpDocumentRange(RazorCSharpDocument csharpDocument, Line } if (!sourceText.TryGetAbsoluteIndex(range.Start, out var startIndex) || - !TryMapToCSharpDocumentPosition(csharpDocument, startIndex, out var generatedRangeStart, out var _)) + !TryMapToCSharpDocumentPosition(csharpDocument, startIndex, out var generatedRangeStart, out _)) { return false; } if (!sourceText.TryGetAbsoluteIndex(range.End, out var endIndex) || - !TryMapToCSharpDocumentPosition(csharpDocument, endIndex, out var generatedRangeEnd, out var _)) + !TryMapToCSharpDocumentPosition(csharpDocument, endIndex, out var generatedRangeEnd, out _)) { return false; } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/AbstractEditMappingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/AbstractEditMappingService.cs index cc860e67758..7cd07247ab5 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/AbstractEditMappingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/AbstractEditMappingService.cs @@ -7,138 +7,117 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis.Razor.ProjectSystem; +using Microsoft.CodeAnalysis.Razor.Protocol; +using Microsoft.CodeAnalysis.Razor.Telemetry; using Microsoft.CodeAnalysis.Razor.Workspaces; +using Microsoft.CodeAnalysis.Text; namespace Microsoft.CodeAnalysis.Razor.DocumentMapping; internal abstract class AbstractEditMappingService( IDocumentMappingService documentMappingService, + ITelemetryReporter telemetryReporter, IFilePathService filePathService) : IEditMappingService { private readonly IDocumentMappingService _documentMappingService = documentMappingService; + private readonly ITelemetryReporter _telemetryReporter = telemetryReporter; private readonly IFilePathService _filePathService = filePathService; - public async Task RemapWorkspaceEditAsync(IDocumentSnapshot contextDocumentSnapshot, WorkspaceEdit workspaceEdit, CancellationToken cancellationToken) + public async Task MapWorkspaceEditAsync(IDocumentSnapshot contextDocumentSnapshot, WorkspaceEdit workspaceEdit, CancellationToken cancellationToken) { - if (workspaceEdit.TryGetTextDocumentEdits(out var documentEdits)) + if (workspaceEdit.DocumentChanges is not null) { - // The LSP spec says, we should prefer `DocumentChanges` property over `Changes` if available. - var remappedEdits = await RemapTextDocumentEditsAsync(contextDocumentSnapshot, documentEdits, cancellationToken).ConfigureAwait(false); - - return new WorkspaceEdit() + using var builder = new PooledArrayBuilder>(); + foreach (var edit in workspaceEdit.EnumerateEdits()) { - DocumentChanges = remappedEdits - }; + if (edit.TryGetFirst(out var textDocumentEdit)) + { + await MapTextDocumentEditAsync(contextDocumentSnapshot, textDocumentEdit, cancellationToken).ConfigureAwait(false); + if (textDocumentEdit.Edits.Length == 0) + { + continue; + } + } + + builder.Add(edit); + } + + workspaceEdit.DocumentChanges = builder.ToArrayAndClear(); } if (workspaceEdit.Changes is { } changeMap) { - var remappedEdits = await RemapDocumentEditsAsync(contextDocumentSnapshot, changeMap, cancellationToken).ConfigureAwait(false); - - return new WorkspaceEdit() - { - Changes = remappedEdits - }; + workspaceEdit.Changes = await MapDocumentEditsAsync(contextDocumentSnapshot, changeMap, cancellationToken).ConfigureAwait(false); } - - return workspaceEdit; } - private async Task> RemapDocumentEditsAsync(IDocumentSnapshot contextDocumentSnapshot, Dictionary changes, CancellationToken cancellationToken) + private async Task MapTextDocumentEditAsync(IDocumentSnapshot contextDocumentSnapshot, TextDocumentEdit entry, CancellationToken cancellationToken) { - var remappedChanges = new Dictionary(capacity: changes.Count); + var generatedDocumentUri = entry.TextDocument.DocumentUri.GetRequiredParsedUri(); - foreach (var (uriString, edits) in changes) + // For Html we just map the Uri, the range will be the same + if (_filePathService.IsVirtualHtmlFile(generatedDocumentUri)) { - var generatedDocumentUri = new Uri(uriString); - - // For Html we just map the Uri, the range will be the same - if (_filePathService.IsVirtualHtmlFile(generatedDocumentUri)) - { - var razorUri = _filePathService.GetRazorDocumentUri(generatedDocumentUri); - remappedChanges[razorUri.AbsoluteUri] = edits; - } - - // Check if the edit is actually for a generated document, because if not we don't need to do anything - if (!_filePathService.IsVirtualCSharpFile(generatedDocumentUri)) - { - remappedChanges[uriString] = edits; - continue; - } - - var razorDocumentUri = await GetRazorDocumentUriAsync(contextDocumentSnapshot, generatedDocumentUri, cancellationToken).ConfigureAwait(false); - if (razorDocumentUri is null) - { - continue; - } - - if (!TryGetDocumentContext(contextDocumentSnapshot, razorDocumentUri, projectContext: null, out var documentContext)) - { - continue; - } - - var codeDocument = await documentContext.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); - var remappedEdits = RemapTextEditsCore(codeDocument.GetRequiredCSharpDocument(), edits); - if (remappedEdits.Length == 0) + var razorUri = _filePathService.GetRazorDocumentUri(generatedDocumentUri); + entry.TextDocument = new OptionalVersionedTextDocumentIdentifier() { - // Nothing to do. - continue; - } - - remappedChanges[razorDocumentUri.AbsoluteUri] = remappedEdits; + DocumentUri = new(razorUri), + }; + return; } - return remappedChanges; - } - - private TextEdit[] RemapTextEditsCore(RazorCSharpDocument csharpDocument, TextEdit[] edits) - { - using var remappedEdits = new PooledArrayBuilder(edits.Length); + // Check if the edit is actually for a generated document, because if not we don't need to do anything + if (!_filePathService.IsVirtualCSharpFile(generatedDocumentUri)) + { + // This location doesn't point to a background razor file. No need to map. + return; + } - foreach (var edit in edits) + var razorDocumentUri = await GetRazorDocumentUriAsync(contextDocumentSnapshot, generatedDocumentUri, cancellationToken).ConfigureAwait(false); + if (razorDocumentUri is null) { - var generatedRange = edit.Range; - if (!_documentMappingService.TryMapToRazorDocumentRange(csharpDocument, generatedRange, MappingBehavior.Strict, out var hostDocumentRange)) - { - // Can't map range. Discard this edit. - continue; - } + return; + } - var remappedEdit = LspFactory.CreateTextEdit(hostDocumentRange, edit.NewText); - remappedEdits.Add(remappedEdit); + if (!TryGetDocumentContext(contextDocumentSnapshot, razorDocumentUri, entry.TextDocument.GetProjectContext(), out var documentContext)) + { + return; } - return remappedEdits.ToArray(); + // entry.Edits is SumType but AnnotatedTextEdit inherits from TextEdit, so we can just cast + var mappedEdits = await GetMappedTextEditsAsync(documentContext, [.. entry.Edits.Select(static e => (TextEdit)e)], cancellationToken).ConfigureAwait(false); + + // Update the entry in-place + entry.TextDocument = new OptionalVersionedTextDocumentIdentifier() + { + DocumentUri = new(razorDocumentUri), + }; + entry.Edits = [.. mappedEdits.Select(static e => new SumType(e))]; } - private async Task RemapTextDocumentEditsAsync(IDocumentSnapshot contextDocumentSnapshot, TextDocumentEdit[] documentEdits, CancellationToken cancellationToken) + private async Task> MapDocumentEditsAsync(IDocumentSnapshot contextDocumentSnapshot, Dictionary changes, CancellationToken cancellationToken) { - using var remappedDocumentEdits = new PooledArrayBuilder(documentEdits.Length); + var mappedChanges = new Dictionary(capacity: changes.Count); - foreach (var entry in documentEdits) + foreach (var (uriString, edits) in changes) { - var generatedDocumentUri = entry.TextDocument.DocumentUri.GetRequiredParsedUri(); + var generatedDocumentUri = new Uri(uriString); // For Html we just map the Uri, the range will be the same if (_filePathService.IsVirtualHtmlFile(generatedDocumentUri)) { var razorUri = _filePathService.GetRazorDocumentUri(generatedDocumentUri); - entry.TextDocument = new OptionalVersionedTextDocumentIdentifier() - { - DocumentUri = new(razorUri), - }; - remappedDocumentEdits.Add(entry); - continue; + mappedChanges[razorUri.AbsoluteUri] = edits; } // Check if the edit is actually for a generated document, because if not we don't need to do anything if (!_filePathService.IsVirtualCSharpFile(generatedDocumentUri)) { - // This location doesn't point to a background razor file. No need to remap. - remappedDocumentEdits.Add(entry); + mappedChanges[uriString] = edits; continue; } @@ -148,32 +127,38 @@ private async Task RemapTextDocumentEditsAsync(IDocumentSnap continue; } - if (!TryGetDocumentContext(contextDocumentSnapshot, razorDocumentUri, entry.TextDocument.GetProjectContext(), out var documentContext)) + if (!TryGetDocumentContext(contextDocumentSnapshot, razorDocumentUri, projectContext: null, out var documentContext)) { continue; } - var codeDocument = await documentContext.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); - - // entry.Edits is SumType but AnnotatedTextEdit inherits from TextEdit, so we can just cast - var remappedEdits = RemapTextEditsCore(codeDocument.GetRequiredCSharpDocument(), [.. entry.Edits.Select(static e => (TextEdit)e)]); - if (remappedEdits.Length == 0) + var mappedEdits = await GetMappedTextEditsAsync(documentContext, edits, cancellationToken).ConfigureAwait(false); + if (mappedEdits.Length == 0) { // Nothing to do. continue; } - remappedDocumentEdits.Add(new() - { - TextDocument = new OptionalVersionedTextDocumentIdentifier() - { - DocumentUri = new(razorDocumentUri), - }, - Edits = [.. remappedEdits.Select(static e => new SumType(e))] - }); + mappedChanges[razorDocumentUri.AbsoluteUri] = mappedEdits; } - return remappedDocumentEdits.ToArray(); + return mappedChanges; + } + + private async Task GetMappedTextEditsAsync(DocumentContext documentContext, TextEdit[] edits, CancellationToken cancellationToken) + { + var codeDocument = await documentContext.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); + + var razorSourceText = codeDocument.Source.Text; + var csharpSourceText = codeDocument.GetCSharpSourceText(); + var textChanges = edits.SelectAsArray(e => new RazorTextChange + { + Span = csharpSourceText.GetTextSpan(e.Range).ToRazorTextSpan(), + NewText = e.NewText, + }); + var mappedEdits = await RazorEditHelper.MapCSharpEditsAsync(textChanges, documentContext.Snapshot, _documentMappingService, _telemetryReporter, cancellationToken).ConfigureAwait(false); + + return [.. mappedEdits.Select(e => LspFactory.CreateTextEdit(razorSourceText.GetLinePositionSpan(e.Span.ToTextSpan()), e.NewText.AssumeNotNull()))]; } protected abstract bool TryGetDocumentContext(IDocumentSnapshot contextDocumentSnapshot, Uri razorDocumentUri, VSProjectContext? projectContext, [NotNullWhen(true)] out DocumentContext? documentContext); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/IEditMappingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/IEditMappingService.cs index 7bf72b21ec0..fc4476128b2 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/IEditMappingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/IEditMappingService.cs @@ -9,5 +9,8 @@ namespace Microsoft.CodeAnalysis.Razor.DocumentMapping; internal interface IEditMappingService { - Task RemapWorkspaceEditAsync(IDocumentSnapshot contextDocumentSnapshot, WorkspaceEdit workspaceEdit, CancellationToken cancellationToken); + /// + /// Maps C# changes in a workspace edit, to their equivalent Razor changes, modifying them in place + /// + Task MapWorkspaceEditAsync(IDocumentSnapshot contextDocumentSnapshot, WorkspaceEdit workspaceEdit, CancellationToken cancellationToken); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/RazorEditHelper.TextChangeBuilder.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/RazorEditHelper.TextChangeBuilder.cs index 62860a425cb..948417643f0 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/RazorEditHelper.TextChangeBuilder.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/RazorEditHelper.TextChangeBuilder.cs @@ -16,7 +16,6 @@ using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Text; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.CodeAnalysis.Razor.DocumentMapping; @@ -24,7 +23,7 @@ internal static partial class RazorEditHelper { private sealed class TextChangeBuilder : IDisposable { - private ObjectPool.Builder> Pool => ArrayBuilderPool.Default; + private static ArrayBuilderPool Pool => ArrayBuilderPool.Default; private readonly ImmutableArray.Builder _builder; private readonly IDocumentMappingService _documentMappingService; @@ -86,6 +85,23 @@ public void AddDirectlyMappedEdits(ImmutableArray csharpEdits, NewText = edit.NewText }; _builder.Add(mappedEdit); + + if (node is BaseMarkupStartTagSyntax startTagSyntax && + startTagSyntax.GetEndTag() is { } endTag) + { + // We are changing a start tag, and so we have a matching end tag. We have to translate the edit over there too + // as we only map the start tag, but if they got out of sync that would be bad. + var endTagEdit = new RazorTextChange() + { + Span = new RazorTextSpan() + { + Start = mappedSpan.Start + (endTag.Name.SpanStart - startTagSyntax.Name.SpanStart), + Length = mappedSpan.Length + }, + NewText = edit.NewText + }; + _builder.Add(endTagEdit); + } } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/RazorEditHelper.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/RazorEditHelper.cs index fe4200d3c04..df8d9b5e3e6 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/RazorEditHelper.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/RazorEditHelper.cs @@ -20,7 +20,7 @@ namespace Microsoft.CodeAnalysis.Razor.DocumentMapping; internal static partial class RazorEditHelper { - internal static bool TryGetMappedSpans(TextSpan span, SourceText source, RazorCSharpDocument output, out LinePositionSpan linePositionSpan, out TextSpan mappedSpan) + internal static bool TryGetMappedSpan(TextSpan span, SourceText source, RazorCSharpDocument output, out LinePositionSpan linePositionSpan, out TextSpan mappedSpan) { foreach (var mapping in output.SourceMappings) { diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/CSharpSyntaxNodeExtensions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/CSharpSyntaxNodeExtensions.cs new file mode 100644 index 00000000000..7ceebbb4c42 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/CSharpSyntaxNodeExtensions.cs @@ -0,0 +1,62 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.Razor.Workspaces; + +internal static class CSharpSyntaxNodeExtensions +{ + extension(SyntaxNode node) + { + internal bool IsStringLiteral(bool multilineOnly = false) + { + if (node is not (InterpolatedStringTextSyntax or LiteralExpressionSyntax + { + RawKind: (int)SyntaxKind.StringLiteralExpression or (int)SyntaxKind.Utf8StringLiteralExpression + })) + { + return false; + } + + if (!multilineOnly) + { + return true; + } + + var sourceText = node.SyntaxTree.GetText(); + + return sourceText.GetLinePositionSpan(node.Span).SpansMultipleLines(); + } + + /// + /// Attempts to retrieve the first class declaration from the current syntax node, if present. + /// + /// + /// This method only supports the known shape of the Razor compiler generated C# source and should + /// not be used for arbitrary C# syntax trees + /// + internal bool TryGetClassDeclaration([NotNullWhen(true)] out ClassDeclarationSyntax? classDeclaration) + { + // Since we know how the compiler generates the C# source we can be a little specific here, and avoid + // long tree walks. If the compiler ever changes how they generate their code, the tests for this will break + // so we'll know about it. + + classDeclaration = node switch + { + CompilationUnitSyntax unit => unit switch + { + { Members: [NamespaceDeclarationSyntax { Members: [ClassDeclarationSyntax c, ..] }, ..] } => c, + { Members: [ClassDeclarationSyntax c, ..] } => c, + _ => null, + }, + _ => null, + }; + + return classDeclaration is not null; + } + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_WorkspaceEdit.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_WorkspaceEdit.cs index 438bb623fe4..dc6b7d7432b 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_WorkspaceEdit.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_WorkspaceEdit.cs @@ -1,40 +1,99 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Diagnostics.CodeAnalysis; +using System.Collections.Generic; +using System.Linq; using Microsoft.AspNetCore.Razor.PooledObjects; namespace Roslyn.LanguageServer.Protocol; internal static partial class LspExtensions { - public static bool TryGetTextDocumentEdits(this WorkspaceEdit workspaceEdit, [NotNullWhen(true)] out TextDocumentEdit[]? textDocumentEdits) + /// + /// Enumerates the objects from the property. + /// + /// + /// WARNING: This method only yields objects. If the + /// contains , , or operations, + /// they will NOT be included. Be careful not to create a new with just the + /// results of this method, as doing so would lose those operations and could lead to data loss. + /// + public static IEnumerable EnumerateTextDocumentEdits(this WorkspaceEdit workspaceEdit) { if (workspaceEdit.DocumentChanges?.Value is TextDocumentEdit[] documentEdits) { - textDocumentEdits = documentEdits; - return true; + foreach (var edit in documentEdits) + { + yield return edit; + } } - - if (workspaceEdit.DocumentChanges?.Value is SumType[] sumTypeArray) + else if (workspaceEdit.DocumentChanges?.Value is SumType[] sumTypeArray) { - using var builder = new PooledArrayBuilder(); foreach (var sumType in sumTypeArray) { if (sumType.Value is TextDocumentEdit textDocumentEdit) { - builder.Add(textDocumentEdit); + yield return textDocumentEdit; } } + } + } - if (builder.Count > 0) + public static IEnumerable> EnumerateEdits(this WorkspaceEdit workspaceEdit) + { + if (workspaceEdit.DocumentChanges?.Value is TextDocumentEdit[] documentEdits) + { + foreach (var edit in documentEdits) { - textDocumentEdits = builder.ToArray(); - return true; + yield return edit; } } + else if (workspaceEdit.DocumentChanges?.Value is SumType[] sumTypeArray) + { + foreach (var edit in sumTypeArray) + { + yield return edit; + } + } + } + + public static WorkspaceEdit Concat(this WorkspaceEdit first, WorkspaceEdit second) + { + using var builder = new PooledArrayBuilder>(); - textDocumentEdits = null; - return false; + AddEdits(ref builder.AsRef(), first); + AddEdits(ref builder.AsRef(), second); + + return new WorkspaceEdit + { + DocumentChanges = builder.ToArrayAndClear() + }; + + static void AddEdits(ref PooledArrayBuilder> builder, WorkspaceEdit edit) + { + if (edit.DocumentChanges?.Value is TextDocumentEdit[] documentEdits) + { + foreach (var e in documentEdits) + { + builder.Add(e); + } + } + else if (edit.DocumentChanges?.Value is SumType[] sumTypeArray) + { + builder.AddRange(sumTypeArray); + } + else if (edit.Changes is not null) + { + foreach (var (uri, textEdits) in edit.Changes) + { + var textDocumentEdit = new TextDocumentEdit + { + TextDocument = new OptionalVersionedTextDocumentIdentifier { DocumentUri = new(uri) }, + Edits = [.. textEdits.Select(te => (SumType)te)] + }; + builder.Add(new SumType(textDocumentEdit)); + } + } + } } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/ProjectExtensions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/ProjectExtensions.cs index 967f55a17d7..7c66e1cf826 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/ProjectExtensions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/ProjectExtensions.cs @@ -2,44 +2,31 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Buffers; using System.Collections.Immutable; -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.AspNetCore.Razor.Threading; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor; -using Microsoft.CodeAnalysis.Razor.Telemetry; using Microsoft.NET.Sdk.Razor.SourceGenerators; namespace Microsoft.CodeAnalysis; internal static class ProjectExtensions { - private const string GetTagHelpersEventName = "taghelperresolver/gettaghelpers"; - private const string PropertySuffix = ".elapsedtimems"; - /// /// Gets the available tag helpers from the specified /// using the given . /// - /// - /// A telemetry event will be reported to . - /// - public static async ValueTask> GetTagHelpersAsync( + public static async ValueTask GetTagHelpersAsync( this Project project, RazorProjectEngine projectEngine, - ITelemetryReporter telemetryReporter, CancellationToken cancellationToken) { - var providers = GetTagHelperDescriptorProviders(projectEngine); - - if (providers is []) + if (!projectEngine.Engine.TryGetFeature(out ITagHelperDiscoveryService? discoveryService)) { return []; } @@ -50,42 +37,16 @@ public static async ValueTask> GetTagHelpers return []; } - using var pooledHashSet = HashSetPool.GetPooledObject(out var results); - using var pooledWatch = StopwatchPool.GetPooledObject(out var watch); - using var pooledSpan = ArrayPool.Shared.GetPooledArraySpan(minimumLength: providers.Length, out var properties); - - var context = new TagHelperDescriptorProviderContext(compilation, results) - { - ExcludeHidden = true, - IncludeDocumentation = true - }; - - var writeProperties = properties; - - foreach (var provider in providers) - { - watch.Restart(); - provider.Execute(context, cancellationToken); - watch.Stop(); + const TagHelperDiscoveryOptions Options = TagHelperDiscoveryOptions.ExcludeHidden | + TagHelperDiscoveryOptions.IncludeDocumentation; - writeProperties[0] = new(provider.GetType().Name + PropertySuffix, watch.ElapsedMilliseconds); - writeProperties = writeProperties[1..]; - } - - telemetryReporter.ReportEvent(GetTagHelpersEventName, Severity.Normal, properties); - - return [.. results]; + return discoveryService.GetTagHelpers(compilation, Options, cancellationToken); } - private static ImmutableArray GetTagHelperDescriptorProviders(RazorProjectEngine projectEngine) - => projectEngine.Engine.GetFeatures().OrderByAsArray(static x => x.Order); - - public static Task TryGetCSharpDocumentFromGeneratedDocumentUriAsync(this Project project, Uri generatedDocumentUri, CancellationToken cancellationToken) + public static Task TryGetCSharpDocumentForGeneratedDocumentAsync(this Project project, RazorGeneratedDocumentIdentity identity, CancellationToken cancellationToken) { - if (!TryGetHintNameFromGeneratedDocumentUri(project, generatedDocumentUri, out var hintName)) - { - return SpecializedTasks.Null(); - } + Debug.Assert(identity.DocumentId.ProjectId == project.Id, "Generated document URI does not belong to this project."); + var hintName = identity.HintName; return TryGetSourceGeneratedDocumentFromHintNameAsync(project, hintName, cancellationToken); } @@ -174,28 +135,4 @@ private static ImmutableArray GetTagHelperDescript return RazorSourceGenerator.GetIdentifierFromPath(relativeDocumentPath); } } - - /// - /// Finds source generated documents by iterating through all of them. In OOP there are better options! - /// - public static bool TryGetHintNameFromGeneratedDocumentUri(this Project project, Uri generatedDocumentUri, [NotNullWhen(true)] out string? hintName) - { - if (!RazorUri.IsGeneratedDocumentUri(generatedDocumentUri)) - { - hintName = null; - return false; - } - - var identity = RazorUri.GetIdentityOfGeneratedDocument(project.Solution, generatedDocumentUri); - - if (!identity.IsRazorSourceGeneratedDocument()) - { - // This is not a Razor source generated document, so we don't know the hint name. - hintName = null; - return false; - } - - hintName = identity.HintName; - return true; - } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions.CachedData.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions.CachedData.cs index 8afd4d5bc2c..71c5c5dafed 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions.CachedData.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions.CachedData.cs @@ -42,6 +42,7 @@ private sealed class CachedData(RazorCodeDocument codeDocument) private SyntaxTree? _syntaxTree; private ImmutableArray? _classifiedSpans; private ImmutableArray? _tagHelperSpans; + private RazorHtmlDocument? _htmlDocument; public SyntaxTree GetOrParseCSharpSyntaxTree(CancellationToken cancellationToken) { @@ -106,12 +107,26 @@ static ImmutableArray ComputeTagHelperSpans(RazorSyntaxTree syntaxTr } } + public RazorHtmlDocument GetOrComputeHtmlDocument(CancellationToken cancellationToken) + { + if (_htmlDocument is not null) + { + return _htmlDocument; + } + + using (_stateLock.DisposableWait(cancellationToken)) + { + return _htmlDocument ??= RazorHtmlWriter.GetHtmlDocument(_codeDocument); + } + } + public CachedData Clone() => new(_codeDocument) { _syntaxTree = _syntaxTree, _classifiedSpans = _classifiedSpans, _tagHelperSpans = _tagHelperSpans, + _htmlDocument = _htmlDocument }; } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions.cs index 167ab5dd3d6..efc5be80318 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions.cs @@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Razor; +using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Text; @@ -35,13 +36,18 @@ public static Syntax.SyntaxNode GetRequiredSyntaxRoot(this RazorCodeDocument cod public static SourceText GetCSharpSourceText(this RazorCodeDocument document) => document.GetRequiredCSharpDocument().Text; - public static SourceText GetHtmlSourceText(this RazorCodeDocument document) - => document.GetHtmlDocument().Text; + public static SourceText GetHtmlSourceText(this RazorCodeDocument document, CancellationToken cancellationToken) + => GetCachedData(document).GetOrComputeHtmlDocument(cancellationToken).Text; /// /// Retrieves a cached Roslyn from the generated C# document. /// If a tree has not yet been cached, a new one will be parsed and added to the cache. /// + /// + /// If possible, prefer calling + /// because it will either call this method, or in cohosting get the syntax tree from Roslyn, where the cached + /// tree can be shared with many more features. + /// public static SyntaxTree GetOrParseCSharpSyntaxTree(this RazorCodeDocument document, CancellationToken cancellationToken) => GetCachedData(document).GetOrParseCSharpSyntaxTree(cancellationToken); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions_ClassifiedSpans.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions_ClassifiedSpans.cs index 37df5f94554..41b5c359a3f 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions_ClassifiedSpans.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/RazorCodeDocumentExtensions_ClassifiedSpans.cs @@ -28,7 +28,7 @@ private enum SpanKind private record struct ClassifiedSpan(SourceSpan Span, SpanKind Kind); - private sealed class ClassifiedSpanVisitor : SyntaxWalker + private sealed class ClassifiedSpanVisitor : SyntaxWalker, IPoolableObject { private enum BlockKind { @@ -47,7 +47,11 @@ private enum BlockKind HtmlComment } - private static readonly ObjectPool s_pool = DefaultPool.Create(Policy.Instance, size: 5); + // Significantly larger than DefaultPool.MaximumObjectSize as there shouldn't be much concurrency + // of these arrays (we limit the number of pooled items to 5) and they are commonly large + public const int MaximumObjectSize = DefaultPool.DefaultMaximumObjectSize * 32; + + private static readonly ObjectPool s_pool = DefaultPool.Create(static () => new ClassifiedSpanVisitor(), poolSize: 5); private readonly ImmutableArray.Builder _spans; @@ -447,11 +451,11 @@ private void AddSpan(SyntaxToken token, SpanKind kind) private void AddSpan(SourceSpan span, SpanKind kind) => _spans.Add(new(span, kind)); - private void Reset() + void IPoolableObject.Reset() { _spans.Clear(); - if (_spans.Capacity > Policy.MaximumObjectSize) + if (_spans.Capacity > MaximumObjectSize) { // Differs from ArrayBuilderPool.Policy's behavior as we allow our array to grow significantly larger _spans.Capacity = 0; @@ -460,27 +464,5 @@ private void Reset() _source = null!; _currentBlockKind = BlockKind.Markup; } - - private sealed class Policy : IPooledObjectPolicy - { - public static readonly Policy Instance = new(); - - // Significantly larger than DefaultPool.MaximumObjectSize as there shouldn't be much concurrency - // of these arrays (we limit the number of pooled items to 5) and they are commonly large - public const int MaximumObjectSize = DefaultPool.MaximumObjectSize * 32; - - private Policy() - { - } - - public ClassifiedSpanVisitor Create() => new(); - - public bool Return(ClassifiedSpanVisitor visitor) - { - visitor.Reset(); - - return true; - } - } } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/SolutionExtensions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/SolutionExtensions.cs index c6282d11e04..25f6b7ad3fa 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/SolutionExtensions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/SolutionExtensions.cs @@ -93,4 +93,22 @@ public static Project GetRequiredProject(this Solution solution, ProjectKey proj return solution.GetProject(projectKey) ?? ThrowHelper.ThrowInvalidOperationException($"The project {projectKey} did not exist in {solution}."); } + + public static bool TryGetSourceGeneratedDocumentIdentity(this Solution solution, Uri generatedDocumentUri, out RazorGeneratedDocumentIdentity identity) + { + identity = default; + if (!RazorUri.IsGeneratedDocumentUri(generatedDocumentUri)) + { + return false; + } + + identity = RazorUri.GetIdentityOfGeneratedDocument(solution, generatedDocumentUri); + + if (!identity.IsRazorSourceGeneratedDocument()) + { + return false; + } + + return true; + } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/AddUsingsHelper.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/AddUsingsHelper.cs index 640d3ccb741..6d18b8acb70 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/AddUsingsHelper.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/AddUsingsHelper.cs @@ -18,6 +18,7 @@ using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Text; using RazorSyntaxNode = Microsoft.AspNetCore.Razor.Language.Syntax.SyntaxNode; @@ -29,7 +30,7 @@ internal static class AddUsingsHelper private readonly record struct RazorUsingDirective(RazorDirectiveSyntax Node, AddImportChunkGenerator Statement); - public static async Task GetUsingStatementEditsAsync(RazorCodeDocument codeDocument, SourceText changedCSharpText, CancellationToken cancellationToken) + public static async Task GetUsingStatementEditsAsync(IDocumentSnapshot documentSnapshot, SourceText changedCSharpText, CancellationToken cancellationToken) { // Now that we're done with everything, lets see if there are any using statements to fix up // We do this by comparing the original generated C# code, and the changed C# code, and look for a difference @@ -44,7 +45,8 @@ public static async Task GetUsingStatementEditsAsync(RazorCodeDocume // So because of the above, we look for a difference in C# using directive nodes directly from the C# syntax tree, and apply them manually // to the Razor document. - var originalCSharpSyntaxTree = codeDocument.GetOrParseCSharpSyntaxTree(cancellationToken); + var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); + var originalCSharpSyntaxTree = await documentSnapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); var changedCSharpSyntaxTree = originalCSharpSyntaxTree.WithChangedText(changedCSharpText); var oldUsings = await FindUsingDirectiveStringsAsync(originalCSharpSyntaxTree, cancellationToken).ConfigureAwait(false); var newUsings = await FindUsingDirectiveStringsAsync(changedCSharpSyntaxTree, cancellationToken).ConfigureAwait(false); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/CSharpFormatter.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/CSharpFormatter.cs index 360719e012b..26a048ba54e 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/CSharpFormatter.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/CSharpFormatter.cs @@ -6,7 +6,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -46,7 +45,7 @@ private static async Task> GetCSharpIndentationCoreAsync( return []; } - var (indentationMap, syntaxTree) = InitializeIndentationData(context, projectedDocumentLocations, cancellationToken); + var (indentationMap, syntaxTree) = await InitializeIndentationDataAsync(context, projectedDocumentLocations, cancellationToken).ConfigureAwait(false); var root = await syntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); @@ -244,7 +243,7 @@ static bool IgnoreInitializerExpression(InitializerExpressionSyntax initializer, } } - private static (Dictionary, SyntaxTree) InitializeIndentationData( + private static async Task<(Dictionary, SyntaxTree)> InitializeIndentationDataAsync( FormattingContext context, IEnumerable projectedDocumentLocations, CancellationToken cancellationToken) @@ -258,8 +257,8 @@ private static (Dictionary, SyntaxTree) InitializeInden using var changes = new PooledArrayBuilder(); - var syntaxTree = context.CodeDocument.GetOrParseCSharpSyntaxTree(cancellationToken); - var root = syntaxTree.GetRoot(cancellationToken); + var syntaxTree = await context.CurrentSnapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); + var root = await syntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); var previousMarkerOffset = 0; foreach (var projectedDocumentIndex in projectedDocumentLocations) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingContext.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingContext.cs index 4a9248912a8..6c825d0c7b8 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingContext.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingContext.cs @@ -25,6 +25,7 @@ internal sealed class FormattingContext private FormattingContext( IDocumentSnapshot originalSnapshot, RazorCodeDocument codeDocument, + IDocumentSnapshot currentSnapshot, RazorFormattingOptions options, IFormattingLogger? logger, bool automaticallyAddUsings, @@ -33,6 +34,7 @@ private FormattingContext( { OriginalSnapshot = originalSnapshot; CodeDocument = codeDocument; + CurrentSnapshot = currentSnapshot; Options = options; Logger = logger; AutomaticallyAddUsings = automaticallyAddUsings; @@ -44,6 +46,7 @@ private FormattingContext( public IDocumentSnapshot OriginalSnapshot { get; } public RazorCodeDocument CodeDocument { get; } + public IDocumentSnapshot CurrentSnapshot { get; } public RazorFormattingOptions Options { get; } public IFormattingLogger? Logger { get; } public bool AutomaticallyAddUsings { get; } @@ -232,6 +235,7 @@ public async Task WithTextAsync(SourceText changedText, Cance var newContext = new FormattingContext( OriginalSnapshot, codeDocument, + currentSnapshot: changedSnapshot, Options, Logger, AutomaticallyAddUsings, @@ -271,6 +275,7 @@ public static FormattingContext CreateForOnTypeFormatting( return new FormattingContext( originalSnapshot, codeDocument, + currentSnapshot: originalSnapshot, options, logger, automaticallyAddUsings, @@ -287,6 +292,7 @@ public static FormattingContext Create( return new FormattingContext( originalSnapshot, codeDocument, + currentSnapshot: originalSnapshot, options, logger, automaticallyAddUsings: false, diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingVisitor.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingVisitor.cs index c85e1de6aca..8ea75e5a575 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingVisitor.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingVisitor.cs @@ -242,7 +242,7 @@ public override void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax no static bool IsComponentTagHelperNode(MarkupTagHelperElementSyntax node) { - return node.TagHelperInfo?.BindingResult?.Descriptors is { Length: > 0 } descriptors && + return node.TagHelperInfo.BindingResult.TagHelpers is { Count: > 0 } descriptors && descriptors.Any(static d => d.IsComponentOrChildContentTagHelper()); } @@ -271,7 +271,7 @@ static bool ParentHasProperty(MarkupTagHelperElementSyntax parentComponent, stri // // This code will not count "ChildContent" as causing indentation because its parent // has a property called "ChildContent". - if (parentComponent.TagHelperInfo?.BindingResult.Descriptors.Any(d => d.BoundAttributes.Any(a => a.Name == propertyName)) ?? false) + if (parentComponent.TagHelperInfo.BindingResult.TagHelpers.Any(d => d.BoundAttributes.Any(a => a.Name == propertyName))) { return true; } @@ -281,7 +281,7 @@ static bool ParentHasProperty(MarkupTagHelperElementSyntax parentComponent, stri static bool HasUnspecifiedCascadingTypeParameter(MarkupTagHelperElementSyntax node) { - if (node.TagHelperInfo?.BindingResult?.Descriptors is not { Length: > 0 } descriptors) + if (node.TagHelperInfo.BindingResult.TagHelpers is not { Count: > 0 } descriptors) { return false; } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.CSharpDocumentGenerator.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.CSharpDocumentGenerator.cs index d13e8848767..b0adf2f1dd2 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.CSharpDocumentGenerator.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.CSharpDocumentGenerator.cs @@ -6,9 +6,13 @@ using System.Diagnostics; using System.Linq; using System.Text; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.Components; using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; +using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Text; using RazorSyntaxNode = Microsoft.AspNetCore.Razor.Language.Syntax.SyntaxNode; @@ -76,13 +80,13 @@ internal partial class CSharpFormattingPass /// private sealed class CSharpDocumentGenerator { - public static CSharpFormattingDocument Generate(RazorCodeDocument codeDocument, RazorFormattingOptions options) + public static CSharpFormattingDocument Generate(RazorCodeDocument codeDocument, SyntaxNode csharpSyntaxRoot, RazorFormattingOptions options, IDocumentMappingService documentMappingService) { using var _1 = StringBuilderPool.GetPooledObject(out var builder); using var _2 = ArrayBuilderPool.GetPooledObject(out var lineInfoBuilder); lineInfoBuilder.SetCapacityIfLarger(codeDocument.Source.Text.Lines.Count); - var generator = new Generator(codeDocument, options, builder, lineInfoBuilder); + var generator = new Generator(codeDocument, csharpSyntaxRoot, options, builder, lineInfoBuilder, documentMappingService); generator.Generate(); @@ -139,16 +143,22 @@ public static bool TryParseAdditionalLineComment(TextLine line, out int start, o private sealed class Generator( RazorCodeDocument codeDocument, + SyntaxNode csharpSyntaxRoot, RazorFormattingOptions options, StringBuilder builder, - ImmutableArray.Builder lineInfoBuilder) : SyntaxVisitor + ImmutableArray.Builder lineInfoBuilder, + IDocumentMappingService documentMappingService) : SyntaxVisitor { private readonly SourceText _sourceText = codeDocument.Source.Text; private readonly RazorCodeDocument _codeDocument = codeDocument; + private readonly SyntaxNode _csharpSyntaxRoot = csharpSyntaxRoot; private readonly bool _insertSpaces = options.InsertSpaces; private readonly int _tabSize = options.TabSize; + private readonly RazorCSharpSyntaxFormattingOptions? _csharpSyntaxFormattingOptions = options.CSharpSyntaxFormattingOptions; private readonly StringBuilder _builder = builder; private readonly ImmutableArray.Builder _lineInfoBuilder = lineInfoBuilder; + private readonly IDocumentMappingService _documentMappingService = documentMappingService; + private readonly RazorCSharpDocument _csharpDocument = codeDocument.GetCSharpDocument().AssumeNotNull(); private TextLine _currentLine; private int _currentFirstNonWhitespacePosition; @@ -211,12 +221,7 @@ public void Generate() var node = root.FindInnermostNode(originalSpan.AbsoluteIndex); if (node is CSharpExpressionLiteralSyntax) { - // Rather than bother to store more data about the formatted file, since we don't actually know where - // these will end up in that file once it's all said and done, we are just going to use a simple comment - // format that we can easily parse. - additionalLinesBuilder.AppendLine(GetAdditionalLineComment(originalSpan)); - additionalLinesBuilder.AppendLine(_sourceText.GetSubTextString(originalSpan.ToTextSpan())); - additionalLinesBuilder.AppendLine(";"); + AddAdditionalLineFormattingContent(additionalLinesBuilder, node, originalSpan); } iMapping++; @@ -251,6 +256,34 @@ public void Generate() _builder.AppendLine(additionalLinesBuilder.ToString()); } + private void AddAdditionalLineFormattingContent(StringBuilder additionalLinesBuilder, RazorSyntaxNode node, SourceSpan originalSpan) + { + // Rather than bother to store more data about the formatted file, since we don't actually know where + // these will end up in that file once it's all said and done, we are just going to use a simple comment + // format that we can easily parse. + + // Special case, for attributes that represent generic type parameters, we want to output something such + // that Roslyn knows to format it as a type. For example, the meaning and spacing around "?"s should be + // what the user expects. + if (node is { Parent.Parent: MarkupTagHelperAttributeSyntax attribute } && + attribute is { Parent.Parent: MarkupTagHelperElementSyntax element } && + element.TagHelperInfo.BindingResult.TagHelpers is [{ } descriptor] && + descriptor.IsGenericTypedComponent() && + descriptor.BoundAttributes.FirstOrDefault(d => d.Name == attribute.TagHelperAttributeInfo.Name) is { } boundAttribute && + boundAttribute.IsTypeParameterProperty()) + { + additionalLinesBuilder.AppendLine("F<"); + additionalLinesBuilder.AppendLine(GetAdditionalLineComment(originalSpan)); + additionalLinesBuilder.AppendLine(_sourceText.GetSubTextString(originalSpan.ToTextSpan())); + additionalLinesBuilder.AppendLine("> x;"); + return; + } + + additionalLinesBuilder.AppendLine(GetAdditionalLineComment(originalSpan)); + additionalLinesBuilder.AppendLine(_sourceText.GetSubTextString(originalSpan.ToTextSpan())); + additionalLinesBuilder.AppendLine(";"); + } + public override LineInfo Visit(RazorSyntaxNode? node) { // Sometimes we are in a block where we want to do no formatting at all @@ -386,6 +419,18 @@ _sourceText.Lines[nodeStartLine] is { } previousLine && public override LineInfo VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node) { Debug.Assert(node.LiteralTokens.Count > 0); + + // If this is the end of a multi-line CSharp template (ie, RenderFragment) then we need to close + // out the lambda expression that we started when we opened it. + if (node.LiteralTokens.Where(static t => !t.IsWhitespace()).FirstOrDefault() is { Content: ";" } && + node.TryGetPreviousSibling(out var previousSibling) && + previousSibling is CSharpTemplateBlockSyntax && + GetLineNumber(previousSibling.GetFirstToken()) != GetLineNumber(previousSibling.GetLastToken())) + { + _builder.AppendLine("};"); + return CreateLineInfo(); + } + return VisitCSharpLiteral(node, node.LiteralTokens[^1]); } @@ -412,13 +457,37 @@ private LineInfo VisitCSharpLiteral(RazorSyntaxNode node, RazorSyntaxToken lastT // Now emit the contents var span = TextSpan.FromBounds(_currentFirstNonWhitespacePosition, node.EndPosition); _builder.Append(_sourceText.ToString(span)); - // Append a comment at the end so whitespace isn't removed, as Roslyn thinks its the end of the line, but we know it isn't. - _builder.AppendLine(" //"); // Putting a semi-colon on the end might make for invalid C#, but it means this line won't cause indentation, // which is all we need. If we're in an explicit expression body though, we don't want to do this, as the // close paren of the expression will do the same job (and the semi-colon would confuse that). var emitSemiColon = node.Parent.Parent is not CSharpExplicitExpressionBodySyntax; + + var skipNextLineIfBrace = false; + int formattedOffsetFromEndOfLine; + + // If the template is multiline we emit a lambda expression, otherwise just a null statement so there + // is something there. See VisitMarkupTransition for more info + if (token.Parent?.Parent.Parent is CSharpTemplateBlockSyntax template && + _sourceText.GetLinePositionSpan(template.Span).SpansMultipleLines()) + { + emitSemiColon = false; + skipNextLineIfBrace = true; + _builder.AppendLine("() => {"); + + // We only want to format up to the text we added, but if Roslyn inserted a newline before the brace + // then that position will be different. If we're not given the options then we assume the default behaviour of + // Roslyn which is to insert the newline. + formattedOffsetFromEndOfLine = _csharpSyntaxFormattingOptions?.NewLines.IsFlagSet(RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody) ?? true + ? 5 + : 7; + } + else + { + _builder.AppendLine("null"); + formattedOffsetFromEndOfLine = 4; + } + if (emitSemiColon) { _builder.AppendLine(";"); @@ -426,14 +495,26 @@ private LineInfo VisitCSharpLiteral(RazorSyntaxNode node, RazorSyntaxToken lastT return CreateLineInfo( skipNextLine: emitSemiColon, + skipNextLineIfBrace: skipNextLineIfBrace, formattedLength: span.Length, - formattedOffsetFromEndOfLine: 3, + formattedOffsetFromEndOfLine: formattedOffsetFromEndOfLine, processFormatting: true, // We turn off check for new lines because that only works if the content doesn't change from the original, // but we're deliberately leaving out a bunch of the original file because it would confuse the Roslyn formatter. checkForNewLines: false); } + // If we're here, it means this is a "normal" line of C#, so we can just emit it as is. The exception to this is + // when we're inside a string literal. We still want to emit it as is, but we need to make sure we tell the formatter + // to ignore any existing indentation too. + if (_documentMappingService.TryMapToCSharpDocumentPosition(_csharpDocument, _currentToken.SpanStart, out _, out var csharpIndex) && + _csharpSyntaxRoot.FindNode(new TextSpan(csharpIndex, 0), getInnermostNodeForTie: true) is { } csharpNode && + csharpNode.IsStringLiteral(multilineOnly: true)) + { + _builder.AppendLine(_currentLine.ToString()); + return CreateLineInfo(processIndentation: false, processFormatting: true, checkForNewLines: true); + } + return EmitCurrentLineAsCSharp(); } @@ -458,8 +539,25 @@ public override LineInfo VisitMarkupStartTag(MarkupStartTagSyntax node) public override LineInfo VisitMarkupEndTag(MarkupEndTagSyntax node) { - // Since this visitor only sees nodes at the start of a line, an end tag always means de-dent. - //return new("}"); + return VisitEndTag(node); + } + + private LineInfo VisitEndTag(BaseMarkupEndTagSyntax node) + { + // If this is the last line of a multi-line CSharp template (ie, RenderFragment), and the semicolon that ends + // if is on the same line, then we need to close out the lambda expression that we started when we opened it. + // If the semicolon is on the next line, then we'll take care of that when we get to it. + if (node.Parent.Parent.Parent is CSharpTemplateBlockSyntax template && + GetLineNumber(template.GetLastToken()) == GetLineNumber(_currentToken) && + GetLineNumber(template.GetFirstToken()) != GetLineNumber(template.GetLastToken()) && + template.GetLastToken().GetNextToken() is { } semiColonToken && + semiColonToken.Content == ";" && + GetLineNumber(semiColonToken) == GetLineNumber(_currentToken)) + { + _builder.AppendLine("};"); + return CreateLineInfo(); + } + return EmitCurrentLineAsComment(); } @@ -537,29 +635,45 @@ private LineInfo VisitMarkupLiteral() public override LineInfo VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node) { - // Since this visitor only sees nodes at the start of a line, an end tag always means de-dent. - //return new("}"); - return EmitCurrentLineAsComment(); + return VisitEndTag(node); } public override LineInfo VisitMarkupTransition(MarkupTransitionSyntax node) { - // A transition to Html is treated the same as Html, which is to say nothing interesting. - // We could emit as a comment, so C# indentation is handled, but it is often that a markup transition - // appears after assigning a RenderFragment, eg + // A transition to Html means the start of a RenderFragment. These are challenging because conceptually + // they are like a Write() call, because their contents are sent to the output, but they can also contain + // statements. eg: // // RenderFragment f = // @
                  - //

                  Some text

                  + // @if (true) + // { + //

                  Some text

                  + // } //
                  ; // - // If we just emit a comment there, the C# formatter will not indent it, and it will leave a hanging - // expression which affects future indentation. So instead we emit some fake C# just to make sure - // nothing is left open. A single semi-colon will suffice. + // If we convert that to C# the way we normally do, we end up with statements in a C# context where only + // expressions are valid. To avoid that, we need to emit C# such that we can be sure we're in a context + // where statements are valid. To do this we emit a block bodied lambda expression. Ironically this whole + // formatting engine arguably exists because the compiler loves to emit lambda expressions, but they're + // really annoying to format. This just happens to be the one case where a lambda is the right choice. + // Emit the whitespace, so user spacing is honoured if possible _builder.Append(_sourceText.ToString(TextSpan.FromBounds(_currentLine.Start, _currentFirstNonWhitespacePosition))); - _builder.AppendLine(";"); - return CreateLineInfo(); + + // If its a one-line render fragment, then we don't need to worry. + if (GetLineNumber(node.Parent.GetLastToken()) == GetLineNumber(_currentToken)) + { + _builder.AppendLine("null;"); + return CreateLineInfo(); + } + + // Roslyn may move the opening brace to the next line, depending on its options. Unlike with code block + // formatting where we put the opening brace on the next line ourselves (and Roslyn might bring it back) + // if we do that for lambdas, Roslyn won't adjust the opening brace position at all. See, told you lambdas + // were annoying to format. + _builder.AppendLine("() => {"); + return CreateLineInfo(skipNextLineIfBrace: true); } public override LineInfo VisitRazorCommentBlock(RazorCommentBlockSyntax node) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.cs index f21b58d46c2..eac8d041e9a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.cs @@ -1,4 +1,5 @@ -// Licensed to the .NET Foundation under one or more agreements. + +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; @@ -11,6 +12,7 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; +using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.Logging; using Microsoft.CodeAnalysis.Razor.TextDifferencing; using Microsoft.CodeAnalysis.Razor.Workspaces; @@ -18,20 +20,28 @@ namespace Microsoft.CodeAnalysis.Razor.Formatting; -internal sealed partial class CSharpFormattingPass(IHostServicesProvider hostServicesProvider, ILoggerFactory loggerFactory) : IFormattingPass +internal sealed partial class CSharpFormattingPass( + IHostServicesProvider hostServicesProvider, + IDocumentMappingService documentMappingService, + ILoggerFactory loggerFactory) : IFormattingPass { private readonly ILogger _logger = loggerFactory.GetOrCreateLogger(); private readonly IHostServicesProvider _hostServicesProvider = hostServicesProvider; + private readonly IDocumentMappingService _documentMappingService = documentMappingService; public async Task> ExecuteAsync(FormattingContext context, ImmutableArray changes, CancellationToken cancellationToken) { // Process changes from previous passes var changedText = context.SourceText.WithChanges(changes); var changedContext = await context.WithTextAsync(changedText, cancellationToken).ConfigureAwait(false); + context.Logger?.LogObject("SourceMappings", changedContext.CodeDocument.GetRequiredCSharpDocument().SourceMappings); + + var csharpSyntaxTrue = await changedContext.CurrentSnapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); + var csharpSyntaxRoot = await csharpSyntaxTrue.GetRootAsync(cancellationToken).ConfigureAwait(false); // To format C# code we generate a C# document that represents the indentation semantics the user would be // expecting in their Razor file. See the doc comments on CSharpDocumentGenerator for more info - var generatedDocument = CSharpDocumentGenerator.Generate(changedContext.CodeDocument, context.Options); + var generatedDocument = CSharpDocumentGenerator.Generate(changedContext.CodeDocument, csharpSyntaxRoot, context.Options, _documentMappingService); var generatedCSharpText = generatedDocument.SourceText; context.Logger?.LogSourceText("FormattingDocument", generatedCSharpText); @@ -147,10 +157,11 @@ public async Task> ExecuteAsync(FormattingContext con else if (lineInfo.SkipNextLineIfBrace) { // If the next line is a brace, we skip it. This is used to skip the opening brace of a class - // that we insert, but Roslyn settings might place on the same like as the class declaration. - if (iFormatted + 1 < formattedCSharpText.Lines.Count && - formattedCSharpText.Lines[iFormatted + 1] is { Span.Length: > 0 } nextLine && - nextLine.CharAt(0) == '{') + // that we insert, but Roslyn settings might place on the same line as the class declaration, + // or skip the opening brace of a lambda definition we insert, but Roslyn might place it on the + // next line. In that case, we can't place it on the next line ourselves because Roslyn doesn't + // adjust the indentation of opening braces of lambdas in that scenario. + if (NextLineIsOnlyAnOpenBrace(formattedCSharpText, iFormatted)) { iFormatted++; } @@ -159,10 +170,7 @@ public async Task> ExecuteAsync(FormattingContext con // it up to the previous line, so we would want to skip the next line in the original document // in that case. Fortunately its illegal to have `@code {\r\n {` in a Razor file, so there can't // be false positives here. - if (iOriginal + 1 < changedText.Lines.Count && - changedText.Lines[iOriginal + 1] is { } nextOriginalLine && - nextOriginalLine.GetFirstNonWhitespaceOffset() is { } firstChar && - nextOriginalLine.CharAt(firstChar) == '{') + if (NextLineIsOnlyAnOpenBrace(changedText, iOriginal)) { iOriginal++; } @@ -221,6 +229,13 @@ public async Task> ExecuteAsync(FormattingContext con return SourceTextDiffer.GetMinimalTextChanges(context.SourceText, changedText, DiffKind.Char); } + private static bool NextLineIsOnlyAnOpenBrace(SourceText text, int lineNumber) + => lineNumber + 1 < text.Lines.Count && + text.Lines[lineNumber + 1] is { Span.Length: > 0 } nextLine && + nextLine.GetFirstNonWhitespaceOffset() is { } firstNonWhitespace && + nextLine.Start + firstNonWhitespace == nextLine.End - 1 && + nextLine.CharAt(firstNonWhitespace) == '{'; + private async Task FormatCSharpAsync(SourceText generatedCSharpText, RazorFormattingOptions options, CancellationToken cancellationToken) { using var helper = new RoslynWorkspaceHelper(_hostServicesProvider); @@ -259,6 +274,6 @@ private async Task FormatCSharpAsync(SourceText generatedCSharpText, } [Obsolete("Only for the syntax visualizer, do not call")] - internal static string GetFormattingDocumentContentsForSyntaxVisualizer(RazorCodeDocument codeDocument) - => CSharpDocumentGenerator.Generate(codeDocument, new()).SourceText.ToString(); + internal static string GetFormattingDocumentContentsForSyntaxVisualizer(RazorCodeDocument codeDocument, SyntaxNode csharpSyntaxRoot, IDocumentMappingService documentMappingService) + => CSharpDocumentGenerator.Generate(codeDocument, csharpSyntaxRoot, new(), documentMappingService).SourceText.ToString(); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpOnTypeFormattingPass.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpOnTypeFormattingPass.cs index 93291a2bf9f..2601364110c 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpOnTypeFormattingPass.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpOnTypeFormattingPass.cs @@ -212,7 +212,7 @@ private static async Task> AddUsingStatementEditsIfNe // Because we need to parse the C# code twice for this operation, lets do a quick check to see if its even necessary if (changes.Any(static e => e.NewText is not null && e.NewText.IndexOf("using") != -1)) { - var usingStatementEdits = await AddUsingsHelper.GetUsingStatementEditsAsync(context.CodeDocument, originalTextWithChanges, cancellationToken).ConfigureAwait(false); + var usingStatementEdits = await AddUsingsHelper.GetUsingStatementEditsAsync(context.CurrentSnapshot, originalTextWithChanges, cancellationToken).ConfigureAwait(false); var usingStatementChanges = usingStatementEdits.Select(context.CodeDocument.Source.Text.GetTextChange); finalChanges = [.. usingStatementChanges, .. finalChanges]; } @@ -339,7 +339,14 @@ private static void CleanupSourceMappingStart(FormattingContext context, LinePos var text = context.SourceText; var sourceMappingSpan = text.GetTextSpan(sourceMappingRange); - if (!ShouldFormat(context, sourceMappingSpan, allowImplicitStatements: false, out var owner)) + if (!ShouldFormat(context, + sourceMappingSpan, + new ShouldFormatOptions( + AllowImplicitStatements: false, + AllowImplicitExpressions: false, + AllowSingleLineExplicitExpressions: true, + IsLineRequest: false), + out var owner)) { // We don't want to run cleanup on this range. return; @@ -900,6 +907,11 @@ private static bool ShouldFormat(FormattingContext context, TextSpan mappingSpan return false; } + if (IsComponentStartTagName()) + { + return false; + } + if (IsInHtmlAttributeValue()) { return false; @@ -1004,6 +1016,19 @@ bool IsInBoundComponentAttributeName() } && !options.IsLineRequest; } + bool IsComponentStartTagName() + { + // E.g, (| is position) + // + // `<|Component>` - true + // + // As above, we map component elements, so GTD and FAR works, there could be C# mapping for them. + // We don't want the mapping to make the formatting engine think it needs to apply C# indentation rules. + + return owner is MarkupTagHelperStartTagSyntax startTag && + startTag.Name.Span.Contains(mappingSpan.Start); + } + bool IsInHtmlAttributeValue() { // E.g, (| is position) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/HtmlFormattingPass.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/HtmlFormattingPass.cs index ae94386e7a6..2b496293d3d 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/HtmlFormattingPass.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/HtmlFormattingPass.cs @@ -2,50 +2,106 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Immutable; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.TextDifferencing; +using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Text; namespace Microsoft.CodeAnalysis.Razor.Formatting; -internal sealed class HtmlFormattingPass : IFormattingPass +internal sealed class HtmlFormattingPass(IDocumentMappingService documentMappingService) : IFormattingPass { - public Task> ExecuteAsync(FormattingContext context, ImmutableArray changes, CancellationToken cancellationToken) + private readonly IDocumentMappingService _documentMappingService = documentMappingService; + + public async Task> ExecuteAsync(FormattingContext context, ImmutableArray changes, CancellationToken cancellationToken) { var changedText = context.SourceText; if (changes.Length > 0) { - var filteredChanges = FilterIncomingChanges(context.CodeDocument.GetRequiredSyntaxTree(), changes); + context.Logger?.LogSourceText("HtmlSourceText", context.CodeDocument.GetHtmlSourceText(cancellationToken)); + + // There is a lot of uncertainty when we're dealing with edits that come from the Html formatter + // because we are not responsible for it. It could make all sorts of strange edits, and it could + // structure those edits is all sorts of ways. eg, it could have individual character edits, or + // it could have a single edit that replaces a whole section of text, or the whole document. + // Since the Html formatter doesn't understand Razor, and in fact doesn't even format the actual + // Razor document directly (all C# is replaced), we have to be selective about what edits we will + // actually use, but being selective is tricky because we might be missing some intentional edits + // that the formatter made. + // + // To solve this, and work around various issues due to the Html formatter seeing a much simpler + // document that we are actually dealing with, the first thing we do is take the changes it suggests + // and apply them to the document it saw, then use our own algorithm to produce a set of changes + // that more closely match what we want to get out of it. Specifically, we only want to see changes + // to whitespace, or Html, not changes that include C#. Fortunately since we encode all C# as tildes + // it means we can do a word-based diff, and all C# will essentially be equal to all other C#, so + // won't appear in the diff. + // + // So we end up with a set of changes that are only ever to whitespace, or legitimate Html (though + // in reality the formatter doesn't change that anyway). + + // Avoid computing a minimal diff if we don't need to. Slightly wasteful if we've come from one + // of the other overloads, but worth it if we haven't (and worth it for them to validate before + // doing the work to convert edits to changes). + if (changes.Any(static e => e.NewText?.Contains('~') ?? false)) + { + var htmlSourceText = context.CodeDocument.GetHtmlSourceText(cancellationToken); + var htmlWithChanges = htmlSourceText.WithChanges(changes); + + changes = SourceTextDiffer.GetMinimalTextChanges(htmlSourceText, htmlWithChanges, DiffKind.Word); + if (changes.Length == 0) + { + return []; + } + } + + // Now that the changes are on our terms, we can apply our own filtering without having to worry + // that we're missing something important. We could still, in theory, be missing something the Html + // formatter intentionally did, but we also know the Html formatter made its decisions without an + // awareness of Razor anyway, so it's not a reliable source. + var filteredChanges = await FilterIncomingChangesAsync(context, changes, cancellationToken).ConfigureAwait(false); + if (filteredChanges.Length == 0) + { + return []; + } + changedText = changedText.WithChanges(filteredChanges); context.Logger?.LogSourceText("AfterHtmlFormatter", changedText); } - return Task.FromResult(SourceTextDiffer.GetMinimalTextChanges(context.SourceText, changedText, DiffKind.Char)); + return SourceTextDiffer.GetMinimalTextChanges(context.SourceText, changedText, DiffKind.Char); } - private static ImmutableArray FilterIncomingChanges(RazorSyntaxTree syntaxTree, ImmutableArray changes) + private async Task> FilterIncomingChangesAsync(FormattingContext context, ImmutableArray changes, CancellationToken cancellationToken) { - var sourceText = syntaxTree.Source.Text; + var codeDocument = context.CodeDocument; + var csharpDocument = codeDocument.GetRequiredCSharpDocument(); + var syntaxRoot = codeDocument.GetRequiredSyntaxRoot(); + var sourceText = codeDocument.Source.Text; + SyntaxNode? csharpSyntaxRoot = null; using var changesToKeep = new PooledArrayBuilder(capacity: changes.Length); foreach (var change in changes) { - // Don't keep changes that start inside of a razor comment block. - var comment = syntaxTree.Root.FindInnermostNode(change.Span.Start)?.FirstAncestorOrSelf(); + // We don't keep changes that start inside of a razor comment block. + var node = syntaxRoot.FindInnermostNode(change.Span.Start); + var comment = node?.FirstAncestorOrSelf(); if (comment is not null && change.Span.Start > comment.SpanStart) { + context.Logger?.LogMessage($"Dropping change {change} because it's in a Razor comment"); continue; } - // Normally we don't touch Html changes much but there is one - // edge case when including render fragments in a C# code block, eg: + // When render fragments are inside a C# code block, eg: // // @code { // void Foo() @@ -56,15 +112,57 @@ private static ImmutableArray FilterIncomingChanges(RazorSyntaxTree // // This is popular in some libraries, like bUnit. The issue here is that // the Html formatter sees ~~~~~ and puts a newline before - // the tag, but obviously that breaks things. + // the tag, but obviously that breaks things by separating the transition and the tag. // // It's straight forward enough to just check for this situation and ignore the change. // There needs to be a newline being inserted between an '@' and a '<'. - if (change.NewText is ['\r' or '\n', ..] && - sourceText.Length > 1 && - sourceText[change.Span.Start - 1] == '@' && - sourceText[change.Span.Start] == '<') + if (change.NewText is ['\r' or '\n', ..]) + { + if (change.Span.Start > 0 && + sourceText.Length > 1 && + sourceText[change.Span.Start - 1] == '@' && + sourceText[change.Span.Start] == '<') + { + context.Logger?.LogMessage($"Dropping change {change} because it breaks a C# template"); + continue; + } + + // The Html formatter in VS Code wraps long lines, based on a user setting, but when there + // are long C# string literals that ends up breaking the code. For example: + // + // @("this is a long string that spans past some user set maximum limit") + // + // could become + // + // @("this is a long string that spans past + // some user set maximum limit") + // + // That doesn't compile, and depending on the scenario, can even cause a crash inside the + // Roslyn formatter. + // + // Strictly speaking if literal is a verbatim string, or multiline raw string literal, then + // it would compile, but it would also change the value of the string, and since these edits + // come from the Html formatter which clearly has no idea it's doing that, it is safer to + // disregard them all equally, and let the user make the final decision. + // + // In order to avoid hard coding all of the various string syntax kinds here, we can just check + // for any literal, as the only literals that can contain spaces, which is what the Html formatter + // will wrap on, are strings. And if it did decide to insert a newline into a number, or the 'null' + // keyword, that would be pretty bad too. + if (await ChangeIsInStringLiteralAsync(context, csharpDocument, change, cancellationToken).ConfigureAwait(false)) + { + continue; + } + } + + // As well as breaking long string literals, above, in VS Code the formatter will also potentially remove spaces + // within a string literal, and in both VS and VS Code, they will happily remove indentation inside a multi-line + // verbatim string, or raw string literal. Simply dropping any edit that is removing content from a string literal + // fixes this. Strictly speaking we only need to care about removing whitespace, not removing anything else, but + // we never want the formatter to remove anything else anyway. + if (change.NewText?.Length == 0 && + await ChangeIsInStringLiteralAsync(context, csharpDocument, change, cancellationToken).ConfigureAwait(false)) { continue; } @@ -73,5 +171,32 @@ private static ImmutableArray FilterIncomingChanges(RazorSyntaxTree } return changesToKeep.ToImmutableAndClear(); + + async Task ChangeIsInStringLiteralAsync(FormattingContext context, RazorCSharpDocument csharpDocument, TextChange change, CancellationToken cancellationToken) + { + if (csharpSyntaxRoot is null) + { + var csharpSyntaxTree = await context.OriginalSnapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); + csharpSyntaxRoot = await csharpSyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); + } + + if (_documentMappingService.TryMapToCSharpDocumentPosition(csharpDocument, change.Span.Start, out _, out var csharpIndex) && + csharpSyntaxRoot.FindNode(new TextSpan(csharpIndex, 0), getInnermostNodeForTie: true) is { } csharpNode && + csharpNode.IsStringLiteral()) + { + context.Logger?.LogMessage($"Dropping change {change} because it breaks a C# string literal"); + return true; + } + + return false; + } + } + + internal TestAccessor GetTestAccessor() => new(this); + + internal readonly struct TestAccessor(HtmlFormattingPass pass) + { + public Task> FilterIncomingChangesAsync(FormattingContext context, ImmutableArray changes, CancellationToken cancellationToken) + => pass.FilterIncomingChangesAsync(context, changes, cancellationToken); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingService.cs index 351ce2e128b..da3b0c2dd46 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingService.cs @@ -51,9 +51,9 @@ public RazorFormattingService( ]; _documentFormattingPasses = [ - new HtmlFormattingPass(), + new HtmlFormattingPass(documentMappingService), new RazorFormattingPass(), - new CSharpFormattingPass(hostServicesProvider, loggerFactory), + new CSharpFormattingPass(hostServicesProvider, documentMappingService, loggerFactory), ]; _formattingLoggerFactory = formattingLoggerFactory; } @@ -92,7 +92,7 @@ public async Task> GetDocumentFormattingChangesAsync( var logger = _formattingLoggerFactory.CreateLogger(documentContext.FilePath, range is null ? "Full" : "Range"); logger?.LogObject("Options", options); - logger?.LogObject("HtmlChanges", htmlChanges); + logger?.LogObject("HtmlChanges", htmlChanges.SelectAsArray(e => e.ToRazorTextChange())); logger?.LogObject("Range", range); logger?.LogSourceText("InitialDocument", sourceText); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/AbstractDefinitionService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/AbstractDefinitionService.cs index e1e682bd152..9b149909b22 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/AbstractDefinitionService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/AbstractDefinitionService.cs @@ -9,7 +9,6 @@ using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.Logging; using Microsoft.CodeAnalysis.Razor.ProjectSystem; -using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Text; using CSharpSyntaxKind = Microsoft.CodeAnalysis.CSharp.SyntaxKind; @@ -31,17 +30,9 @@ internal abstract class AbstractDefinitionService( IDocumentSnapshot documentSnapshot, DocumentPositionInfo positionInfo, ISolutionQueryOperations solutionQueryOperations, - bool ignoreComponentAttributes, bool includeMvcTagHelpers, CancellationToken cancellationToken) { - - // If we're in C# then there is no point checking for a component tag, because there won't be one - if (positionInfo.LanguageKind == RazorLanguageKind.CSharp) - { - return null; - } - if (!includeMvcTagHelpers && !documentSnapshot.FileKind.IsComponent()) { _logger.LogInformation($"'{documentSnapshot.FileKind}' is not a component type."); @@ -50,7 +41,7 @@ internal abstract class AbstractDefinitionService( var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); - if (!RazorComponentDefinitionHelpers.TryGetBoundTagHelpers(codeDocument, positionInfo.HostDocumentIndex, ignoreComponentAttributes, _logger, out var boundTagHelperResults)) + if (!RazorComponentDefinitionHelpers.TryGetBoundTagHelpers(codeDocument, positionInfo.HostDocumentIndex, _logger, out var boundTagHelperResults)) { _logger.LogInformation($"Could not retrieve bound tag helper information."); return null; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/IDefinitionService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/IDefinitionService.cs index 79463c9a781..3fcd2ed6fbf 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/IDefinitionService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/IDefinitionService.cs @@ -17,7 +17,6 @@ internal interface IDefinitionService IDocumentSnapshot documentSnapshot, DocumentPositionInfo positionInfo, ISolutionQueryOperations solutionQueryOperations, - bool ignoreComponentAttributes, bool includeMvcTagHelpers, CancellationToken cancellationToken); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/RazorComponentDefinitionHelpers.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/RazorComponentDefinitionHelpers.cs index d76a83c5882..3056f1811f4 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/RazorComponentDefinitionHelpers.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/GoToDefinition/RazorComponentDefinitionHelpers.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -26,8 +25,14 @@ internal sealed record BoundTagHelperResult(TagHelperDescriptor ElementDescripto internal static class RazorComponentDefinitionHelpers { + /// + /// Gets bound tag helpers that might apply to the specified index + /// + /// + /// This method will not match component attribute tag helpers + /// public static bool TryGetBoundTagHelpers( - RazorCodeDocument codeDocument, int absoluteIndex, bool ignoreComponentAttributes, ILogger logger, + RazorCodeDocument codeDocument, int absoluteIndex, ILogger logger, out ImmutableArray descriptors) { descriptors = default; @@ -71,10 +76,10 @@ public static bool TryGetBoundTagHelpers( using var descriptorsBuilder = new PooledArrayBuilder(); - foreach (var boundTagHelper in binding.Descriptors.Where(d => !d.IsAttributeDescriptor())) + foreach (var boundTagHelper in binding.TagHelpers.Where(d => !d.IsAttributeDescriptor())) { var requireAttributeMatch = false; - if ((!ignoreComponentAttributes || boundTagHelper.Kind != TagHelperKind.Component) && + if (boundTagHelper.Kind != TagHelperKind.Component && tagHelperNode is MarkupTagHelperStartTagSyntax startTag) { // Include attributes where the end index also matches, since GetSyntaxNodeAsync will consider that the start tag but we behave @@ -170,10 +175,7 @@ static bool TryGetTagName(RazorSyntaxNode node, out RazorSyntaxToken tagName) var root = await csharpSyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); - // Since we know how the compiler generates the C# source we can be a little specific here, and avoid - // long tree walks. If the compiler ever changes how they generate their code, the tests for this will break - // so we'll know about it. - if (TryGetClassDeclaration(root, out var classDeclaration)) + if (root.TryGetClassDeclaration(out var classDeclaration)) { var property = classDeclaration .Members @@ -201,21 +203,5 @@ static bool TryGetTagName(RazorSyntaxNode node, out RazorSyntaxToken tagName) logger.LogInformation($"Generated C# was not in expected shape (CompilationUnit [-> Namespace] -> Class)"); return null; - - static bool TryGetClassDeclaration(SyntaxNode root, [NotNullWhen(true)] out ClassDeclarationSyntax? classDeclaration) - { - classDeclaration = root switch - { - CompilationUnitSyntax unit => unit switch - { - { Members: [NamespaceDeclarationSyntax { Members: [ClassDeclarationSyntax c, ..] }, ..] } => c, - { Members: [ClassDeclarationSyntax c, ..] } => c, - _ => null, - }, - _ => null, - }; - - return classDeclaration is not null; - } } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Hover/HoverFactory.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Hover/HoverFactory.cs index 57d3a5a9a4f..6dc522198e3 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Hover/HoverFactory.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Hover/HoverFactory.cs @@ -88,14 +88,14 @@ internal static class HoverFactory return SpecializedTasks.Null(); } - Debug.Assert(binding.Descriptors.Any()); + Debug.Assert(binding.TagHelpers.Any()); var span = containingTagNameToken.GetLinePositionSpan(codeDocument.Source); var filePath = codeDocument.Source.FilePath.AssumeNotNull(); return ElementInfoToHoverAsync( - filePath, binding.Descriptors, span, options, componentAvailabilityService, cancellationToken); + filePath, binding.TagHelpers, span, options, componentAvailabilityService, cancellationToken); } if (HtmlFacts.TryGetAttributeInfo(owner, out containingTagNameToken, out _, out var selectedAttributeName, out var selectedAttributeNameLocation, out attributes) && @@ -123,7 +123,7 @@ internal static class HoverFactory return SpecializedTasks.Null(); } - Debug.Assert(binding.Descriptors.Any()); + Debug.Assert(binding.TagHelpers.Any()); var tagHelperAttributes = TagHelperFacts.GetBoundTagHelperAttributes( tagHelperContext, selectedAttributeName.AssumeNotNull(), @@ -218,7 +218,7 @@ internal static class HoverFactory private static async Task ElementInfoToHoverAsync( string documentFilePath, - ImmutableArray descriptors, + TagHelperCollection tagHelpers, LinePositionSpan span, HoverDisplayOptions options, IComponentAvailabilityService componentAvailabilityService, @@ -226,7 +226,7 @@ internal static class HoverFactory { // Filter out attribute descriptors since we're creating an element hover var keepAttributeInfo = FileKinds.GetFileKindFromPath(documentFilePath) == RazorFileKind.Legacy; - var descriptionInfos = descriptors + var descriptionInfos = tagHelpers .Where(d => keepAttributeInfo || !d.IsAttributeDescriptor()) .SelectAsArray(BoundElementDescriptionInfo.From); var elementDescriptionInfo = new AggregateBoundElementDescription(descriptionInfos); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ITagHelperResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ITagHelperResolver.cs index 3283d3f64d5..b6692c24fb5 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ITagHelperResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ITagHelperResolver.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; @@ -16,7 +15,7 @@ internal interface ITagHelperResolver /// using the given to provide a /// . ///
                  - ValueTask> GetTagHelpersAsync( + ValueTask GetTagHelpersAsync( Project project, ProjectSnapshot projectSnapshot, CancellationToken cancellationToken); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/LanguageServerFeatureOptions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/LanguageServerFeatureOptions.cs index 4aee89013d4..d844139e4b3 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/LanguageServerFeatureOptions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/LanguageServerFeatureOptions.cs @@ -7,44 +7,11 @@ internal abstract class LanguageServerFeatureOptions { public abstract bool SupportsFileManipulation { get; } - public abstract string CSharpVirtualDocumentSuffix { get; } - - public abstract string HtmlVirtualDocumentSuffix { get; } - - public abstract bool SingleServerSupport { get; } - - public abstract bool DelegateToCSharpOnDiagnosticPublish { get; } - public abstract bool ShowAllCSharpCodeActions { get; } - public abstract bool UpdateBuffersForClosedDocuments { get; } - // Code action and rename paths in Windows VS Code need to be prefixed with '/': // https://github.com/dotnet/razor/issues/8131 public abstract bool ReturnCodeActionAndRenamePathsWithPrefixedSlash { get; } - /// - /// Whether the file path for the generated C# documents should utilize the project key to - /// ensure a unique file path per project. - /// - public abstract bool IncludeProjectKeyInGeneratedFilePath { get; } - public abstract bool UseRazorCohostServer { get; } - - /// - /// Indicates that client supports soft selection in completion list, meaning that typing a commit - /// character with a soft-selected item will not commit that item. - /// - public abstract bool SupportsSoftSelectionInCompletion { get; } - - /// - /// Indicates that VSCode-compatible completion trigger character set should be used - /// - public abstract bool UseVsCodeCompletionCommitCharacters { get; } - - /// - /// Indicates whether the language server's miscellanous files project will be initialized with - /// all Razor files found under the workspace root path. - /// - public abstract bool DoNotInitializeMiscFilesProjectFromWorkspace { get; } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Microsoft.CodeAnalysis.Razor.Workspaces.csproj b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Microsoft.CodeAnalysis.Razor.Workspaces.csproj index a28d1009766..10b487228a6 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Microsoft.CodeAnalysis.Razor.Workspaces.csproj +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Microsoft.CodeAnalysis.Razor.Workspaces.csproj @@ -49,7 +49,6 @@ - @@ -58,7 +57,6 @@ - diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/AbstractRazorProjectInfoDriver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/AbstractRazorProjectInfoDriver.cs index 229417d73de..abdf0503063 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/AbstractRazorProjectInfoDriver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/AbstractRazorProjectInfoDriver.cs @@ -105,7 +105,7 @@ private async ValueTask ProcessBatchAsync(ImmutableArray items, Cancellati switch (work) { case Update(var projectInfo): - Logger?.LogTrace($"Sending update for {projectInfo.FilePath} with {projectInfo.ProjectWorkspaceState.TagHelpers.Length} TagHelpers"); + Logger?.LogTrace($"Sending update for {projectInfo.FilePath} with {projectInfo.ProjectWorkspaceState.TagHelpers.Count} TagHelpers"); _latestProjectInfoMap[projectInfo.ProjectKey] = projectInfo; break; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/DocumentContext.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/DocumentContext.cs index faa4be73a44..65633dd6b63 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/DocumentContext.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/DocumentContext.cs @@ -135,18 +135,18 @@ async ValueTask GetCSharpSourceTextCoreAsync(CancellationToken cance public ValueTask GetHtmlSourceTextAsync(CancellationToken cancellationToken) { return TryGetCodeDocument(out var codeDocument) - ? new(GetHtmlSourceTextCore(codeDocument)) + ? new(GetHtmlSourceTextCore(codeDocument, cancellationToken)) : GetHtmlSourceTextCoreAsync(cancellationToken); - static SourceText GetHtmlSourceTextCore(RazorCodeDocument codeDocument) + static SourceText GetHtmlSourceTextCore(RazorCodeDocument codeDocument, CancellationToken cancellationToken) { - return codeDocument.GetHtmlSourceText(); + return codeDocument.GetHtmlSourceText(cancellationToken); } async ValueTask GetHtmlSourceTextCoreAsync(CancellationToken cancellationToken) { var codeDocument = await GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); - return GetHtmlSourceTextCore(codeDocument); + return GetHtmlSourceTextCore(codeDocument, cancellationToken); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/IProjectSnapshot.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/IProjectSnapshot.cs index 7763a9f54b8..310c92e2ea0 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/IProjectSnapshot.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/IProjectSnapshot.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; @@ -31,7 +30,7 @@ internal interface IProjectSnapshot string DisplayName { get; } LanguageVersion CSharpLanguageVersion { get; } - ValueTask> GetTagHelpersAsync(CancellationToken cancellationToken); + ValueTask GetTagHelpersAsync(CancellationToken cancellationToken); bool ContainsDocument(string filePath); bool TryGetDocument(string filePath, [NotNullWhen(true)] out IDocumentSnapshot? document); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/Legacy/ILegacyProjectSnapshot.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/Legacy/ILegacyProjectSnapshot.cs index 57ee41e1768..b8b657ed984 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/Legacy/ILegacyProjectSnapshot.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/Legacy/ILegacyProjectSnapshot.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis.CSharp; @@ -21,7 +20,7 @@ internal interface ILegacyProjectSnapshot string? RootNamespace { get; } LanguageVersion CSharpLanguageVersion { get; } - ImmutableArray TagHelpers { get; } + TagHelperCollection TagHelpers { get; } RazorProjectEngine GetProjectEngine(); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectSnapshot.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectSnapshot.cs index 6ccc250cb9b..60a681a14c5 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectSnapshot.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectSnapshot.cs @@ -37,7 +37,7 @@ internal sealed class ProjectSnapshot(ProjectState state) : IProjectSnapshot, IL public RazorProjectEngine ProjectEngine => _state.ProjectEngine; - public ValueTask> GetTagHelpersAsync(CancellationToken cancellationToken) + public ValueTask GetTagHelpersAsync(CancellationToken cancellationToken) => new(_state.TagHelpers); public bool ContainsDocument(string filePath) @@ -143,7 +143,7 @@ public ImmutableArray GetRelatedDocumentFilePaths(string documentFilePat string ILegacyProjectSnapshot.FilePath => FilePath; string? ILegacyProjectSnapshot.RootNamespace => RootNamespace; LanguageVersion ILegacyProjectSnapshot.CSharpLanguageVersion => CSharpLanguageVersion; - ImmutableArray ILegacyProjectSnapshot.TagHelpers => ProjectWorkspaceState.TagHelpers; + TagHelperCollection ILegacyProjectSnapshot.TagHelpers => ProjectWorkspaceState.TagHelpers; RazorProjectEngine ILegacyProjectSnapshot.GetProjectEngine() => _state.ProjectEngine; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs index ddfc0a60b67..37c53816b57 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs @@ -15,13 +15,12 @@ using Microsoft.CodeAnalysis.Razor.ProjectEngineHost; using Microsoft.CodeAnalysis.Razor.Utilities; using Microsoft.CodeAnalysis.Text; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.CodeAnalysis.Razor.ProjectSystem; internal sealed class ProjectState { - private static readonly ObjectPool.Builder>> s_importMapBuilderPool = + private static readonly DictionaryPool.Builder> s_importMapBuilderPool = DictionaryPool.Builder>.Create(FilePathNormalizingComparer.Instance); private static readonly ImmutableDictionary s_emptyDocuments @@ -80,7 +79,7 @@ public static ProjectState Create( IProjectEngineFactoryProvider projectEngineFactoryProvider) => new(hostProject, projectEngineFactoryProvider); - public ImmutableArray TagHelpers => ProjectWorkspaceState.TagHelpers; + public TagHelperCollection TagHelpers => ProjectWorkspaceState.TagHelpers; public LanguageVersion CSharpLanguageVersion => HostProject.Configuration.CSharpLanguageVersion; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectWorkspaceState.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectWorkspaceState.cs index 6a550021f72..98eba74d385 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectWorkspaceState.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectWorkspaceState.cs @@ -2,8 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Collections.Immutable; -using System.Linq; using Microsoft.AspNetCore.Razor.Language; using Microsoft.Extensions.Internal; @@ -11,18 +9,18 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem; internal sealed class ProjectWorkspaceState : IEquatable { - public static readonly ProjectWorkspaceState Default = new(ImmutableArray.Empty); + public static readonly ProjectWorkspaceState Default = new(TagHelperCollection.Empty); - public ImmutableArray TagHelpers { get; } + public TagHelperCollection TagHelpers { get; } - private ProjectWorkspaceState( - ImmutableArray tagHelpers) + public bool IsDefault => TagHelpers.IsEmpty; + + private ProjectWorkspaceState(TagHelperCollection tagHelpers) { TagHelpers = tagHelpers; } - public static ProjectWorkspaceState Create( - ImmutableArray tagHelpers) + public static ProjectWorkspaceState Create(TagHelperCollection tagHelpers) => tagHelpers.IsEmpty ? Default : new(tagHelpers); @@ -32,7 +30,7 @@ public override bool Equals(object? obj) public bool Equals(ProjectWorkspaceState? other) => other is not null && - TagHelpers.SequenceEqual(other.TagHelpers); + TagHelpers.Equals(other.TagHelpers); public override int GetHashCode() { diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DocumentSymbols/DocumentSymbolService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DocumentSymbols/DocumentSymbolService.cs index 4d969d2d555..a8e829451bb 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DocumentSymbols/DocumentSymbolService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DocumentSymbols/DocumentSymbolService.cs @@ -13,11 +13,11 @@ internal class DocumentSymbolService(IDocumentMappingService documentMappingServ { private readonly IDocumentMappingService _documentMappingService = documentMappingService; - public SumType? GetDocumentSymbols(Uri razorDocumentUri, RazorCSharpDocument csharpDocument, SumType csharpSymbols) + public SumType? GetDocumentSymbols(RazorFileKind fileKind, Uri razorDocumentUri, RazorCSharpDocument csharpDocument, SumType csharpSymbols) { if (csharpSymbols.TryGetFirst(out var documentSymbols)) { - return RemapDocumentSymbols(csharpDocument, documentSymbols); + return RemapDocumentSymbols(fileKind, csharpDocument, documentSymbols); } else if (csharpSymbols.TryGetSecond(out var symbolInformations)) { @@ -25,9 +25,16 @@ internal class DocumentSymbolService(IDocumentMappingService documentMappingServ foreach (var symbolInformation in symbolInformations) { -#pragma warning disable CS0618 // Type or member is obsolete // SymbolInformation is obsolete, but things still return it so we have to handle it - if (_documentMappingService.TryMapToRazorDocumentRange(csharpDocument, symbolInformation.Location.Range, out var newRange)) +#pragma warning disable CS0618 // Type or member is obsolete + if (symbolInformation.Name == RenderMethodSignature(fileKind)) + { + symbolInformation.Name = RenderMethodDisplay(fileKind); + symbolInformation.Location.Range = LspFactory.DefaultRange; + symbolInformation.Location.Uri = razorDocumentUri; + mappedSymbols.Add(symbolInformation); + } + else if (_documentMappingService.TryMapToRazorDocumentRange(csharpDocument, symbolInformation.Location.Range, out var newRange)) { symbolInformation.Location.Range = newRange; symbolInformation.Location.Uri = razorDocumentUri; @@ -45,7 +52,7 @@ internal class DocumentSymbolService(IDocumentMappingService documentMappingServ } } - private DocumentSymbol[]? RemapDocumentSymbols(RazorCSharpDocument csharpDocument, DocumentSymbol[]? documentSymbols) + private DocumentSymbol[]? RemapDocumentSymbols(RazorFileKind fileKind, RazorCSharpDocument csharpDocument, DocumentSymbol[]? documentSymbols) { if (documentSymbols is null) { @@ -58,12 +65,12 @@ internal class DocumentSymbolService(IDocumentMappingService documentMappingServ { if (TryRemapRanges(csharpDocument, documentSymbol)) { - documentSymbol.Children = RemapDocumentSymbols(csharpDocument, documentSymbol.Children); + documentSymbol.Children = RemapDocumentSymbols(fileKind, csharpDocument, documentSymbol.Children); mappedSymbols.Add(documentSymbol); } else if (documentSymbol.Children is [_, ..] && - RemapDocumentSymbols(csharpDocument, documentSymbol.Children) is [_, ..] mappedChildren) + RemapDocumentSymbols(fileKind, csharpDocument, documentSymbol.Children) is [_, ..] mappedChildren) { // This range didn't map, but some/all of its children did, so we promote them to this level so we don't // lose any information. @@ -75,7 +82,16 @@ internal class DocumentSymbolService(IDocumentMappingService documentMappingServ bool TryRemapRanges(RazorCSharpDocument csharpDocument, DocumentSymbol documentSymbol) { - if (_documentMappingService.TryMapToRazorDocumentRange(csharpDocument, documentSymbol.Range, out var newRange) && + if (documentSymbol.Detail == RenderMethodSignature(fileKind)) + { + // Special case BuildRenderTree to always map to the top of the document + documentSymbol.Detail = RenderMethodDisplay(fileKind); + documentSymbol.Range = LspFactory.DefaultRange; + documentSymbol.SelectionRange = LspFactory.DefaultRange; + + return true; + } + else if (_documentMappingService.TryMapToRazorDocumentRange(csharpDocument, documentSymbol.Range, out var newRange) && _documentMappingService.TryMapToRazorDocumentRange(csharpDocument, documentSymbol.SelectionRange, out var newSelectionRange)) { documentSymbol.Range = newRange; @@ -87,4 +103,15 @@ bool TryRemapRanges(RazorCSharpDocument csharpDocument, DocumentSymbol documentS return false; } } + + private static string RenderMethodSignature(RazorFileKind fileKind) + => fileKind == RazorFileKind.Legacy + ? "ExecuteAsync()" + : "BuildRenderTree(RenderTreeBuilder __builder)"; + + private static string RenderMethodDisplay(RazorFileKind fileKind) + => fileKind == RazorFileKind.Legacy + ? "ExecuteAsync()" + : "BuildRenderTree()"; // We hide __builder because it can be misleading to users: https://github.com/dotnet/razor/issues/11960 + } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DocumentSymbols/IDocumentSymbolService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DocumentSymbols/IDocumentSymbolService.cs index 7fab7ad26e6..69c5c306e20 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DocumentSymbols/IDocumentSymbolService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DocumentSymbols/IDocumentSymbolService.cs @@ -8,5 +8,5 @@ namespace Microsoft.CodeAnalysis.Razor.Protocol.DocumentSymbols; internal interface IDocumentSymbolService { - SumType? GetDocumentSymbols(Uri razorDocumentUri, RazorCSharpDocument csharpDocument, SumType csharpSymbols); + SumType? GetDocumentSymbols(RazorFileKind fileKind, Uri razorDocumentUri, RazorCSharpDocument csharpDocument, SumType csharpSymbols); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/LanguageServerConstants.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/LanguageServerConstants.cs index 754a268ad7d..a760923d534 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/LanguageServerConstants.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/LanguageServerConstants.cs @@ -5,6 +5,9 @@ namespace Microsoft.CodeAnalysis.Razor.Protocol; internal static class LanguageServerConstants { + public const string HtmlVirtualDocumentSuffix = "__virtual.html"; + public const string CSharpVirtualDocumentSuffix = ".ide.g.cs"; + public const string RazorLanguageQueryEndpoint = "razor/languageQuery"; public const string RazorBreakpointSpanEndpoint = "razor/breakpointSpan"; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/IRemoteDataTipRangeService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/IRemoteDataTipRangeService.cs new file mode 100644 index 00000000000..64e0b1ed722 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/IRemoteDataTipRangeService.cs @@ -0,0 +1,18 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; + +namespace Microsoft.CodeAnalysis.Razor.Remote; + +internal interface IRemoteDataTipRangeService : IRemoteJsonService +{ + ValueTask> GetDataTipRangeAsync( + JsonSerializableRazorPinnedSolutionInfoWrapper solutionInfo, + JsonSerializableDocumentId razorDocumentId, + Position position, + CancellationToken cancellationToken); +} + diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/IRemoteSpanMappingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/IRemoteSpanMappingService.cs index ddff29ffb47..c0997178d6a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/IRemoteSpanMappingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/IRemoteSpanMappingService.cs @@ -22,4 +22,12 @@ ValueTask> MapSpansAsync( DocumentId generatedDocumentId, ImmutableArray spans, CancellationToken cancellationToken); + + ValueTask TryExcerptAsync( + RazorPinnedSolutionInfoWrapper solutionInfo, + DocumentId id, + TextSpan span, + RazorExcerptMode mode, + RazorClassificationOptionsWrapper options, + CancellationToken cancellationToken); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RazorServices.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RazorServices.cs index fa25803fc2b..f08f7fc4882 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RazorServices.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RazorServices.cs @@ -47,6 +47,7 @@ internal static class RazorServices (typeof(IRemoteFindAllReferencesService), null), (typeof(IRemoteMEFInitializationService), null), (typeof(IRemoteCodeLensService), null), + (typeof(IRemoteDataTipRangeService), null), ]; private const string ComponentName = "Razor"; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RemoteClientInitializationOptions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RemoteClientInitializationOptions.cs index 448da662e98..148606ce5b3 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RemoteClientInitializationOptions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RemoteClientInitializationOptions.cs @@ -10,9 +10,6 @@ internal struct RemoteClientInitializationOptions [JsonPropertyName("useRazorCohostServer")] public required bool UseRazorCohostServer { get; set; } - [JsonPropertyName("htmlVirtualDocumentSuffix")] - public required string HtmlVirtualDocumentSuffix { get; set; } - [JsonPropertyName("returnCodeActionAndRenamePathsWithPrefixedSlash")] public required bool ReturnCodeActionAndRenamePathsWithPrefixedSlash { get; set; } @@ -21,10 +18,4 @@ internal struct RemoteClientInitializationOptions [JsonPropertyName("showAllCSharpCodeActions")] public required bool ShowAllCSharpCodeActions { get; set; } - - [JsonPropertyName("supportsSoftSelectionInCompletion")] - public required bool SupportsSoftSelectionInCompletion { get; set; } - - [JsonPropertyName("useVsCodeCompletionCommitCharacters")] - public required bool UseVsCodeCompletionCommitCharacters { get; set; } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RemoteExcerptResult.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RemoteExcerptResult.cs new file mode 100644 index 00000000000..1c4cedaeac2 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/RemoteExcerptResult.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using System.Runtime.Serialization; +using Microsoft.CodeAnalysis.Classification; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.Razor.Remote; + +[DataContract] +internal sealed record RemoteExcerptResult( + [property: DataMember(Order = 0)] DocumentId RazorDocumentId, + [property: DataMember(Order = 1)] TextSpan RazorDocumentSpan, + [property: DataMember(Order = 2)] TextSpan ExcerptSpan, + [property: DataMember(Order = 3)] ImmutableArray ClassifiedSpans, + [property: DataMember(Order = 4)] TextSpan Span); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Rename/IRenameService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Rename/IRenameService.cs index d11ff780f4c..8b89b958f2e 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Rename/IRenameService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Rename/IRenameService.cs @@ -10,10 +10,12 @@ namespace Microsoft.CodeAnalysis.Razor.Rename; internal interface IRenameService { - Task TryGetRazorRenameEditsAsync( + Task TryGetRazorRenameEditsAsync( DocumentContext documentContext, DocumentPositionInfo positionInfo, string newName, ISolutionQueryOperations solutionQueryOperations, CancellationToken cancellationToken); } + +internal readonly record struct RenameResult(WorkspaceEdit? Edit, bool FallbackToCSharp = true); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Rename/RenameService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Rename/RenameService.cs index 7bf2b77017d..3de533b7e79 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Rename/RenameService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Rename/RenameService.cs @@ -17,19 +17,20 @@ using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Razor.Workspaces; -using RazorSyntaxKind = Microsoft.AspNetCore.Razor.Language.SyntaxKind; using RazorSyntaxNode = Microsoft.AspNetCore.Razor.Language.Syntax.SyntaxNode; namespace Microsoft.CodeAnalysis.Razor.Rename; internal class RenameService( IRazorComponentSearchEngine componentSearchEngine, + IFileSystem fileSystem, LanguageServerFeatureOptions languageServerFeatureOptions) : IRenameService { private readonly IRazorComponentSearchEngine _componentSearchEngine = componentSearchEngine; + private readonly IFileSystem _fileSystem = fileSystem; private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; - public async Task TryGetRazorRenameEditsAsync( + public async Task TryGetRazorRenameEditsAsync( DocumentContext documentContext, DocumentPositionInfo positionInfo, string newName, @@ -39,42 +40,62 @@ internal class RenameService( // We only support renaming of .razor components, not .cshtml tag helpers if (!documentContext.FileKind.IsComponent()) { - return null; + return new(Edit: null); } var codeDocument = await documentContext.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); - var originTagHelpers = await GetOriginTagHelpersAsync(documentContext, positionInfo.HostDocumentIndex, cancellationToken).ConfigureAwait(false); - if (originTagHelpers.IsDefaultOrEmpty) + if (!TryGetOriginTagHelpers(codeDocument, positionInfo.HostDocumentIndex, out var originTagHelpers)) { - return null; + return new(Edit: null); } var originComponentDocumentSnapshot = await _componentSearchEngine - .TryLocateComponentAsync(originTagHelpers.First(), solutionQueryOperations, cancellationToken) + .TryLocateComponentAsync(originTagHelpers.Primary, solutionQueryOperations, cancellationToken) .ConfigureAwait(false); if (originComponentDocumentSnapshot is null) { - return null; + return new(Edit: null); } var originComponentDocumentFilePath = originComponentDocumentSnapshot.FilePath; var newPath = MakeNewPath(originComponentDocumentFilePath, newName); - if (File.Exists(newPath)) + if (_fileSystem.FileExists(newPath)) { - return null; + // We found a tag, but the new name would cause a conflict, so we can't proceed with the rename, + // even if C# might have worked. + return new(Edit: null, FallbackToCSharp: false); } - using var _ = ListPool>.GetPooledObject(out var documentChanges); - var fileRename = GetFileRenameForComponent(originComponentDocumentSnapshot, newPath); + using var documentChanges = new PooledArrayBuilder>(); + + var fileRename = GetRenameFileEdit(originComponentDocumentFilePath, newPath); documentChanges.Add(fileRename); - AddEditsForCodeDocument(documentChanges, originTagHelpers, newName, new(documentContext.Uri), codeDocument); - var documentSnapshots = GetAllDocumentSnapshots(documentContext.FilePath, solutionQueryOperations); + if (!_languageServerFeatureOptions.UseRazorCohostServer) + { + AddEditsForCodeDocument(ref documentChanges.AsRef(), originTagHelpers, newName, new(documentContext.Uri), codeDocument); + } + + AddAdditionalFileRenames(ref documentChanges.AsRef(), originComponentDocumentFilePath, newPath); - foreach (var documentSnapshot in documentSnapshots) + if (!_languageServerFeatureOptions.UseRazorCohostServer) { - await AddEditsForCodeDocumentAsync(documentChanges, originTagHelpers, newName, documentSnapshot, cancellationToken).ConfigureAwait(false); + var documentSnapshots = GetAllDocumentSnapshots(documentContext.FilePath, solutionQueryOperations); + + foreach (var documentSnapshot in documentSnapshots) + { + if (!documentSnapshot.FileKind.IsComponent()) + { + continue; + } + + // VS Code in Windows expects path to start with '/' + var uri = new DocumentUri(LspFactory.CreateFilePathUri(documentSnapshot.FilePath, _languageServerFeatureOptions)); + var generatedOutput = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); + + AddEditsForCodeDocument(ref documentChanges.AsRef(), originTagHelpers, newName, uri, generatedOutput); + } } foreach (var documentChange in documentChanges) @@ -86,16 +107,16 @@ internal class RenameService( } } - return new WorkspaceEdit + return new(Edit: new() { - DocumentChanges = documentChanges.ToArray(), - }; + DocumentChanges = documentChanges.ToArrayAndClear() + }); } private static ImmutableArray GetAllDocumentSnapshots(string filePath, ISolutionQueryOperations solutionQueryOperations) { using var documentSnapshots = new PooledArrayBuilder(); - using var _ = StringHashSetPool.GetPooledObject(out var documentPaths); + using var _ = SpecializedPools.GetPooledStringHashSet(out var documentPaths); foreach (var project in solutionQueryOperations.GetProjects()) { @@ -126,11 +147,31 @@ private static ImmutableArray GetAllDocumentSnapshots(string return documentSnapshots.ToImmutableAndClear(); } - private RenameFile GetFileRenameForComponent(IDocumentSnapshot documentSnapshot, string newPath) - => new RenameFile + private void AddAdditionalFileRenames( + ref PooledArrayBuilder> documentChanges, + string oldFilePath, string newFilePath) + { + TryAdd(".cs", ref documentChanges); + TryAdd(".css", ref documentChanges); + + void TryAdd( + string extension, + ref PooledArrayBuilder> documentChanges) + { + var changedPath = oldFilePath + extension; + + if (_fileSystem.FileExists(changedPath)) + { + documentChanges.Add(GetRenameFileEdit(changedPath, newFilePath + extension)); + } + } + } + + private RenameFile GetRenameFileEdit(string oldFilePath, string newFilePath) + => new() { - OldDocumentUri = new(LspFactory.CreateFilePathUri(documentSnapshot.FilePath, _languageServerFeatureOptions)), - NewDocumentUri = new(LspFactory.CreateFilePathUri(newPath, _languageServerFeatureOptions)), + OldDocumentUri = new(LspFactory.CreateFilePathUri(oldFilePath, _languageServerFeatureOptions)), + NewDocumentUri = new(LspFactory.CreateFilePathUri(newFilePath, _languageServerFeatureOptions)), }; private static string MakeNewPath(string originalPath, string newName) @@ -140,118 +181,160 @@ private static string MakeNewPath(string originalPath, string newName) return Path.Combine(directoryName, newFileName); } - private async Task AddEditsForCodeDocumentAsync( - List> documentChanges, - ImmutableArray originTagHelpers, + private void AddEditsForCodeDocument( + ref PooledArrayBuilder> documentChanges, + OriginTagHelpers originTagHelpers, string newName, - IDocumentSnapshot documentSnapshot, - CancellationToken cancellationToken) + DocumentUri uri, + RazorCodeDocument codeDocument) { - if (!documentSnapshot.FileKind.IsComponent()) + var documentIdentifier = new OptionalVersionedTextDocumentIdentifier { DocumentUri = uri }; + + using var elements = new PooledArrayBuilder(); + + foreach (var node in codeDocument.GetRequiredSyntaxRoot().DescendantNodes()) { - return; + if (node is MarkupTagHelperElementSyntax element) + { + elements.Add(element); + } } - var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); + // Collect all edits first, then de-duplicate them by range. + using var allEdits = new PooledArrayBuilder>(); - // VS Code in Windows expects path to start with '/' - var uri = new DocumentUri(LspFactory.CreateFilePathUri(documentSnapshot.FilePath, _languageServerFeatureOptions)); + if (TryCollectEdits(originTagHelpers.Primary, newName, codeDocument.Source, in elements, ref allEdits.AsRef()) && + (originTagHelpers.Associated is null || TryCollectEdits(originTagHelpers.Associated, newName, codeDocument.Source, in elements, ref allEdits.AsRef()))) + { + var uniqueEdits = GetUniqueEdits(ref allEdits.AsRef()); - AddEditsForCodeDocument(documentChanges, originTagHelpers, newName, uri, codeDocument); - } + if (uniqueEdits.Length > 0) + { + documentChanges.Add(new TextDocumentEdit + { + TextDocument = documentIdentifier, + Edits = uniqueEdits, + }); + } + } - private static void AddEditsForCodeDocument( - List> documentChanges, - ImmutableArray originTagHelpers, - string newName, - DocumentUri uri, - RazorCodeDocument codeDocument) - { - var documentIdentifier = new OptionalVersionedTextDocumentIdentifier { DocumentUri = uri }; - var tagHelperElements = codeDocument.GetRequiredSyntaxRoot() - .DescendantNodes() - .OfType(); + return; - foreach (var originTagHelper in originTagHelpers) + static bool TryCollectEdits( + TagHelperDescriptor tagHelper, + string newName, + RazorSourceDocument sourceDocument, + ref readonly PooledArrayBuilder elements, + ref PooledArrayBuilder> edits) { var editedName = newName; - if (originTagHelper.IsFullyQualifiedNameMatch) + + if (tagHelper.IsFullyQualifiedNameMatch) { // Fully qualified binding, our "new name" needs to be fully qualified. - var @namespace = originTagHelper.TypeNamespace; + var @namespace = tagHelper.TypeNamespace; if (@namespace == null) { - return; + return false; } - // The origin TagHelper was fully qualified so any fully qualified rename locations we find will need a fully qualified renamed edit. + // The origin TagHelper was fully qualified so any fully qualified rename locations + // we find will need a fully qualified renamed edit. editedName = $"{@namespace}.{newName}"; } - foreach (var node in tagHelperElements) + foreach (var element in elements) { - if (node is MarkupTagHelperElementSyntax { TagHelperInfo.BindingResult: var binding } tagHelperElement && - BindingContainsTagHelper(originTagHelper, binding)) + if (element.TagHelperInfo.BindingResult.TagHelpers.Contains(tagHelper)) { - documentChanges.Add(new TextDocumentEdit + var startTagEdit = LspFactory.CreateTextEdit(element.StartTag.Name.GetRange(sourceDocument), editedName); + + edits.Add(startTagEdit); + + if (element.EndTag is MarkupTagHelperEndTagSyntax endTag) { - TextDocument = documentIdentifier, - Edits = CreateEditsForMarkupTagHelperElement(tagHelperElement, codeDocument, editedName), - }); + var endTagEdit = LspFactory.CreateTextEdit(endTag.Name.GetRange(sourceDocument), editedName); + + edits.Add(endTagEdit); + } } } - } - } - private static SumType[] CreateEditsForMarkupTagHelperElement(MarkupTagHelperElementSyntax element, RazorCodeDocument codeDocument, string newName) - { - var startTagEdit = LspFactory.CreateTextEdit(element.StartTag.Name.GetRange(codeDocument.Source), newName); + return true; + } - if (element.EndTag is MarkupTagHelperEndTagSyntax endTag) + static SumType[] GetUniqueEdits( + ref PooledArrayBuilder> edits) { - var endTagEdit = LspFactory.CreateTextEdit(endTag.Name.GetRange(codeDocument.Source), newName); + if (edits.Count == 0) + { + return []; + } - return [startTagEdit, endTagEdit]; - } + // De-duplicate edits by range. + using var uniqueEdits = new PooledArrayBuilder>(edits.Count); + using var _ = HashSetPool.GetPooledObject(out var seenRanges); + +#if NET + seenRanges.EnsureCapacity(edits.Count); +#endif + + foreach (var edit in edits) + { + if (edit.TryGetFirst(out var textEdit)) + { + if (seenRanges.Add(textEdit.Range)) + { + uniqueEdits.Add(edit); + } + } + else if (edit.TryGetSecond(out var annotatedEdit)) + { + if (seenRanges.Add(annotatedEdit.Range)) + { + uniqueEdits.Add(edit); + } + } + } - return [startTagEdit]; + return uniqueEdits.ToArrayAndClear(); + } } - private static bool BindingContainsTagHelper(TagHelperDescriptor tagHelper, TagHelperBinding potentialBinding) - => potentialBinding.Descriptors.Any(descriptor => descriptor.Equals(tagHelper)); + private readonly record struct OriginTagHelpers(TagHelperDescriptor Primary, TagHelperDescriptor? Associated); - private static async Task> GetOriginTagHelpersAsync(DocumentContext documentContext, int absoluteIndex, CancellationToken cancellationToken) + private bool TryGetOriginTagHelpers(RazorCodeDocument codeDocument, int absoluteIndex, out OriginTagHelpers originTagHelpers) { - var owner = await documentContext.GetSyntaxNodeAsync(absoluteIndex, cancellationToken).ConfigureAwait(false); + var owner = codeDocument.GetRequiredSyntaxRoot().FindInnermostNode(absoluteIndex); if (owner is null) { Debug.Fail("Owner should never be null."); - return default; + originTagHelpers = default; + return false; } if (!TryGetTagHelperBinding(owner, absoluteIndex, out var binding)) { - return default; + originTagHelpers = default; + return false; } // Can only have 1 component TagHelper belonging to an element at a time - var primaryTagHelper = binding.Descriptors.FirstOrDefault(static d => d.Kind == TagHelperKind.Component); + var primaryTagHelper = binding.TagHelpers.FirstOrDefault(static d => d.Kind == TagHelperKind.Component); if (primaryTagHelper is null) { - return default; + originTagHelpers = default; + return false; } - var tagHelpers = await documentContext.Snapshot.Project.GetTagHelpersAsync(cancellationToken).ConfigureAwait(false); - var associatedTagHelper = FindAssociatedTagHelper(primaryTagHelper, tagHelpers); - if (associatedTagHelper is null) - { - return default; - } + var tagHelpers = codeDocument.GetRequiredTagHelpers(); + var associatedTagHelper = TryFindAssociatedTagHelper(primaryTagHelper, tagHelpers); - return [primaryTagHelper, associatedTagHelper]; + originTagHelpers = new(primaryTagHelper, associatedTagHelper); + return true; } - private static bool TryGetTagHelperBinding(RazorSyntaxNode owner, int absoluteIndex, [NotNullWhen(true)] out TagHelperBinding? binding) + private bool TryGetTagHelperBinding(RazorSyntaxNode owner, int absoluteIndex, [NotNullWhen(true)] out TagHelperBinding? binding) { // End tags are easy, because there is only one possible binding result if (owner is MarkupTagHelperEndTagSyntax { Parent: MarkupTagHelperElementSyntax { TagHelperInfo.BindingResult: var endTagBindingResult } }) @@ -262,8 +345,7 @@ private static bool TryGetTagHelperBinding(RazorSyntaxNode owner, int absoluteIn // A rename of a start tag could have an "owner" of one of its attributes, so we do a bit more checking // to support this case - var node = owner.FirstAncestorOrSelf(n => n.Kind == RazorSyntaxKind.MarkupTagHelperStartTag); - if (node is not MarkupTagHelperStartTagSyntax tagHelperStartTag) + if (owner.FirstAncestorOrSelf() is not { } tagHelperStartTag) { binding = null; return false; @@ -281,6 +363,22 @@ private static bool TryGetTagHelperBinding(RazorSyntaxNode owner, int absoluteIn if (tagHelperStartTag is { Parent: MarkupTagHelperElementSyntax { TagHelperInfo.BindingResult: var startTagBindingResult } }) { binding = startTagBindingResult; + + // If the component is fully qualified, we need to make sure that the caret is in the actual component name part + // not a namespace part. This only applies in cohosting, where we also get Roslyn edits for renames, and hence + // renaming a namespace part will actually rename the namespace. + if (_languageServerFeatureOptions.UseRazorCohostServer && + binding.TagHelpers is [{ IsFullyQualifiedNameMatch: true }, ..]) + { + var lastDotIndex = tagHelperStartTag.Name.Content.LastIndexOf('.'); + Debug.Assert(lastDotIndex != -1, "Fully qualified component names should contain a dot."); + if (absoluteIndex < tagHelperStartTag.Name.SpanStart + lastDotIndex + 1) + { + binding = null; + return false; + } + } + return true; } @@ -288,33 +386,23 @@ private static bool TryGetTagHelperBinding(RazorSyntaxNode owner, int absoluteIn return false; } - private static TagHelperDescriptor? FindAssociatedTagHelper(TagHelperDescriptor tagHelper, ImmutableArray tagHelpers) + private static TagHelperDescriptor? TryFindAssociatedTagHelper( + TagHelperDescriptor primary, + TagHelperCollection tagHelpers) { - var typeName = tagHelper.TypeName; - var assemblyName = tagHelper.AssemblyName; - foreach (var currentTagHelper in tagHelpers) - { - if (tagHelper == currentTagHelper) - { - // Same as the primary, we're looking for our other pair. - continue; - } + var typeName = primary.TypeName; + var assemblyName = primary.AssemblyName; - if (typeName != currentTagHelper.TypeName) - { - continue; - } - - if (assemblyName != currentTagHelper.AssemblyName) + foreach (var tagHelper in tagHelpers) + { + if (typeName == tagHelper.TypeName && + assemblyName == tagHelper.AssemblyName && + !tagHelper.Equals(primary)) { - continue; + return tagHelper; } - - // Found our associated TagHelper, there should only ever be 1 other associated TagHelper (fully qualified and non-fully qualified). - return currentTagHelper; } - Debug.Fail("Components should always have an associated TagHelper."); return null; } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/SR.resx b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/SR.resx index 7f407c12e42..93b26605604 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/SR.resx +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/SR.resx @@ -230,4 +230,7 @@ {0} (and req'd attributes...) The term "req'd" is an abbreviation for "required"
                  + + {0} Keyword + \ No newline at end of file diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.cs.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.cs.xlf index 9226e11be37..47e428a5f9f 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.cs.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.cs.xlf @@ -104,6 +104,11 @@ Neplatný posun + + {0} Keyword + Klíčové slovo {0} + + Razor language services not configured properly, missing language service '{0}'. Služby jazyka Razor nejsou správně nakonfigurované, chybí služba jazyka {0}. @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Zjednodušení plně kvalifikované komponenty diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.de.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.de.xlf index 6ea9f84bc69..36451532504 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.de.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.de.xlf @@ -104,6 +104,11 @@ Ungültiger Offset. + + {0} Keyword + {0}-Schlüsselwort + + Razor language services not configured properly, missing language service '{0}'. Razor-Sprachdienste sind nicht ordnungsgemäß konfiguriert, der Sprachdienst "{0}" fehlt. @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Vereinfachen der vollqualifizierten Komponente diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.es.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.es.xlf index ae7685bfb32..90429dc25af 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.es.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.es.xlf @@ -104,6 +104,11 @@ Desplazamiento no válido. + + {0} Keyword + {0} Palabra clave + + Razor language services not configured properly, missing language service '{0}'. Los servicios de lenguaje Razor no están configurados correctamente; falta el servicio de idioma "{0}". @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Simplificar componente totalmente calificado diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.fr.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.fr.xlf index 74f7aaa02e0..d94655edcf2 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.fr.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.fr.xlf @@ -104,6 +104,11 @@ Décalage non valide. + + {0} Keyword + Mot clé {0} + + Razor language services not configured properly, missing language service '{0}'. Les services de langage Razor ne sont pas configurés correctement, le service de langage «{0}» manquant. @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Simplifier le composant complet diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.it.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.it.xlf index ca1a402ffeb..232f06d05ec 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.it.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.it.xlf @@ -104,6 +104,11 @@ Offset non valido. + + {0} Keyword + Parola chiave di {0} + + Razor language services not configured properly, missing language service '{0}'. I servizi di linguaggio Razor non sono configurati correttamente. Manca il servizio di linguaggio '{0}'. @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Semplifica il componente completamente qualificato diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ja.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ja.xlf index 856e55a852b..1ba23490c1d 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ja.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ja.xlf @@ -104,6 +104,11 @@ 無効なオフセットです。 + + {0} Keyword + {0} キーワード + + Razor language services not configured properly, missing language service '{0}'. Razor 言語サービスが正しく構成されていません。言語サービス '{0}' がありません。 @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + 完全修飾コンポーネントの簡略化 diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ko.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ko.xlf index 8a128539a5b..6bf70f15642 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ko.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ko.xlf @@ -104,6 +104,11 @@ 오프셋이 유효하지 않습니다. + + {0} Keyword + {0} 키워드 + + Razor language services not configured properly, missing language service '{0}'. Razor 언어 서비스가 제대로 구성되지 않았습니다. 언어 서비스 '{0}'이(가) 없습니다. @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + 정규화된 구성 요소 간소화 diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.pl.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.pl.xlf index 94c7c378f5d..71467434682 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.pl.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.pl.xlf @@ -104,6 +104,11 @@ Nieprawidłowe przesunięcie. + + {0} Keyword + Słowo kluczowe {0} + + Razor language services not configured properly, missing language service '{0}'. Usługi języka dla składni Razor nie zostały prawidłowo skonfigurowane — brak usługi językowej "{0}". @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Upraszczanie w pełni kwalifikowanego składnika diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.pt-BR.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.pt-BR.xlf index 40979f6657f..b63b70709b5 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.pt-BR.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.pt-BR.xlf @@ -104,6 +104,11 @@ Deslocamento inválido. + + {0} Keyword + {0} Palavra-chave + + Razor language services not configured properly, missing language service '{0}'. Serviços de Linguagem Razor não configurados corretamente, serviço de linguagem '{0}' ausente. @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Simplifique o componente totalmente qualificado diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ru.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ru.xlf index 22e91fec0b8..30936006f8a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ru.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.ru.xlf @@ -104,6 +104,11 @@ Недопустимое смещение. + + {0} Keyword + Ключевое слово: {0} + + Razor language services not configured properly, missing language service '{0}'. Языковые службы Razor настроены неправильно, отсутствует языковая служба "{0}". @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Упростите полный компонент с квалификатором diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.tr.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.tr.xlf index d730f936628..b584031aa3a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.tr.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.tr.xlf @@ -104,6 +104,11 @@ Geçersiz uzaklık. + + {0} Keyword + {0} Anahtar Sözcüğü + + Razor language services not configured properly, missing language service '{0}'. Razor dil hizmetleri düzgün yapılandırılmadı, '{0}' dil hizmeti eksik. @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + Tam nitelenmiş bileşeni basitleştir diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.zh-Hans.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.zh-Hans.xlf index a60f39a6b7b..88b2e01340b 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.zh-Hans.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.zh-Hans.xlf @@ -104,6 +104,11 @@ 偏移无效。 + + {0} Keyword + {0} 关键字 + + Razor language services not configured properly, missing language service '{0}'. Razor 语言服务未正确配置,缺少语言服务 "{0}"。 @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + 简化完全限定的组件 diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.zh-Hant.xlf b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.zh-Hant.xlf index 514a5565752..d4f2abe32c3 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.zh-Hant.xlf +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Resources/xlf/SR.zh-Hant.xlf @@ -104,6 +104,11 @@ 位移無效。 + + {0} Keyword + {0} 關鍵字 + + Razor language services not configured properly, missing language service '{0}'. 未正確設定 Razor 語言服務,遺漏語言服務 '{0}'。 @@ -131,7 +136,7 @@ Simplify fully qualified component - Simplify fully qualified component + 簡化完整合格的元件 diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/AbstractRazorSemanticTokensInfoService.Policy.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/AbstractRazorSemanticTokensInfoService.Policy.cs deleted file mode 100644 index e89cc528397..00000000000 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/AbstractRazorSemanticTokensInfoService.Policy.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.CodeAnalysis.Razor.SemanticTokens; - -internal abstract partial class AbstractRazorSemanticTokensInfoService -{ - private sealed class Policy : IPooledObjectPolicy> - { - public static readonly Policy Instance = new(); - - // Significantly larger than DefaultPool.MaximumObjectSize as these arrays are commonly large. - // The 2048 limit should be large enough for nearly all semantic token requests, while still - // keeping the backing arrays off the LOH. - public const int MaximumObjectSize = 2048; - - private Policy() - { - } - - public List Create() => []; - - public bool Return(List list) - { - var count = list.Count; - - list.Clear(); - - if (count > MaximumObjectSize) - { - list.TrimExcess(); - } - - return true; - } - } -} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/AbstractRazorSemanticTokensInfoService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/AbstractRazorSemanticTokensInfoService.cs index 91bd9a4bad6..d6416188253 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/AbstractRazorSemanticTokensInfoService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/AbstractRazorSemanticTokensInfoService.cs @@ -15,7 +15,6 @@ using Microsoft.CodeAnalysis.Razor.Logging; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Text; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.CodeAnalysis.Razor.SemanticTokens; @@ -29,7 +28,11 @@ internal abstract partial class AbstractRazorSemanticTokensInfoService( private const int TokenSize = 5; // Use a custom pool as these lists commonly exceed the size threshold for returning into the default ListPool. - private static readonly ObjectPool> s_pool = DefaultPool.Create(Policy.Instance, size: 8); + // These lists are significantly larger than DefaultPool.MaximumObjectSize as these arrays are commonly large. + // The 2048 limit should be large enough for nearly all semantic token requests, while still + // keeping the backing arrays off the LOH. + + private static readonly ListPool s_pool = ListPool.Create(maximumObjectSize: 2048, poolSize: 8); private readonly IDocumentMappingService _documentMappingService = documentMappingService; private readonly ISemanticTokensLegendService _semanticTokensLegendService = semanticTokensLegendService; @@ -188,7 +191,7 @@ private void AddAdditionalCSharpWhitespaceRanges(List razorRanges ContainsOnlySpacesOrTabs(razorSource, previousSpanEndIndex + 1, startChar - previousRange.End.Character - 1)) { // we're on the same line as previous, lets extend ours to include whitespace between us and the proceeding range - razorRanges.Add(new SemanticRange(textClassification, startLine, previousRange.End.Character, startLine, startChar, _semanticTokensLegendService.TokenModifiers.RazorCodeModifier, fromRazor: false)); + razorRanges.Add(new SemanticRange(textClassification, startLine, previousRange.End.Character, startLine, startChar, _semanticTokensLegendService.TokenModifiers.RazorCodeModifier, fromRazor: false, isCSharpWhitespace: true)); } else if (startChar > 0 && previousRazorSemanticRange?.End.Line != startLine && @@ -196,7 +199,7 @@ private void AddAdditionalCSharpWhitespaceRanges(List razorRanges ContainsOnlySpacesOrTabs(razorSource, originalRangeStartIndex - startChar + 1, startChar - 1)) { // We're on a new line, and the start of the line is only whitespace, so give that a background color too - razorRanges.Add(new SemanticRange(textClassification, startLine, 0, startLine, startChar, _semanticTokensLegendService.TokenModifiers.RazorCodeModifier, fromRazor: false)); + razorRanges.Add(new SemanticRange(textClassification, startLine, 0, startLine, startChar, _semanticTokensLegendService.TokenModifiers.RazorCodeModifier, fromRazor: false, isCSharpWhitespace: true)); } } @@ -292,15 +295,21 @@ private static int[] ConvertSemanticRangesToSemanticTokensData( var isFirstRange = true; var index = 0; SemanticRange previousRange = default; + var i = 0; foreach (var range in semanticRanges) { - if (TryWriteToken(range, previousRange, isFirstRange, sourceText, tokens.AsSpan(index, TokenSize))) + var nextRange = semanticRanges.Count > i + 1 + ? semanticRanges[i + 1] + : default; + + if (TryWriteToken(range, previousRange, nextRange, isFirstRange, sourceText, tokens.AsSpan(index, TokenSize))) { index += TokenSize; + previousRange = range; } isFirstRange = false; - previousRange = range; + i++; } // The common case is that the ConvertIntoDataArray calls didn't find any overlap, and we can just directly use the @@ -316,12 +325,33 @@ private static int[] ConvertSemanticRangesToSemanticTokensData( static bool TryWriteToken( SemanticRange currentRange, SemanticRange previousRange, + SemanticRange nextRange, bool isFirstRange, SourceText sourceText, Span destination) { Debug.Assert(destination.Length == TokenSize); + // Due to the fact that Razor ranges can supersede C# ranges, we can end up with C# whitespace ranges we've + // added, that we not don't want after further processing, so check for that, and skip emitting those ranges. + if (currentRange.IsCSharpWhitespace) + { + // If the previous range is on the same line, and from Razor, then we don't want to emit this. + // This happens when we have leftover whitespace from between two C# ranges, that were superseded by Razor ranges. + if (previousRange.FromRazor && + currentRange.StartLine == previousRange.EndLine) + { + return false; + } + + // If the next range is Razor, then it's leftover whitespace before C#, that was superseded by Razor, so don't emit. + if (nextRange.FromRazor && + currentRange.StartCharacter == 0) + { + return false; + } + } + /* * In short, each token takes 5 integers to represent, so a specific token `i` in the file consists of the following array indices: * - at index `5*i` - `deltaLine`: token line number, relative to the previous token diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/SemanticRange.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/SemanticRange.cs index 7208b71dbd7..a5b84c35a4d 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/SemanticRange.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/SemanticRange.cs @@ -8,7 +8,7 @@ namespace Microsoft.CodeAnalysis.Razor.SemanticTokens; internal readonly struct SemanticRange : IComparable { - public SemanticRange(int kind, int startLine, int startCharacter, int endLine, int endCharacter, int modifier, bool fromRazor) + public SemanticRange(int kind, int startLine, int startCharacter, int endLine, int endCharacter, int modifier, bool fromRazor, bool isCSharpWhitespace) { Kind = kind; StartLine = startLine; @@ -17,6 +17,7 @@ public SemanticRange(int kind, int startLine, int startCharacter, int endLine, i EndCharacter = endCharacter; Modifier = modifier; FromRazor = fromRazor; + IsCSharpWhitespace = isCSharpWhitespace; } public SemanticRange(int kind, LinePositionSpan range, int modifier, bool fromRazor) @@ -25,7 +26,12 @@ public SemanticRange(int kind, LinePositionSpan range, int modifier, bool fromRa } public SemanticRange(int kind, LinePosition start, LinePosition end, int modifier, bool fromRazor) - : this(kind, start.Line, start.Character, end.Line, end.Character, modifier, fromRazor) + : this(kind, start.Line, start.Character, end.Line, end.Character, modifier, fromRazor, isCSharpWhitespace: false) + { + } + + public SemanticRange(int kind, int startLine, int startCharacter, int endLine, int endCharacter, int modifier, bool fromRazor) + : this(kind, startLine, startCharacter, endLine, endCharacter, modifier, fromRazor, isCSharpWhitespace: false) { } @@ -45,6 +51,8 @@ public SemanticRange(int kind, LinePosition start, LinePosition end, int modifie /// public bool FromRazor { get; } + public bool IsCSharpWhitespace { get; } + public LinePositionSpan AsLinePositionSpan() => new(new(StartLine, StartCharacter), new(EndLine, EndCharacter)); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/SemanticTokensVisitor.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/SemanticTokensVisitor.cs index ab8f682eb3b..2d5ff0eeed3 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/SemanticTokensVisitor.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/SemanticTokens/SemanticTokensVisitor.cs @@ -490,7 +490,7 @@ private static bool IsComponent(SyntaxNode node) { if (node is MarkupTagHelperElementSyntax { TagHelperInfo.BindingResult: var binding }) { - var componentDescriptor = binding.Descriptors.FirstOrDefault(static d => d.Kind == TagHelperKind.Component); + var componentDescriptor = binding.TagHelpers.FirstOrDefault(static d => d.Kind == TagHelperKind.Component); return componentDescriptor is not null; } else if (node is MarkupTagHelperStartTagSyntax startTag) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/FetchTagHelpersResult.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/FetchTagHelpersResult.cs index 9a9c95ada4a..64f2ab367c8 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/FetchTagHelpersResult.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/FetchTagHelpersResult.cs @@ -1,12 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; namespace Microsoft.CodeAnalysis.Razor.Serialization; -internal sealed record FetchTagHelpersResult(ImmutableArray TagHelpers) +internal sealed record FetchTagHelpersResult(TagHelperCollection TagHelpers) { - public static readonly FetchTagHelpersResult Empty = new(ImmutableArray.Empty); + public static readonly FetchTagHelpersResult Empty = new(TagHelperCollection.Empty); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/ChecksumFormatter.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/ChecksumFormatter.cs index fb68e1c4624..6797bbe4bfd 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/ChecksumFormatter.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/ChecksumFormatter.cs @@ -8,6 +8,8 @@ namespace Microsoft.CodeAnalysis.Razor.Serialization.MessagePack.Formatters; internal sealed class ChecksumFormatter : NonCachingFormatter { + private const int PropertyCount = 2; + public static readonly NonCachingFormatter Instance = new ChecksumFormatter(); private ChecksumFormatter() @@ -16,27 +18,19 @@ private ChecksumFormatter() public override Checksum Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { - reader.ReadArrayHeaderAndVerify(4); + reader.ReadArrayHeaderAndVerify(PropertyCount); var data1 = reader.ReadInt64(); var data2 = reader.ReadInt64(); - var data3 = reader.ReadInt64(); - var data4 = reader.ReadInt64(); - - var hashData = new Checksum.HashData(data1, data2, data3, data4); - return new Checksum(hashData); + return new Checksum(data1, data2); } public override void Serialize(ref MessagePackWriter writer, Checksum value, MessagePackSerializerOptions options) { - writer.WriteArrayHeader(4); - - var hashData = value.Data; + writer.WriteArrayHeader(PropertyCount); - writer.Write(hashData.Data1); - writer.Write(hashData.Data2); - writer.Write(hashData.Data3); - writer.Write(hashData.Data4); + writer.Write(value.Data1); + writer.Write(value.Data2); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/FetchTagHelpersResultFormatter.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/FetchTagHelpersResultFormatter.cs index 351bb25397d..96b4f4008f1 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/FetchTagHelpersResultFormatter.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/FetchTagHelpersResultFormatter.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using MessagePack; using Microsoft.AspNetCore.Razor.Language; @@ -17,7 +16,7 @@ private FetchTagHelpersResultFormatter() public override FetchTagHelpersResult Deserialize(ref MessagePackReader reader, SerializerCachingOptions options) { - var tagHelpers = reader.Deserialize>(options); + var tagHelpers = reader.Deserialize(options); return new(tagHelpers); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/ProjectWorkspaceStateFormatter.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/ProjectWorkspaceStateFormatter.cs index 9da11b26804..b9fb89b3eea 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/ProjectWorkspaceStateFormatter.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/ProjectWorkspaceStateFormatter.cs @@ -1,14 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using MessagePack; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.AspNetCore.Razor.Utilities; using Microsoft.CodeAnalysis.Razor.ProjectSystem; -using Microsoft.CodeAnalysis.Razor.Serialization.MessagePack.Formatters.TagHelpers; -using Microsoft.CodeAnalysis.Razor.Utilities; namespace Microsoft.CodeAnalysis.Razor.Serialization.MessagePack.Formatters; @@ -22,42 +18,13 @@ private ProjectWorkspaceStateFormatter() public override ProjectWorkspaceState Deserialize(ref MessagePackReader reader, SerializerCachingOptions options) { - reader.ReadArrayHeaderAndVerify(2); - - var checksums = reader.Deserialize>(options); - - reader.ReadArrayHeaderAndVerify(checksums.Length); - - using var builder = new PooledArrayBuilder(capacity: checksums.Length); - var cache = TagHelperCache.Default; - - foreach (var checksum in checksums) - { - if (!cache.TryGet(checksum, out var tagHelper)) - { - tagHelper = TagHelperFormatter.Instance.Deserialize(ref reader, options); - cache.TryAdd(checksum, tagHelper); - } - else - { - TagHelperFormatter.Instance.Skim(ref reader, options); - } - - builder.Add(tagHelper); - } - - var tagHelpers = builder.ToImmutableAndClear(); + var tagHelpers = reader.Deserialize(options).AssumeNotNull(); return ProjectWorkspaceState.Create(tagHelpers); } public override void Serialize(ref MessagePackWriter writer, ProjectWorkspaceState value, SerializerCachingOptions options) { - writer.WriteArrayHeader(2); - - var checksums = value.TagHelpers.SelectAsArray(x => x.Checksum); - - writer.Serialize(checksums, options); writer.Serialize(value.TagHelpers, options); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/SerializerCachingOptions.ReferenceMap`1.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/SerializerCachingOptions.ReferenceMap`1.cs index 34118f7d22a..3993ed91be8 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/SerializerCachingOptions.ReferenceMap`1.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/SerializerCachingOptions.ReferenceMap`1.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.CodeAnalysis.Razor.Serialization.MessagePack.Formatters; @@ -13,11 +12,11 @@ internal partial class SerializerCachingOptions public struct ReferenceMap : IDisposable where T : notnull { - private readonly ObjectPool> _dictionaryPool; + private readonly DictionaryPool _dictionaryPool; private List _values; private Dictionary _valueToIdMap; - public ReferenceMap(ObjectPool> dictionaryPool) + public ReferenceMap(DictionaryPool dictionaryPool) { _dictionaryPool = dictionaryPool; _values = ListPool.Default.Get(); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/SerializerCachingOptions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/SerializerCachingOptions.cs index 993040f0814..e257b46bfc6 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/SerializerCachingOptions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/SerializerCachingOptions.cs @@ -2,17 +2,14 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Collections.Generic; using MessagePack; using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.CodeAnalysis.Razor.Serialization.MessagePack.Formatters; internal partial class SerializerCachingOptions(MessagePackSerializerOptions copyFrom) : MessagePackSerializerOptions(copyFrom), IDisposable { - private static readonly ObjectPool> s_stringPool - = StringDictionaryPool.Ordinal; + private static readonly DictionaryPool s_stringPool = SpecializedPools.StringDictionary.Ordinal; private ReferenceMap? _stringMap; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/TagHelpers/TagHelperCollectionFormatter.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/TagHelpers/TagHelperCollectionFormatter.cs new file mode 100644 index 00000000000..dcf654ca83a --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/TagHelpers/TagHelperCollectionFormatter.cs @@ -0,0 +1,77 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics; +using MessagePack; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.CodeAnalysis.Razor.Utilities; + +namespace Microsoft.CodeAnalysis.Razor.Serialization.MessagePack.Formatters.TagHelpers; + +internal sealed class TagHelperCollectionFormatter : ValueFormatter +{ + public static readonly ValueFormatter Instance = new TagHelperCollectionFormatter(); + + private TagHelperCollectionFormatter() + { + } + + public override TagHelperCollection Deserialize(ref MessagePackReader reader, SerializerCachingOptions options) + { + var count = reader.ReadArrayHeader(); + if (count == 0) + { + return TagHelperCollection.Empty; + } + + // The array is structured as [Checksum, TagHelperDescriptor, Checksum, TagHelperDescriptor, ...] + Debug.Assert(count % 2 == 0, "Expected array to have an even number of elements."); + count /= 2; + + using var builder = new TagHelperCollection.RefBuilder(initialCapacity: count); + + var cache = TagHelperCache.Default; + var checksumFormatter = ChecksumFormatter.Instance; + var tagHelperFormatter = TagHelperFormatter.Instance; + + for (var i = 0; i < count; i++) + { + var checksum = checksumFormatter.Deserialize(ref reader, options); + + if (!cache.TryGet(checksum, out var tagHelper)) + { + tagHelper = tagHelperFormatter.Deserialize(ref reader, options); + cache.TryAdd(checksum, tagHelper); + } + else + { + tagHelperFormatter.Skim(ref reader, options); + } + + builder.Add(tagHelper); + } + + return builder.ToCollection(); + } + + public override void Serialize(ref MessagePackWriter writer, TagHelperCollection value, SerializerCachingOptions options) + { + if (value.Count == 0) + { + writer.WriteArrayHeader(0); + return; + } + + // Write an array of [Checksum, TagHelperDescriptor, Checksum, TagHelperDescriptor, ...] + writer.WriteArrayHeader(value.Count * 2); + + var checksumFormatter = ChecksumFormatter.Instance; + var tagHelperFormatter = TagHelperFormatter.Instance; + + foreach (var tagHelper in value) + { + checksumFormatter.Serialize(ref writer, tagHelper.Checksum, options); + tagHelperFormatter.Serialize(ref writer, tagHelper, options); + } + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Resolvers/FetchTagHelpersResultResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Resolvers/FetchTagHelpersResultResolver.cs index 0761038f1ee..c9c1491915f 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Resolvers/FetchTagHelpersResultResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Resolvers/FetchTagHelpersResultResolver.cs @@ -48,6 +48,7 @@ private static class TypeToFormatterMap RazorDiagnosticFormatter.Instance, RequiredAttributeFormatter.Instance, TagHelperFormatter.Instance, + TagHelperCollectionFormatter.Instance, TagMatchingRuleFormatter.Instance, TypeNameObjectFormatter.Instance }; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Resolvers/RazorProjectInfoResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Resolvers/RazorProjectInfoResolver.cs index 4da4f14e4d2..bae890efe62 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Resolvers/RazorProjectInfoResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Resolvers/RazorProjectInfoResolver.cs @@ -53,6 +53,7 @@ private static class TypeToFormatterMap RazorDiagnosticFormatter.Instance, RequiredAttributeFormatter.Instance, TagHelperFormatter.Instance, + TagHelperCollectionFormatter.Instance, TagMatchingRuleFormatter.Instance, TypeNameObjectFormatter.Instance }; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/SerializationFormat.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/SerializationFormat.cs index 06adc564423..e5b0ca9684c 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/SerializationFormat.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/SerializationFormat.cs @@ -9,5 +9,5 @@ internal static class SerializationFormat // or any of the types that compose it changes. This includes: RazorConfiguration, // ProjectWorkspaceState, TagHelperDescriptor, and DocumentSnapshotHandle. // NOTE: If this version is changed, a coordinated insertion is required between Roslyn and Razor for the C# extension. - public const int Version = 14; + public const int Version = 16; } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TagHelperFacts.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TagHelperFacts.cs index 199c856d359..1c3b53a4363 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TagHelperFacts.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TagHelperFacts.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.AspNetCore.Razor.PooledObjects; @@ -19,10 +20,7 @@ internal static class TagHelperFacts string? parentTag, bool parentIsTagHelper) { - if (documentContext is null) - { - throw new ArgumentNullException(nameof(documentContext)); - } + ArgHelper.ThrowIfNull(documentContext); if (attributes.IsDefault) { @@ -34,7 +32,7 @@ internal static class TagHelperFacts return null; } - if (documentContext.TagHelpers.Length == 0) + if (documentContext.TagHelpers.Count == 0) { return null; } @@ -49,24 +47,13 @@ public static ImmutableArray GetBoundTagHelperAttribut string attributeName, TagHelperBinding binding) { - if (documentContext is null) - { - throw new ArgumentNullException(nameof(documentContext)); - } - - if (attributeName is null) - { - throw new ArgumentNullException(nameof(attributeName)); - } - - if (binding is null) - { - throw new ArgumentNullException(nameof(binding)); - } + ArgHelper.ThrowIfNull(documentContext); + ArgHelper.ThrowIfNull(attributeName); + ArgHelper.ThrowIfNull(binding); using var matchingBoundAttributes = new PooledArrayBuilder(); - foreach (var tagHelper in binding.Descriptors) + foreach (var tagHelper in binding.TagHelpers) { foreach (var boundAttribute in tagHelper.BoundAttributes) { @@ -83,85 +70,73 @@ public static ImmutableArray GetBoundTagHelperAttribut return matchingBoundAttributes.ToImmutableAndClear(); } - public static ImmutableArray GetTagHelpersGivenTag( + public static TagHelperCollection GetTagHelpersGivenTag( TagHelperDocumentContext documentContext, string tagName, string? parentTag) { - if (documentContext is null) - { - throw new ArgumentNullException(nameof(documentContext)); - } + ArgHelper.ThrowIfNull(documentContext); + ArgHelper.ThrowIfNull(tagName); - if (tagName is null) + if (documentContext.TagHelpers.IsEmpty) { - throw new ArgumentNullException(nameof(tagName)); + return []; } - if (documentContext?.TagHelpers is not { Length: > 0 } tagHelpers) - { - return ImmutableArray.Empty; - } + var tagNameWithoutPrefix = tagName.AsMemory(); - var prefix = documentContext?.Prefix ?? string.Empty; - if (!tagName.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + if (documentContext.Prefix is { Length: > 0 } prefix) { - // Can't possibly match TagHelpers, it doesn't start with the TagHelperPrefix. - return ImmutableArray.Empty; - } - - using var matchingDescriptors = new PooledArrayBuilder(); + if (!tagNameWithoutPrefix.Span.StartsWith(prefix.AsSpan(), StringComparison.OrdinalIgnoreCase)) + { + // 'tagName' can't possibly match TagHelpers if it doesn't start with the provided prefix. + return []; + } - var tagNameWithoutPrefix = tagName.AsSpan()[prefix.Length..]; + tagNameWithoutPrefix = tagNameWithoutPrefix[prefix.Length..]; + } - foreach (var tagHelper in tagHelpers) + return documentContext.TagHelpers.Where(state: (tagNameWithoutPrefix, parentTag), static (tagHelper, state) => { foreach (var rule in tagHelper.TagMatchingRules) { - if (TagHelperMatchingConventions.SatisfiesTagName(rule, tagNameWithoutPrefix) && - TagHelperMatchingConventions.SatisfiesParentTag(rule, parentTag.AsSpanOrDefault())) + if (TagHelperMatchingConventions.SatisfiesTagName(rule, state.tagNameWithoutPrefix.Span) && + TagHelperMatchingConventions.SatisfiesParentTag(rule, state.parentTag.AsSpan())) { - matchingDescriptors.Add(tagHelper); - break; + return true; } } - } - return matchingDescriptors.ToImmutableAndClear(); + return false; + }); } - public static ImmutableArray GetTagHelpersGivenParent(TagHelperDocumentContext documentContext, string? parentTag) + public static TagHelperCollection GetTagHelpersGivenParent(TagHelperDocumentContext documentContext, string? parentTag) { - if (documentContext is null) - { - throw new ArgumentNullException(nameof(documentContext)); - } + ArgHelper.ThrowIfNull(documentContext); - if (documentContext?.TagHelpers is not { Length: > 0 } tagHelpers) + if (documentContext.TagHelpers.IsEmpty) { - return ImmutableArray.Empty; + return []; } - using var matchingDescriptors = new PooledArrayBuilder(); - - foreach (var descriptor in tagHelpers) + return documentContext.TagHelpers.Where(parentTag, static (tagHelper, parentTag) => { - foreach (var rule in descriptor.TagMatchingRules) + foreach (var rule in tagHelper.TagMatchingRules) { - if (TagHelperMatchingConventions.SatisfiesParentTag(rule, parentTag.AsSpanOrDefault())) + if (TagHelperMatchingConventions.SatisfiesParentTag(rule, parentTag.AsSpan())) { - matchingDescriptors.Add(descriptor); - break; + return true; } } - } - return matchingDescriptors.ToImmutableAndClear(); + return false; + }); } public static ImmutableArray> StringifyAttributes(SyntaxList attributes) { - using var stringifiedAttributes = new PooledArrayBuilder>(); + using var builder = new PooledArrayBuilder>(); foreach (var attribute in attributes) { @@ -171,14 +146,14 @@ public static ImmutableArray> StringifyAttributes(S { var name = tagHelperAttribute.Name.GetContent(); var value = tagHelperAttribute.Value?.GetContent() ?? string.Empty; - stringifiedAttributes.Add(new KeyValuePair(name, value)); + builder.Add(KeyValuePair.Create(name, value)); break; } case MarkupMinimizedTagHelperAttributeSyntax minimizedTagHelperAttribute: { var name = minimizedTagHelperAttribute.Name.GetContent(); - stringifiedAttributes.Add(new KeyValuePair(name, string.Empty)); + builder.Add(KeyValuePair.Create(name, string.Empty)); break; } @@ -186,14 +161,14 @@ public static ImmutableArray> StringifyAttributes(S { var name = markupAttribute.Name.GetContent(); var value = markupAttribute.Value?.GetContent() ?? string.Empty; - stringifiedAttributes.Add(new KeyValuePair(name, value)); + builder.Add(KeyValuePair.Create(name, value)); break; } case MarkupMinimizedAttributeBlockSyntax minimizedMarkupAttribute: { var name = minimizedMarkupAttribute.Name.GetContent(); - stringifiedAttributes.Add(new KeyValuePair(name, string.Empty)); + builder.Add(KeyValuePair.Create(name, string.Empty)); break; } @@ -201,20 +176,20 @@ public static ImmutableArray> StringifyAttributes(S { var name = directiveAttribute.FullName; var value = directiveAttribute.Value?.GetContent() ?? string.Empty; - stringifiedAttributes.Add(new KeyValuePair(name, value)); + builder.Add(KeyValuePair.Create(name, value)); break; } case MarkupMinimizedTagHelperDirectiveAttributeSyntax minimizedDirectiveAttribute: { var name = minimizedDirectiveAttribute.FullName; - stringifiedAttributes.Add(new KeyValuePair(name, string.Empty)); + builder.Add(KeyValuePair.Create(name, string.Empty)); break; } } } - return stringifiedAttributes.ToImmutableAndClear(); + return builder.ToImmutableAndClear(); } public static (string? ancestorTagName, bool ancestorIsTagHelper) GetNearestAncestorTagInfo(IEnumerable ancestors) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/DiffKind.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/DiffKind.cs index 594cec83f40..1308827c508 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/DiffKind.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/DiffKind.cs @@ -5,6 +5,19 @@ namespace Microsoft.CodeAnalysis.Razor.TextDifferencing; internal enum DiffKind : byte { + /// + /// Diff by character. + /// Char, + /// + /// Diff by line + /// Line, + /// + /// Diff by word + /// + /// + /// Word break characters are: whitespace, '/' and '"'. Contiguous word breaks are treated as a single word. + /// + Word, } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.LineDiffer.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.LineDiffer.cs index db9d2fd947b..901a8b95568 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.LineDiffer.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.LineDiffer.cs @@ -1,115 +1,27 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Text; +using System.Collections.Immutable; +using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis.Text; namespace Microsoft.CodeAnalysis.Razor.TextDifferencing; internal partial class SourceTextDiffer { - private class LineDiffer : SourceTextDiffer + private sealed class LineDiffer(SourceText oldText, SourceText newText) + : TextSpanDiffer(oldText, newText) { - private readonly TextLineCollection _oldLines; - private readonly TextLineCollection _newLines; - - private char[] _oldLineBuffer; - private char[] _newLineBuffer; - private char[] _appendBuffer; - - protected override int OldSourceLength { get; } - protected override int NewSourceLength { get; } - - public LineDiffer(SourceText oldText, SourceText newText) - : base(oldText, newText) - { - _oldLineBuffer = RentArray(1024); - _newLineBuffer = RentArray(1024); - _appendBuffer = RentArray(1024); - - _oldLines = oldText.Lines; - _newLines = newText.Lines; - - OldSourceLength = _oldLines.Count; - NewSourceLength = _newLines.Count; - } - - public override void Dispose() + protected override ImmutableArray Tokenize(SourceText text) { - ReturnArray(_oldLineBuffer); - ReturnArray(_newLineBuffer); - ReturnArray(_appendBuffer); - } - - protected override bool SourceEqual(int oldSourceIndex, int newSourceIndex) - { - var oldLine = _oldLines[oldSourceIndex]; - var newLine = _newLines[newSourceIndex]; - - var oldSpan = oldLine.SpanIncludingLineBreak; - var newSpan = newLine.SpanIncludingLineBreak; - - if (oldSpan.Length != newSpan.Length) - { - return false; - } - - var length = oldSpan.Length; + using var builder = new PooledArrayBuilder(); - // Simple case: Both lines are empty. - if (length == 0) + foreach (var line in text.Lines) { - return true; - } - - // Copy the text into char arrays for comparison. Note: To avoid allocation, - // we try to reuse the same char buffers and only grow them when a longer - // line is encountered. - var oldChars = EnsureBuffer(ref _oldLineBuffer, length); - var newChars = EnsureBuffer(ref _newLineBuffer, length); - - OldText.CopyTo(oldSpan.Start, oldChars, 0, length); - NewText.CopyTo(newSpan.Start, newChars, 0, length); - - for (var i = 0; i < length; i++) - { - if (oldChars[i] != newChars[i]) - { - return false; - } - } - - return true; - } - - protected override int GetEditPosition(DiffEdit edit) - => _oldLines[edit.Position].Start; - - protected override int AppendEdit(DiffEdit edit, StringBuilder builder) - { - if (edit.Kind == DiffEditKind.Insert) - { - Assumes.NotNull(edit.NewTextPosition); - var newTextPosition = edit.NewTextPosition.GetValueOrDefault(); - - for (var i = 0; i < edit.Length; i++) - { - var newLine = _newLines[newTextPosition + i]; - - var newSpan = newLine.SpanIncludingLineBreak; - if (newSpan.Length > 0) - { - var buffer = EnsureBuffer(ref _appendBuffer, newSpan.Length); - NewText.CopyTo(newSpan.Start, buffer, 0, newSpan.Length); - - builder.Append(buffer, 0, newSpan.Length); - } - } - - return _oldLines[edit.Position].Start; + builder.Add(line.SpanIncludingLineBreak); } - return _oldLines[edit.Position + edit.Length - 1].EndIncludingLineBreak; + return builder.ToImmutableAndClear(); } } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.TextSpanDiffer.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.TextSpanDiffer.cs new file mode 100644 index 00000000000..b01bde5f5fc --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.TextSpanDiffer.cs @@ -0,0 +1,121 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using System.Text; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.Razor.TextDifferencing; + +internal partial class SourceTextDiffer +{ + private abstract class TextSpanDiffer : SourceTextDiffer + { + private readonly ImmutableArray _oldSpans = []; + private readonly ImmutableArray _newSpans = []; + + private char[] _oldBuffer; + private char[] _newBuffer; + private char[] _appendBuffer; + + protected override int OldSourceLength { get; } + protected override int NewSourceLength { get; } + + public TextSpanDiffer(SourceText oldText, SourceText newText) + : base(oldText, newText) + { + _oldBuffer = RentArray(1024); + _newBuffer = RentArray(1024); + _appendBuffer = RentArray(1024); + + if (oldText.Length > 0) + { + _oldSpans = Tokenize(oldText); + } + + if (newText.Length > 0) + { + _newSpans = Tokenize(newText); + } + + OldSourceLength = _oldSpans.Length; + NewSourceLength = _newSpans.Length; + } + + protected abstract ImmutableArray Tokenize(SourceText text); + + public override void Dispose() + { + ReturnArray(_oldBuffer); + ReturnArray(_newBuffer); + ReturnArray(_appendBuffer); + } + + protected override bool SourceEqual(int oldSourceIndex, int newSourceIndex) + { + var oldSpan = _oldSpans[oldSourceIndex]; + var newSpan = _newSpans[newSourceIndex]; + + if (oldSpan.Length != newSpan.Length) + { + return false; + } + + var length = oldSpan.Length; + + // Simple case: Both lines are empty. + if (length == 0) + { + return true; + } + + // Copy the text into char arrays for comparison. Note: To avoid allocation, + // we try to reuse the same char buffers and only grow them when a longer + // line is encountered. + var oldChars = EnsureBuffer(ref _oldBuffer, length); + var newChars = EnsureBuffer(ref _newBuffer, length); + + OldText.CopyTo(oldSpan.Start, oldChars, 0, length); + NewText.CopyTo(newSpan.Start, newChars, 0, length); + + for (var i = 0; i < length; i++) + { + if (oldChars[i] != newChars[i]) + { + return false; + } + } + + return true; + } + + protected override int GetEditPosition(DiffEdit edit) + => _oldSpans[edit.Position].Start; + + protected override int AppendEdit(DiffEdit edit, StringBuilder builder) + { + if (edit.Kind == DiffEditKind.Insert) + { + Assumes.NotNull(edit.NewTextPosition); + var newTextPosition = edit.NewTextPosition.GetValueOrDefault(); + + for (var i = 0; i < edit.Length; i++) + { + var newSpan = _newSpans[newTextPosition + i]; + + if (newSpan.Length > 0) + { + var buffer = EnsureBuffer(ref _appendBuffer, newSpan.Length); + NewText.CopyTo(newSpan.Start, buffer, 0, newSpan.Length); + + builder.Append(buffer, 0, newSpan.Length); + } + } + + return _oldSpans[edit.Position].Start; + } + + return _oldSpans[edit.Position + edit.Length - 1].End; + } + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.WordDiffer.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.WordDiffer.cs new file mode 100644 index 00000000000..367dafc73ad --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.WordDiffer.cs @@ -0,0 +1,58 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using System.Diagnostics; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.Razor.TextDifferencing; + +internal partial class SourceTextDiffer +{ + private sealed class WordDiffer(SourceText oldText, SourceText newText) + : TextSpanDiffer(oldText, newText) + { + protected override ImmutableArray Tokenize(SourceText text) + { + using var builder = new PooledArrayBuilder(); + + var currentSpanStart = 0; + var currentClassification = Classify(text[0]); + + // This algorithm is simpler than a normal tokenizer might be because we want to keep contiguous + // whitespace characters in the same "word", and we don't really care about contiguous quotes + // or slashes, so we can keep it simple and just capture a "word" when the classification of + // the current character changes. + for (var index = 1; index < text.Length; index++) + { + var classification = Classify(text[index]); + if (classification != currentClassification) + { + // We've hit a word boundary, so store this and move on + builder.Add(TextSpan.FromBounds(currentSpanStart, index)); + currentSpanStart = index; + currentClassification = classification; + } + } + + // It's impossible for the loop to capture the last word + Debug.Assert(currentSpanStart < text.Length); + builder.Add(TextSpan.FromBounds(currentSpanStart, text.Length)); + + return builder.ToImmutableAndClear(); + } + + private static int Classify(char c) + { + // The type of classification doesn't matter as long as its unique and equatible + return c switch + { + '/' => 0, + '"' => 1, + _ when char.IsWhiteSpace(c) => 2, + _ => 3, + }; + } + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.cs index b1216936400..ad35039f4ad 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/TextDifferencing/SourceTextDiffer.cs @@ -13,16 +13,10 @@ namespace Microsoft.CodeAnalysis.Razor.TextDifferencing; -internal abstract partial class SourceTextDiffer : TextDiffer, IDisposable +internal abstract partial class SourceTextDiffer(SourceText oldText, SourceText newText) : TextDiffer, IDisposable { - protected readonly SourceText OldText; - protected readonly SourceText NewText; - - protected SourceTextDiffer(SourceText oldText, SourceText newText) - { - OldText = oldText ?? throw new ArgumentNullException(nameof(oldText)); - NewText = newText ?? throw new ArgumentNullException(nameof(newText)); - } + protected readonly SourceText OldText = oldText; + protected readonly SourceText NewText = newText; public abstract void Dispose(); @@ -30,21 +24,21 @@ protected SourceTextDiffer(SourceText oldText, SourceText newText) protected abstract int AppendEdit(DiffEdit edit, StringBuilder builder); /// - /// Rents a char array of at least from the shared array pool. + /// Rents a char array of at least from the shared array pool. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] protected static char[] RentArray(int minimumLength) => ArrayPool.Shared.Rent(minimumLength); /// - /// Returns a char array to the shared array pool. + /// Returns a char array to the shared array pool. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] protected static void ReturnArray(char[] array, bool clearArray = false) => ArrayPool.Shared.Return(array, clearArray); /// - /// Ensures that references a char array of at least . + /// Ensures that references a char array of at least . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] protected static char[] EnsureBuffer(ref char[] array, int minimumLength) @@ -114,9 +108,13 @@ public static ImmutableArray GetMinimalTextChanges(SourceText oldTex return newText.GetTextChangesArray(oldText); } - using SourceTextDiffer differ = kind == DiffKind.Line - ? new LineDiffer(oldText, newText) - : new CharDiffer(oldText, newText); + using SourceTextDiffer differ = kind switch + { + DiffKind.Line => new LineDiffer(oldText, newText), + DiffKind.Char => new CharDiffer(oldText, newText), + DiffKind.Word => new WordDiffer(oldText, newText), + _ => throw new ArgumentOutOfRangeException(nameof(kind)), + }; var edits = differ.ComputeDiff(); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Tooltip/BoundAttributeDescriptionInfo.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Tooltip/BoundAttributeDescriptionInfo.cs index fc14ca25ebb..1a2c3d57396 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Tooltip/BoundAttributeDescriptionInfo.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Tooltip/BoundAttributeDescriptionInfo.cs @@ -9,25 +9,18 @@ namespace Microsoft.CodeAnalysis.Razor.Tooltip; internal record BoundAttributeDescriptionInfo(string ReturnTypeName, string TypeName, string PropertyName, string? Documentation = null) { - public static BoundAttributeDescriptionInfo From(BoundAttributeParameterDescriptor parameterAttribute, string parentTagHelperTypeName) + public static BoundAttributeDescriptionInfo From(BoundAttributeParameterDescriptor parameter) { - if (parameterAttribute is null) - { - throw new ArgumentNullException(nameof(parameterAttribute)); - } - - if (parentTagHelperTypeName is null) - { - throw new ArgumentNullException(nameof(parentTagHelperTypeName)); - } + ArgHelper.ThrowIfNull(parameter); - var propertyName = parameterAttribute.PropertyName; + var parentTagHelperTypeName = parameter.Parent.Parent.TypeName; + var propertyName = parameter.PropertyName; return new BoundAttributeDescriptionInfo( - parameterAttribute.TypeName, + parameter.TypeName, parentTagHelperTypeName, propertyName, - parameterAttribute.Documentation); + parameter.Documentation); } public static BoundAttributeDescriptionInfo From(BoundAttributeDescriptor boundAttribute, bool isIndexer) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.Entry.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.Entry.cs new file mode 100644 index 00000000000..b04f42ea084 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.Entry.cs @@ -0,0 +1,24 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Threading; + +namespace Microsoft.CodeAnalysis.Razor.Utilities; + +internal sealed partial class MemoryCache where TKey : notnull + where TValue : class +{ + private sealed class Entry(TValue value) + { + private long _lastAccessTicks = DateTime.UtcNow.Ticks; + + public DateTime LastAccess => new(Volatile.Read(ref _lastAccessTicks)); + public TValue Value => value; + + public void UpdateLastAccess() + { + Volatile.Write(ref _lastAccessTicks, DateTime.UtcNow.Ticks); + } + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.TestAccessor.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.TestAccessor.cs new file mode 100644 index 00000000000..d6a9e048e87 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.TestAccessor.cs @@ -0,0 +1,34 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; + +namespace Microsoft.CodeAnalysis.Razor.Utilities; + +internal partial class MemoryCache + where TKey : notnull + where TValue : class +{ + internal TestAccessor GetTestAccessor() => new(this); + + internal struct TestAccessor(MemoryCache instance) + { + public event Action Compacted + { + add => instance._compactedHandler += value; + remove => instance._compactedHandler -= value; + } + + public readonly bool TryGetLastAccess(TKey key, out DateTime result) + { + if (instance._map.TryGetValue(key, out var value)) + { + result = value.LastAccess; + return true; + } + + result = default; + return false; + } + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.cs index ad35fc5e322..1e15c439d6d 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/MemoryCache`2.cs @@ -5,37 +5,45 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Linq; namespace Microsoft.CodeAnalysis.Razor.Utilities; -// We've created our own MemoryCache here, ideally we would use the one in Microsoft.Extensions.Caching.Memory, -// but until we update O# that causes an Assembly load problem. -internal class MemoryCache +/// +/// A thread-safe, size-limited cache with approximate LRU (Least Recently Used) +/// eviction policy. When the cache reaches its size limit, it removes approximately +/// half of the least recently used entries. +/// +/// The type of keys in the cache. +/// The type of values in the cache. +/// The maximum number of entries the cache can hold before compaction is triggered. +/// The estimated number of threads that will update the cache concurrently. +internal sealed partial class MemoryCache(int sizeLimit = 50, int concurrencyLevel = 2) where TKey : notnull where TValue : class { - private const int DefaultSizeLimit = 50; - private const int DefaultConcurrencyLevel = 2; + private readonly ConcurrentDictionary _map = new(concurrencyLevel, capacity: sizeLimit); - protected IDictionary _dict; + /// + /// Lock used to synchronize cache compaction operations. This prevents multiple threads + /// from attempting to compact the cache simultaneously while allowing concurrent reads. + /// + private readonly object _compactLock = new(); + private readonly int _sizeLimit = sizeLimit; - private readonly object _compactLock; - private readonly int _sizeLimit; + /// + /// Optional callback invoked after cache compaction completes. Only used by tests. + /// + private Action? _compactedHandler; - public MemoryCache(int sizeLimit = DefaultSizeLimit, int concurrencyLevel = DefaultConcurrencyLevel) + /// + /// Attempts to retrieve a value from the cache and updates its last access time if found. + /// + public bool TryGetValue(TKey key, [NotNullWhen(true)] out TValue? result) { - _sizeLimit = sizeLimit; - _dict = new ConcurrentDictionary(concurrencyLevel, capacity: _sizeLimit); - _compactLock = new object(); - } - - public bool TryGetValue(TKey key, [NotNullWhen(returnValue: true)] out TValue? result) - { - if (_dict.TryGetValue(key, out var value)) + if (_map.TryGetValue(key, out var entry)) { - value.LastAccess = DateTime.UtcNow; - result = value.Value; + entry.UpdateLastAccess(); + result = entry.Value; return true; } @@ -43,39 +51,80 @@ public bool TryGetValue(TKey key, [NotNullWhen(returnValue: true)] out TValue? r return false; } + /// + /// Adds or updates a value in the cache. If the cache is at capacity, triggers compaction + /// before adding the new entry. + /// public void Set(TKey key, TValue value) { + CompactIfNeeded(); + + _map[key] = new Entry(value); + } + + /// + /// Removes approximately half of the least recently used entries when the cache reaches capacity. + /// + private void CompactIfNeeded() + { + // Fast path: check size without locking + if (_map.Count < _sizeLimit) + { + return; + } + lock (_compactLock) { - if (_dict.Count >= _sizeLimit) + // Double-check after acquiring lock in case another thread already compacted + if (_map.Count < _sizeLimit) { - Compact(); + return; } - } - _dict[key] = new CacheEntry - { - LastAccess = DateTime.UtcNow, - Value = value, - }; - } + // Create a snapshot with last access times to implement approximate LRU eviction. + // This captures each entry's access time to determine which entries were least recently used. + var orderedItems = _map.ToArray().SelectAndOrderByAsArray( + selector: static x => (x.Key, x.Value.LastAccess), + keySelector: static x => x.LastAccess); - public void Clear() => _dict.Clear(); + var toRemove = Math.Max(_sizeLimit / 2, 1); - protected virtual void Compact() - { - var kvps = _dict.OrderBy(x => x.Value.LastAccess).ToArray(); + // Remove up to half of the oldest entries using an atomic remove-then-check pattern. + // This ensures we don't remove entries that were accessed after our snapshot was taken. + foreach (var (itemKey, itemLastAccess) in orderedItems) + { + // Atomic remove-then-check pattern eliminates race conditions + // Note: If TryRemove fails, another thread already removed this entry. + if (_map.TryRemove(itemKey, out var removedEntry)) + { + if (removedEntry.LastAccess == itemLastAccess) + { + // Entry was still old when removed - successful eviction + toRemove--; - for (var i = 0; i < _sizeLimit / 2; i++) - { - _dict.Remove(kvps[i].Key); + // Stop early if we've removed enough entries + if (toRemove == 0) + { + break; + } + } + else + { + // Entry was accessed after snapshot - try to restore it + // If TryAdd fails, another thread already added a new entry with this key, + // which is acceptable - we preserve the hot entry's data either way + _map.TryAdd(itemKey, removedEntry); + } + } + } + + _compactedHandler?.Invoke(); } } - protected class CacheEntry - { - public required TValue Value { get; init; } - - public required DateTime LastAccess { get; set; } - } + /// + /// Removes all entries from the cache. + /// + public void Clear() + => _map.Clear(); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/RazorProjectInfoFactory.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/RazorProjectInfoFactory.cs index 22a25543a6d..5c60d8b27fd 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/RazorProjectInfoFactory.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/RazorProjectInfoFactory.cs @@ -16,7 +16,6 @@ using Microsoft.CodeAnalysis.Razor.ProjectEngineHost; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Razor.Serialization; -using Microsoft.CodeAnalysis.Razor.Telemetry; namespace Microsoft.CodeAnalysis.Razor.Utilities; @@ -88,7 +87,7 @@ public static async Task ConvertAsync(Project project, Cancell fileSystem, configure: defaultConfigure); - var tagHelpers = await project.GetTagHelpersAsync(engine, NoOpTelemetryReporter.Instance, cancellationToken).ConfigureAwait(false); + var tagHelpers = await project.GetTagHelpersAsync(engine, cancellationToken).ConfigureAwait(false); var projectWorkspaceState = ProjectWorkspaceState.Create(tagHelpers); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/TagHelperCache.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/TagHelperCache.cs index 41625477119..2e2b82a808a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/TagHelperCache.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Utilities/TagHelperCache.cs @@ -1,103 +1,19 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.AspNetCore.Razor.Utilities; namespace Microsoft.CodeAnalysis.Razor.Utilities; -internal sealed class TagHelperCache +internal sealed class TagHelperCache : CleanableWeakCache { - public static readonly TagHelperCache Default = new(); - - private readonly Dictionary> _checksumToTagHelperMap = new(); - private const int CleanUpThreshold = 200; - private int _addsSinceLastCleanUp; - - public TagHelperCache() - { - } - public TagHelperDescriptor GetOrAdd(Checksum checksum, TagHelperDescriptor tagHelper) - { - lock (_checksumToTagHelperMap) - { - // Note: This returns null if tagHelper was added to the cache. - return TryAddOrGet_NoLock(checksum, tagHelper) ?? tagHelper; - } - } - - public bool TryAdd(Checksum checksum, TagHelperDescriptor tagHelper) - { - lock (_checksumToTagHelperMap) - { - // Note: This returns null if tagHelper was added to the cache. - return TryAddOrGet_NoLock(checksum, tagHelper) is null; - } - } - - /// - /// Try to add the given tag helper to the cache. If it already exists, return the cached instance. - /// - private TagHelperDescriptor? TryAddOrGet_NoLock(Checksum checksum, TagHelperDescriptor tagHelper) - { - if (++_addsSinceLastCleanUp >= CleanUpThreshold) - { - CleanUpDeadObjects_NoLock(); - } - - if (!_checksumToTagHelperMap.TryGetValue(checksum, out var weakRef)) - { - _checksumToTagHelperMap.Add(checksum, new(tagHelper)); - return null; - } - - if (!weakRef.TryGetTarget(out var cachedTagHelper)) - { - weakRef.SetTarget(tagHelper); - return null; - } - - return cachedTagHelper; - } - - public bool TryGet(Checksum checksum, [NotNullWhen(true)] out TagHelperDescriptor? tagHelper) - { - lock (_checksumToTagHelperMap) - { - if (_checksumToTagHelperMap.TryGetValue(checksum, out var weakRef) && - weakRef.TryGetTarget(out tagHelper)) - { - return true; - } - - tagHelper = null; - return false; - } - } + public static readonly TagHelperCache Default = new(); - private void CleanUpDeadObjects_NoLock() + public TagHelperCache() + : base(CleanUpThreshold) { - using var deadChecksums = new PooledArrayBuilder(); - - foreach (var (checksum, weakRef) in _checksumToTagHelperMap) - { - if (!weakRef.TryGetTarget(out _)) - { - deadChecksums.Add(checksum); - } - } - - foreach (var checksum in deadChecksums) - { - _checksumToTagHelperMap.Remove(checksum); - } - - _addsSinceLastCleanUp = 0; } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/CoreComponents.props b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/CoreComponents.props new file mode 100644 index 00000000000..64058f69e6b --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/CoreComponents.props @@ -0,0 +1,51 @@ + + + + $(NetVS) + library + false + + + + + + true + false + false + + $(ComponentArchitecture) + true + + false + false + false + + $(RazorVSSDKTargetPlatformRegRootSuffix) + $(RazorExtensionInstallationRoot) + $(RazorExtensionInstallationFolderBase)\$(RazorServiceHubCoreSubFolder) + $(RazorVisualStudioInsertionComponent) + + + false + true + + + + + + + + false + + + PublishProjectOutputGroup + + + RuntimeIdentifier=win-$(ComponentArchitecture);TargetFramework=$(NetVS) + + + false + + + + \ No newline at end of file diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.csproj b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.csproj deleted file mode 100644 index 358f5f2ed54..00000000000 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.csproj +++ /dev/null @@ -1,41 +0,0 @@ - - - - $(NetVS) - Exe - - - false - - - - - - - - - - - - - - <_ExcludedFiles Include="$(PublishDir)**\Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.*" /> - - <_PublishedFiles Include="$(PublishDir)**\Microsoft.CodeAnalysis.Razor.*" /> - <_PublishedFiles Include="$(PublishDir)**\Microsoft.CodeAnalysis.Remote.Razor.*" Exclude="@(_ExcludedFiles)"/> - <_PublishedFiles Include="$(PublishDir)**\Microsoft.AspNetCore.*" /> - <_PublishedFiles Include="$(PublishDir)**\Microsoft.Extensions.ObjectPool.dll" /> - - <_PublishedFiles Remove="@(_PublishedFiles)" Condition="'%(Extension)' == '.pdb'" /> - <_PublishedFiles Remove="@(_PublishedFiles)" Condition="'%(Extension)' == '.xml'" /> - - - <_PublishedFiles Update="@(_PublishedFiles)" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" /> - - - - diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/Program.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/Program.cs deleted file mode 100644 index ebcd0e67083..00000000000 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/Program.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.CodeAnalysis.Remote.Razor.CoreComponents; - -internal static class Program -{ -#pragma warning disable IDE0060 // Remove unused parameter - public static void Main(string[] args) -#pragma warning restore IDE0060 // Remove unused parameter - { - } -} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/arm64/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.arm64.csproj b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/arm64/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.arm64.csproj new file mode 100644 index 00000000000..2124856ecff --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/arm64/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.arm64.csproj @@ -0,0 +1,10 @@ + + + + arm64 + + + + + + diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/arm64/source.extension.vsixmanifest b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/arm64/source.extension.vsixmanifest new file mode 100644 index 00000000000..e8b63e3bdad --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/arm64/source.extension.vsixmanifest @@ -0,0 +1,27 @@ + + + + + Razor Service Hub Components + Razor Service Hub Components (arm64) + + + true + + + + + + amd64 + + + + + + + + diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/x64/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.x64.csproj b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/x64/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.x64.csproj new file mode 100644 index 00000000000..3dd5c6e77ea --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/x64/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.x64.csproj @@ -0,0 +1,10 @@ + + + + x64 + + + + + + diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/x64/source.extension.vsixmanifest b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/x64/source.extension.vsixmanifest new file mode 100644 index 00000000000..cf2a29c0643 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor.CoreComponents/x64/source.extension.vsixmanifest @@ -0,0 +1,21 @@ + + + + + Razor Service Hub Components + Razor Service Hub Components (x64) + + + true + + + + amd64 + + + + + + + + diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/CodeActions/RemoteServices.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/CodeActions/RemoteServices.cs index fb05912ea9e..bd1a9b2293a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/CodeActions/RemoteServices.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/CodeActions/RemoteServices.cs @@ -56,6 +56,9 @@ internal sealed class OOPSimplifyFullyQualifiedComponentCodeActionProvider : Sim [method: ImportingConstructor] internal sealed class OOPComponentAccessibilityCodeActionProvider(IFileSystem fileSystem) : ComponentAccessibilityCodeActionProvider(fileSystem); +[Export(typeof(IRazorCodeActionProvider)), Shared] +internal sealed class OOPUnboundDirectiveAttributeAddUsingCodeActionProvider : UnboundDirectiveAttributeAddUsingCodeActionProvider; + [Export(typeof(IRazorCodeActionProvider)), Shared] internal sealed class OOPGenerateMethodCodeActionProvider : GenerateMethodCodeActionProvider; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPCompletionTriggerAndCommitCharacters.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPCompletionTriggerAndCommitCharacters.cs index 6095a7599c1..1af9524c977 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPCompletionTriggerAndCommitCharacters.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPCompletionTriggerAndCommitCharacters.cs @@ -3,11 +3,11 @@ using System.Composition; using Microsoft.CodeAnalysis.Razor.Completion; -using Microsoft.CodeAnalysis.Razor.Workspaces; +using Microsoft.CodeAnalysis.Razor.Protocol; namespace Microsoft.CodeAnalysis.Remote.Razor.Completion; [Export(typeof(CompletionTriggerAndCommitCharacters)), Shared] [method: ImportingConstructor] -internal sealed class OOPCompletionTriggerAndCommitCharacters(LanguageServerFeatureOptions options) - : CompletionTriggerAndCommitCharacters(options); +internal sealed class OOPCompletionTriggerAndCommitCharacters(IClientCapabilitiesService clientCapabilitiesService) + : CompletionTriggerAndCommitCharacters(clientCapabilitiesService); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPRazorCompletionItemProviders.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPRazorCompletionItemProviders.cs index 2e362652a7e..ee8132e5251 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPRazorCompletionItemProviders.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPRazorCompletionItemProviders.cs @@ -3,26 +3,26 @@ using System.Composition; using Microsoft.CodeAnalysis.Razor.Completion; -using Microsoft.CodeAnalysis.Razor.Workspaces; +using Microsoft.CodeAnalysis.Razor.Protocol; namespace Microsoft.CodeAnalysis.Remote.Razor.Completion; [Export(typeof(IRazorCompletionItemProvider)), Shared] -internal sealed class OOPDirectiveCompletionItemProvider : DirectiveCompletionItemProvider; +internal sealed class OOPCSharpRazorKeywordCompletionItemProvider : CSharpRazorKeywordCompletionItemProvider; [Export(typeof(IRazorCompletionItemProvider)), Shared] -internal sealed class OOPDirectiveAttributeCompletionItemProvider : DirectiveAttributeCompletionItemProvider; +internal sealed class OOPDirectiveCompletionItemProvider : DirectiveCompletionItemProvider; [Export(typeof(IRazorCompletionItemProvider)), Shared] -internal sealed class OOPDirectiveAttributeParameterCompletionItemProvider : DirectiveAttributeParameterCompletionItemProvider; +internal sealed class OOPDirectiveAttributeCompletionItemProvider : DirectiveAttributeCompletionItemProvider; [Export(typeof(IRazorCompletionItemProvider)), Shared] internal sealed class OOPDirectiveAttributeEventParameterCompletionItemProvider : DirectiveAttributeEventParameterCompletionItemProvider; [Export(typeof(IRazorCompletionItemProvider)), Shared] [method: ImportingConstructor] -internal sealed class OOPDirectiveAttributeTransitionCompletionItemProvider(LanguageServerFeatureOptions languageServerFeatureOptions) - : DirectiveAttributeTransitionCompletionItemProvider(languageServerFeatureOptions); +internal sealed class OOPDirectiveAttributeTransitionCompletionItemProvider(IClientCapabilitiesService clientCapabilitiesService) + : DirectiveAttributeTransitionCompletionItemProvider(clientCapabilitiesService); [Export(typeof(IRazorCompletionItemProvider)), Shared] internal sealed class OOPMarkupTransitionCompletionItemProvider : MarkupTransitionCompletionItemProvider; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Debugging/RemoteDataTipRangeService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Debugging/RemoteDataTipRangeService.cs new file mode 100644 index 00000000000..31ae4e5961a --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Debugging/RemoteDataTipRangeService.cs @@ -0,0 +1,75 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; +using Microsoft.CodeAnalysis.Razor.DocumentMapping; +using Microsoft.CodeAnalysis.Razor.Remote; +using Microsoft.CodeAnalysis.Remote.Razor.ProjectSystem; +using Microsoft.CodeAnalysis.Text; +using static Microsoft.CodeAnalysis.Razor.Remote.RemoteResponse; + +namespace Microsoft.CodeAnalysis.Remote.Razor; + +internal sealed class RemoteDataTipRangeService(in ServiceArgs args) : RazorDocumentServiceBase(in args), IRemoteDataTipRangeService +{ + internal sealed class Factory : FactoryBase + { + protected override IRemoteDataTipRangeService CreateService(in ServiceArgs args) + => new RemoteDataTipRangeService(in args); + } + + private readonly IDocumentMappingService _documentMappingService = args.ExportProvider.GetExportedValue(); + + public ValueTask> GetDataTipRangeAsync( + JsonSerializableRazorPinnedSolutionInfoWrapper solutionInfo, + JsonSerializableDocumentId documentId, + Position position, + CancellationToken cancellationToken) + { + return RunServiceAsync( + solutionInfo, + documentId, + context => GetDataTipRangeAsync(context, position, cancellationToken), + cancellationToken); + } + + private async ValueTask> GetDataTipRangeAsync( + RemoteDocumentContext context, + Position position, + CancellationToken cancellationToken) + { + var codeDocument = await context.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); + var razorIndex = codeDocument.Source.Text.GetRequiredAbsoluteIndex(position); + var csharpDocument = codeDocument.GetRequiredCSharpDocument(); + + if (!_documentMappingService.TryMapToCSharpDocumentPosition(csharpDocument, razorIndex, out var csharpPosition, out _)) + { + return NoFurtherHandling; + } + + var generatedDocument = await context.Snapshot.GetGeneratedDocumentAsync(cancellationToken).ConfigureAwait(false); + + var csharpResult = await ExternalAccess.Razor.Cohost.Handlers.DataTipRange.GetDataTipRangeAsync(generatedDocument, csharpPosition, cancellationToken).ConfigureAwait(false); + if (csharpResult?.ExpressionRange is null) + { + return NoFurtherHandling; + } + + if (!DocumentMappingService.TryMapToRazorDocumentRange(csharpDocument, csharpResult.HoverRange, out var razorHoverRange) + || !DocumentMappingService.TryMapToRazorDocumentRange(csharpDocument, csharpResult.ExpressionRange, out var razorExpressionRange)) + { + return NoFurtherHandling; + } + + var razorResult = new VSInternalDataTip() + { + HoverRange = razorHoverRange, + ExpressionRange = razorExpressionRange, + DataTipTags = csharpResult.DataTipTags, + }; + + return Results(razorResult); + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Debugging/RemoteDebugInfoService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Debugging/RemoteDebugInfoService.cs index 5a0f4eda9c1..dfd7d5d2a26 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Debugging/RemoteDebugInfoService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Debugging/RemoteDebugInfoService.cs @@ -5,9 +5,9 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor.DocumentMapping; -using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Razor.Remote; using Microsoft.CodeAnalysis.Remote.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Text; @@ -113,27 +113,48 @@ protected override IRemoteDebugInfoService CreateService(in ServiceArgs args) private bool TryGetUsableProjectedIndex(RazorCodeDocument codeDocument, LinePosition hostDocumentPosition, out int projectedIndex) { - var hostDocumentIndex = codeDocument.Source.Text.GetPosition(hostDocumentPosition); - projectedIndex = 0; - var languageKind = codeDocument.GetLanguageKind(hostDocumentIndex, rightAssociative: false); - // For C#, we just map - if (languageKind == RazorLanguageKind.CSharp && - !_documentMappingService.TryMapToCSharpDocumentPosition(codeDocument.GetRequiredCSharpDocument(), hostDocumentIndex, out _, out projectedIndex)) - { - return false; - } - // Otherwise see if there is more C# on the line to map to. This is for situations like "$$

                  @DateTime.Now

                  " - else if (languageKind == RazorLanguageKind.Html && - !_documentMappingService.TryMapToCSharpPositionOrNext(codeDocument.GetRequiredCSharpDocument(), hostDocumentIndex, out _, out projectedIndex)) - { - return false; - } - else if (languageKind == RazorLanguageKind.Razor) + + var sourceText = codeDocument.Source.Text; + var hostDocumentIndex = sourceText.GetPosition(hostDocumentPosition); + var syntaxRoot = codeDocument.GetRequiredSyntaxRoot(); + var csharpDocument = codeDocument.GetRequiredCSharpDocument(); + + // We want to find a position that maps to C# on the same line as the original request, but we might have to skip over + // some Razor/HTML nodes to find valid C#. + while (sourceText.GetLinePosition(hostDocumentIndex).Line == hostDocumentPosition.Line) { - return false; + if (_documentMappingService.TryMapToCSharpPositionOrNext(csharpDocument, hostDocumentIndex, out _, out projectedIndex)) + { + if (syntaxRoot.FindInnermostNode(hostDocumentIndex) is not { } node) + { + return false; + } + + // We want to avoid component tags and component attributes, where we map to C#, but they're not valid breakpoint locations + if (!node.IsAnyAttributeSyntax() && node is not (MarkupTagHelperStartTagSyntax or MarkupEndTagSyntax)) + { + // Found something valid! + return true; + } + + // It's C#, but not valid, so skip past it so we can try to find more C# + hostDocumentIndex = node.Span.End + 1; + } + + // See if there is more C# on the line to map to, for example "$$

                  @DateTime.Now

                  " + if (!_documentMappingService.TryMapToCSharpPositionOrNext(csharpDocument, hostDocumentIndex, out _, out projectedIndex)) + { + return false; + } + + // We found some C# later on the line, so map that back to Razor so we can loop around and check the node type + if (!_documentMappingService.TryMapToRazorDocumentPosition(csharpDocument, projectedIndex, out _, out hostDocumentIndex)) + { + return false; + } } - return true; + return false; } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DevTools/RemoteDevToolsService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DevTools/RemoteDevToolsService.cs index b4353f1f95a..c025cb851db 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DevTools/RemoteDevToolsService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DevTools/RemoteDevToolsService.cs @@ -1,8 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -50,7 +48,7 @@ public ValueTask GetHtmlDocumentTextAsync( async context => { var codeDocument = await context.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); - return codeDocument.GetHtmlSourceText().ToString(); + return codeDocument.GetHtmlSourceText(cancellationToken).ToString(); }, cancellationToken); @@ -64,8 +62,10 @@ public ValueTask GetFormattingDocumentTextAsync( async context => { var codeDocument = await context.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); + var csharpSyntaxTree = await context.Snapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); + var csharpSyntaxRoot = await csharpSyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); #pragma warning disable CS0618 // Type or member is obsolete - return CSharpFormattingPass.GetFormattingDocumentContentsForSyntaxVisualizer(codeDocument); + return CSharpFormattingPass.GetFormattingDocumentContentsForSyntaxVisualizer(codeDocument, csharpSyntaxRoot, DocumentMappingService); #pragma warning restore CS0618 // Type or member is obsolete }, cancellationToken); @@ -88,12 +88,12 @@ private static async ValueTask GetTagHelpersJsonAsync(Rem { TagHelpersKind.All => codeDocument.GetTagHelpers(), TagHelpersKind.InScope => codeDocument.GetRequiredTagHelperContext().TagHelpers, - TagHelpersKind.Referenced => (IEnumerable?)codeDocument.GetReferencedTagHelpers(), + TagHelpersKind.Referenced => codeDocument.GetReferencedTagHelpers(), _ => [] }; tagHelpers ??= []; - return new FetchTagHelpersResult(tagHelpers.ToImmutableArray()); + return new FetchTagHelpersResult(tagHelpers); } public ValueTask GetRazorSyntaxTreeAsync( diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteDocumentMappingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteDocumentMappingService.cs index 89dc76f525d..89501052501 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteDocumentMappingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteDocumentMappingService.cs @@ -5,6 +5,7 @@ using System.Composition; using System.Threading; using System.Threading.Tasks; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.Logging; using Microsoft.CodeAnalysis.Razor.Workspaces; @@ -33,8 +34,7 @@ internal sealed class RemoteDocumentMappingService( // For Html we just map the Uri, the range will be the same if (_filePathService.IsVirtualHtmlFile(generatedDocumentUri)) { - var razorDocumentUri = _filePathService.GetRazorDocumentUri(generatedDocumentUri); - return (razorDocumentUri, generatedDocumentRange); + return (_filePathService.GetRazorDocumentUri(generatedDocumentUri), generatedDocumentRange); } // We only map from C# files @@ -43,19 +43,66 @@ internal sealed class RemoteDocumentMappingService( return (generatedDocumentUri, generatedDocumentRange); } - var project = originSnapshot.TextDocument.Project; - var razorCodeDocument = await _snapshotManager.GetSnapshot(project).TryGetCodeDocumentFromGeneratedDocumentUriAsync(generatedDocumentUri, cancellationToken).ConfigureAwait(false); + var solution = originSnapshot.TextDocument.Project.Solution; + if (!solution.TryGetSourceGeneratedDocumentIdentity(generatedDocumentUri, out var identity)) + { + return (generatedDocumentUri, generatedDocumentRange); + } + + var project = solution.GetProject(identity.DocumentId.ProjectId); + if (project is null) + { + return (generatedDocumentUri, generatedDocumentRange); + } + + var razorCodeDocument = await _snapshotManager.GetSnapshot(project).TryGetCodeDocumentForGeneratedDocumentAsync(identity, cancellationToken).ConfigureAwait(false); if (razorCodeDocument is null) { return (generatedDocumentUri, generatedDocumentRange); } + var razorDocumentUri = project.Solution.GetRazorDocumentUri(razorCodeDocument); if (TryMapToRazorDocumentRange(razorCodeDocument.GetRequiredCSharpDocument(), generatedDocumentRange, MappingBehavior.Strict, out var mappedRange)) { - var razorDocumentUri = project.Solution.GetRazorDocumentUri(razorCodeDocument); return (razorDocumentUri, mappedRange); } + // If the position is unmappable, but was in a generated Razor, we have one last check to see if Roslyn wants to navigate + // to the class declaration, in which case we'll map to (0,0) in the Razor document itself. + if (await TryGetCSharpClassDeclarationSpanAsync(identity, project, cancellationToken).ConfigureAwait(false) is { } classDeclSpan && + generatedDocumentRange.Start == classDeclSpan.Start && + (generatedDocumentRange.End == generatedDocumentRange.Start || + generatedDocumentRange.End == classDeclSpan.End)) + { + return (razorDocumentUri, new(LinePosition.Zero, LinePosition.Zero)); + } + return (generatedDocumentUri, generatedDocumentRange); } + + private static async Task TryGetCSharpClassDeclarationSpanAsync(RazorGeneratedDocumentIdentity identity, Project project, CancellationToken cancellationToken) + { + var generatedDocument = await project.TryGetCSharpDocumentForGeneratedDocumentAsync(identity, cancellationToken).ConfigureAwait(false); + if (generatedDocument is null) + { + return null; + } + + var csharpSyntaxTree = await generatedDocument.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); + if (csharpSyntaxTree is null) + { + return null; + } + + var csharpSyntaxRoot = await csharpSyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); + if (!csharpSyntaxRoot.TryGetClassDeclaration(out var classDecl)) + { + return null; + } + + var sourceText = await generatedDocument.GetTextAsync(cancellationToken).ConfigureAwait(false); + var classDeclSpan = sourceText.GetLinePositionSpan(classDecl.Identifier.Span); + + return classDeclSpan; + } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteEditMappingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteEditMappingService.cs index fc87624abc2..d67aff2c266 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteEditMappingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteEditMappingService.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.ProjectSystem; +using Microsoft.CodeAnalysis.Razor.Telemetry; using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Remote.Razor.ProjectSystem; @@ -17,8 +18,9 @@ namespace Microsoft.CodeAnalysis.Remote.Razor.DocumentMapping; [method: ImportingConstructor] internal sealed class RemoteEditMappingService( IDocumentMappingService documentMappingService, + ITelemetryReporter telemetryReporter, IFilePathService filePathService, - RemoteSnapshotManager snapshotManager) : AbstractEditMappingService(documentMappingService, filePathService) + RemoteSnapshotManager snapshotManager) : AbstractEditMappingService(documentMappingService, telemetryReporter, filePathService) { private readonly RemoteSnapshotManager _snapshotManager = snapshotManager; @@ -49,8 +51,14 @@ protected override bool TryGetDocumentContext(IDocumentSnapshot contextDocumentS throw new InvalidOperationException("RemoteEditMappingService can only be used with RemoteDocumentSnapshot instances."); } - var project = originSnapshot.TextDocument.Project; - var razorCodeDocument = await _snapshotManager.GetSnapshot(project).TryGetCodeDocumentFromGeneratedDocumentUriAsync(generatedDocumentUri, cancellationToken).ConfigureAwait(false); + var solution = originSnapshot.TextDocument.Project.Solution; + if (!solution.TryGetSourceGeneratedDocumentIdentity(generatedDocumentUri, out var identity) || + !solution.TryGetProject(identity.DocumentId.ProjectId, out var project)) + { + return null; + } + + var razorCodeDocument = await _snapshotManager.GetSnapshot(project).TryGetCodeDocumentForGeneratedDocumentAsync(identity, cancellationToken).ConfigureAwait(false); if (razorCodeDocument is null) { return null; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/WrapWithTag/RemoteSpanMappingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteSpanMappingService.cs similarity index 52% rename from src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/WrapWithTag/RemoteSpanMappingService.cs rename to src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteSpanMappingService.cs index 65294bc201f..0bd925f0f91 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/WrapWithTag/RemoteSpanMappingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RemoteSpanMappingService.cs @@ -7,12 +7,15 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor; +using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis.ExternalAccess.Razor; +using Microsoft.CodeAnalysis.Razor.DocumentExcerpt; using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Razor.Remote; using Microsoft.CodeAnalysis.Razor.Telemetry; +using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Remote.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Text; @@ -30,6 +33,54 @@ protected override IRemoteSpanMappingService CreateService(in ServiceArgs args) private readonly IDocumentMappingService _documentMappingService = args.ExportProvider.GetExportedValue(); private readonly ITelemetryReporter _telemetryReporter = args.ExportProvider.GetExportedValue(); + public ValueTask TryExcerptAsync(RazorPinnedSolutionInfoWrapper solutionInfo, DocumentId generatedDocumentId, TextSpan span, RazorExcerptMode mode, RazorClassificationOptionsWrapper options, CancellationToken cancellationToken) + => RunServiceAsync( + solutionInfo, + solution => TryExcerptAsync(solution, generatedDocumentId, span, mode, options, cancellationToken), + cancellationToken); + + private async ValueTask TryExcerptAsync(Solution solution, DocumentId generatedDocumentId, TextSpan span, RazorExcerptMode mode, RazorClassificationOptionsWrapper options, CancellationToken cancellationToken) + { + var generatedDocument = await solution.GetSourceGeneratedDocumentAsync(generatedDocumentId, cancellationToken).ConfigureAwait(false); + if (generatedDocument is null) + { + return null; + } + + var razorDocument = await TryGetRazorDocumentForGeneratedDocumentAsync(generatedDocument, cancellationToken).ConfigureAwait(false); + if (razorDocument is null) + { + return null; + } + + var documentSnapshot = _snapshotManager.GetSnapshot(razorDocument); + var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); + + var mappedSpans = await MapSpansAsync(documentSnapshot, codeDocument, [span], cancellationToken).ConfigureAwait(false); + if (mappedSpans is not [{ IsDefault: false } mappedSpan]) + { + return null; + } + + var razorDocumentText = await razorDocument.GetTextAsync(cancellationToken).ConfigureAwait(false); + var razorDocumentSpan = razorDocumentText.GetTextSpan(mappedSpan.LinePositionSpan); + + // First compute the range of text we want to we to display relative to the primary document. + var excerptSpan = DocumentExcerptHelper.ChooseExcerptSpan(razorDocumentText, razorDocumentSpan, mode); + + // Then we'll classify the spans based on the primary document, since that's the coordinate + // space that our output mappings use. + var mappings = codeDocument.GetRequiredCSharpDocument().SourceMappings; + var classifiedSpans = await DocumentExcerptHelper.ClassifyPreviewAsync( + excerptSpan, + generatedDocument, + mappings, + options, + cancellationToken).ConfigureAwait(false); + + return new RemoteExcerptResult(razorDocument.Id, razorDocumentSpan, excerptSpan, classifiedSpans.ToImmutable(), span); + } + public ValueTask> MapSpansAsync(RazorPinnedSolutionInfoWrapper solutionInfo, DocumentId generatedDocumentId, ImmutableArray spans, CancellationToken cancellationToken) => RunServiceAsync( solutionInfo, @@ -45,18 +96,38 @@ private async ValueTask> MapSpansAsync(Sol } var documentSnapshot = _snapshotManager.GetSnapshot(razorDocument); - var output = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); + var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); + + return await MapSpansAsync(documentSnapshot, codeDocument, spans, cancellationToken).ConfigureAwait(false); + } + + private static async Task> MapSpansAsync(RemoteDocumentSnapshot documentSnapshot, RazorCodeDocument codeDocument, ImmutableArray spans, CancellationToken cancellationToken) + { + var csharpSyntaxTree = await documentSnapshot.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); + var csharpSyntaxNode = await csharpSyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); - var source = output.Source.Text; + var source = codeDocument.Source.Text; - var csharpDocument = output.GetRequiredCSharpDocument(); - var filePath = output.Source.FilePath.AssumeNotNull(); + var csharpDocument = codeDocument.GetRequiredCSharpDocument(); + var filePath = codeDocument.Source.FilePath.AssumeNotNull(); + + var classDeclSpan = csharpSyntaxNode.TryGetClassDeclaration(out var classDecl) + ? classDecl.Identifier.Span + : default; using var results = new PooledArrayBuilder(); foreach (var span in spans) { - if (RazorEditHelper.TryGetMappedSpans(span, source, csharpDocument, out var linePositionSpan, out var mappedSpan)) + // If Roslyn is trying to navigate to, or show a reference to the class declaration, then we remap it to + // (0,0) in the Razor document. + if (span.Start == classDeclSpan.Start && + (span.Length == 0 || + span.Length == classDeclSpan.Length)) + { + results.Add(new(filePath, new(LinePosition.Zero, LinePosition.Zero), new TextSpan())); + } + else if (RazorEditHelper.TryGetMappedSpan(span, source, csharpDocument, out var linePositionSpan, out var mappedSpan)) { results.Add(new(filePath, linePositionSpan, mappedSpan)); } @@ -118,6 +189,11 @@ private async ValueTask> MapTextChangesAsy return null; } + return await TryGetRazorDocumentForGeneratedDocumentAsync(generatedDocument, cancellationToken).ConfigureAwait(false); + } + + private async Task TryGetRazorDocumentForGeneratedDocumentAsync(SourceGeneratedDocument generatedDocument, CancellationToken cancellationToken) + { var identity = RazorGeneratedDocumentIdentity.Create(generatedDocument); if (!identity.IsRazorSourceGeneratedDocument()) { @@ -126,6 +202,6 @@ private async ValueTask> MapTextChangesAsy var projectSnapshot = _snapshotManager.GetSnapshot(generatedDocument.Project); - return await projectSnapshot.TryGetRazorDocumentFromGeneratedHintNameAsync(identity.HintName, cancellationToken).ConfigureAwait(false); + return await projectSnapshot.TryGetRazorDocumentForGeneratedDocumentAsync(identity, cancellationToken).ConfigureAwait(false); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentSymbols/RemoteDocumentSymbolService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentSymbols/RemoteDocumentSymbolService.cs index eac353882e4..85acf91626e 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentSymbols/RemoteDocumentSymbolService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentSymbols/RemoteDocumentSymbolService.cs @@ -53,7 +53,7 @@ protected override IRemoteDocumentSymbolService CreateService(in ServiceArgs arg var codeDocument = await context.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); var csharpDocument = codeDocument.GetRequiredCSharpDocument(); - return _documentSymbolService.GetDocumentSymbols(context.Uri, csharpDocument, csharpSymbols); + return _documentSymbolService.GetDocumentSymbols(context.FileKind, context.Uri, csharpDocument, csharpSymbols); } private static DocumentSymbol[] ConvertDocumentSymbols(DocumentSymbol[] roslynDocumentSymbols) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FindAllReferences/RemoteFindAllReferencesService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FindAllReferences/RemoteFindAllReferencesService.cs index d7dfbc3316f..14801654fbb 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FindAllReferences/RemoteFindAllReferencesService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FindAllReferences/RemoteFindAllReferencesService.cs @@ -4,6 +4,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor; using Microsoft.CodeAnalysis.Razor.DocumentMapping; @@ -30,6 +31,7 @@ protected override IRemoteFindAllReferencesService CreateService(in ServiceArgs private readonly IClientCapabilitiesService _clientCapabilitiesService = args.ExportProvider.GetExportedValue(); private readonly IWorkspaceProvider _workspaceProvider = args.WorkspaceProvider; + private readonly IFilePathService _filePathService = args.ExportProvider.GetExportedValue(); protected override IDocumentPositionInfoStrategy DocumentPositionInfoStrategy => PreferAttributeNameDocumentPositionInfoStrategy.Instance; @@ -86,6 +88,8 @@ protected override IRemoteFindAllReferencesService CreateService(in ServiceArgs return NoFurtherHandling; } + using var mappedResults = new PooledArrayBuilder>(results.Length); + // Map the C# locations back to the Razor file. foreach (var result in results) { @@ -100,6 +104,12 @@ protected override IRemoteFindAllReferencesService CreateService(in ServiceArgs var (mappedUri, mappedRange) = await DocumentMappingService.MapToHostDocumentUriAndRangeAsync(context.Snapshot, location.DocumentUri.GetRequiredParsedUri(), location.Range.ToLinePositionSpan(), cancellationToken).ConfigureAwait(false); + if (_filePathService.IsVirtualCSharpFile(mappedUri)) + { + // Couldn't map, so probably a hidden part of the code-gen, let's skip it. + continue; + } + if (referenceItem is not null) { // Indicates the reference item is directly available in the code @@ -118,8 +128,10 @@ protected override IRemoteFindAllReferencesService CreateService(in ServiceArgs location.DocumentUri = new(mappedUri); location.Range = mappedRange.ToRange(); + + mappedResults.Add(result); } - return Results(results); + return Results(mappedResults.ToArrayAndClear()); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FoldingRanges/RemoteFoldingRangeService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FoldingRanges/RemoteFoldingRangeService.cs index bad50e9ebff..accd4edc394 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FoldingRanges/RemoteFoldingRangeService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FoldingRanges/RemoteFoldingRangeService.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor.FoldingRanges; +using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Razor.Protocol.Folding; using Microsoft.CodeAnalysis.Razor.Remote; using Microsoft.CodeAnalysis.Remote.Razor.ProjectSystem; @@ -23,6 +24,7 @@ protected override IRemoteFoldingRangeService CreateService(in ServiceArgs args) } private readonly IFoldingRangeService _foldingRangeService = args.ExportProvider.GetExportedValue(); + private readonly IClientCapabilitiesService _clientCapabilitiesService = args.ExportProvider.GetExportedValue(); public ValueTask> GetFoldingRangesAsync( RazorPinnedSolutionInfoWrapper solutionInfo, @@ -44,7 +46,8 @@ private async ValueTask> GetFoldingRangesAsyn .GetGeneratedDocumentAsync(cancellationToken) .ConfigureAwait(false); - var csharpRanges = await ExternalHandlers.FoldingRanges.GetFoldingRangesAsync(generatedDocument, cancellationToken).ConfigureAwait(false); + var lineFoldingOnly = _clientCapabilitiesService.ClientCapabilities.TextDocument?.FoldingRange?.LineFoldingOnly ?? false; + var csharpRanges = await ExternalHandlers.FoldingRanges.GetFoldingRangesAsync(generatedDocument, lineFoldingOnly, cancellationToken).ConfigureAwait(false); var convertedCSharp = csharpRanges.SelectAsArray(ToFoldingRange); var convertedHtml = htmlRanges.SelectAsArray(RemoteFoldingRange.ToVsFoldingRange); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/GoToDefinition/RemoteGoToDefinitionService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/GoToDefinition/RemoteGoToDefinitionService.cs index 459e91d809d..d4e24c6218c 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/GoToDefinition/RemoteGoToDefinitionService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/GoToDefinition/RemoteGoToDefinitionService.cs @@ -60,6 +60,20 @@ protected override IRemoteGoToDefinitionService CreateService(in ServiceArgs arg var positionInfo = GetPositionInfo(codeDocument, hostDocumentIndex, preferCSharpOverHtml: true); + // First, see if this is a tag helper. We ignore component attributes here, because they're better served by the C# handler. + var componentLocations = await _definitionService.GetDefinitionAsync( + context.Snapshot, + positionInfo, + context.GetSolutionQueryOperations(), + includeMvcTagHelpers: true, + cancellationToken) + .ConfigureAwait(false); + + if (componentLocations is { Length: > 0 }) + { + return Results(componentLocations); + } + // Check if we're in a string literal with a file path (before calling C# which would navigate to String class) if (positionInfo.LanguageKind is RazorLanguageKind.CSharp) { @@ -77,21 +91,6 @@ protected override IRemoteGoToDefinitionService CreateService(in ServiceArgs arg if (positionInfo.LanguageKind is RazorLanguageKind.Html or RazorLanguageKind.Razor) { - // First, see if this is a tag helper. We ignore component attributes here, because they're better served by the C# handler. - var componentLocations = await _definitionService.GetDefinitionAsync( - context.Snapshot, - positionInfo, - context.GetSolutionQueryOperations(), - ignoreComponentAttributes: true, - includeMvcTagHelpers: true, - cancellationToken) - .ConfigureAwait(false); - - if (componentLocations is { Length: > 0 }) - { - return Results(componentLocations); - } - // If it isn't a Razor construct, and it isn't C#, let the server know to delegate to HTML. return CallHtml; } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Hover/RemoteHoverService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Hover/RemoteHoverService.cs index 8e417f0a431..ab28c512071 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Hover/RemoteHoverService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Hover/RemoteHoverService.cs @@ -111,7 +111,8 @@ protected override IRemoteHoverService CreateService(in ServiceArgs args) } } - return Results(csharpHover); + // As there is a C# hover, stop further handling. + return new RemoteResponse(StopHandling: true, Result: csharpHover); } if (positionInfo.LanguageKind is not (RazorLanguageKind.Html or RazorLanguageKind.Razor)) @@ -152,7 +153,7 @@ protected override IRemoteHoverService CreateService(in ServiceArgs args) /// /// Once Razor moves wholly over to Roslyn.LanguageServer.Protocol, this method can be removed. /// - private Hover ConvertHover(Hover hover) + private static Hover ConvertHover(Hover hover) { // Note: Razor only ever produces a Hover with MarkupContent or a VSInternalHover with RawContents. // Both variants return a Range. diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/HtmlDocuments/RemoteHtmlDocumentService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/HtmlDocuments/RemoteHtmlDocumentService.cs index 0be49531a58..e7380c4d23c 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/HtmlDocuments/RemoteHtmlDocumentService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/HtmlDocuments/RemoteHtmlDocumentService.cs @@ -32,6 +32,6 @@ protected override IRemoteHtmlDocumentService CreateService(in ServiceArgs args) { var codeDocument = await documentContext.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); - return codeDocument.GetHtmlSourceText().ToString(); + return codeDocument.GetHtmlSourceText(cancellationToken).ToString(); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Initialization/RemoteLanguageServerFeatureOptions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Initialization/RemoteLanguageServerFeatureOptions.cs index 67132981d72..8c6877ebd13 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Initialization/RemoteLanguageServerFeatureOptions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Initialization/RemoteLanguageServerFeatureOptions.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Composition; using Microsoft.CodeAnalysis.Razor.Remote; using Microsoft.CodeAnalysis.Razor.Workspaces; @@ -26,27 +25,9 @@ public void SetOptions(RemoteClientInitializationOptions options) public override bool SupportsFileManipulation => _options.SupportsFileManipulation; - public override string CSharpVirtualDocumentSuffix => throw new InvalidOperationException("This property is not valid in OOP"); - - public override string HtmlVirtualDocumentSuffix => _options.HtmlVirtualDocumentSuffix; - - public override bool SingleServerSupport => throw new InvalidOperationException("This option has not been synced to OOP."); - - public override bool DelegateToCSharpOnDiagnosticPublish => throw new InvalidOperationException("This option has not been synced to OOP."); - public override bool ShowAllCSharpCodeActions => _options.ShowAllCSharpCodeActions; - public override bool UpdateBuffersForClosedDocuments => throw new InvalidOperationException("This option has not been synced to OOP."); - public override bool ReturnCodeActionAndRenamePathsWithPrefixedSlash => _options.ReturnCodeActionAndRenamePathsWithPrefixedSlash; - public override bool IncludeProjectKeyInGeneratedFilePath => throw new InvalidOperationException("This option does not apply in cohosting."); - public override bool UseRazorCohostServer => _options.UseRazorCohostServer; - - public override bool SupportsSoftSelectionInCompletion => _options.SupportsSoftSelectionInCompletion; - - public override bool UseVsCodeCompletionCommitCharacters => _options.UseVsCodeCompletionCommitCharacters; - - public override bool DoNotInitializeMiscFilesProjectFromWorkspace => throw new NotImplementedException("This option has not been synced to OOP."); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj index daa956efa53..eb7c15d6b35 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj @@ -17,6 +17,9 @@ $(NoWarn);NU1701 + + true + win-x64;win-arm64 @@ -70,4 +73,25 @@ + + + + + + + <_ExcludedFiles Include="$(PublishDir)**\Microsoft.CodeAnalysis.Remote.Razor.CoreComponents.*" /> + + <_PublishedFiles Include="$(PublishDir)**\Microsoft.CodeAnalysis.Razor.*" /> + <_PublishedFiles Include="$(PublishDir)**\Microsoft.CodeAnalysis.Remote.Razor.*" Exclude="@(_ExcludedFiles)"/> + <_PublishedFiles Include="$(PublishDir)**\Microsoft.AspNetCore.*" /> + <_PublishedFiles Include="$(PublishDir)**\Microsoft.Extensions.ObjectPool.dll" /> + + <_PublishedFiles Remove="@(_PublishedFiles)" Condition="'%(Extension)' == '.pdb'" /> + <_PublishedFiles Remove="@(_PublishedFiles)" Condition="'%(Extension)' == '.xml'" /> + + + <_PublishedFiles Update="@(_PublishedFiles)" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" /> + + + diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/GeneratorRunResult.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/GeneratorRunResult.cs index 0ba9b367fe2..299ec3e86a6 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/GeneratorRunResult.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/GeneratorRunResult.cs @@ -20,7 +20,7 @@ internal readonly record struct GeneratorRunResult(RazorGeneratorResult Generato { public bool IsDefault => GeneratorResult is null && Project is null; - public IReadOnlyList TagHelpers => GeneratorResult.TagHelpers; + public TagHelperCollection TagHelpers => GeneratorResult.TagHelpers; public RazorCodeDocument? GetCodeDocument(string filePath) => GeneratorResult.GetCodeDocument(filePath); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/RemoteProjectSnapshot.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/RemoteProjectSnapshot.cs index ad1a7558fba..24f2b3be113 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/RemoteProjectSnapshot.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/RemoteProjectSnapshot.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading; @@ -12,6 +13,7 @@ using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Razor.Utilities; @@ -56,13 +58,13 @@ public IEnumerable DocumentFilePaths public LanguageVersion CSharpLanguageVersion => ((CSharpParseOptions)_project.ParseOptions.AssumeNotNull()).LanguageVersion; - public async ValueTask> GetTagHelpersAsync(CancellationToken cancellationToken) + public async ValueTask GetTagHelpersAsync(CancellationToken cancellationToken) { var generatorResult = await GeneratorRunResult.CreateAsync(throwIfNotFound: false, _project, SolutionSnapshot.SnapshotManager, cancellationToken).ConfigureAwait(false); - if (generatorResult.IsDefault) - return []; - return [.. generatorResult.TagHelpers]; + return !generatorResult.IsDefault + ? generatorResult.TagHelpers + : []; } public RemoteDocumentSnapshot GetDocument(TextDocument document) @@ -163,17 +165,15 @@ internal async Task GetRequiredGeneratedDocumentAsync(I return await generatorResult.GetRequiredSourceGeneratedDocumentForRazorFilePathAsync(documentSnapshot.FilePath, cancellationToken).ConfigureAwait(false); } - public async Task TryGetCodeDocumentFromGeneratedDocumentUriAsync(Uri generatedDocumentUri, CancellationToken cancellationToken) + public async Task TryGetCodeDocumentForGeneratedDocumentAsync(RazorGeneratedDocumentIdentity identity, CancellationToken cancellationToken) { - if (!_project.TryGetHintNameFromGeneratedDocumentUri(generatedDocumentUri, out var hintName)) - { - return null; - } + Debug.Assert(identity.DocumentId.ProjectId == _project.Id, "Generated document does not belong to this project."); + var hintName = identity.HintName; return await TryGetCodeDocumentFromGeneratedHintNameAsync(hintName, cancellationToken).ConfigureAwait(false); } - public async Task TryGetCodeDocumentFromGeneratedHintNameAsync(string generatedDocumentHintName, CancellationToken cancellationToken) + private async Task TryGetCodeDocumentFromGeneratedHintNameAsync(string generatedDocumentHintName, CancellationToken cancellationToken) { var generatorResult = await GeneratorRunResult.CreateAsync(throwIfNotFound: false, _project, SolutionSnapshot.SnapshotManager, cancellationToken).ConfigureAwait(false); if (generatorResult.IsDefault) @@ -186,15 +186,18 @@ internal async Task GetRequiredGeneratedDocumentAsync(I : null; } - public async Task TryGetRazorDocumentFromGeneratedHintNameAsync(string generatedDocumentHintName, CancellationToken cancellationToken) + public async Task TryGetRazorDocumentForGeneratedDocumentAsync(RazorGeneratedDocumentIdentity identity, CancellationToken cancellationToken) { + Debug.Assert(identity.DocumentId.ProjectId == _project.Id, "Generated document does not belong to this project."); + var hintName = identity.HintName; + var generatorResult = await GeneratorRunResult.CreateAsync(throwIfNotFound: false, _project, SolutionSnapshot.SnapshotManager, cancellationToken).ConfigureAwait(false); if (generatorResult.IsDefault) { return null; } - return generatorResult.GetRazorFilePathFromHintName(generatedDocumentHintName) is { } razorFilePath && + return generatorResult.GetRazorFilePathFromHintName(hintName) is { } razorFilePath && generatorResult.TryGetRazorDocument(razorFilePath, out var razorDocument) ? razorDocument : null; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteMefComposition.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteMefComposition.cs index 51d22e5a7c2..0b26573c6a6 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteMefComposition.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteMefComposition.cs @@ -167,8 +167,8 @@ private static void CleanCacheDirectory(DirectoryInfo directoryInfo, Cancellatio foreach (var assembly in Assemblies) { var assemblyPath = assembly.Location.AssumeNotNull(); - checksum.AppendData(Path.GetFileName(assemblyPath)); - checksum.AppendData(File.GetLastWriteTimeUtc(assemblyPath).ToString("F")); + checksum.Append(Path.GetFileName(assemblyPath)); + checksum.Append(File.GetLastWriteTimeUtc(assemblyPath).ToString("F")); } // Create base64 string of the hash. diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperSearchEngine.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperSearchEngine.cs index 35acd6090a2..1ef8032686d 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperSearchEngine.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperSearchEngine.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Immutable; using System.Composition; using System.Diagnostics; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Rename/OOPRenameService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Rename/OOPRenameService.cs index 497d828954b..ea4b1c0c133 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Rename/OOPRenameService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Rename/OOPRenameService.cs @@ -11,7 +11,8 @@ namespace Microsoft.CodeAnalysis.Remote.Razor.Rename; [method: ImportingConstructor] internal sealed class OOPRenameService( IRazorComponentSearchEngine componentSearchEngine, + IFileSystem fileSystem, LanguageServerFeatureOptions languageServerFeatureOptions) - : RenameService(componentSearchEngine, languageServerFeatureOptions) + : RenameService(componentSearchEngine, fileSystem, languageServerFeatureOptions) { } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Rename/RemoteRenameService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Rename/RemoteRenameService.cs index 468d824b511..7a8b6898645 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Rename/RemoteRenameService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Rename/RemoteRenameService.cs @@ -3,12 +3,14 @@ using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.Remote; using Microsoft.CodeAnalysis.Razor.Rename; using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Remote.Razor.ProjectSystem; +using Microsoft.CodeAnalysis.Text; using static Microsoft.CodeAnalysis.Razor.Remote.RemoteResponse; using ExternalHandlers = Microsoft.CodeAnalysis.ExternalAccess.Razor.Cohost.Handlers; @@ -45,10 +47,10 @@ protected override IRemoteRenameService CreateService(in ServiceArgs args) { var codeDocument = await context.GetCodeDocumentAsync(cancellationToken).ConfigureAwait(false); - if (!TryGetDocumentPositionInfo(codeDocument, position, preferCSharpOverHtml: true, out var positionInfo)) - { - return NoFurtherHandling; - } + var hostDocumentIndex = codeDocument.Source.Text.GetRequiredAbsoluteIndex(position); + hostDocumentIndex = codeDocument.AdjustPositionForComponentEndTag(hostDocumentIndex); + + var positionInfo = GetPositionInfo(codeDocument, hostDocumentIndex, preferCSharpOverHtml: true); var generatedDocument = await context.Snapshot .GetGeneratedDocumentAsync(cancellationToken) @@ -58,14 +60,14 @@ protected override IRemoteRenameService CreateService(in ServiceArgs args) .TryGetRazorRenameEditsAsync(context, positionInfo, newName, context.GetSolutionQueryOperations(), cancellationToken) .ConfigureAwait(false); - if (razorEdit is not null) + if (razorEdit.Edit is null && positionInfo.LanguageKind != CodeAnalysis.Razor.Protocol.RazorLanguageKind.CSharp) { - return Results(razorEdit); + return CallHtml; } - if (positionInfo.LanguageKind != CodeAnalysis.Razor.Protocol.RazorLanguageKind.CSharp) + if (razorEdit.Edit is null && !razorEdit.FallbackToCSharp) { - return CallHtml; + return NoFurtherHandling; } var csharpEdit = await ExternalHandlers.Rename @@ -77,7 +79,14 @@ protected override IRemoteRenameService CreateService(in ServiceArgs args) return NoFurtherHandling; } - var mappedEdit = await _editMappingService.RemapWorkspaceEditAsync(context.Snapshot, csharpEdit, cancellationToken).ConfigureAwait(false); - return Results(mappedEdit); + await _editMappingService.MapWorkspaceEditAsync(context.Snapshot, csharpEdit, cancellationToken).ConfigureAwait(false); + + // Only Roslyn edits? just return them + if (razorEdit.Edit is null) + { + return Results(csharpEdit); + } + + return Results(csharpEdit.Concat(razorEdit.Edit)); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/TagHelpers/RemoteTagHelperProviderService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/TagHelpers/RemoteTagHelperProviderService.cs index dd49aa5d08b..1f46757b624 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/TagHelpers/RemoteTagHelperProviderService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/TagHelpers/RemoteTagHelperProviderService.cs @@ -2,10 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Immutable; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.AspNetCore.Razor.Utilities; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor.Remote; @@ -76,23 +76,23 @@ private async ValueTask FetchTagHelpersCoreAsync( return new FetchTagHelpersResult(tagHelpers); - static bool TryGetCachedTagHelpers(ImmutableArray checksums, out ImmutableArray tagHelpers) + static bool TryGetCachedTagHelpers(ImmutableArray checksums, out TagHelperCollection tagHelpers) { - using var builder = new PooledArrayBuilder(capacity: checksums.Length); + using var builder = new TagHelperCollection.RefBuilder(initialCapacity: checksums.Length); var cache = TagHelperCache.Default; foreach (var checksum in checksums) { if (!cache.TryGet(checksum, out var tagHelper)) { - tagHelpers = ImmutableArray.Empty; + tagHelpers = []; return false; } builder.Add(tagHelper); } - tagHelpers = builder.ToImmutableAndClear(); + tagHelpers = builder.ToCollection(); return true; } } @@ -117,7 +117,7 @@ private async ValueTask GetTagHelpersDeltaCoreAsync( if (solution.GetProject(projectHandle.ProjectId) is not Project workspaceProject) { - checksums = ImmutableArray.Empty; + checksums = []; } else { @@ -130,21 +130,22 @@ private async ValueTask GetTagHelpersDeltaCoreAsync( return _tagHelperDeltaProvider.GetTagHelpersDelta(projectHandle.ProjectId, lastResultId, checksums); - static ImmutableArray GetChecksums(ImmutableArray tagHelpers) + static ImmutableArray GetChecksums(TagHelperCollection tagHelpers) { - using var builder = new PooledArrayBuilder(capacity: tagHelpers.Length); + var array = new Checksum[tagHelpers.Count]; // Add each tag helpers to the cache so that we can retrieve them later if needed. var cache = TagHelperCache.Default; + var index = 0; foreach (var tagHelper in tagHelpers) { var checksum = tagHelper.Checksum; - builder.Add(checksum); + array[index++] = checksum; cache.TryAdd(checksum, tagHelper); } - return builder.ToImmutableAndClear(); + return ImmutableCollectionsMarshal.AsImmutableArray(array); } } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/TagHelpers/RemoteTagHelperResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/TagHelpers/RemoteTagHelperResolver.cs index 3e4707bc552..4a361c50a4f 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/TagHelpers/RemoteTagHelperResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/TagHelpers/RemoteTagHelperResolver.cs @@ -3,27 +3,22 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Composition; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis.Razor.ProjectEngineHost; -using Microsoft.CodeAnalysis.Razor.Telemetry; namespace Microsoft.CodeAnalysis.Remote.Razor; [Export(typeof(RemoteTagHelperResolver)), Shared] -[method: ImportingConstructor] -internal class RemoteTagHelperResolver(ITelemetryReporter telemetryReporter) +internal class RemoteTagHelperResolver { /// /// A map of configuration names to instances. /// private static readonly Dictionary s_configurationNameToFactoryMap = CreateConfigurationNameToFactoryMap(); - private readonly ITelemetryReporter _telemetryReporter = telemetryReporter; - private static Dictionary CreateConfigurationNameToFactoryMap() { var map = new Dictionary(StringComparer.Ordinal); @@ -36,15 +31,15 @@ private static Dictionary CreateConfigurationName return map; } - public ValueTask> GetTagHelpersAsync( + public ValueTask GetTagHelpersAsync( Project workspaceProject, RazorConfiguration? configuration, CancellationToken cancellationToken) => configuration is not null - ? workspaceProject.GetTagHelpersAsync(CreateProjectEngine(configuration), _telemetryReporter, cancellationToken) + ? workspaceProject.GetTagHelpersAsync(CreateProjectEngine(configuration), cancellationToken) : new([]); - private RazorProjectEngine CreateProjectEngine(RazorConfiguration configuration) + private static RazorProjectEngine CreateProjectEngine(RazorConfiguration configuration) { // If there's no factory to handle the configuration then fall back to a very basic configuration. // diff --git a/src/Razor/src/Microsoft.VisualStudio.DevKit.Razor/Microsoft.VisualStudio.DevKit.Razor.csproj b/src/Razor/src/Microsoft.VisualStudio.DevKit.Razor/Microsoft.VisualStudio.DevKit.Razor.csproj deleted file mode 100644 index fedb3b7609e..00000000000 --- a/src/Razor/src/Microsoft.VisualStudio.DevKit.Razor/Microsoft.VisualStudio.DevKit.Razor.csproj +++ /dev/null @@ -1,43 +0,0 @@ - - - - $(NetVSCode) - Library - Razor is a markup syntax for adding server-side logic to web pages. This package contains the language server assets for C# DevKit. - false - true - true - - - $(NoWarn);NU5100 - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - - diff --git a/src/Razor/src/Microsoft.VisualStudio.DevKit.Razor/Telemetry/DevKitTelemetryReporter.cs b/src/Razor/src/Microsoft.VisualStudio.DevKit.Razor/Telemetry/DevKitTelemetryReporter.cs deleted file mode 100644 index 87f3b9d319b..00000000000 --- a/src/Razor/src/Microsoft.VisualStudio.DevKit.Razor/Telemetry/DevKitTelemetryReporter.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Composition; -using System.Diagnostics; -using System.Text; -using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.CodeAnalysis.Razor.Telemetry; -using Microsoft.VisualStudio.Razor.Telemetry; -using Microsoft.VisualStudio.Telemetry; - -namespace Microsoft.VisualStudio.DevKit.Razor.Telemetry; - -[Shared] -[Export(typeof(ITelemetryReporter))] -internal sealed class DevKitTelemetryReporter : TelemetryReporter, ITelemetryReporterInitializer -{ - private const string CollectorApiKey = "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255"; - - [ImportingConstructor] - public DevKitTelemetryReporter() - : base(null) - { - } - - public void InitializeSession(string telemetryLevel, string? sessionId, bool isDefaultSession) - { - var sessionSettingsJson = CreateSessionSettingsJson(telemetryLevel, sessionId); - var session = new TelemetrySession(sessionSettingsJson); - - if (isDefaultSession) - { - TelemetryService.SetDefaultSession(session); - } - - session.Start(); - session.RegisterForReliabilityEvent(); - - SetSession(session); - } - - private static string CreateSessionSettingsJson(string telemetryLevel, string? sessionId) - { - sessionId ??= Guid.NewGuid().ToString(); - - // Generate a new startTime for process to be consumed by Telemetry Settings - using var curProcess = Process.GetCurrentProcess(); - var processStartTime = curProcess.StartTime.ToFileTimeUtc().ToString(); - - using var _ = StringBuilderPool.GetPooledObject(out var builder); - - builder.Append('{'); - - AppendNameValuePair(builder, "Id", sessionId); - AppendNameValuePair(builder, "HostName", "Default"); - - // Insert Telemetry Level instead of Opt-Out status. The telemetry service handles - // validation of this value so there is no need to do so on this end. If it's invalid, - // it defaults to off. - AppendNameValuePair(builder, "TelemetryLevel", telemetryLevel); - - // this sets the Telemetry Session Created by LSP Server to be the Root Initial session - // This means that the SessionID set here by "Id" will be the SessionID used by cloned session - // further down stream - AppendNameValuePair(builder, "IsInitialSession", "true", quoteValue: false); - AppendNameValuePair(builder, "CollectorApiKey", CollectorApiKey); - - // using 1010 to indicate VS Code and not to match it to devenv 1000 - AppendNameValuePair(builder, "AppId", "1010", quoteValue: false); - - // Don't add a comma to the last property. - AppendNameValuePair(builder, "ProcessStartTime", processStartTime, quoteValue: false, addComma: false); - - builder.Append('}'); - - return builder.ToString(); - - static void AppendNameValuePair(StringBuilder builder, string name, string? value, bool quoteValue = true, bool addComma = true) - { - builder.Append('"'); - builder.Append(name); - builder.Append('"'); - builder.Append(':'); - - if (value is string s) - { - if (quoteValue) - { - builder.Append('"'); - } - - builder.Append(value); - - if (quoteValue) - { - builder.Append('"'); - } - } - else - { - builder.Append("null"); - } - - if (addComma) - { - builder.Append(','); - } - } - } -} diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServer.ContainedLanguage/PublicAPI.Shipped.txt b/src/Razor/src/Microsoft.VisualStudio.LanguageServer.ContainedLanguage/PublicAPI.Shipped.txt index 5d084bebf40..c4d79f6b2c5 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServer.ContainedLanguage/PublicAPI.Shipped.txt +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServer.ContainedLanguage/PublicAPI.Shipped.txt @@ -11,6 +11,7 @@ abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnap abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot.Uri.get -> System.Uri! abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot.Version.get -> int abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot.VirtualDocuments.get -> System.Collections.Generic.IReadOnlyList! +abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericMessageInterceptor.ApplyChangesAsync(TJsonToken message, string! containedLanguageName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task>! abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptorManager.HasInterceptor(string! messageName, string! contentType) -> bool abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptorManager.ProcessInterceptorsAsync(string! methodName, Newtonsoft.Json.Linq.JToken! message, string! contentType, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.MessageInterceptor.ApplyChangesAsync(Newtonsoft.Json.Linq.JToken! message, string! containedLanguageName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! @@ -30,6 +31,7 @@ Microsoft.VisualStudio.LanguageServer.ContainedLanguage.FormattingOptionsProvide Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument.LSPDocument() -> void Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument.TryGetVirtualDocument(out TVirtualDocument? virtualDocument) -> bool +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument.TryGetVirtualDocument(System.Uri! virtualDocumentUri, out TVirtualDocument? virtualDocument) -> bool Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentChangeKind Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentChangeKind.Added = 0 -> Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentChangeKind Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentChangeKind.Removed = 1 -> Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentChangeKind @@ -38,7 +40,20 @@ Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentManager Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentManager.LSPDocumentManager() -> void Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot.LSPDocumentSnapshot() -> void +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot.TryGetAllVirtualDocuments(out TVirtualDocument![]? virtualDocuments) -> bool Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot.TryGetVirtualDocument(out TVirtualDocument? virtualDocument) -> bool +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer.CanHandle(string! methodName) -> bool +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer.GenericInterceptionMiddleLayer(Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptorManager! interceptorManager, string! contentType) -> void +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer.HandleNotificationAsync(string! methodName, TJsonToken methodParam, System.Func! sendNotification) -> System.Threading.Tasks.Task! +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer.HandleRequestAsync(string! methodName, TJsonToken methodParam, System.Func!>! sendRequest) -> System.Threading.Tasks.Task! +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.ChangedDocumentUri.get -> bool +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.GenericInterceptionResult() -> void +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.GenericInterceptionResult(TJsonToken? newToken, bool changedDocumentUri) -> void +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.UpdatedToken.get -> TJsonToken? +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericMessageInterceptor +Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericMessageInterceptor.GenericMessageInterceptor() -> void Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptionMiddleLayer Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptionMiddleLayer.CanHandle(string! methodName) -> bool Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptionMiddleLayer.HandleNotificationAsync(string! methodName, Newtonsoft.Json.Linq.JToken! methodParam, System.Func! sendNotification) -> System.Threading.Tasks.Task! @@ -67,5 +82,10 @@ override Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocument override Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocumentBase.TextBuffer.get -> Microsoft.VisualStudio.Text.ITextBuffer! override Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocumentBase.Update(System.Collections.Generic.IReadOnlyList! changes, int hostDocumentVersion, object? state) -> Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocumentSnapshot! override Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocumentBase.Uri.get -> System.Uri! +static readonly Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.NoChange -> Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult static readonly Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptionResult.NoChange -> Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptionResult -virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument.Dispose() -> void \ No newline at end of file +virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument.Dispose() -> void +virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument.UpdateVirtualDocument(TVirtualDocument! virtualDocument, System.Collections.Generic.IReadOnlyList! changes, int hostDocumentVersion, object? state) -> Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot! +virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentManager.RefreshVirtualDocuments() -> void +virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptorManager.ProcessGenericInterceptorsAsync(string! methodName, TJsonToken message, string! contentType, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocumentFactory.TryCreateMultipleFor(Microsoft.VisualStudio.Text.ITextBuffer! hostDocumentBuffer, out Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocument![]? virtualDocuments) -> bool diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServer.ContainedLanguage/PublicAPI.Unshipped.txt b/src/Razor/src/Microsoft.VisualStudio.LanguageServer.ContainedLanguage/PublicAPI.Unshipped.txt index eb2db14b9f3..074c6ad103b 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServer.ContainedLanguage/PublicAPI.Unshipped.txt +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServer.ContainedLanguage/PublicAPI.Unshipped.txt @@ -1,21 +1,2 @@ #nullable enable -abstract Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericMessageInterceptor.ApplyChangesAsync(TJsonToken message, string! containedLanguageName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task>! -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument.TryGetVirtualDocument(System.Uri! virtualDocumentUri, out TVirtualDocument? virtualDocument) -> bool -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot.TryGetAllVirtualDocuments(out TVirtualDocument![]? virtualDocuments) -> bool -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer.CanHandle(string! methodName) -> bool -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer.GenericInterceptionMiddleLayer(Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptorManager! interceptorManager, string! contentType) -> void -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer.HandleNotificationAsync(string! methodName, TJsonToken methodParam, System.Func! sendNotification) -> System.Threading.Tasks.Task! -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionMiddleLayer.HandleRequestAsync(string! methodName, TJsonToken methodParam, System.Func!>! sendRequest) -> System.Threading.Tasks.Task! -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.ChangedDocumentUri.get -> bool -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.GenericInterceptionResult() -> void -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.GenericInterceptionResult(TJsonToken? newToken, bool changedDocumentUri) -> void -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.UpdatedToken.get -> TJsonToken? -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericMessageInterceptor -Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericMessageInterceptor.GenericMessageInterceptor() -> void -static readonly Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult.NoChange -> Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.GenericInterceptionResult -virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocument.UpdateVirtualDocument(TVirtualDocument! virtualDocument, System.Collections.Generic.IReadOnlyList! changes, int hostDocumentVersion, object? state) -> Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentSnapshot! -virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.LSPDocumentManager.RefreshVirtualDocuments() -> void -virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.MessageInterception.InterceptorManager.ProcessGenericInterceptorsAsync(string! methodName, TJsonToken message, string! contentType, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! -virtual Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocumentFactory.TryCreateMultipleFor(Microsoft.VisualStudio.Text.ITextBuffer! hostDocumentBuffer, out Microsoft.VisualStudio.LanguageServer.ContainedLanguage.VirtualDocument![]? virtualDocuments) -> bool + diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/OutOfProcTagHelperResolver.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/OutOfProcTagHelperResolver.cs index bebcdbc5f97..6a6e8f8f4d0 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/OutOfProcTagHelperResolver.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/OutOfProcTagHelperResolver.cs @@ -37,10 +37,12 @@ internal class OutOfProcTagHelperResolver( { private readonly IRemoteServiceInvoker _remoteServiceInvoker = remoteServiceInvoker; private readonly ILogger _logger = loggerFactory.GetOrCreateLogger(); +#pragma warning disable IDE0052 // Private member 'OutOfProcTagHelperResolver._telemetryReporter' can be removed as the value assigned to it is never read private readonly ITelemetryReporter _telemetryReporter = telemetryReporter; +#pragma warning restore IDE0052 // Private member 'OutOfProcTagHelperResolver._telemetryReporter' can be removed as the value assigned to it is never read private readonly TagHelperResultCache _resultCache = new(); - public async ValueTask> GetTagHelpersAsync( + public async ValueTask GetTagHelpersAsync( Project project, ProjectSnapshot projectSnapshot, CancellationToken cancellationToken) @@ -52,7 +54,7 @@ public async ValueTask> GetTagHelpersAsync( var result = await ResolveTagHelpersOutOfProcessAsync(project, projectSnapshot, cancellationToken).ConfigureAwait(false); // We received tag helpers, so we're done. - if (!result.IsDefault) + if (result is not null) { return result; } @@ -70,11 +72,11 @@ public async ValueTask> GetTagHelpersAsync( catch (Exception ex) when (ex is not OperationCanceledException) { _logger.LogError(ex, $"Error encountered from project '{projectSnapshot.FilePath}':{Environment.NewLine}{ex}"); - return default; + return null; } } - protected virtual async ValueTask> ResolveTagHelpersOutOfProcessAsync(Project project, ProjectSnapshot projectSnapshot, CancellationToken cancellationToken) + protected virtual async ValueTask ResolveTagHelpersOutOfProcessAsync(Project project, ProjectSnapshot projectSnapshot, CancellationToken cancellationToken) { if (!_resultCache.TryGetId(project.Id, out var lastResultId)) { @@ -92,7 +94,7 @@ protected virtual async ValueTask> ResolveTa if (deltaResult is null) { // For some reason, TryInvokeAsync can return null if it is cancelled while fetching the client. - return default; + return null; } // Apply the delta we received to any cached checksums for the current project. @@ -137,7 +139,7 @@ protected virtual async ValueTask> ResolveTa if (fetchResult is null) { // For some reason, TryInvokeAsync can return null if it is cancelled while fetching the client. - return default; + return null; } var fetchedTagHelpers = fetchResult.TagHelpers; @@ -149,7 +151,7 @@ protected virtual async ValueTask> ResolveTa } Debug.Assert( - checksumsToFetch.Length == fetchedTagHelpers.Length, + checksumsToFetch.Length == fetchedTagHelpers.Count, $"{nameof(FetchTagHelpersResult)} should return the same number of tag helpers as checksums requested."); Debug.Assert( @@ -159,7 +161,7 @@ protected virtual async ValueTask> ResolveTa // Be sure to add the tag helpers we just fetched to the cache. var cache = TagHelperCache.Default; - for (var i = 0; i < fetchedTagHelpers.Length; i++) + for (var i = 0; i < fetchedTagHelpers.Count; i++) { var index = checksumIndicesBuilder[i]; Debug.Assert(result[index] is null); @@ -169,14 +171,14 @@ protected virtual async ValueTask> ResolveTa cache.TryAdd(fetchedTagHelper.Checksum, fetchedTagHelper); } - if (checksumsToFetch.Length != fetchedTagHelpers.Length) + if (checksumsToFetch.Length != fetchedTagHelpers.Count) { _logger.LogWarning($"Expected to receive {checksumsToFetch.Length} tag helpers from Roslyn OOP, " + - $"but received {fetchedTagHelpers.Length} instead. Returning a partial set of tag helpers."); + $"but received {fetchedTagHelpers.Count} instead. Returning a partial set of tag helpers."); // We didn't receive all the tag helpers we requested. This is bad. However, instead of failing, // we'll just return the tag helpers we were able to retrieve. - using var resultBuilder = new PooledArrayBuilder(capacity: result.Length); + using var resultBuilder = new TagHelperCollection.RefBuilder(initialCapacity: result.Length); foreach (var tagHelper in result) { @@ -186,11 +188,17 @@ protected virtual async ValueTask> ResolveTa } } - return resultBuilder.ToImmutableAndClear(); + return resultBuilder.ToCollection(); } } - return ImmutableCollectionsMarshal.AsImmutableArray(result); + // If we pass 'result' to TagHelperCollection.Create(...) the overload that takes + // a ReadOnlySpan will be called, resulting in 'result' being + // copied to a new array. By first wrapping 'result' in an ImmutableArray we ensure + // that TagHelperCollection.Create(...) slices 'result' into segments. + var resultArray = ImmutableCollectionsMarshal.AsImmutableArray(result); + + return TagHelperCollection.Create(resultArray); } // Protected virtual for testing @@ -224,9 +232,9 @@ protected ImmutableArray ProduceChecksumsFromDelta(ProjectId projectId return checksums; } - protected virtual ValueTask> ResolveTagHelpersInProcessAsync( + protected virtual ValueTask ResolveTagHelpersInProcessAsync( Project project, ProjectSnapshot projectSnapshot, CancellationToken cancellationToken) - => project.GetTagHelpersAsync(projectSnapshot.ProjectEngine, _telemetryReporter, cancellationToken); + => project.GetTagHelpersAsync(projectSnapshot.ProjectEngine, cancellationToken); } diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/ProjectStateChangeDetector.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/ProjectStateChangeDetector.cs index ef1690ea01e..8fc681c561d 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/ProjectStateChangeDetector.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/ProjectStateChangeDetector.cs @@ -14,6 +14,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Razor; using Microsoft.CodeAnalysis.Razor.ProjectSystem; +using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Razor.Utilities; using Microsoft.CodeAnalysis.Razor.Workspaces; @@ -35,7 +36,6 @@ public override int GetHashCode() private readonly IProjectStateUpdater _updater; private readonly ProjectSnapshotManager _projectManager; - private readonly LanguageServerFeatureOptions _options; private readonly CodeAnalysis.Workspace _workspace; private readonly WorkspaceEventRegistration _changeRegistration; private readonly CancellationTokenSource _disposeTokenSource; @@ -53,22 +53,19 @@ public override int GetHashCode() public ProjectStateChangeDetector( IProjectStateUpdater generator, ProjectSnapshotManager projectManager, - LanguageServerFeatureOptions options, IWorkspaceProvider workspaceProvider) - : this(generator, projectManager, options, workspaceProvider, s_delay) + : this(generator, projectManager, workspaceProvider, s_delay) { } public ProjectStateChangeDetector( IProjectStateUpdater updater, ProjectSnapshotManager projectManager, - LanguageServerFeatureOptions options, IWorkspaceProvider workspaceProvider, TimeSpan delay) { _updater = updater; _projectManager = projectManager; - _options = options; _workerSet = []; _disposeTokenSource = new(); @@ -245,7 +242,7 @@ private bool IsRazorOrRazorVirtualFile(Document document) } // Using EndsWith because Path.GetExtension will ignore everything before .cs - return filePath.EndsWith(_options.CSharpVirtualDocumentSuffix, PathUtilities.OSSpecificPathComparison) || + return filePath.EndsWith(LanguageServerConstants.CSharpVirtualDocumentSuffix, PathUtilities.OSSpecificPathComparison) || // Still have .cshtml.g.cs and .razor.g.cs for Razor.VSCode scenarios. filePath.EndsWith(".cshtml.g.cs", PathUtilities.OSSpecificPathComparison) || filePath.EndsWith(".razor.g.cs", PathUtilities.OSSpecificPathComparison) || diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/ProjectStateUpdater.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/ProjectStateUpdater.cs index 2d9bbca820f..80ad12ed5a1 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/ProjectStateUpdater.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Discovery/ProjectStateUpdater.cs @@ -159,7 +159,7 @@ private async Task UpdateWorkspaceStateAsync(ProjectKey key, ProjectId? id, Canc return; } - _logger.LogTrace($"Received {nameof(ProjectWorkspaceState)} with {workspaceState.TagHelpers.Length} tag helper(s) for '{key}'"); + _logger.LogTrace($"Received {nameof(ProjectWorkspaceState)} with {workspaceState.TagHelpers.Count} tag helper(s) for '{key}'"); await _projectManager .UpdateAsync( @@ -172,7 +172,7 @@ await _projectManager return; } - logger.LogTrace($"Updating project with {workspaceState.TagHelpers.Length} tag helper(s) for '{projectKey}'"); + logger.LogTrace($"Updating project with {workspaceState.TagHelpers.Count} tag helper(s) for '{projectKey}'"); var projectSnapshot = updater.GetRequiredProject(projectKey); var hostProject = projectSnapshot.HostProject with { Configuration = configuration }; @@ -290,7 +290,7 @@ private void ReleaseSemaphore(ProjectKey projectKey) _telemetryReporter.ReportEvent("taghelperresolve/begin", Severity.Normal, new("id", telemetryId), - new("tagHelperCount", projectSnapshot.ProjectWorkspaceState.TagHelpers.Length)); + new("tagHelperCount", projectSnapshot.ProjectWorkspaceState.TagHelpers.Count)); try { @@ -317,7 +317,7 @@ private void ReleaseSemaphore(ProjectKey projectKey) // Don't report success if the call failed. // If the ImmutableArray that was returned is default, then the call failed. - if (tagHelpers.IsDefault) + if (tagHelpers is null) { _telemetryReporter.ReportEvent("taghelperresolve/end", Severity.Normal, new("id", telemetryId), @@ -335,14 +335,14 @@ Tag helper discovery failed. new("id", telemetryId), new("ellapsedms", watch.ElapsedMilliseconds), new("result", "success"), - new("tagHelperCount", tagHelpers.Length)); + new("tagHelperCount", tagHelpers.Count)); _logger.LogInformation($""" Resolved tag helpers for project in {watch.ElapsedMilliseconds} ms. Project: {projectSnapshot.FilePath} """); - return (ProjectWorkspaceState.Create(tagHelpers), configuration); + return (ProjectWorkspaceState.Create([.. tagHelpers]), configuration); } catch (OperationCanceledException) { diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Documents/EditorDocumentManagerListener.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Documents/EditorDocumentManagerListener.cs index 0a22e87400e..2b5a2ae5f96 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Documents/EditorDocumentManagerListener.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Documents/EditorDocumentManagerListener.cs @@ -256,7 +256,7 @@ private Task Document_OpenedAsync(object sender, CancellationToken cancellationT "fallbackproject/documentopen", Severity.Normal, new Property("document.count", project.DocumentCount), - new Property("taghelper.count", project.ProjectWorkspaceState.TagHelpers.Length)); + new Property("taghelper.count", project.ProjectWorkspaceState.TagHelpers.Count)); } updater.OpenDocument(document.ProjectKey, document.DocumentFilePath, document.EditorTextContainer!.CurrentText); diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/DocumentExcerptService.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/DocumentExcerptService.cs index cca18915837..8738df83614 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/DocumentExcerptService.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/DocumentExcerptService.cs @@ -1,13 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; -using System.Collections.Immutable; -using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Classification; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Text; @@ -15,74 +11,20 @@ namespace Microsoft.VisualStudio.Razor.DynamicFiles; internal abstract class DocumentExcerptService : IRazorDocumentExcerptServiceImplementation { - async Task IRazorDocumentExcerptServiceImplementation.TryExcerptAsync( + Task IRazorDocumentExcerptServiceImplementation.TryExcerptAsync( Document document, TextSpan span, RazorExcerptMode mode, RazorClassificationOptionsWrapper options, CancellationToken cancellationToken) { - var result = await TryGetExcerptInternalAsync(document, span, (ExcerptModeInternal)mode, options, cancellationToken).ConfigureAwait(false); - return result?.ToExcerptResult(); + return TryGetExcerptInternalAsync(document, span, mode, options, cancellationToken); } - internal abstract Task TryGetExcerptInternalAsync( + internal abstract Task TryGetExcerptInternalAsync( Document document, TextSpan span, - ExcerptModeInternal mode, + RazorExcerptMode mode, RazorClassificationOptionsWrapper options, CancellationToken cancellationToken); - - protected static TextSpan ChooseExcerptSpan(SourceText text, TextSpan span, ExcerptModeInternal mode) - { - var startLine = text.Lines.GetLineFromPosition(span.Start); - var endLine = text.Lines.GetLineFromPosition(span.End); - - if (mode == ExcerptModeInternal.Tooltip) - { - // Expand the range by 3 in each direction (if possible). - var startIndex = Math.Max(startLine.LineNumber - 3, 0); - startLine = text.Lines[startIndex]; - - var endIndex = Math.Min(endLine.LineNumber + 3, text.Lines.Count - 1); - endLine = text.Lines[endIndex]; - return CreateTextSpan(startLine, endLine); - } - else - { - // Trim leading whitespace in a single line excerpt - var excerptSpan = CreateTextSpan(startLine, endLine); - var trimmedExcerptSpan = excerptSpan.TrimLeadingWhitespace(text); - return trimmedExcerptSpan; - } - - static TextSpan CreateTextSpan(TextLine startLine, TextLine endLine) - { - return new TextSpan(startLine.Start, endLine.End - startLine.Start); - } - } - - protected static SourceText GetTranslatedExcerptText( - SourceText razorDocumentText, - ref TextSpan razorDocumentSpan, - ref TextSpan excerptSpan, - ImmutableArray.Builder classifiedSpans) - { - // Now translate everything to be relative to the excerpt - var offset = 0 - excerptSpan.Start; - var excerptText = razorDocumentText.GetSubText(excerptSpan); - excerptSpan = new TextSpan(0, excerptSpan.Length); - razorDocumentSpan = new TextSpan(razorDocumentSpan.Start + offset, razorDocumentSpan.Length); - - for (var i = 0; i < classifiedSpans.Count; i++) - { - var classifiedSpan = classifiedSpans[i]; - var updated = new TextSpan(classifiedSpan.TextSpan.Start + offset, classifiedSpan.TextSpan.Length); - Debug.Assert(excerptSpan.Contains(updated)); - - classifiedSpans[i] = new ClassifiedSpan(classifiedSpan.ClassificationType, updated); - } - - return excerptText; - } } diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/ExcerptModeInternal.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/ExcerptModeInternal.cs deleted file mode 100644 index 2e525557e6a..00000000000 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/ExcerptModeInternal.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.CodeAnalysis.ExternalAccess.Razor; - -namespace Microsoft.VisualStudio.Razor.DynamicFiles; - -// We have IVT access to the Roslyn APIs for product code, but not for testing. -internal enum ExcerptModeInternal -{ - SingleLine = RazorExcerptMode.SingleLine, - Tooltip = RazorExcerptMode.Tooltip, -} diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/ExcerptResultInternal.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/ExcerptResultInternal.cs deleted file mode 100644 index 5d475aabbaa..00000000000 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/ExcerptResultInternal.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Immutable; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Classification; -using Microsoft.CodeAnalysis.ExternalAccess.Razor; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.VisualStudio.Razor.DynamicFiles; - -// We have IVT access to the Roslyn APIs for product code, but not for testing. -internal readonly struct ExcerptResultInternal -{ - public readonly SourceText Content; - public readonly TextSpan MappedSpan; - public readonly ImmutableArray ClassifiedSpans; - public readonly Document Document; - public readonly TextSpan Span; - - public ExcerptResultInternal( - SourceText content, - TextSpan mappedSpan, - ImmutableArray classifiedSpans, - Document document, - TextSpan span) - { - Content = content; - MappedSpan = mappedSpan; - ClassifiedSpans = classifiedSpans; - Document = document; - Span = span; - } - - public RazorExcerptResult ToExcerptResult() - { - return new RazorExcerptResult(Content, MappedSpan, ClassifiedSpans, Document, Span); - } -} diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/RazorDocumentExcerptService.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/RazorDocumentExcerptService.cs index 7e8f7124e2a..85da1560049 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/RazorDocumentExcerptService.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/RazorDocumentExcerptService.cs @@ -1,15 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; -using System.Diagnostics; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Classification; using Microsoft.CodeAnalysis.ExternalAccess.Razor; -using Microsoft.CodeAnalysis.Razor; +using Microsoft.CodeAnalysis.Razor.DocumentExcerpt; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Text; @@ -22,10 +18,10 @@ internal class RazorDocumentExcerptService( private readonly IDocumentSnapshot _document = document; private readonly IRazorMappingService _mappingService = mappingService; - internal override async Task TryGetExcerptInternalAsync( + internal override async Task TryGetExcerptInternalAsync( Document document, TextSpan span, - ExcerptModeInternal mode, + RazorExcerptMode mode, RazorClassificationOptionsWrapper options, CancellationToken cancellationToken) { @@ -52,127 +48,21 @@ internal class RazorDocumentExcerptService( var generatedDocument = document; // First compute the range of text we want to we to display relative to the primary document. - var excerptSpan = ChooseExcerptSpan(razorDocumentText, razorDocumentSpan, mode); + var excerptSpan = DocumentExcerptHelper.ChooseExcerptSpan(razorDocumentText, razorDocumentSpan, mode); // Then we'll classify the spans based on the primary document, since that's the coordinate // space that our output mappings use. var output = await _document.GetGeneratedOutputAsync(cancellationToken).ConfigureAwait(false); var mappings = output.GetRequiredCSharpDocument().SourceMappings; - var classifiedSpans = await ClassifyPreviewAsync( + var classifiedSpans = await DocumentExcerptHelper.ClassifyPreviewAsync( excerptSpan, generatedDocument, mappings, options, cancellationToken).ConfigureAwait(false); - var excerptText = GetTranslatedExcerptText(razorDocumentText, ref razorDocumentSpan, ref excerptSpan, classifiedSpans); + var excerptText = DocumentExcerptHelper.GetTranslatedExcerptText(razorDocumentText, ref razorDocumentSpan, ref excerptSpan, classifiedSpans); - return new ExcerptResultInternal(excerptText, razorDocumentSpan, classifiedSpans.ToImmutable(), document, span); - } - - private async Task.Builder> ClassifyPreviewAsync( - TextSpan excerptSpan, - Document generatedDocument, - ImmutableArray mappings, - RazorClassificationOptionsWrapper options, - CancellationToken cancellationToken) - { - var builder = ImmutableArray.CreateBuilder(); - - var sorted = mappings.Sort((x, y) => x.OriginalSpan.AbsoluteIndex.CompareTo(y.OriginalSpan.AbsoluteIndex)); - - // The algorithm here is to iterate through the source mappings (sorted) and use the C# classifier - // on the spans that are known to be C#. For the spans that are not known to be C# then - // we just treat them as text since we'd don't currently have our own classifications. - - var remainingSpan = excerptSpan; - foreach (var span in sorted) - { - if (excerptSpan.Length == 0) - { - break; - } - - var primarySpan = span.OriginalSpan.AsTextSpan(); - if (primarySpan.Intersection(remainingSpan) is not TextSpan intersection) - { - // This span is outside the area we're interested in. - continue; - } - - // OK this span intersects with the excerpt span, so we will process it. Let's compute - // the secondary span that matches the intersection. - var secondarySpan = span.GeneratedSpan.AsTextSpan(); - secondarySpan = new TextSpan(secondarySpan.Start + intersection.Start - primarySpan.Start, intersection.Length); - primarySpan = intersection; - - if (remainingSpan.Start < primarySpan.Start) - { - // The position is before the next C# span. Classify everything up to the C# start - // as text. - builder.Add(new ClassifiedSpan(ClassificationTypeNames.Text, new TextSpan(remainingSpan.Start, primarySpan.Start - remainingSpan.Start))); - - // Advance to the start of the C# span. - remainingSpan = new TextSpan(primarySpan.Start, remainingSpan.Length - (primarySpan.Start - remainingSpan.Start)); - } - - // We should be able to process this whole span as C#, so classify it. - // - // However, we'll have to translate it to the the generated document's coordinates to do that. - Debug.Assert(remainingSpan.Contains(primarySpan) && remainingSpan.Start == primarySpan.Start); - var classifiedSecondarySpans = await RazorClassifierAccessor.GetClassifiedSpansAsync( - generatedDocument, - secondarySpan, - options, - cancellationToken).ConfigureAwait(false); - - // NOTE: The Classifier will only returns spans for things that it understands. That means - // that whitespace is not classified. The preview expects us to provide contiguous spans, - // so we are going to have to fill in the gaps. - - // Now we have to translate back to the primary document's coordinates. - var offset = primarySpan.Start - secondarySpan.Start; - foreach (var classifiedSecondarySpan in classifiedSecondarySpans) - { - // It's possible for the classified span to extend past our secondary span, so we cap it - var classifiedSpan = classifiedSecondarySpan.TextSpan.End > secondarySpan.End - ? TextSpan.FromBounds(classifiedSecondarySpan.TextSpan.Start, secondarySpan.End) - : classifiedSecondarySpan.TextSpan; - Debug.Assert(secondarySpan.Contains(classifiedSpan)); - - var updated = new TextSpan(classifiedSpan.Start + offset, classifiedSpan.Length); - Debug.Assert(primarySpan.Contains(updated)); - - // Make sure that we're not introducing a gap. Remember, we need to fill in the whitespace. - if (remainingSpan.Start < updated.Start) - { - builder.Add(new ClassifiedSpan( - ClassificationTypeNames.Text, - new TextSpan(remainingSpan.Start, updated.Start - remainingSpan.Start))); - remainingSpan = new TextSpan(updated.Start, remainingSpan.Length - (updated.Start - remainingSpan.Start)); - } - - builder.Add(new ClassifiedSpan(classifiedSecondarySpan.ClassificationType, updated)); - remainingSpan = new TextSpan(updated.End, remainingSpan.Length - (updated.End - remainingSpan.Start)); - } - - // Make sure that we're not introducing a gap. Remember, we need to fill in the whitespace. - if (remainingSpan.Start < primarySpan.End) - { - builder.Add(new ClassifiedSpan( - ClassificationTypeNames.Text, - new TextSpan(remainingSpan.Start, primarySpan.End - remainingSpan.Start))); - remainingSpan = new TextSpan(primarySpan.End, remainingSpan.Length - (primarySpan.End - remainingSpan.Start)); - } - } - - // Deal with residue - if (remainingSpan.Length > 0) - { - // Trailing Razor/markup text. - builder.Add(new ClassifiedSpan(ClassificationTypeNames.Text, remainingSpan)); - } - - return builder; + return new RazorExcerptResult(excerptText, razorDocumentSpan, classifiedSpans.ToImmutable(), document, span); } } diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/RazorMappingService.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/RazorMappingService.cs index 51a9bded976..ab60fad8142 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/RazorMappingService.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/DynamicFiles/RazorMappingService.cs @@ -45,7 +45,7 @@ public async Task> MapSpansAsync(Document foreach (var span in spans) { - if (RazorEditHelper.TryGetMappedSpans(span, source, csharpDocument, out var linePositionSpan, out var mappedSpan)) + if (RazorEditHelper.TryGetMappedSpan(span, source, csharpDocument, out var linePositionSpan, out var mappedSpan)) { results.Add(new(filePath, linePositionSpan, mappedSpan)); } diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/CSharpDocumentExcerptService.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/CSharpDocumentExcerptService.cs index 0b9148678b3..7e44d1a7c0d 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/CSharpDocumentExcerptService.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/CSharpDocumentExcerptService.cs @@ -8,6 +8,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Classification; using Microsoft.CodeAnalysis.ExternalAccess.Razor; +using Microsoft.CodeAnalysis.Razor.DocumentExcerpt; using Microsoft.CodeAnalysis.Text; using Microsoft.VisualStudio.LanguageServer.ContainedLanguage; using Microsoft.VisualStudio.Razor.DynamicFiles; @@ -45,10 +46,10 @@ internal CSharpDocumentExcerptService() { } - internal override async Task TryGetExcerptInternalAsync( + internal override async Task TryGetExcerptInternalAsync( Document document, TextSpan span, - ExcerptModeInternal mode, + RazorExcerptMode mode, RazorClassificationOptionsWrapper options, CancellationToken cancellationToken) { @@ -68,10 +69,10 @@ internal CSharpDocumentExcerptService() cancellationToken).ConfigureAwait(false); } - internal async Task TryGetExcerptInternalAsync( + internal async Task TryGetExcerptInternalAsync( Document document, TextSpan span, - ExcerptModeInternal mode, + RazorExcerptMode mode, SourceText razorDocumentText, LinePositionSpan mappedLinePosition, RazorClassificationOptionsWrapper options, @@ -82,7 +83,7 @@ internal CSharpDocumentExcerptService() var generatedDocument = document; // First compute the range of text we want to we to display relative to the razor document. - var excerptSpan = ChooseExcerptSpan(razorDocumentText, razorDocumentSpan, mode); + var excerptSpan = DocumentExcerptHelper.ChooseExcerptSpan(razorDocumentText, razorDocumentSpan, mode); // Then we'll classify the spans based on the razor document, since that's the coordinate // space that our output mappings use. @@ -94,9 +95,9 @@ internal CSharpDocumentExcerptService() options, cancellationToken).ConfigureAwait(false); - var excerptText = GetTranslatedExcerptText(razorDocumentText, ref razorDocumentSpan, ref excerptSpan, classifiedSpans); + var excerptText = DocumentExcerptHelper.GetTranslatedExcerptText(razorDocumentText, ref razorDocumentSpan, ref excerptSpan, classifiedSpans); - return new ExcerptResultInternal(excerptText, razorDocumentSpan, classifiedSpans.ToImmutable(), document, span); + return new RazorExcerptResult(excerptText, razorDocumentSpan, classifiedSpans.ToImmutable(), document, span); } private static async Task.Builder> ClassifyPreviewAsync( diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/CSharpVirtualDocumentFactory.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/CSharpVirtualDocumentFactory.cs index 874f6979ccc..67bda505e2f 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/CSharpVirtualDocumentFactory.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/CSharpVirtualDocumentFactory.cs @@ -133,12 +133,6 @@ internal override bool TryRefreshVirtualDocuments(LSPDocument document, [NotNull { newVirtualDocuments = null; - // If generated file paths are not unique, then there is nothing to refresh - if (!_languageServerFeatureOptions.IncludeProjectKeyInGeneratedFilePath) - { - return false; - } - var projectKeys = GetProjectKeys(document.Uri).ToList(); // If the document is in no projects, we don't do anything, as it means we probably got a notification about the project being added @@ -197,13 +191,6 @@ internal override bool TryRefreshVirtualDocuments(LSPDocument document, [NotNull private IEnumerable GetProjectKeys(Uri hostDocumentUri) { - // If generated file paths are not unique, then we just act as though we're in one unknown project - if (!_languageServerFeatureOptions.IncludeProjectKeyInGeneratedFilePath) - { - yield return ProjectKey.Unknown; - yield break; - } - var projects = _projectManager.GetProjects(); var inAny = false; diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostDataTipRangeEndpoint.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostDataTipRangeEndpoint.cs new file mode 100644 index 00000000000..e1e372fb883 --- /dev/null +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostDataTipRangeEndpoint.cs @@ -0,0 +1,66 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using System.Composition; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.ExternalAccess.Razor.Cohost; +using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; +using Microsoft.CodeAnalysis.Razor.Cohost; +using Microsoft.CodeAnalysis.Razor.Remote; + +namespace Microsoft.VisualStudio.Razor.LanguageClient.Cohost; + +#pragma warning disable RS0030 // Do not use banned APIs +[Shared] +[CohostEndpoint(VSInternalMethods.TextDocumentDataTipRangeName)] +[Export(typeof(IDynamicRegistrationProvider))] +[ExportRazorStatelessLspService(typeof(CohostDataTipRangeEndpoint))] +[method: ImportingConstructor] +#pragma warning restore RS0030 // Do not use banned APIs +internal sealed class CohostDataTipRangeEndpoint( + IIncompatibleProjectService incompatibleProjectService, + IRemoteServiceInvoker remoteServiceInvoker) + : AbstractCohostDocumentEndpoint(incompatibleProjectService), IDynamicRegistrationProvider +{ + private readonly IRemoteServiceInvoker _remoteServiceInvoker = remoteServiceInvoker; + + protected override bool MutatesSolutionState => false; + + protected override bool RequiresLSPSolution => true; + + public ImmutableArray GetRegistrations(VSInternalClientCapabilities clientCapabilities, RazorCohostRequestContext requestContext) + { + return [new Registration + { + Method = VSInternalMethods.TextDocumentDataTipRangeName, + RegisterOptions = new TextDocumentRegistrationOptions() + }]; + } + + protected override RazorTextDocumentIdentifier? GetRazorTextDocumentIdentifier(TextDocumentPositionParams request) + => request.TextDocument.ToRazorTextDocumentIdentifier(); + + protected override Task HandleRequestAsync(TextDocumentPositionParams request, TextDocument razorDocument, CancellationToken cancellationToken) + => HandleRequestAsync(razorDocument, request.Position, cancellationToken); + + private async Task HandleRequestAsync(TextDocument razorDocument, Position position, CancellationToken cancellationToken) + { + var data = await _remoteServiceInvoker.TryInvokeAsync>( + razorDocument.Project.Solution, + (service, solutionInfo, cancellationToken) => service.GetDataTipRangeAsync(solutionInfo, razorDocument.Id, position, cancellationToken), + cancellationToken).ConfigureAwait(false); + + return data.Result; + } + + internal TestAccessor GetTestAccessor() => new(this); + + internal readonly struct TestAccessor(CohostDataTipRangeEndpoint instance) + { + public Task HandleRequestAsync(TextDocument razorDocument, Position position, CancellationToken cancellationToken) + => instance.HandleRequestAsync(razorDocument, position, cancellationToken); + } +} diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostDocumentPullDiagnosticsEndpoint.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostDocumentPullDiagnosticsEndpoint.cs index ea2e5bb9dc6..86a23e2ae63 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostDocumentPullDiagnosticsEndpoint.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostDocumentPullDiagnosticsEndpoint.cs @@ -6,6 +6,7 @@ using System.Composition; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.ExternalAccess.Razor.Cohost; @@ -79,8 +80,7 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie cancellationToken).ConfigureAwait(false); } - var results = await GetDiagnosticsAsync(razorDocument, cancellationToken).ConfigureAwait(false); - + var results = await GetVSDiagnosticsAsync(razorDocument, cancellationToken).ConfigureAwait(false); if (results is null) { return null; @@ -93,6 +93,37 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie }]; } + private async Task GetVSDiagnosticsAsync(TextDocument razorDocument, CancellationToken cancellationToken) + { + var diagnostics = await GetDiagnosticsAsync(razorDocument, cancellationToken).ConfigureAwait(false); + if (diagnostics is null) + { + return null; + } + + // We always use Roslyn's project understanding, and in VS the project Id is not necessarily the Id that is reported by Roslyn + // for diagnostics. Rather than try to replicate any of this behaviour directly, we just take Roslyn as the source of truth, + // and force the project information to match what it would produce, regardless of where it comes from or how we might have + // filtered or converted it. + var projectInfo = new[] { ExternalHandlers.Diagnostics.GetProjectInformation(razorDocument.Project) }; + + var results = new VSDiagnostic[diagnostics.Length]; + for (var i = 0; i < diagnostics.Length; i++) + { + var vsDiagnostic = JsonHelpers.Convert(diagnostics[i]).AssumeNotNull(); + vsDiagnostic.Projects = projectInfo; + + // Setting a unique identifier ensures that VS will show project info in the error list, and things like the "Current Project" + // filter will work. Putting the Razor file path in the identifier ensures that files in multiple projects get their diagnostics + // de-duped. + vsDiagnostic.Identifier = (vsDiagnostic.Code, razorDocument.FilePath, vsDiagnostic.Range, vsDiagnostic.Message).GetHashCode().ToString(); + + results[i] = vsDiagnostic; + } + + return results; + } + protected override VSInternalDocumentDiagnosticsParams CreateHtmlParams(Uri uri) { return new VSInternalDocumentDiagnosticsParams @@ -157,7 +188,7 @@ private async Task GetCSharpTaskListItemsAsync(TextDocument raz internal readonly struct TestAccessor(CohostDocumentPullDiagnosticsEndpoint instance) { public Task HandleRequestAsync(TextDocument razorDocument, CancellationToken cancellationToken) - => instance.GetDiagnosticsAsync(razorDocument, cancellationToken); + => instance.GetVSDiagnosticsAsync(razorDocument, cancellationToken); public Task HandleTaskListItemRequestAsync(TextDocument razorDocument, ImmutableArray taskListDescriptors, CancellationToken cancellationToken) => instance.HandleTaskListItemRequestAsync(razorDocument, taskListDescriptors, cancellationToken); diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostInlineCompletionEndpoint.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostInlineCompletionEndpoint.cs index e5f529e882a..75de28abe78 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostInlineCompletionEndpoint.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostInlineCompletionEndpoint.cs @@ -73,7 +73,14 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie return null; } - var generatedDocument = await razorDocument.Project.TryGetCSharpDocumentFromGeneratedDocumentUriAsync(generatedDocumentUri, cancellationToken).ConfigureAwait(false); + var solution = razorDocument.Project.Solution; + if (!solution.TryGetSourceGeneratedDocumentIdentity(generatedDocumentUri, out var identity) || + !solution.TryGetProject(identity.DocumentId.ProjectId, out var project)) + { + return null; + } + + var generatedDocument = await project.TryGetCSharpDocumentForGeneratedDocumentAsync(identity, cancellationToken).ConfigureAwait(false); if (generatedDocument is null) { return null; diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostTextPresentationEndpoint.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostTextPresentationEndpoint.cs index 5c190e9d2f8..884fa19db4f 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostTextPresentationEndpoint.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostTextPresentationEndpoint.cs @@ -62,12 +62,10 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie return null; } - if (!workspaceEdit.TryGetTextDocumentEdits(out var edits)) - { - return null; - } - - foreach (var edit in edits) + // NOTE: We iterate over just the TextDocumentEdit objects and modify them in place. + // We intentionally do NOT create a new WorkspaceEdit here to avoid losing any + // CreateFile, RenameFile, or DeleteFile operations that may be in DocumentChanges. + foreach (var edit in workspaceEdit.EnumerateTextDocumentEdits()) { if (edit.TextDocument.DocumentUri.ParsedUri is { } uri && _filePathService.IsVirtualHtmlFile(uri)) diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostUriPresentationEndpoint.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostUriPresentationEndpoint.cs index 06a9407604d..a4e1b993674 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostUriPresentationEndpoint.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/CohostUriPresentationEndpoint.cs @@ -101,14 +101,12 @@ public ImmutableArray GetRegistrations(VSInternalClientCapabilitie return null; } - if (!workspaceEdit.TryGetTextDocumentEdits(out var edits)) - { - return null; - } - + // NOTE: We iterate over just the TextDocumentEdit objects and modify them in place. + // We intentionally do NOT create a new WorkspaceEdit here to avoid losing any + // CreateFile, RenameFile, or DeleteFile operations that may be in DocumentChanges. // TODO: We could have a helper service for this, because RazorDocumentMappingService used to do it, but we can't use that in devenv, // but if we move this all to OOP, per the above TODO, then that point is moot. - foreach (var edit in edits) + foreach (var edit in workspaceEdit.EnumerateTextDocumentEdits()) { if (edit.TextDocument.DocumentUri.ParsedUri is { } uri && _filePathService.IsVirtualHtmlFile(uri)) diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/HtmlRequestInvoker.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/HtmlRequestInvoker.cs index 09a5f6f4a49..e1e36f16619 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/HtmlRequestInvoker.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/HtmlRequestInvoker.cs @@ -100,9 +100,6 @@ private void UpdateTextDocumentUri(TRequest request, DocumentUri uri, ITextDocumentParams textDocumentParams => textDocumentParams.TextDocument, // VSInternalDiagnosticParams doesn't implement the interface because the TextDocument property is nullable VSInternalDiagnosticParams vsInternalDiagnosticParams => vsInternalDiagnosticParams.TextDocument, - // We don't implement the endpoint that uses this, but it's the only other thing, at time of writing, in the LSP - // protocol library that isn't handled by the above two cases. - VSInternalRelatedDocumentParams vsInternalRelatedDocumentParams => vsInternalRelatedDocumentParams.TextDocument, VSCodeActionParams vsCodeActionParams => vsCodeActionParams.TextDocument, _ => null }; diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/IncompatibleProjectNotifier.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/IncompatibleProjectNotifier.cs index ff8e68f9378..1d6e4ff99e0 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/IncompatibleProjectNotifier.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Cohost/IncompatibleProjectNotifier.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.IO; diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget.cs index 8be90a355d1..e2e9a46d124 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget.cs @@ -13,7 +13,6 @@ using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Razor.Telemetry; -using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Razor.Workspaces.Settings; using Microsoft.VisualStudio.LanguageServer.ContainedLanguage; using Microsoft.VisualStudio.Text; @@ -29,7 +28,6 @@ internal partial class RazorCustomMessageTarget private readonly JoinableTaskFactory _joinableTaskFactory; private readonly LSPRequestInvoker _requestInvoker; private readonly ITelemetryReporter _telemetryReporter; - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions; private readonly ProjectSnapshotManager _projectManager; private readonly ISnippetCompletionItemProvider _snippetCompletionItemProvider; private readonly FormattingOptionsProvider _formattingOptionsProvider; @@ -48,7 +46,6 @@ public RazorCustomMessageTarget( LSPDocumentSynchronizer documentSynchronizer, CSharpVirtualDocumentAddListener csharpVirtualDocumentAddListener, ITelemetryReporter telemetryReporter, - LanguageServerFeatureOptions languageServerFeatureOptions, ProjectSnapshotManager projectManager, ISnippetCompletionItemProvider snippetCompletionItemProvider, ILoggerFactory loggerFactory) @@ -67,7 +64,6 @@ public RazorCustomMessageTarget( _documentSynchronizer = documentSynchronizer ?? throw new ArgumentNullException(nameof(documentSynchronizer)); _csharpVirtualDocumentAddListener = csharpVirtualDocumentAddListener ?? throw new ArgumentNullException(nameof(csharpVirtualDocumentAddListener)); _telemetryReporter = telemetryReporter ?? throw new ArgumentNullException(nameof(telemetryReporter)); - _languageServerFeatureOptions = languageServerFeatureOptions ?? throw new ArgumentNullException(nameof(languageServerFeatureOptions)); _projectManager = projectManager ?? throw new ArgumentNullException(nameof(projectManager)); _snippetCompletionItemProvider = snippetCompletionItemProvider ?? throw new ArgumentNullException(nameof(snippetCompletionItemProvider)); _logger = loggerFactory.GetOrCreateLogger(); @@ -126,9 +122,7 @@ private async Task> TrySynchronizeV var hostDocumentUri = hostDocument.DocumentUri.GetRequiredParsedUri(); // For Html documents we don't do anything fancy, just call the standard service - // If we're not generating unique document file names, then we can treat C# documents the same way - if (!_languageServerFeatureOptions.IncludeProjectKeyInGeneratedFilePath || - typeof(TVirtualDocumentSnapshot) == typeof(HtmlVirtualDocumentSnapshot)) + if (typeof(TVirtualDocumentSnapshot) == typeof(HtmlVirtualDocumentSnapshot)) { var htmlResult = await _documentSynchronizer.TrySynchronizeVirtualDocumentAsync(requiredHostDocumentVersion, hostDocumentUri, cancellationToken).ConfigureAwait(false); _logger.LogDebug($"{(htmlResult.Synchronized ? "Did" : "Did NOT")} synchronize for {caller}: Version {requiredHostDocumentVersion} for {htmlResult.VirtualSnapshot?.Uri}"); @@ -196,8 +190,7 @@ private async Task> TrySynchronizeV // If we're not generating unique document file names, then we don't need to ensure we find the right virtual document // as there can only be one anyway - if (_languageServerFeatureOptions.IncludeProjectKeyInGeneratedFilePath && - hostDocument.GetProjectContext() is { } projectContext && + if (hostDocument.GetProjectContext() is { } projectContext && FindVirtualDocument(hostDocumentUri, projectContext) is { } virtualDocument) { return documentSynchronizer.TryReturnPossiblyFutureSnapshot(requiredHostDocumentVersion, hostDocumentUri, virtualDocument.Uri); diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget_FindAllReferences.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget_FindAllReferences.cs index 3b7d921bad0..c90d2da645d 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget_FindAllReferences.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget_FindAllReferences.cs @@ -27,7 +27,10 @@ internal partial class RazorCustomMessageTarget ProjectContext = null, }, Position = request.ProjectedPosition, - Context = new ReferenceContext(), + Context = new ReferenceContext() + { + IncludeDeclaration = true + }, }; var response = await _requestInvoker.ReinvokeRequestOnServerAsync( diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget_UpdateCSharpBuffer.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget_UpdateCSharpBuffer.cs index 70a02b6d938..e82327c29ed 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget_UpdateCSharpBuffer.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/Endpoints/RazorCustomMessageTarget_UpdateCSharpBuffer.cs @@ -56,8 +56,7 @@ private async Task UpdateCSharpBufferCoreAsync(UpdateBufferRequest request _logger.LogDebug($"UpdateCSharpBuffer for {request.HostDocumentVersion} of {hostDocumentUri} in {request.ProjectKeyId}"); // If we're generating unique file paths for virtual documents, then we have to take a different path here, and do more work - if (_languageServerFeatureOptions.IncludeProjectKeyInGeneratedFilePath && - request.ProjectKeyId is not null && + if (request.ProjectKeyId is not null && _documentManager.TryGetDocument(hostDocumentUri, out var documentSnapshot) && documentSnapshot.TryGetAllVirtualDocuments(out var virtualDocuments)) { diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/HtmlVirtualDocumentFactory.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/HtmlVirtualDocumentFactory.cs index 4e501f20512..94182735107 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/HtmlVirtualDocumentFactory.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/LanguageClient/HtmlVirtualDocumentFactory.cs @@ -3,8 +3,8 @@ using System; using System.ComponentModel.Composition; +using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Razor.Telemetry; -using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.VisualStudio.LanguageServer.ContainedLanguage; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Utilities; @@ -16,7 +16,6 @@ namespace Microsoft.VisualStudio.Razor.LanguageClient; internal class HtmlVirtualDocumentFactory : VirtualDocumentFactoryBase { private static IContentType? s_htmlLSPContentType; - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions; private readonly ITelemetryReporter _telemetryReporter; [ImportingConstructor] @@ -25,11 +24,9 @@ public HtmlVirtualDocumentFactory( ITextBufferFactoryService textBufferFactory, ITextDocumentFactoryService textDocumentFactory, FileUriProvider filePathProvider, - LanguageServerFeatureOptions languageServerFeatureOptions, ITelemetryReporter telemetryReporter) : base(contentTypeRegistry, textBufferFactory, textDocumentFactory, filePathProvider) { - _languageServerFeatureOptions = languageServerFeatureOptions; _telemetryReporter = telemetryReporter; } @@ -44,6 +41,6 @@ protected override IContentType LanguageContentType } protected override string HostDocumentContentTypeName => RazorConstants.RazorLSPContentTypeName; - protected override string LanguageFileNameSuffix => _languageServerFeatureOptions.HtmlVirtualDocumentSuffix; + protected override string LanguageFileNameSuffix => LanguageServerConstants.HtmlVirtualDocumentSuffix; protected override VirtualDocument CreateVirtualDocument(Uri uri, ITextBuffer textBuffer) => new HtmlVirtualDocument(uri, textBuffer, _telemetryReporter); } diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Remote/RemoteServiceInvoker.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Remote/RemoteServiceInvoker.cs index 0ef8d8af231..b376ccb7859 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Remote/RemoteServiceInvoker.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Remote/RemoteServiceInvoker.cs @@ -180,12 +180,9 @@ await remoteClient.TryInvokeAsync( var initParams = new RemoteClientInitializationOptions { UseRazorCohostServer = _languageServerFeatureOptions.UseRazorCohostServer, - HtmlVirtualDocumentSuffix = _languageServerFeatureOptions.HtmlVirtualDocumentSuffix, ReturnCodeActionAndRenamePathsWithPrefixedSlash = _languageServerFeatureOptions.ReturnCodeActionAndRenamePathsWithPrefixedSlash, SupportsFileManipulation = _languageServerFeatureOptions.SupportsFileManipulation, ShowAllCSharpCodeActions = _languageServerFeatureOptions.ShowAllCSharpCodeActions, - SupportsSoftSelectionInCompletion = _languageServerFeatureOptions.SupportsSoftSelectionInCompletion, - UseVsCodeCompletionCommitCharacters = _languageServerFeatureOptions.UseVsCodeCompletionCommitCharacters, }; _logger.LogDebug($"First OOP call, so initializing OOP service."); diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/SyntaxVisualizer/SyntaxVisualizerHelper.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/SyntaxVisualizer/SyntaxVisualizerHelper.cs index 2fd44e8d97c..5f99e49e2c5 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/SyntaxVisualizer/SyntaxVisualizerHelper.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/SyntaxVisualizer/SyntaxVisualizerHelper.cs @@ -4,7 +4,6 @@ using System; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Razor.Protocol.DevTools; using Microsoft.CodeAnalysis.Razor.Remote; diff --git a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/VisualStudioLanguageServerFeatureOptions.cs b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/VisualStudioLanguageServerFeatureOptions.cs index cc4ebc28e26..2df10beab23 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/VisualStudioLanguageServerFeatureOptions.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/VisualStudioLanguageServerFeatureOptions.cs @@ -14,17 +14,11 @@ internal class VisualStudioLanguageServerFeatureOptions : LanguageServerFeatureO { private readonly ILspEditorFeatureDetector _lspEditorFeatureDetector; private readonly Lazy _showAllCSharpCodeActions; - private readonly Lazy _includeProjectKeyInGeneratedFilePath; private readonly Lazy _useRazorCohostServer; [ImportingConstructor] public VisualStudioLanguageServerFeatureOptions(ILspEditorFeatureDetector lspEditorFeatureDetector) { - if (lspEditorFeatureDetector is null) - { - throw new ArgumentNullException(nameof(lspEditorFeatureDetector)); - } - _lspEditorFeatureDetector = lspEditorFeatureDetector; _showAllCSharpCodeActions = new Lazy(() => @@ -34,13 +28,6 @@ public VisualStudioLanguageServerFeatureOptions(ILspEditorFeatureDetector lspEdi return showAllCSharpCodeActions; }); - _includeProjectKeyInGeneratedFilePath = new Lazy(() => - { - var featureFlags = (IVsFeatureFlags)Package.GetGlobalService(typeof(SVsFeatureFlags)); - var includeProjectKeyInGeneratedFilePath = featureFlags.IsFeatureEnabled(WellKnownFeatureFlagNames.IncludeProjectKeyInGeneratedFilePath, defaultValue: true); - return includeProjectKeyInGeneratedFilePath; - }); - _useRazorCohostServer = new Lazy(() => { var featureFlags = (IVsFeatureFlags)Package.GetGlobalService(typeof(SVsFeatureFlags)); @@ -52,32 +39,11 @@ public VisualStudioLanguageServerFeatureOptions(ILspEditorFeatureDetector lspEdi // We don't currently support file creation operations on VS Codespaces or VS Liveshare public override bool SupportsFileManipulation => !IsCodespacesOrLiveshare; - public override string CSharpVirtualDocumentSuffix => ".ide.g.cs"; - - public override string HtmlVirtualDocumentSuffix => "__virtual.html"; - - public override bool SingleServerSupport => true; - - public override bool DelegateToCSharpOnDiagnosticPublish => false; - public override bool ReturnCodeActionAndRenamePathsWithPrefixedSlash => false; - public override bool UpdateBuffersForClosedDocuments => false; - private bool IsCodespacesOrLiveshare => _lspEditorFeatureDetector.IsRemoteClient() || _lspEditorFeatureDetector.IsLiveShareHost(); public override bool ShowAllCSharpCodeActions => _showAllCSharpCodeActions.Value; - public override bool IncludeProjectKeyInGeneratedFilePath => _includeProjectKeyInGeneratedFilePath.Value; - public override bool UseRazorCohostServer => _useRazorCohostServer.Value; - - // VS actually needs explicit commit characters so don't avoid them. - public override bool SupportsSoftSelectionInCompletion => true; - - public override bool UseVsCodeCompletionCommitCharacters => false; - - // In VS, we do not want the language server to add all documents in the workspace root path - // to the misc-files project when initialized. - public override bool DoNotInitializeMiscFilesProjectFromWorkspace => true; } diff --git a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Completion/LegacyRazorCompletionFactsService.cs b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Completion/LegacyRazorCompletionFactsService.cs index fa72bd4619d..86c16888a22 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Completion/LegacyRazorCompletionFactsService.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Completion/LegacyRazorCompletionFactsService.cs @@ -13,7 +13,6 @@ internal sealed class LegacyRazorCompletionFactsService : AbstractRazorCompletio private static readonly ImmutableArray s_providers = [ new DirectiveAttributeCompletionItemProvider(), - new DirectiveAttributeParameterCompletionItemProvider(), new DirectiveCompletionItemProvider() ]; diff --git a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Completion/LegacyTagHelperCompletionService.cs b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Completion/LegacyTagHelperCompletionService.cs index 41f502d3196..f35d52cd32e 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Completion/LegacyTagHelperCompletionService.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Completion/LegacyTagHelperCompletionService.cs @@ -20,6 +20,9 @@ namespace Microsoft.VisualStudio.LegacyEditor.Razor.Completion; [Export(typeof(ITagHelperCompletionService))] internal sealed class LegacyTagHelperCompletionService : ITagHelperCompletionService { + private static readonly HashSetPool s_shortNameSetPool = + HashSetPool.Create(ShortNameToFullyQualifiedComparer.Instance); + private static readonly HashSet s_emptyHashSet = new(); // This API attempts to understand a users context as they're typing in a Razor file to provide TagHelper based attribute IntelliSense. @@ -45,8 +48,13 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont StringComparer.OrdinalIgnoreCase); var documentContext = completionContext.DocumentContext; - var descriptorsForTag = TagHelperFacts.GetTagHelpersGivenTag(documentContext, completionContext.CurrentTagName, completionContext.CurrentParentTagName); - if (descriptorsForTag.Length == 0) + + var tagHelpersForTag = TagHelperFacts.GetTagHelpersGivenTag( + documentContext, + completionContext.CurrentTagName, + completionContext.CurrentParentTagName); + + if (tagHelpersForTag.IsEmpty) { // If the current tag has no possible descriptors then we can't have any additional attributes. return AttributeCompletionResult.Create(attributeCompletions); @@ -64,9 +72,9 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont using var _ = HashSetPool.GetPooledObject(out var applicableDescriptors); - if (applicableTagHelperBinding is { Descriptors: var descriptors }) + if (applicableTagHelperBinding is { TagHelpers: var tagHelpers }) { - applicableDescriptors.UnionWith(descriptors); + applicableDescriptors.UnionWith(tagHelpers); } var unprefixedTagName = completionContext.CurrentTagName[prefix.Length..]; @@ -78,11 +86,11 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont attributeCompletions.Clear(); } - foreach (var descriptor in descriptorsForTag) + foreach (var tagHelper in tagHelpersForTag) { - if (applicableDescriptors.Contains(descriptor)) + if (applicableDescriptors.Contains(tagHelper)) { - foreach (var attributeDescriptor in descriptor.BoundAttributes) + foreach (var attributeDescriptor in tagHelper.BoundAttributes) { if (!attributeDescriptor.Name.IsNullOrEmpty()) { @@ -98,7 +106,7 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont else { var htmlNameToBoundAttribute = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (var attributeDescriptor in descriptor.BoundAttributes) + foreach (var attributeDescriptor in tagHelper.BoundAttributes) { if (attributeDescriptor.Name != null) { @@ -111,7 +119,7 @@ public AttributeCompletionResult GetAttributeCompletions(AttributeCompletionCont } } - foreach (var rule in descriptor.TagMatchingRules) + foreach (var rule in tagHelper.TagMatchingRules) { foreach (var requiredAttribute in rule.Attributes) { @@ -178,16 +186,21 @@ public ElementCompletionResult GetElementCompletions(ElementCompletionContext co _ => new HashSet(), StringComparer.Ordinal); - var catchAllDescriptors = new HashSet(); + var catchAllTagHelpers = new HashSet(); var prefix = completionContext.DocumentContext.Prefix ?? string.Empty; - var possibleChildDescriptors = TagHelperFacts.GetTagHelpersGivenParent(completionContext.DocumentContext, completionContext.ContainingTagName); - possibleChildDescriptors = FilterFullyQualifiedCompletions(possibleChildDescriptors); - foreach (var possibleDescriptor in possibleChildDescriptors) + + var possibleChildTagHelpers = TagHelperFacts.GetTagHelpersGivenParent( + completionContext.DocumentContext, + completionContext.ContainingTagName); + + possibleChildTagHelpers = FilterFullyQualifiedTagHelpers(possibleChildTagHelpers); + + foreach (var possibleChildTagHelper in possibleChildTagHelpers) { var addRuleCompletions = false; - var outputHint = possibleDescriptor.TagOutputHint; + var outputHint = possibleChildTagHelper.TagOutputHint; - foreach (var rule in possibleDescriptor.TagMatchingRules) + foreach (var rule in possibleChildTagHelper.TagMatchingRules) { if (!TagHelperMatchingConventions.SatisfiesParentTag(rule, completionContext.ContainingTagName.AsSpanOrDefault())) { @@ -196,7 +209,7 @@ public ElementCompletionResult GetElementCompletions(ElementCompletionContext co if (rule.TagName == TagHelperMatchingConventions.ElementCatchAllName) { - catchAllDescriptors.Add(possibleDescriptor); + catchAllTagHelpers.Add(possibleChildTagHelper); } else if (elementCompletions.ContainsKey(rule.TagName)) { @@ -221,14 +234,14 @@ public ElementCompletionResult GetElementCompletions(ElementCompletionContext co if (addRuleCompletions) { - UpdateCompletions(prefix + rule.TagName, possibleDescriptor); + UpdateCompletions(prefix + rule.TagName, possibleChildTagHelper); } } } // We needed to track all catch-alls and update their completions after all other completions have been completed. // This way, any TagHelper added completions will also have catch-alls listed under their entries. - foreach (var catchAllDescriptor in catchAllDescriptors) + foreach (var catchAllDescriptor in catchAllTagHelpers) { foreach (var completionTagName in elementCompletions.Keys) { @@ -290,17 +303,17 @@ private void AddAllowedChildrenCompletions( return; } - foreach (var descriptor in binding.Descriptors) + foreach (var tagHelper in binding.TagHelpers) { - foreach (var childTag in descriptor.AllowedChildTags) + foreach (var childTag in tagHelper.AllowedChildTags) { var prefixedName = string.Concat(prefix, childTag.Name); - var descriptors = TagHelperFacts.GetTagHelpersGivenTag( + var tagHelpersForTag = TagHelperFacts.GetTagHelpersGivenTag( completionContext.DocumentContext, prefixedName, completionContext.ContainingTagName); - if (descriptors.Length == 0) + if (tagHelpersForTag.IsEmpty) { if (!elementCompletions.ContainsKey(prefixedName)) { @@ -316,47 +329,33 @@ private void AddAllowedChildrenCompletions( elementCompletions[prefixedName] = existingRuleDescriptors; } - existingRuleDescriptors.AddRange(descriptors); + existingRuleDescriptors.UnionWith(tagHelpersForTag); } } } - private static ImmutableArray FilterFullyQualifiedCompletions(ImmutableArray possibleChildDescriptors) + private static TagHelperCollection FilterFullyQualifiedTagHelpers(TagHelperCollection tagHelpers) { - // Iterate once through the list to tease apart fully qualified and short name TagHelpers - using var fullyQualifiedTagHelpers = new PooledArrayBuilder(); - var shortNameTagHelpers = new HashSet(ShortNameToFullyQualifiedComparer.Instance); + // We want to filter 'tagHelpers' and remove any tag helpers that require a fully-qualified name match + // but have a short name match present. - foreach (var descriptor in possibleChildDescriptors) - { - if (descriptor.IsFullyQualifiedNameMatch) - { - fullyQualifiedTagHelpers.Add(descriptor); - } - else - { - shortNameTagHelpers.Add(descriptor); - } - } + // First, collect all "short name" tag helpers, i.e. those that do not require a fully qualified name match. + using var _ = s_shortNameSetPool.GetPooledObject(out var shortNameSet); - // Re-combine the short named & fully qualified TagHelpers but filter out any fully qualified TagHelpers that have a short - // named representation already. - using var filteredList = new PooledArrayBuilder(capacity: shortNameTagHelpers.Count); - filteredList.AddRange(shortNameTagHelpers); - - foreach (var fullyQualifiedTagHelper in fullyQualifiedTagHelpers) + foreach (var tagHelper in tagHelpers) { - if (!shortNameTagHelpers.Contains(fullyQualifiedTagHelper)) + if (!tagHelper.IsFullyQualifiedNameMatch) { - // Unimported completion item that isn't represented in a short named form. - filteredList.Add(fullyQualifiedTagHelper); - } - else - { - // There's already a shortname variant of this item, don't include it. + shortNameSet.Add(tagHelper); } } - return filteredList.ToImmutableAndClear(); + return tagHelpers.Where(shortNameSet, static (tagHelper, shortNameSet) => + { + // We want to keep tag helpers that either: + // 1. Do not require a fully qualified name match (i.e., short name tag helpers). + // 2. Are fully qualified tag helpers that do not have a corresponding short name tag helper. + return !tagHelper.IsFullyQualifiedNameMatch || !shortNameSet.Contains(tagHelper); + }); } } diff --git a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/EphemeralProjectSnapshot.cs b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/EphemeralProjectSnapshot.cs index 4a51b790441..32d6d65f18f 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/EphemeralProjectSnapshot.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/EphemeralProjectSnapshot.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Collections.Immutable; using System.IO; using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; @@ -26,7 +25,7 @@ internal sealed class EphemeralProjectSnapshot(IProjectEngineFactoryProvider pro public RazorConfiguration Configuration => FallbackRazorConfiguration.Latest; public string? RootNamespace => null; public LanguageVersion CSharpLanguageVersion => LanguageVersion.Default; - public ImmutableArray TagHelpers => []; + public TagHelperCollection TagHelpers => []; public RazorProjectEngine GetProjectEngine() => _projectEngine.Value; diff --git a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/IVisualStudioDocumentTracker.cs b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/IVisualStudioDocumentTracker.cs index 7f936343cf8..ae3226ac284 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/IVisualStudioDocumentTracker.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/IVisualStudioDocumentTracker.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis.Razor.ProjectSystem.Legacy; using Microsoft.CodeAnalysis.Razor.Settings; @@ -16,7 +15,7 @@ internal interface IVisualStudioDocumentTracker { RazorConfiguration? Configuration { get; } ClientSpaceSettings EditorSettings { get; } - ImmutableArray TagHelpers { get; } + TagHelperCollection TagHelpers { get; } bool IsSupportedProject { get; } string FilePath { get; } string ProjectPath { get; } diff --git a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Parsing/VisualStudioRazorParser.cs b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Parsing/VisualStudioRazorParser.cs index 8945148d6de..5dc771f4c9a 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Parsing/VisualStudioRazorParser.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/Parsing/VisualStudioRazorParser.cs @@ -332,11 +332,10 @@ private void TextBuffer_OnChanged(object sender, TextContentChangedEventArgs arg Assumed.NotNull(partialParseSyntaxTree, $"Expected new {nameof(RazorSyntaxTree)} when parser result is not '{result}'."); #pragma warning disable CS0618 // Type or member is obsolete - var newCodeDocument = currentCodeDocument.Clone(); + var newCodeDocument = currentCodeDocument.WithSyntaxTree(partialParseSyntaxTree); currentCodeDocument.CloneCachedData(newCodeDocument); #pragma warning restore CS0618 // Type or member is obsolete - newCodeDocument.SetSyntaxTree(partialParseSyntaxTree); TryUpdateLatestParsedSyntaxTreeSnapshot(newCodeDocument, snapshot); } @@ -581,18 +580,11 @@ private void CompleteCodeDocumentRequestsForSnapshot(RazorCodeDocument codeDocum } } - private class VisualStudioTagHelperFeature : RazorEngineFeatureBase, ITagHelperFeature + private class VisualStudioTagHelperFeature(TagHelperCollection tagHelpers) : RazorEngineFeatureBase, ITagHelperFeature { - private readonly IReadOnlyList? _tagHelpers; - - public VisualStudioTagHelperFeature(IReadOnlyList? tagHelpers) - { - _tagHelpers = tagHelpers; - } - - public IReadOnlyList GetDescriptors(CancellationToken cancellationToken = default) + public TagHelperCollection GetTagHelpers(CancellationToken cancellationToken = default) { - return _tagHelpers ?? []; + return tagHelpers; } } diff --git a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/VisualStudioDocumentTracker.cs b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/VisualStudioDocumentTracker.cs index 0569e316961..d7d828da149 100644 --- a/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/VisualStudioDocumentTracker.cs +++ b/src/Razor/src/Microsoft.VisualStudio.LegacyEditor.Razor/VisualStudioDocumentTracker.cs @@ -3,8 +3,6 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor; @@ -70,7 +68,7 @@ public VisualStudioDocumentTracker( public ClientSpaceSettings EditorSettings => _workspaceEditorSettings.Current.ClientSpaceSettings; - public ImmutableArray TagHelpers + public TagHelperCollection TagHelpers => _projectSnapshot is { TagHelpers: var tagHelpers } ? tagHelpers : []; @@ -218,7 +216,7 @@ internal void ProjectManager_Changed(object sender, ProjectChangeEventArgs e) OnContextChangedAsync(ContextChangeKind.ProjectChanged).Forget(); if (e.Older is not ILegacyProjectSnapshot older || - !older.TagHelpers.SequenceEqual(newer.TagHelpers)) + !older.TagHelpers.Equals(newer.TagHelpers)) { OnContextChangedAsync(ContextChangeKind.TagHelpersChanged).Forget(); } diff --git a/src/Razor/src/Microsoft.VisualStudio.RazorExtension/EmbeddedGrammars/aspnetcorerazor.tmLanguage.json b/src/Razor/src/Microsoft.VisualStudio.RazorExtension/EmbeddedGrammars/aspnetcorerazor.tmLanguage.json index cce8d9c433c..1498da095d0 100644 --- a/src/Razor/src/Microsoft.VisualStudio.RazorExtension/EmbeddedGrammars/aspnetcorerazor.tmLanguage.json +++ b/src/Razor/src/Microsoft.VisualStudio.RazorExtension/EmbeddedGrammars/aspnetcorerazor.tmLanguage.json @@ -25,6 +25,13 @@ "include": "#implicit-expression" } ] + }, + "source.cs": { + "patterns": [ + { + "include": "#inline-template" + } + ] } }, "patterns": [ @@ -127,6 +134,9 @@ { "include": "#text-tag" }, + { + "include": "#inline-template" + }, { "include": "#wellformed-html" }, @@ -181,6 +191,111 @@ } } }, + "inline-template": { + "patterns": [ + { + "include": "#inline-template-void-tag" + }, + { + "include": "#inline-template-non-void-tag" + } + ] + }, + "inline-template-void-tag": { + "name": "meta.tag.structure.$4.void.html", + "begin": "(?i)(@)(<)(!)?(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)(?=\\s|/?>)", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "punctuation.definition.tag.begin.html" + }, + "3": { + "name": "constant.character.escape.razor.tagHelperOptOut" + }, + "4": { + "name": "entity.name.tag.html" + } + }, + "patterns": [ + { + "include": "#razor-control-structures" + }, + { + "include": "text.html.basic#attribute" + } + ], + "end": "/?>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.html" + } + } + }, + "inline-template-non-void-tag": { + "begin": "(@)(<)(!)?([^/\\s>]+)(?=\\s|/?>)", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "punctuation.definition.tag.begin.html" + }, + "3": { + "name": "constant.character.escape.razor.tagHelperOptOut" + }, + "4": { + "name": "entity.name.tag.html" + } + }, + "end": "()|(/>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.html" + }, + "3": { + "name": "punctuation.definition.tag.end.html" + }, + "4": { + "name": "punctuation.definition.tag.end.html" + } + }, + "patterns": [ + { + "begin": "(?<=>)(?!$)", + "end": "(?= $(NetFxVS) - RoslynDev + $(RazorVSSDKTargetPlatformRegRootSuffix) /rootsuffix $(VSSDKTargetPlatformRegRootSuffix) /log - CommonExtensions - Microsoft\RazorLanguageServices + $(RazorExtensionInstallationRoot) + $(RazorExtensionInstallationFolderBase) true - Microsoft.VisualStudio.RazorExtension + $(RazorVisualStudioInsertionComponent) false @@ -23,7 +23,7 @@ true neutral - ServiceHubCore + $(RazorServiceHubCoreSubFolder) true @@ -175,19 +175,6 @@ TargetFramework=$(NetFxVS) - - Microsoft.CodeAnalysis.Remote.Razor.CoreComponents - - true - false - PublishProjectOutputGroup - - false - $(ServiceHubCoreSubPath) - - - false - 2 @@ -196,9 +183,24 @@ Microsoft.CodeAnalysis.Razor.Compiler BuiltProjectOutputGroup + 2 + + + + + false + PublishProjectOutputGroup + + false + PublishReadyToRun=false;TargetFramework=$(NetVS) + ServiceHubCore + + + + @@ -230,7 +232,6 @@ - diff --git a/src/Razor/src/Microsoft.VisualStudio.RazorExtension/SyntaxVisualizer/SyntaxVisualizerControl.xaml.cs b/src/Razor/src/Microsoft.VisualStudio.RazorExtension/SyntaxVisualizer/SyntaxVisualizerControl.xaml.cs index 9fe7e52a6df..5d1ddb19a63 100644 --- a/src/Razor/src/Microsoft.VisualStudio.RazorExtension/SyntaxVisualizer/SyntaxVisualizerControl.xaml.cs +++ b/src/Razor/src/Microsoft.VisualStudio.RazorExtension/SyntaxVisualizer/SyntaxVisualizerControl.xaml.cs @@ -11,7 +11,6 @@ using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Serialization.Json; -using Microsoft.CodeAnalysis.Razor.Formatting; using Microsoft.CodeAnalysis.Razor.Protocol.DevTools; using Microsoft.CodeAnalysis.Razor.Remote; using Microsoft.CodeAnalysis.Razor.Workspaces; @@ -140,17 +139,7 @@ public void ShowFormattingDocument() return; } - // Fall back to legacy method if cohosting is not enabled or failed - var codeDocument = GetCodeDocument(); - if (codeDocument is null) - { - return; - } - -#pragma warning disable CS0618 // Type or member is obsolete - var formattingDocument = CSharpFormattingPass.GetFormattingDocumentContentsForSyntaxVisualizer(codeDocument); -#pragma warning restore CS0618 // Type or member is obsolete - OpenGeneratedCode(hostDocumentUri.AbsoluteUri + ".formatting.cs", formattingDocument); + // Only supported with cohosting } } diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorDynamicFileChangedEndpoint.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorDynamicFileChangedEndpoint.cs deleted file mode 100644 index ffb0e9e4f50..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorDynamicFileChangedEndpoint.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Composition; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; -using Microsoft.CodeAnalysis.Razor; - -namespace Microsoft.VisualStudioCode.RazorExtension.Endpoints; - -[Shared] -[ExportRazorStatelessLspService(typeof(RazorDynamicFileChangedEndpoint))] -[RazorEndpoint("razor/dynamicFileInfoChanged")] -internal class RazorDynamicFileChangedEndpoint : AbstractRazorNotificationHandler -{ - public override bool MutatesSolutionState => false; - - public override bool RequiresLSPSolution => false; - - protected override Task HandleNotificationAsync(RazorDynamicFileChangedParams request, RazorRequestContext context, CancellationToken cancellationToken) - { - var dynamicFileInfoProvider = context.GetRequiredService(); - dynamicFileInfoProvider.Update(request.RazorDocument.DocumentUri.GetRequiredParsedUri()); - - return Task.CompletedTask; - } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorDynamicFileChangedParams.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorDynamicFileChangedParams.cs deleted file mode 100644 index 017a2ff7e71..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorDynamicFileChangedParams.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Text.Json.Serialization; - -namespace Microsoft.VisualStudioCode.RazorExtension.Endpoints; - -internal class RazorDynamicFileChangedParams -{ - [JsonPropertyName("razorDocument")] - public required TextDocumentIdentifier RazorDocument { get; set; } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorInitializeEndpoint.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorInitializeEndpoint.cs deleted file mode 100644 index 043d85330a3..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Endpoints/RazorInitializeEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Composition; -using System.Text.Json.Serialization; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor; -using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; - -namespace Microsoft.VisualStudioCode.RazorExtension.Endpoints; - -[Shared] -[ExportRazorStatelessLspService(typeof(RazorInitializeEndpoint))] -[RazorEndpoint("razor/initialize")] -internal class RazorInitializeEndpoint : AbstractRazorNotificationHandler -{ - public override bool MutatesSolutionState => false; - - public override bool RequiresLSPSolution => true; - - protected override Task HandleNotificationAsync(RazorInitializeParams request, RazorRequestContext requestContext, CancellationToken cancellationToken) - { - var workspaceService = requestContext.GetRequiredService(); - workspaceService.Initialize(requestContext.Workspace.AssumeNotNull(), request.PipeName); - return Task.CompletedTask; - } -} - -internal class RazorInitializeParams -{ - [JsonPropertyName("pipeName")] - public required string PipeName { get; set; } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Microsoft.VisualStudioCode.RazorExtension.csproj b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Microsoft.VisualStudioCode.RazorExtension.csproj index 39f71733982..4c6b22d59d6 100644 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Microsoft.VisualStudioCode.RazorExtension.csproj +++ b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Microsoft.VisualStudioCode.RazorExtension.csproj @@ -46,14 +46,7 @@ - - Targets - true - content\Targets - PreserveNewest - - - + true content\Targets PreserveNewest diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorVSCodeEndpoint.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorVSCodeEndpoint.cs deleted file mode 100644 index b8a93855781..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorVSCodeEndpoint.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; - -namespace Microsoft.VisualStudioCode.RazorExtension; - -internal class RazorVSCodeEndpoint : RazorEndpointAttribute -{ - public RazorVSCodeEndpoint(string method) : base(method, "Razor") - { - } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorWorkspaceListener.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorWorkspaceListener.cs deleted file mode 100644 index 5a470eb38e6..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorWorkspaceListener.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.IO; -using System.IO.Pipes; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis; -using Microsoft.Extensions.Logging; - -namespace Microsoft.VisualStudioCode.RazorExtension; - -internal sealed class RazorWorkspaceListener : RazorWorkspaceListenerBase -{ - public RazorWorkspaceListener(ILoggerFactory loggerFactory) : base(loggerFactory.CreateLogger()) - { - } - - /// - /// Initializes the workspace and begins hooking up to workspace events. This is not thread safe - /// but may be called multiple times. - /// - public void EnsureInitialized(Workspace workspace, string pipeName) - { - // Configuration of the server stream is very important. Please - // be _very_ careful if changing any of the options used to initialize this. - EnsureInitialized(workspace, () => new NamedPipeServerStream( - pipeName, - PipeDirection.Out, - maxNumberOfServerInstances: 1, - PipeTransmissionMode.Byte, - PipeOptions.CurrentUserOnly | PipeOptions.Asynchronous)); - } - - private protected override Task CheckConnectionAsync(Stream stream, CancellationToken cancellationToken) - { - if (stream is NamedPipeServerStream { IsConnected: false } namedPipe) - { - return namedPipe.WaitForConnectionAsync(cancellationToken); - } - - return Task.CompletedTask; - } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorWorkspaceListenerBase.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorWorkspaceListenerBase.cs deleted file mode 100644 index 705cec980dc..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/RazorWorkspaceListenerBase.cs +++ /dev/null @@ -1,301 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Razor.Utilities; -using Microsoft.Extensions.Logging; - -namespace Microsoft.VisualStudioCode.RazorExtension; - -internal abstract class RazorWorkspaceListenerBase : IDisposable -{ - private static readonly TimeSpan s_debounceTime = TimeSpan.FromMilliseconds(500); - private readonly CancellationTokenSource _disposeTokenSource = new(); - - private readonly ILogger _logger; - private readonly AsyncBatchingWorkQueue _workQueue; - - // Use an immutable dictionary for ImmutableInterlocked operations. The value isn't checked, just - // the existance of the key so work is only done for projects with dynamic files. - private ImmutableDictionary _projectsWithDynamicFile = ImmutableDictionary.Empty; - - private Stream? _stream; - private Workspace? _workspace; - private WorkspaceEventRegistration? _changeRegistration; - private bool _disposed; - - internal record Work(ProjectId ProjectId); - internal record UpdateWork(ProjectId ProjectId) : Work(ProjectId); - internal record RemovalWork(ProjectId ProjectId, string IntermediateOutputPath) : Work(ProjectId); - - protected RazorWorkspaceListenerBase(ILogger logger) - { - _logger = logger; - _workQueue = new(s_debounceTime, ProcessWorkAsync, EqualityComparer.Default, _disposeTokenSource.Token); - } - - private protected abstract Task CheckConnectionAsync(Stream stream, CancellationToken cancellationToken); - - public void Dispose() - { - _changeRegistration?.Dispose(); - - if (_disposed) - { - _logger.LogInformation("Disposal was called twice"); - return; - } - - _disposed = true; - _logger.LogInformation("Tearing down named pipe for pid {pid}", Environment.ProcessId); - - _disposeTokenSource.Cancel(); - _disposeTokenSource.Dispose(); - - _stream?.Dispose(); - _stream = null; - } - - public void NotifyDynamicFile(ProjectId projectId) - { - // Since there is no "un-notify" API to indicate that callers no longer care about a project, it's entirely - // possible that by the time we get notified, a project might have been removed from the workspace. Whilst - // that wouldn't cause any issues we may as well avoid creating a task scheduler. - if (_workspace is null || !_workspace.CurrentSolution.ContainsProject(projectId)) - { - return; - } - - // Other modifications of projects happen on Workspace.Changed events, which are not - // assumed to be on the same thread as dynamic file notification. - ImmutableInterlocked.GetOrAdd(ref _projectsWithDynamicFile, projectId, static (_) => true); - - // Schedule a task, in case adding a dynamic file is the last thing that happens - _logger.LogTrace("{projectId} scheduling task due to dynamic file", projectId); - _workQueue.AddWork(new UpdateWork(projectId)); - } - - /// - /// Initializes the workspace and begins hooking up to workspace events. This is not thread safe - /// and intended to be called only once. - /// - private protected void EnsureInitialized(Workspace workspace, Func createStream) - { - // Early exit check. Initialization should only happen once. Handle as safely as possible but - if (_workspace is not null) - { - _logger.LogInformation("EnsureInitialized was called multiple times when it shouldn't have been."); - return; - } - - // Early check for disposal just to reduce any work further - if (_disposed) - { - return; - } - - _workspace = workspace; - _changeRegistration = _workspace.RegisterWorkspaceChangedHandler(Workspace_WorkspaceChanged); - _stream = createStream(); - } - - private void Workspace_WorkspaceChanged(WorkspaceChangeEventArgs e) - { - switch (e.Kind) - { - case WorkspaceChangeKind.SolutionChanged: - case WorkspaceChangeKind.SolutionReloaded: - foreach (var project in e.NewSolution.Projects) - { - EnqueueUpdate(project); - } - - break; - - case WorkspaceChangeKind.SolutionAdded: - foreach (var project in e.NewSolution.Projects) - { - EnqueueUpdate(project); - } - - break; - - case WorkspaceChangeKind.ProjectReloaded: - EnqueueUpdate(e.NewSolution.GetProject(e.ProjectId)); - break; - - case WorkspaceChangeKind.ProjectRemoved: - RemoveProject(e.OldSolution.GetProject(e.ProjectId.AssumeNotNull()).AssumeNotNull()); - break; - - case WorkspaceChangeKind.ProjectAdded: - case WorkspaceChangeKind.ProjectChanged: - case WorkspaceChangeKind.DocumentAdded: - case WorkspaceChangeKind.DocumentRemoved: - case WorkspaceChangeKind.DocumentReloaded: - case WorkspaceChangeKind.DocumentChanged: - case WorkspaceChangeKind.AdditionalDocumentAdded: - case WorkspaceChangeKind.AdditionalDocumentRemoved: - case WorkspaceChangeKind.AdditionalDocumentReloaded: - case WorkspaceChangeKind.AdditionalDocumentChanged: - case WorkspaceChangeKind.DocumentInfoChanged: - case WorkspaceChangeKind.AnalyzerConfigDocumentAdded: - case WorkspaceChangeKind.AnalyzerConfigDocumentRemoved: - case WorkspaceChangeKind.AnalyzerConfigDocumentReloaded: - case WorkspaceChangeKind.AnalyzerConfigDocumentChanged: - var projectId = e.ProjectId ?? e.DocumentId?.ProjectId; - if (projectId is not null) - { - EnqueueUpdate(e.NewSolution.GetProject(projectId)); - } - - break; - - case WorkspaceChangeKind.SolutionCleared: - case WorkspaceChangeKind.SolutionRemoved: - foreach (var project in e.OldSolution.Projects) - { - RemoveProject(project); - } - - break; - - default: - break; - } - - // - // Local functions - // - void EnqueueUpdate(Project? project) - { - if (_disposed || - project is not - { - Language: LanguageNames.CSharp - }) - { - return; - } - - // Don't queue work for projects that don't have a dynamic file - if (!_projectsWithDynamicFile.TryGetValue(project.Id, out var _)) - { - return; - } - - _workQueue.AddWork(new UpdateWork(project.Id)); - } - - void RemoveProject(Project project) - { - // Remove project is called from Workspace.Changed, while other notifications of _projectsWithDynamicFile - // are handled with NotifyDynamicFile. Use ImmutableInterlocked here to be sure the updates happen - // in a thread safe manner since those are not assumed to be the same thread. - if (ImmutableInterlocked.TryRemove(ref _projectsWithDynamicFile, project.Id, out var _)) - { - var intermediateOutputPath = Path.GetDirectoryName(project.CompilationOutputInfo.AssemblyPath); - if (intermediateOutputPath is null) - { - _logger.LogTrace("intermediatePath is null, skipping notification of removal for {projectId}", project.Id); - return; - } - - _workQueue.AddWork(new RemovalWork(project.Id, intermediateOutputPath)); - } - } - } - - /// - /// Work controlled by the . Cancellation of that work queue propagates - /// to cancellation of this thread and should be handled accordingly - /// - /// - /// private protected virtual for testing - /// - private protected async virtual ValueTask ProcessWorkAsync(ImmutableArray work, CancellationToken cancellationToken) - { - // Capture as locals here. Cancellation of the work queue still need to propogate. The cancellation - // token itself represents the work queue halting, but this will help avoid any assumptions about nullability of locals - // through the use in this function. - var stream = _stream; - var solution = _workspace?.CurrentSolution; - - cancellationToken.ThrowIfCancellationRequested(); - - // Early bail check for if we are disposed or somewhere in the middle of disposal - if (_disposed || stream is null || solution is null) - { - _logger.LogTrace("Skipping work due to disposal"); - return; - } - - await CheckConnectionAsync(stream, cancellationToken).ConfigureAwait(false); - await ProcessWorkCoreAsync(work, stream, solution, _logger, cancellationToken).ConfigureAwait(false); - } - - private static async Task ProcessWorkCoreAsync(ImmutableArray work, Stream stream, Solution solution, ILogger logger, CancellationToken cancellationToken) - { - foreach (var unit in work) - { - try - { - cancellationToken.ThrowIfCancellationRequested(); - - if (unit is RemovalWork removalWork) - { - await ReportRemovalAsync(stream, removalWork, logger, cancellationToken).ConfigureAwait(false); - } - - var project = solution.GetProject(unit.ProjectId); - if (project is null) - { - logger.LogTrace("Project {projectId} is not in workspace", unit.ProjectId); - continue; - } - - await ReportUpdateProjectAsync(stream, project, logger, cancellationToken).ConfigureAwait(false); - } - catch (Exception ex) when (ex is not OperationCanceledException) - { - logger.LogError(ex, "Encountered exception while processing unit: {message}", ex.Message); - } - } - - try - { - await stream.FlushAsync(cancellationToken).ConfigureAwait(false); - } - catch (Exception ex) - { - logger.LogError(ex, "Encountered error flusingh stream"); - } - } - - private static async Task ReportUpdateProjectAsync(Stream stream, Project project, ILogger logger, CancellationToken cancellationToken) - { - logger.LogTrace("Serializing information for {projectId}", project.Id); - var result = await RazorProjectInfoFactory.ConvertAsync(project, cancellationToken).ConfigureAwait(false); - if (!result.Succeeded) - { - logger.LogTrace("Skipped writing data for {projectId} because of '{reason}'", project.Id, result.Reason); - return; - } - - stream.WriteProjectInfoAction(RazorProjectInfoAction.Update); - await stream.WriteProjectInfoAsync(result.ProjectInfo, cancellationToken).ConfigureAwait(false); - } - - private static Task ReportRemovalAsync(Stream stream, RemovalWork unit, ILogger logger, CancellationToken cancellationToken) - { - logger.LogTrace("Reporting removal of {projectId}", unit.ProjectId); - return stream.WriteProjectInfoRemovalAsync(unit.IntermediateOutputPath, cancellationToken); - } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/DynamicFileProviderFactory.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/DynamicFileProviderFactory.cs deleted file mode 100644 index 5b2361d1c04..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/DynamicFileProviderFactory.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Composition; -using Microsoft.CodeAnalysis.ExternalAccess.Razor; -using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; -using Microsoft.CodeAnalysis.Razor.Workspaces; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -[ExportRazorLspServiceFactory(typeof(RazorLspDynamicFileInfoProvider)), Shared] -[method: ImportingConstructor] -internal sealed class DynamicFileProviderFactory( - LanguageServerFeatureOptions featureOptions) : AbstractRazorLspServiceFactory -{ - private readonly LanguageServerFeatureOptions _featureOptions = featureOptions; - - protected override AbstractRazorLspService CreateService(IRazorLspServices lspServices) - { - var clientLanguageServerManager = lspServices.GetRequiredService(); - return new LspDynamicFileProvider(clientLanguageServerManager, _featureOptions); - } -} - diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/EmptyServiceProvider.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/EmptyServiceProvider.cs deleted file mode 100644 index 95ccb530cf4..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/EmptyServiceProvider.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.CodeAnalysis.ExternalAccess.Razor; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class EmptyServiceProvider : IRazorDocumentServiceProvider -{ - public static readonly EmptyServiceProvider Instance = new(); - - public bool CanApplyChange => false; - - public bool SupportDiagnostics => true; - - public TService? GetService() where TService : class - { - return null; - } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDocumentServiceProvider.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDocumentServiceProvider.cs deleted file mode 100644 index e15d3018847..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDocumentServiceProvider.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.AspNetCore.Razor; -using Microsoft.CodeAnalysis.ExternalAccess.Razor; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class LspDocumentServiceProvider(IRazorClientLanguageServerManager razorClientLanguageServerManager) : IRazorDocumentServiceProvider -{ - public bool CanApplyChange => true; - - public bool SupportDiagnostics => true; - - private IRazorMappingService? _mappingService; - - public TService? GetService() where TService : class - { - var serviceType = typeof(TService); - - if (serviceType == typeof(IRazorMappingService)) - { - var mappingService = _mappingService ?? InterlockedOperations.Initialize(ref _mappingService, CreateMappingService()); - return (TService?)mappingService; - } - - return this as TService; - } - - private IRazorMappingService CreateMappingService() - { - return new MappingService(razorClientLanguageServerManager); - } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDynamicFileProvider.LspTextChangesTextLoader.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDynamicFileProvider.LspTextChangesTextLoader.cs deleted file mode 100644 index ddee6860b71..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDynamicFileProvider.LspTextChangesTextLoader.cs +++ /dev/null @@ -1,124 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.ExternalAccess.Razor; -using Microsoft.CodeAnalysis.Razor.Protocol; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed partial class LspDynamicFileProvider -{ - private sealed class LspTextChangesTextLoader( - TextDocument? document, - RazorTextChange[] changes, - byte[] checksum, - SourceHashAlgorithm checksumAlgorithm, - int? codePage, - Uri razorUri, - IRazorClientLanguageServerManager razorClientLanguageServerManager) : TextLoader - { - private readonly TextDocument? _document = document; - private readonly ImmutableArray _changes = changes.SelectAsArray(c => c.ToTextChange()); - private readonly byte[] _checksum = checksum; - private readonly SourceHashAlgorithm _checksumAlgorithm = checksumAlgorithm; - private readonly int? _codePage = codePage; - private readonly DocumentUri _razorUri = new(razorUri); - private readonly IRazorClientLanguageServerManager _razorClientLanguageServerManager = razorClientLanguageServerManager; - private readonly Lazy _emptySourceText = new(() => - { - var encoding = codePage is null ? null : Encoding.GetEncoding(codePage.Value); - return SourceText.From("", checksumAlgorithm: checksumAlgorithm, encoding: encoding); - }); - - public override async Task LoadTextAndVersionAsync(LoadTextOptions options, CancellationToken cancellationToken) - { - try - { - if (_document is null) - { - var text = ApplyChanges(_emptySourceText.Value, _changes); - return TextAndVersion.Create(text, VersionStamp.Default.GetNewerVersion()); - } - - var sourceText = await _document.GetTextAsync(cancellationToken).ConfigureAwait(false); - - // Validate the checksum information so the edits are known to be correct - - if (IsSourceTextMatching(sourceText)) - { - var version = await _document.GetTextVersionAsync(cancellationToken).ConfigureAwait(false); - var newText = ApplyChanges(sourceText, _changes); - return TextAndVersion.Create(newText, version.GetNewerVersion()); - } - } - catch (Exception ex) when (ex is not OperationCanceledException) - { - // This happens if ApplyChanges tries to apply an invalid TextChange. - // This is recoverable but incurs a perf hit for getting the full text below. - - // TODO: Add ability to capture a fault here in EA. There's something wrong if - // the Checksum matches but the text changes can't be applied. - } - - return await GetFullDocumentFromServerAsync(cancellationToken).ConfigureAwait(false); - } - - private bool IsSourceTextMatching(SourceText sourceText) - { - if (sourceText.ChecksumAlgorithm != _checksumAlgorithm) - { - return false; - } - - if (sourceText.Encoding?.CodePage != _codePage) - { - return false; - } - - if (!sourceText.GetChecksum().SequenceEqual(_checksum)) - { - return false; - } - - return true; - } - - private async Task GetFullDocumentFromServerAsync(CancellationToken cancellationToken) - { - var response = await _razorClientLanguageServerManager.SendRequestAsync( - ProvideRazorDynamicFileInfoMethodName, - new RazorProvideDynamicFileParams - { - RazorDocument = new() - { - DocumentUri = _razorUri, - }, - FullText = true - }, - cancellationToken).ConfigureAwait(false); - - var text = ApplyChanges(_emptySourceText.Value, response.Edits.SelectAsArray(e => e.ToTextChange())); - return TextAndVersion.Create(text, VersionStamp.Default.GetNewerVersion()); - } - - private static SourceText ApplyChanges(SourceText sourceText, ImmutableArray changes) - { - foreach (var change in changes) - { - sourceText = sourceText.WithChanges(change); - } - - return sourceText; - } - } -} - diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDynamicFileProvider.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDynamicFileProvider.cs deleted file mode 100644 index e903d18a9bd..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/LspDynamicFileProvider.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.ExternalAccess.Razor; -using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; -using Microsoft.CodeAnalysis.Razor; -using Microsoft.CodeAnalysis.Razor.Workspaces; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed partial class LspDynamicFileProvider( - IRazorClientLanguageServerManager clientLanguageServerManager, - LanguageServerFeatureOptions languageServerFeatureOptions) : RazorLspDynamicFileInfoProvider -{ - private const string ProvideRazorDynamicFileInfoMethodName = "razor/provideDynamicFileInfo"; - private const string RemoveRazorDynamicFileInfoMethodName = "razor/removeDynamicFileInfo"; - - private readonly IRazorClientLanguageServerManager _clientLanguageServerManager = clientLanguageServerManager; - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; - - public override async Task GetDynamicFileInfoAsync(Workspace workspace, ProjectId projectId, string? projectFilePath, string filePath, CancellationToken cancellationToken) - { - if (_languageServerFeatureOptions.UseRazorCohostServer) - { - return null; - } - - var razorUri = new Uri(filePath); - - var requestParams = new RazorProvideDynamicFileParams - { - RazorDocument = new() - { - DocumentUri = new(razorUri) - } - }; - - var response = await _clientLanguageServerManager.SendRequestAsync( - ProvideRazorDynamicFileInfoMethodName, - requestParams, - cancellationToken).ConfigureAwait(false); - - if (response is null) - { - return null; - } - - var textDocument = await WorkspaceExtensions.GetTextDocumentAsync(workspace, response.CSharpDocument.DocumentUri, cancellationToken).ConfigureAwait(false); - var checksum = Convert.FromBase64String(response.Checksum); - var textLoader = new LspTextChangesTextLoader( - textDocument, - response.Edits, - checksum, - response.ChecksumAlgorithm, - response.SourceEncodingCodePage, - razorUri, - _clientLanguageServerManager); - - return new RazorDynamicFileInfo( - RazorUri.GetDocumentFilePathFromUri(response.CSharpDocument.DocumentUri.GetRequiredParsedUri()), - SourceCodeKind.Regular, - textLoader, - documentServiceProvider: new LspDocumentServiceProvider(_clientLanguageServerManager)); - } - - public override Task RemoveDynamicFileInfoAsync(Workspace workspace, ProjectId projectId, string? projectFilePath, string filePath, CancellationToken cancellationToken) - { - var notificationParams = new RazorRemoveDynamicFileParams - { - CSharpDocument = new() - { - DocumentUri = new(new Uri(filePath)) - } - }; - return _clientLanguageServerManager.SendNotificationAsync( - RemoveRazorDynamicFileInfoMethodName, notificationParams, cancellationToken).AsTask(); - } -} - diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/MappingService.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/MappingService.cs deleted file mode 100644 index 3e44b71d65c..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/MappingService.cs +++ /dev/null @@ -1,118 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.ExternalAccess.Razor; -using Microsoft.CodeAnalysis.Razor; -using Microsoft.CodeAnalysis.Razor.Protocol; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class MappingService(IRazorClientLanguageServerManager razorClientLanguageServerManager) : IRazorMappingService -{ - private const string RazorMapSpansEndpoint = "razor/mapSpans"; - private const string RazorMapTextChangesEndpoint = "razor/mapTextChanges"; - - private readonly IRazorClientLanguageServerManager _razorClientLanguageServerManager = razorClientLanguageServerManager; - - public async Task> MapSpansAsync(Document document, IEnumerable spans, CancellationToken cancellationToken) - { - if (string.IsNullOrWhiteSpace(document.FilePath) || - (spans.TryGetNonEnumeratedCount(out var count) && count == 0)) - { - return []; - } - - var sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false); - - var mapParams = new RazorMapSpansParams() - { - CSharpDocument = new() - { - DocumentUri = new(new Uri(document.FilePath)) - }, - Ranges = [.. spans.Select(sourceText.GetRange)] - }; - - var response = await _razorClientLanguageServerManager.SendRequestAsync( - RazorMapSpansEndpoint, - mapParams, - cancellationToken).ConfigureAwait(false); - - if (response is not { Spans.Length: > 0, Ranges.Length: > 0 }) - { - return []; - } - - Debug.Assert(response.Spans.Length == spans.Count(), "The number of mapped spans should match the number of input spans."); - Debug.Assert(response.Ranges.Length == spans.Count(), "The number of mapped ranges should match the number of input spans."); - - using var builder = new PooledArrayBuilder(response.Spans.Length); - var filePath = response.RazorDocument.DocumentUri.GetRequiredParsedUri().GetDocumentFilePath(); - - for (var i = 0; i < response.Spans.Length; i++) - { - var span = response.Spans[i]; - var range = response.Ranges[i]; - - if (range.IsUndefined()) - { - continue; - } - - builder.Add(new RazorMappedSpanResult(filePath, range.ToLinePositionSpan(), span.ToTextSpan())); - } - - return builder.ToImmutableAndClear(); - } - - public async Task> MapTextChangesAsync(Document oldDocument, Document newDocument, CancellationToken cancellationToken) - { - if (string.IsNullOrWhiteSpace(newDocument.FilePath)) - { - return []; - } - - var changes = await newDocument.GetTextChangesAsync(oldDocument, cancellationToken).ConfigureAwait(false); - var textChanges = changes.Select(c => c.ToRazorTextChange()).ToArray(); - - if (textChanges.Length == 0) - { - return []; - } - - var mapParams = new RazorMapTextChangesParams() - { - CSharpDocument = new() - { - DocumentUri = new(new Uri(newDocument.FilePath)) - }, - TextChanges = textChanges - }; - - var response = await _razorClientLanguageServerManager.SendRequestAsync( - RazorMapTextChangesEndpoint, - mapParams, - cancellationToken).ConfigureAwait(false); - - if (response is not { MappedTextChanges.Length: > 0 }) - { - return []; - } - - Debug.Assert(response.MappedTextChanges.Length == changes.Count(), "The number of mapped text changes should match the number of input text changes."); - var filePath = response.RazorDocument.DocumentUri.GetRequiredParsedUri().GetDocumentFilePath(); - var convertedChanges = Array.ConvertAll(response.MappedTextChanges, mappedChange => mappedChange.ToTextChange()); - var result = new RazorMappedEditResult(filePath, convertedChanges); - return [result]; - } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapSpansParams.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapSpansParams.cs deleted file mode 100644 index a134e4de14e..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapSpansParams.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Text.Json.Serialization; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class RazorMapSpansParams -{ - [JsonPropertyName("csharpDocument")] - public required TextDocumentIdentifier CSharpDocument { get; set; } - - [JsonPropertyName("ranges")] - public required LspRange[] Ranges { get; set; } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapSpansResponse.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapSpansResponse.cs deleted file mode 100644 index 8edb110afe0..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapSpansResponse.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Text.Json.Serialization; -using Microsoft.CodeAnalysis.Razor.Protocol; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class RazorMapSpansResponse -{ - [JsonPropertyName("ranges")] - public required LspRange[] Ranges { get; set; } - - [JsonPropertyName("spans")] - public required RazorTextSpan[] Spans { get; set; } - - [JsonPropertyName("razorDocument")] - public required TextDocumentIdentifier RazorDocument { get; set; } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapTextChangesParams.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapTextChangesParams.cs deleted file mode 100644 index 9e0595a5e0d..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapTextChangesParams.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Text.Json.Serialization; -using Microsoft.CodeAnalysis.Razor.Protocol; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class RazorMapTextChangesParams -{ - [JsonPropertyName("csharpDocument")] - public required TextDocumentIdentifier CSharpDocument { get; set; } - - [JsonPropertyName("textChanges")] - public required RazorTextChange[] TextChanges { get; set; } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapTextChangesResponse.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapTextChangesResponse.cs deleted file mode 100644 index 83aa78252c6..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorMapTextChangesResponse.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Text.Json.Serialization; -using Microsoft.CodeAnalysis.Razor.Protocol; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class RazorMapTextChangesResponse -{ - [JsonPropertyName("razorDocument")] - public required TextDocumentIdentifier RazorDocument { get; set; } - - [JsonPropertyName("mappedTextChanges")] - public required RazorTextChange[] MappedTextChanges { get; set; } -} - diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorProvideDynamicFileParams.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorProvideDynamicFileParams.cs deleted file mode 100644 index 3275f19a494..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorProvideDynamicFileParams.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Text.Json.Serialization; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class RazorProvideDynamicFileParams -{ - [JsonPropertyName("razorDocument")] - public required TextDocumentIdentifier RazorDocument { get; set; } - - /// - /// When true, the full text of the document will be sent over as a single - /// edit instead of diff edits - /// - [JsonPropertyName("fullText")] - public bool FullText { get; set; } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorProvideDynamicFileResponse.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorProvideDynamicFileResponse.cs deleted file mode 100644 index 716733def66..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorProvideDynamicFileResponse.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Text.Json.Serialization; -using Microsoft.CodeAnalysis.Text; -using Microsoft.CodeAnalysis.Razor.Protocol; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal sealed class RazorProvideDynamicFileResponse -{ - [JsonPropertyName("csharpDocument")] - public required TextDocumentIdentifier CSharpDocument { get; set; } - - [JsonPropertyName("edits")] - public required RazorTextChange[] Edits { get; set; } - - [JsonPropertyName("checksum")] - public required string Checksum { get; set; } - - [JsonPropertyName("checksumAlgorithm")] - public SourceHashAlgorithm ChecksumAlgorithm { get; set; } - - [JsonPropertyName("encodingCodePage")] - public int? SourceEncodingCodePage { get; set; } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorRemoveDynamicFileParams.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorRemoveDynamicFileParams.cs deleted file mode 100644 index f8ff21e222d..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/RazorRemoveDynamicFileParams.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Text.Json.Serialization; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -internal class RazorRemoveDynamicFileParams -{ - [JsonPropertyName("csharpDocument")] - public required TextDocumentIdentifier CSharpDocument { get; set; } -} diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/VSCodeLanguageServerFeatureOptions.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/VSCodeLanguageServerFeatureOptions.cs index 247399ffee9..7f763f94aba 100644 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/VSCodeLanguageServerFeatureOptions.cs +++ b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/VSCodeLanguageServerFeatureOptions.cs @@ -2,79 +2,18 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Composition; -using System.Text.Json.Nodes; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.LanguageServer; using Microsoft.AspNetCore.Razor.Utilities; -using Microsoft.CodeAnalysis.ExternalAccess.Razor.Cohost; using Microsoft.CodeAnalysis.Razor.Workspaces; -using Microsoft.NET.Sdk.Razor.SourceGenerators; -using Microsoft.VisualStudio.Razor.LanguageClient.Cohost; namespace Microsoft.VisualStudioCode.RazorExtension.Services; [Shared] -[Export(typeof(IRazorCohostStartupService))] [Export(typeof(LanguageServerFeatureOptions))] [method: ImportingConstructor] -internal class VSCodeLanguageServerFeatureOptions(RazorClientServerManagerProvider razorClientServerManagerProvider) : LanguageServerFeatureOptions, IRazorCohostStartupService +internal class VSCodeLanguageServerFeatureOptions() : LanguageServerFeatureOptions { - private bool _useRazorCohostServer = false; - - private readonly RazorClientServerManagerProvider _razorClientServerManagerProvider = razorClientServerManagerProvider; - - // Options that are set to their defaults public override bool SupportsFileManipulation => true; - public override bool SingleServerSupport => false; public override bool ShowAllCSharpCodeActions => false; public override bool ReturnCodeActionAndRenamePathsWithPrefixedSlash => PlatformInformation.IsWindows; - public override bool IncludeProjectKeyInGeneratedFilePath => false; - public override bool DoNotInitializeMiscFilesProjectFromWorkspace => false; - - // Options that differ from the default - public override string CSharpVirtualDocumentSuffix => "__virtual.cs"; - public override string HtmlVirtualDocumentSuffix => "__virtual.html"; - public override bool UpdateBuffersForClosedDocuments => true; - public override bool DelegateToCSharpOnDiagnosticPublish => true; - public override bool SupportsSoftSelectionInCompletion => false; - public override bool UseVsCodeCompletionCommitCharacters => true; - - // User configurable options - public override bool UseRazorCohostServer => _useRazorCohostServer; - - public int Order => WellKnownStartupOrder.LanguageServerFeatureOptions; - - public async Task StartupAsync(VSInternalClientCapabilities clientCapabilities, RazorCohostRequestContext requestContext, CancellationToken cancellationToken) - { - var razorClientLanguageServerManager = _razorClientServerManagerProvider.ClientLanguageServerManager.AssumeNotNull(); - - // Attempt to get configurations from the client. If this throws we'll get NFW reports. - var configurationParams = new ConfigurationParams() - { - Items = [ - // Roslyn's typescript config handler will convert underscores to camelcase, ie 'razor.languageServer.cohostingEnabled' - new ConfigurationItem { Section = "razor.language_server.cohosting_enabled" }, - ] - }; - var options = await razorClientLanguageServerManager.SendRequestAsync( - Methods.WorkspaceConfigurationName, - configurationParams, - cancellationToken).ConfigureAwait(false); - - _useRazorCohostServer = GetBooleanOptionValue(options[0], _useRazorCohostServer); - - RazorCohostingOptions.UseRazorCohostServer = _useRazorCohostServer; - } - - private static bool GetBooleanOptionValue(JsonNode? jsonNode, bool defaultValue) - { - if (jsonNode is null) - { - return defaultValue; - } - - return jsonNode.ToString() == "true"; - } + public override bool UseRazorCohostServer => true; } diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/VSCodeRemoteServicesInitializer.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/VSCodeRemoteServicesInitializer.cs index aa4d63c197c..e7e6f54d5fd 100644 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/VSCodeRemoteServicesInitializer.cs +++ b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/VSCodeRemoteServicesInitializer.cs @@ -54,12 +54,9 @@ public async Task StartupAsync(VSInternalClientCapabilities clientCapabilities, await service.InitializeAsync(new RemoteClientInitializationOptions { UseRazorCohostServer = _featureOptions.UseRazorCohostServer, - HtmlVirtualDocumentSuffix = _featureOptions.HtmlVirtualDocumentSuffix, ReturnCodeActionAndRenamePathsWithPrefixedSlash = _featureOptions.ReturnCodeActionAndRenamePathsWithPrefixedSlash, SupportsFileManipulation = _featureOptions.SupportsFileManipulation, ShowAllCSharpCodeActions = _featureOptions.ShowAllCSharpCodeActions, - SupportsSoftSelectionInCompletion = _featureOptions.SupportsSoftSelectionInCompletion, - UseVsCodeCompletionCommitCharacters = _featureOptions.UseVsCodeCompletionCommitCharacters, }, cancellationToken).ConfigureAwait(false); await service.InitializeLspAsync(new RemoteClientLSPInitializationOptions diff --git a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/WorkspaceService.cs b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/WorkspaceService.cs deleted file mode 100644 index cc9bcdb4654..00000000000 --- a/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Services/WorkspaceService.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Composition; -using System.Threading; -using Microsoft.AspNetCore.Razor; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.ExternalAccess.Razor.Features; -using Microsoft.CodeAnalysis.Razor.Workspaces; -using Microsoft.Extensions.Logging; - -namespace Microsoft.VisualStudioCode.RazorExtension.Services; - -[ExportRazorStatelessLspService(typeof(RazorWorkspaceService)), Shared] -[method: ImportingConstructor] -internal sealed class WorkspaceService(ILoggerFactory loggerFactory, LanguageServerFeatureOptions languageServerFeatureOptions) : RazorWorkspaceService -{ - private readonly ILoggerFactory _loggerFactory = loggerFactory; - private readonly ILogger _logger = loggerFactory.CreateLogger(); - private readonly Lock _initializeLock = new(); - private readonly LanguageServerFeatureOptions _languageServerFeatureOptions = languageServerFeatureOptions; - - private RazorWorkspaceListener? _razorWorkspaceListener; - private HashSet? _projectIdWithDynamicFiles = []; - - public override void Initialize(Workspace workspace, string pipeName) - { - if (_languageServerFeatureOptions.UseRazorCohostServer) - { - // Cohost server doesn't need to initialize the workspace listener. - return; - } - - HashSet projectsToInitialize; - lock (_initializeLock) - { - // Only initialize once - if (_razorWorkspaceListener is not null) - { - return; - } - - //_logger.LogTrace("Initializing the Razor workspace listener with pipe name {0}", pipeName); - _razorWorkspaceListener = new RazorWorkspaceListener(_loggerFactory); - _razorWorkspaceListener.EnsureInitialized(workspace, pipeName); - - // _projectIdWithDynamicFiles won't be used again after initialization is done - projectsToInitialize = _projectIdWithDynamicFiles.AssumeNotNull(); - _projectIdWithDynamicFiles = null; - } - - foreach (var projectId in projectsToInitialize) - { - _logger.LogTrace("{projectId} notifying a dynamic file for the first time", projectId); - _razorWorkspaceListener.NotifyDynamicFile(projectId); - } - } - - public override void NotifyDynamicFile(ProjectId projectId) - { - if (_languageServerFeatureOptions.UseRazorCohostServer) - { - // Cohost server doesn't need to initialize the workspace listener. - return; - } - - if (_razorWorkspaceListener is null) - { - lock (_initializeLock) - { - if (_razorWorkspaceListener is not null) - { - _razorWorkspaceListener.NotifyDynamicFile(projectId); - return; - } - - _projectIdWithDynamicFiles - .AssumeNotNull() - .Add(projectId); - } - } - else - { - _razorWorkspaceListener?.NotifyDynamicFile(projectId); - } - } -} diff --git a/src/Razor/src/rzls/Targets/Microsoft.NET.Sdk.Razor.DesignTime.targets b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Microsoft.NET.Sdk.Razor.DesignTime.targets similarity index 100% rename from src/Razor/src/rzls/Targets/Microsoft.NET.Sdk.Razor.DesignTime.targets rename to src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Microsoft.NET.Sdk.Razor.DesignTime.targets diff --git a/src/Razor/src/rzls/Targets/Readme.md b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Readme.md similarity index 100% rename from src/Razor/src/rzls/Targets/Readme.md rename to src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Readme.md diff --git a/src/Razor/src/rzls/Targets/Rules/RazorComponentWithTargetPath.xaml b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorComponentWithTargetPath.xaml similarity index 100% rename from src/Razor/src/rzls/Targets/Rules/RazorComponentWithTargetPath.xaml rename to src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorComponentWithTargetPath.xaml diff --git a/src/Razor/src/rzls/Targets/Rules/RazorConfiguration.xaml b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorConfiguration.xaml similarity index 100% rename from src/Razor/src/rzls/Targets/Rules/RazorConfiguration.xaml rename to src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorConfiguration.xaml diff --git a/src/Razor/src/rzls/Targets/Rules/RazorExtension.xaml b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorExtension.xaml similarity index 100% rename from src/Razor/src/rzls/Targets/Rules/RazorExtension.xaml rename to src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorExtension.xaml diff --git a/src/Razor/src/rzls/Targets/Rules/RazorGeneral.xaml b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorGeneral.xaml similarity index 100% rename from src/Razor/src/rzls/Targets/Rules/RazorGeneral.xaml rename to src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorGeneral.xaml diff --git a/src/Razor/src/rzls/Targets/Rules/RazorGenerateWithTargetPath.xaml b/src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorGenerateWithTargetPath.xaml similarity index 100% rename from src/Razor/src/rzls/Targets/Rules/RazorGenerateWithTargetPath.xaml rename to src/Razor/src/Microsoft.VisualStudioCode.RazorExtension/Targets/Rules/RazorGenerateWithTargetPath.xaml diff --git a/src/Razor/src/rzls/CustomExportAssemblyLoader.cs b/src/Razor/src/rzls/CustomExportAssemblyLoader.cs deleted file mode 100644 index 8883f7d7b53..00000000000 --- a/src/Razor/src/rzls/CustomExportAssemblyLoader.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Microsoft.VisualStudio.Composition; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -internal class CustomExportAssemblyLoader(string baseDirectory) : IAssemblyLoader -{ - /// - /// Cache assemblies that are already loaded by AssemblyName comparison - /// - private readonly Dictionary _loadedAssemblies = new(AssemblyNameComparer.Instance); - - /// - /// Base directory to search for if initial load fails - /// - private readonly string _baseDirectory = baseDirectory; - - public Assembly LoadAssembly(AssemblyName assemblyName) - { - Assembly? assembly; - - lock (_loadedAssemblies) - { - if (_loadedAssemblies.TryGetValue(assemblyName, out assembly)) - { - return assembly; - } - } - - assembly = LoadAssemblyCore(assemblyName); - - lock (_loadedAssemblies) - { - _loadedAssemblies[assemblyName] = assembly; - } - - return assembly; - } - - public Assembly LoadAssembly(string assemblyFullName, string? codeBasePath) - { - var assemblyName = new AssemblyName(assemblyFullName); - - if (codeBasePath is not null) - { -#pragma warning disable SYSLIB0044 // Type or member is obsolete - assemblyName.CodeBase = codeBasePath; -#pragma warning restore SYSLIB0044 // Type or member is obsolete - } - - return LoadAssembly(assemblyName); - } - - private Assembly LoadAssemblyCore(AssemblyName assemblyName) - { - // Attempt to load the assembly normally, but fall back to Assembly.LoadFrom in the base - // directory if the assembly load fails - - try - { - return Assembly.Load(assemblyName); - } - catch (FileNotFoundException) - { - // Carry on trying to load by path below. - } - - var simpleName = assemblyName.Name!; - var assemblyPath = Path.Combine(_baseDirectory, simpleName + ".dll"); - if (File.Exists(assemblyPath)) - { - return Assembly.LoadFrom(assemblyPath); - } - - throw new FileNotFoundException($"Could not find assembly {assemblyName} at {assemblyPath}"); - } - - private sealed class AssemblyNameComparer : IEqualityComparer - { - public static readonly AssemblyNameComparer Instance = new(); - - private AssemblyNameComparer() - { - } - - public bool Equals(AssemblyName? x, AssemblyName? y) - { - if (x == null && y == null) - { - return true; - } - - if (x == null || y == null) - { - return false; - } - - return x.Name == y.Name; - } - - public int GetHashCode(AssemblyName obj) - { - return obj.Name?.GetHashCode() ?? 0; - } - } -} diff --git a/src/Razor/src/rzls/ExportProviderBuilder.cs b/src/Razor/src/rzls/ExportProviderBuilder.cs deleted file mode 100644 index 2f3fbeef46d..00000000000 --- a/src/Razor/src/rzls/ExportProviderBuilder.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.IO; -using System.Threading.Tasks; -using Microsoft.VisualStudio.Composition; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -internal sealed class ExportProviderBuilder -{ - public static async Task CreateExportProviderAsync(string extensionPath) - { - var baseDirectory = Path.GetDirectoryName(extensionPath); - var assemblyLoader = new CustomExportAssemblyLoader(baseDirectory!); - var resolver = new Resolver(assemblyLoader); - - var discovery = PartDiscovery.Combine( - resolver, - new AttributedPartDiscovery(resolver, isNonPublicSupported: true), // "NuGet MEF" attributes (Microsoft.Composition) - new AttributedPartDiscoveryV1(resolver)); - - // TODO - we should likely cache the catalog so we don't have to rebuild it every time. - var parts = await discovery.CreatePartsAsync(new[] { extensionPath! }).ConfigureAwait(true); - var catalog = ComposableCatalog.Create(resolver) - .AddParts(parts) - .WithCompositionService(); // Makes an ICompositionService export available to MEF parts to import - - // Assemble the parts into a valid graph. - var config = CompositionConfiguration.Create(catalog); - - // Verify we have no errors. - config.ThrowOnErrors(); - - // Prepare an ExportProvider factory based on this graph. - var exportProviderFactory = config.CreateExportProviderFactory(); - - // Create an export provider, which represents a unique container of values. - // You can create as many of these as you want, but typically an app needs just one. - var exportProvider = exportProviderFactory.CreateExportProvider(); - - return exportProvider; - } -} diff --git a/src/Razor/src/rzls/LoggerFactory.cs b/src/Razor/src/rzls/LoggerFactory.cs deleted file mode 100644 index c3c1a109348..00000000000 --- a/src/Razor/src/rzls/LoggerFactory.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Immutable; -using Microsoft.CodeAnalysis.Razor.Logging; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -internal sealed class LoggerFactory(ImmutableArray> providers) - : AbstractLoggerFactory(providers) -{ -} diff --git a/src/Razor/src/rzls/LoggerProvider.cs b/src/Razor/src/rzls/LoggerProvider.cs deleted file mode 100644 index 92c0ffd3c0d..00000000000 --- a/src/Razor/src/rzls/LoggerProvider.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting.Logging; -using Microsoft.CodeAnalysis.Razor.Logging; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -internal class LoggerProvider(LogLevelProvider logLevelProvider, IClientConnection clientConnection) : ILoggerProvider -{ - public ILogger CreateLogger(string categoryName) - { - return new LspLogger(categoryName, logLevelProvider, clientConnection); - } -} diff --git a/src/Razor/src/rzls/LspLogger.cs b/src/Razor/src/rzls/LspLogger.cs deleted file mode 100644 index 8dfbc2864c3..00000000000 --- a/src/Razor/src/rzls/LspLogger.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Threading; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting.Logging; -using Microsoft.CodeAnalysis.Razor.Logging; -using Microsoft.VisualStudio.Threading; -using Roslyn.LanguageServer.Protocol; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -/// -/// ILogger implementation that logs via the window/logMessage LSP method -/// -internal class LspLogger(string categoryName, LogLevelProvider logLevelProvider, IClientConnection clientConnection) : ILogger -{ - private LogLevel LogLevel => logLevelProvider.Current; - private readonly string _categoryName = categoryName; - private readonly IClientConnection _clientConnection = clientConnection; - - public bool IsEnabled(LogLevel logLevel) - { - return logLevel.IsAtLeast(LogLevel); - } - - public void Log(LogLevel logLevel, string message, Exception? exception) - { - if (!IsEnabled(logLevel)) - { - return; - } - - var messageType = logLevel switch - { - LogLevel.Critical => MessageType.Error, - LogLevel.Error => MessageType.Error, - LogLevel.Warning => MessageType.Warning, - LogLevel.Information => MessageType.Info, - LogLevel.Debug => MessageType.Debug, - LogLevel.Trace => MessageType.Log, - _ => throw new NotImplementedException(), - }; - - var formattedMessage = LogMessageFormatter.FormatMessage(message, _categoryName, exception, includeTimeStamp: false); - - var @params = new LogMessageParams - { - MessageType = messageType, - Message = formattedMessage, - }; - - _clientConnection.SendNotificationAsync(Methods.WindowLogMessageName, @params, CancellationToken.None).Forget(); - } -} diff --git a/src/Razor/src/rzls/NamedPipeBasedRazorProjectInfoDriver.cs b/src/Razor/src/rzls/NamedPipeBasedRazorProjectInfoDriver.cs deleted file mode 100644 index ffb89e488b2..00000000000 --- a/src/Razor/src/rzls/NamedPipeBasedRazorProjectInfoDriver.cs +++ /dev/null @@ -1,106 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Diagnostics; -using System.IO.Pipes; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting.NamedPipes; -using Microsoft.CodeAnalysis.Razor.Logging; -using Microsoft.CodeAnalysis.Razor.ProjectSystem; -using Microsoft.CodeAnalysis.Razor.Utilities; -using Microsoft.VisualStudio.Threading; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -internal sealed class NamedPipeBasedRazorProjectInfoDriver : AbstractRazorProjectInfoDriver, INamedPipeProjectInfoDriver -{ - private NamedPipeClientStream? _namedPipe; - - public NamedPipeBasedRazorProjectInfoDriver(ILoggerFactory loggerFactory) : base(loggerFactory) - { - StartInitialization(); - } - - public async Task CreateNamedPipeAsync(string pipeName, CancellationToken cancellationToken) - { - Assumed.True(_namedPipe is null); - Logger.LogTrace($"Connecting to named pipe {pipeName} on PID: {Process.GetCurrentProcess().Id}"); - - _namedPipe = new NamedPipeClientStream(".", pipeName, PipeDirection.In, PipeOptions.CurrentUserOnly | PipeOptions.Asynchronous); - await _namedPipe.ConnectAsync(cancellationToken).ConfigureAwait(false); - - // Don't block reading the stream on the caller of this - ReadFromStreamAsync(DisposalToken).Forget(); - } - - protected override Task InitializeAsync(CancellationToken cancellationToken) => Task.CompletedTask; - - protected override void OnDispose() - { - _namedPipe?.Dispose(); - _namedPipe = null; - } - - private async Task ReadFromStreamAsync(CancellationToken cancellationToken) - { - Logger.LogTrace($"Starting read from named pipe."); - var failedActionReads = 0; - - while ( - _namedPipe is { IsConnected: true } && - !cancellationToken.IsCancellationRequested) - { - RazorProjectInfoAction? projectInfoAction; - try - { - projectInfoAction = _namedPipe.ReadProjectInfoAction(); - } - catch - { - if (failedActionReads++ > 0) - { - throw; - } - - Logger.LogError("Failed to read ProjectInfoAction from stream"); - continue; - } - - if (failedActionReads > 0) - { - Logger.LogInformation($"Failed {failedActionReads} times but things may be back on track"); - } - - failedActionReads = 0; - - try - { - switch (projectInfoAction) - { - case RazorProjectInfoAction.Remove: - Logger.LogTrace($"Attempting to read project id for removal"); - var id = await _namedPipe.ReadProjectInfoRemovalAsync(cancellationToken).ConfigureAwait(false); - EnqueueRemove(new ProjectKey(id)); - - break; - - case RazorProjectInfoAction.Update: - Logger.LogTrace($"Attempting to read project info for update"); - var projectInfo = await _namedPipe.ReadProjectInfoAsync(cancellationToken).ConfigureAwait(false); - if (projectInfo is not null) - { - EnqueueUpdate(projectInfo); - } - - break; - } - } - catch (Exception ex) - { - Logger.LogError(ex, $"{ex.Message}"); - } - } - } -} diff --git a/src/Razor/src/rzls/Program.cs b/src/Razor/src/rzls/Program.cs deleted file mode 100644 index c163ae6466a..00000000000 --- a/src/Razor/src/rzls/Program.cs +++ /dev/null @@ -1,160 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting.Diagnostics; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting.Logging; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting.NamedPipes; -using Microsoft.AspNetCore.Razor.Utilities; -using Microsoft.CodeAnalysis.Razor.Logging; -using Microsoft.CodeAnalysis.Razor.ProjectSystem; -using Microsoft.CodeAnalysis.Razor.Telemetry; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.VisualStudio.Composition; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -public class Program -{ - public static async Task Main(string[] args) - { - var logLevel = LogLevel.Information; - var telemetryLevel = string.Empty; - var sessionId = string.Empty; - var telemetryExtensionPath = string.Empty; - - for (var i = 0; i < args.Length; i++) - { - if (args[i].Contains("debug", StringComparison.OrdinalIgnoreCase)) - { - await Console.Error.WriteLineAsync($"Server started with process ID {Environment.ProcessId}").ConfigureAwait(true); - if (PlatformInformation.IsWindows) - { - // Debugger.Launch() only works on Windows. - Debugger.Launch(); - } - else - { - var timeout = TimeSpan.FromMinutes(1); - await Console.Error.WriteLineAsync($"Waiting {timeout:g} for a debugger to attach").ConfigureAwait(true); - using var timeoutSource = new CancellationTokenSource(timeout); - while (!Debugger.IsAttached && !timeoutSource.Token.IsCancellationRequested) - { - await Task.Delay(100, CancellationToken.None).ConfigureAwait(true); - } - } - - continue; - } - - if (args[i] == "--logLevel" && i + 1 < args.Length) - { - var logLevelArg = args[++i]; - if (!Enum.TryParse(logLevelArg, out logLevel)) - { - logLevel = LogLevel.Information; - await Console.Error.WriteLineAsync($"Invalid Razor log level '{logLevelArg}'. Defaulting to {logLevel}.").ConfigureAwait(true); - } - } - - if (args[i] == "--telemetryLevel" && i + 1 < args.Length) - { - telemetryLevel = args[++i]; - } - - if (args[i] == "--sessionId" && i + 1 < args.Length) - { - sessionId = args[++i]; - } - - if (args[i] == "--telemetryExtensionPath" && i + 1 < args.Length) - { - telemetryExtensionPath = args[++i]; - } - } - - var languageServerFeatureOptions = new ConfigurableLanguageServerFeatureOptions(args); - - using var telemetryContext = await TryGetTelemetryReporterAsync(telemetryLevel, sessionId, telemetryExtensionPath).ConfigureAwait(true); - - // Have to create a logger factory to give to the server, but can't create any logger providers until we have - // a server. - var loggerFactory = new LoggerFactory([]); - var logLevelProvider = new LogLevelProvider(logLevel); - - using var host = RazorLanguageServerHost.Create( - Console.OpenStandardInput(), - Console.OpenStandardOutput(), - loggerFactory, - telemetryContext?.TelemetryReporter ?? NoOpTelemetryReporter.Instance, - featureOptions: languageServerFeatureOptions, - configureServices: services => - { - services.AddSingleton(); - services.AddHandler(); - services.AddHandlerWithCapabilities(); - - services.AddSingleton(logLevelProvider); - services.AddHandler(); - }); - - // Now we have a server, and hence a connection, we have somewhere to log - var clientConnection = host.GetRequiredService(); - var loggerProvider = new LoggerProvider(logLevelProvider, clientConnection); - loggerFactory.AddLoggerProvider(loggerProvider); - - loggerFactory.GetOrCreateLogger("RZLS").LogInformation($"Razor Language Server started successfully."); - - await host.WaitForExitAsync().ConfigureAwait(true); - } - - private static async Task TryGetTelemetryReporterAsync(string telemetryLevel, string sessionId, string telemetryExtensionPath) - { - ExportProvider? exportProvider = null; - if (!telemetryExtensionPath.IsNullOrEmpty()) - { - try - { - exportProvider = await ExportProviderBuilder - .CreateExportProviderAsync(telemetryExtensionPath) - .ConfigureAwait(true); - - // Initialize the telemetry reporter if available - var devKitTelemetryReporter = exportProvider.GetExports().SingleOrDefault()?.Value; - - if (devKitTelemetryReporter is ITelemetryReporterInitializer initializer) - { - initializer.InitializeSession(telemetryLevel, sessionId, isDefaultSession: true); - return new TelemetryContext(exportProvider, devKitTelemetryReporter); - } - else - { - exportProvider.Dispose(); - } - } - catch (Exception ex) - { - await Console.Error.WriteLineAsync($"Failed to load telemetry extension in {telemetryExtensionPath}.").ConfigureAwait(true); - await Console.Error.WriteLineAsync(ex.ToString()).ConfigureAwait(true); - exportProvider?.Dispose(); - } - } - - return null; - } - - private readonly record struct TelemetryContext(IDisposable ExportProvider, ITelemetryReporter TelemetryReporter) : IDisposable - { - public void Dispose() - { - // No need to explicitly dispose of the telemetry reporter. The lifetime - // is managed by the ExportProvider and will be disposed with it. - ExportProvider.Dispose(); - } - } -} diff --git a/src/Razor/src/rzls/PublishAllRids.targets b/src/Razor/src/rzls/PublishAllRids.targets deleted file mode 100644 index a035664d84c..00000000000 --- a/src/Razor/src/rzls/PublishAllRids.targets +++ /dev/null @@ -1,32 +0,0 @@ - - - - false - <_RazorPublishReadyToRun>false - <_RazorPublishReadyToRun Condition="'$(Configuration)' == 'Release'">true - - - - - - - - - - - - - - PackRuntimeIdentifier=%(RuntimeIdentifierForPack.Identity) - - - - - - diff --git a/src/Razor/src/rzls/rzls.csproj b/src/Razor/src/rzls/rzls.csproj deleted file mode 100644 index e7ac625f83f..00000000000 --- a/src/Razor/src/rzls/rzls.csproj +++ /dev/null @@ -1,122 +0,0 @@ - - - - $(NetVSCode) - Exe - - Razor is a markup syntax for adding server-side logic to web pages. This package - contains a Razor language server. - - Microsoft.AspNetCore.Razor.LanguageServer - false - true - LatestMajor - - true - - $(PackRuntimeIdentifier) - - - false - - $(AssemblyName).$(PackRuntimeIdentifier) - - - PackPublishContent;$(BeforePack) - - - $(NoWarn);NU5100;NETSDK1206 - - - false - $(ArtifactsDir)LanguageServer\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier) - $(ArtifactsDir)LanguageServer\$(Configuration)\$(TargetFramework)\neutral - - - - $(TargetRid) - win-x64;win-arm64;linux-x64;linux-arm64;linux-musl-x64;linux-musl-arm64;osx-x64;osx-arm64 - - true - - - - - - PackRuntimeIdentifier - - - - - - - - - - PreserveNewest - - - - PreserveNewest - - - - PreserveNewest - - - - - - - - true - content\LanguageServer\$(PackRuntimeIdentifier) - false - None - - - - - - - diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor.Test/RazorSyntaxFactsServiceTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor.Test/RazorSyntaxFactsServiceTest.cs index 522bc96bcc0..b455ba332b3 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor.Test/RazorSyntaxFactsServiceTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.ExternalAccess.LegacyEditor.Test/RazorSyntaxFactsServiceTest.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Xunit; using Xunit.Abstractions; @@ -98,7 +97,7 @@ private IRazorCodeDocument GetCodeDocument(string source) var sourceDocument = TestRazorSourceDocument.Create(source, normalizeNewLines: true); var importDocument = TestRazorSourceDocument.Create("@addTagHelper *, TestAssembly", filePath: "import.cshtml", relativePath: "import.cshtml"); - var codeDocument = engine.ProcessDesignTime(sourceDocument, RazorFileKind.Legacy, importSources: ImmutableArray.Create(importDocument), new[] { taghelper }); + var codeDocument = engine.ProcessDesignTime(sourceDocument, RazorFileKind.Legacy, importSources: [importDocument], [taghelper]); return RazorWrapperFactory.WrapCodeDocument(codeDocument); } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.NetFx.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.NetFx.cs index 6547d314f6b..7b0fdb3e12b 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.NetFx.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.NetFx.cs @@ -27,7 +27,6 @@ public async Task Handle_SingleProvider_InvokesProvider() var insertProvider = new TestOnAutoInsertProvider(">", canResolve: true); var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider]), @@ -76,7 +75,6 @@ public async Task Handle_MultipleProviderSameTrigger_UsesSuccessful() }; var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider1, insertProvider2]), @@ -128,7 +126,6 @@ public async Task Handle_MultipleProviderSameTrigger_UsesFirstSuccessful() }; var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider1, insertProvider2]), @@ -172,7 +169,6 @@ public async Task Handle_NoApplicableProvider_CallsProviderAndReturnsNull() var insertProvider = new TestOnAutoInsertProvider(">", canResolve: false); var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider]), @@ -214,7 +210,6 @@ public async Task Handle_OnTypeFormattingOff_Html_CallsLanguageServer() var insertProvider = new TestOnAutoInsertProvider("<", canResolve: false); var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider]), @@ -254,7 +249,6 @@ public async Task Handle_AutoInsertAttributeQuotesOff_Html_DoesNotCallLanguageSe var insertProvider = new TestOnAutoInsertProvider("<", canResolve: false); var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider]), @@ -399,7 +393,6 @@ private async Task VerifyCSharpOnAutoInsertAsync(string input, string expected, var insertProvider = new TestOnAutoInsertProvider("!!!", canResolve: false); var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider]), diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.cs index bbc18f05e16..ebaa78585ee 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.cs @@ -27,7 +27,6 @@ public async Task Handle_MultipleProviderUnmatchingTrigger_ReturnsNull() var insertProvider2 = new TestOnAutoInsertProvider("<", canResolve: true); var autoInsertService = new AutoInsertService([insertProvider1, insertProvider2]); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, autoInsertService, @@ -68,7 +67,6 @@ public async Task Handle_DocumentNotFound_ReturnsNull() var optionsMonitor = GetOptionsMonitor(); var insertProvider = new TestOnAutoInsertProvider(">", canResolve: true); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider]), @@ -110,7 +108,6 @@ public async Task Handle_OnTypeFormattingOff_CSharp_ReturnsNull() var optionsMonitor = GetOptionsMonitor(formatOnType: false); var insertProvider = new TestOnAutoInsertProvider(">", canResolve: false); var endpoint = new OnAutoInsertEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, new AutoInsertService([insertProvider]), diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/RazorOnAutoInsertProviderTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/RazorOnAutoInsertProviderTestBase.cs index c10d481c6fc..f591a868349 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/RazorOnAutoInsertProviderTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/RazorOnAutoInsertProviderTestBase.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; using Microsoft.CodeAnalysis.Razor.AutoInsert; @@ -22,7 +21,7 @@ protected void RunAutoInsertTest( string expected, bool enableAutoClosingTags = true, RazorFileKind? fileKind = null, - ImmutableArray tagHelpers = default) + TagHelperCollection? tagHelpers = null) { // Arrange TestFileMarkupParser.GetPosition(input, out input, out var location); @@ -54,11 +53,11 @@ private static SourceText ApplyEdit(SourceText source, TextEdit edit) private static RazorCodeDocument CreateCodeDocument( SourceText text, string path, - ImmutableArray tagHelpers, + TagHelperCollection? tagHelpers, RazorFileKind? fileKind = null) { var fileKindValue = fileKind ?? RazorFileKind.Component; - tagHelpers = tagHelpers.NullToEmpty(); + tagHelpers ??= []; var sourceDocument = RazorSourceDocument.Create(text, RazorSourceDocumentProperties.Create(path, path)); var projectEngine = RazorProjectEngine.Create(builder => diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CSharp/CSharpCodeActionProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CSharp/CSharpCodeActionProviderTest.cs index 169222c6cb7..691443b93ab 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CSharp/CSharpCodeActionProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CSharp/CSharpCodeActionProviderTest.cs @@ -242,7 +242,7 @@ public async Task ProvideAsync_InvalidCodeActions_ShowAllFeatureFlagOn_ReturnsCo var context = CreateRazorCodeActionContext(request, cursorPosition, documentPath, contents, new SourceSpan(8, 4)); - var options = new ConfigurableLanguageServerFeatureOptions(new[] { $"--{nameof(ConfigurableLanguageServerFeatureOptions.ShowAllCSharpCodeActions)}" }); + var options = new TestLanguageServerFeatureOptions(showAllCSharpCodeActions: true); var provider = new CSharpCodeActionProvider(options); ImmutableArray codeActions = @@ -307,11 +307,11 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( bool supportsFileCreation = true, bool supportsCodeActionResolve = true) { - var tagHelpers = ImmutableArray.Empty; + var tagHelpers = TagHelperCollection.Empty; var sourceDocument = TestRazorSourceDocument.Create(text, filePath: filePath, relativePath: filePath); var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(tagHelpers); + builder.SetTagHelpers(tagHelpers); builder.ConfigureParserOptions(builder => { @@ -325,7 +325,7 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( var diagnosticDescriptor = new RazorDiagnosticDescriptor("RZ10012", "diagnostic", RazorDiagnosticSeverity.Error); var diagnostic = RazorDiagnostic.Create(diagnosticDescriptor, componentSourceSpan); var csharpDocumentWithDiagnostic = new RazorCSharpDocument(codeDocument, csharpDocument.Text, [diagnostic]); - codeDocument.SetCSharpDocument(csharpDocumentWithDiagnostic); + codeDocument = codeDocument.WithCSharpDocument(csharpDocumentWithDiagnostic); var documentSnapshotMock = new StrictMock(); documentSnapshotMock diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CSharp/TypeAccessibilityCodeActionProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CSharp/TypeAccessibilityCodeActionProviderTest.cs index b21cce5223a..97632aad97b 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CSharp/TypeAccessibilityCodeActionProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CSharp/TypeAccessibilityCodeActionProviderTest.cs @@ -431,12 +431,12 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( var fullyQualifiedComponent = TagHelperDescriptorBuilder.CreateComponent("Fully.Qualified.Component", "TestAssembly"); fullyQualifiedComponent.TagMatchingRule(rule => rule.TagName = "Fully.Qualified.Component"); - var tagHelpers = ImmutableArray.Create(shortComponent.Build(), fullyQualifiedComponent.Build()); + TagHelperCollection tagHelpers = [shortComponent.Build(), fullyQualifiedComponent.Build()]; var sourceDocument = TestRazorSourceDocument.Create(text, filePath: filePath, relativePath: filePath); var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(tagHelpers); + builder.SetTagHelpers(tagHelpers); builder.AddDirective(InjectDirective.Directive); builder.ConfigureParserOptions(builder => @@ -451,7 +451,7 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( var diagnosticDescriptor = new RazorDiagnosticDescriptor("RZ10012", "diagnostic", RazorDiagnosticSeverity.Error); var diagnostic = RazorDiagnostic.Create(diagnosticDescriptor, componentSourceSpan); var csharpDocumentWithDiagnostic = new RazorCSharpDocument(codeDocument, csharpDocument.Text, [diagnostic]); - codeDocument.SetCSharpDocument(csharpDocumentWithDiagnostic); + codeDocument = codeDocument.WithCSharpDocument(csharpDocumentWithDiagnostic); var documentSnapshotMock = new StrictMock(); documentSnapshotMock diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTest.NetFx.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTest.NetFx.cs index b4fa852f71d..da59332bea5 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTest.NetFx.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTest.NetFx.cs @@ -11,8 +11,6 @@ using Microsoft.CodeAnalysis.Razor.Formatting; using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Testing; -using Microsoft.CodeAnalysis.Text; -using Roslyn.Test.Utilities; using Xunit; using Xunit.Abstractions; diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTestBase.NetFx.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTestBase.NetFx.cs index 02ab7f1c1f6..4a2a685ef8e 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTestBase.NetFx.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTestBase.NetFx.cs @@ -283,12 +283,13 @@ internal async Task GetEditsAsync( Assert.NotNull(resolveResult.Edit); var workspaceEdit = resolveResult.Edit; - Assert.True(workspaceEdit.TryGetTextDocumentEdits(out var documentEdits)); + var documentEdits = workspaceEdit.EnumerateTextDocumentEdits().ToArray(); + Assert.NotEmpty(documentEdits); return documentEdits; } - internal static ImmutableArray CreateTagHelperDescriptors() + internal static TagHelperCollection CreateTagHelperDescriptors() { return [.. BuildTagHelpers()]; diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Html/HtmlCodeActionProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Html/HtmlCodeActionProviderTest.cs index 40cf81cf18c..3802f1e78d0 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Html/HtmlCodeActionProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Html/HtmlCodeActionProviderTest.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Immutable; +using System.Linq; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -17,6 +18,7 @@ using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Razor.Protocol.CodeActions; using Microsoft.CodeAnalysis.Testing; +using Microsoft.CodeAnalysis.Text; using Moq; using Xunit; using Xunit.Abstractions; @@ -73,24 +75,16 @@ public async Task ProvideAsync_RemapsAndFixesEdits() var context = CreateRazorCodeActionContext(request, cursorPosition, documentPath, contents); - var remappedEdit = new WorkspaceEdit - { - DocumentChanges = new TextDocumentEdit[] - { - new() { - TextDocument = new OptionalVersionedTextDocumentIdentifier - { - DocumentUri = new(new Uri(documentPath)), - }, - Edits = [LspFactory.CreateTextEdit(context.SourceText.GetRange(span), "Goo /*~~~~~~~~~~~*/ Bar")] - } - } - }; - var editMappingServiceMock = new StrictMock(); editMappingServiceMock - .Setup(x => x.RemapWorkspaceEditAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(remappedEdit); + .Setup(x => x.MapWorkspaceEditAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((_, edit, _) => + { + var textDocumentEdit = edit.EnumerateTextDocumentEdits().First(); + textDocumentEdit.TextDocument.DocumentUri = new(documentPath); + textDocumentEdit.Edits = [LspFactory.CreateTextEdit(context.SourceText.GetRange(span), "Goo /*~~~~~~~~~~~*/ Bar")]; + }) + .Returns(Task.CompletedTask); var provider = new HtmlCodeActionProvider(editMappingServiceMock.Object); @@ -121,18 +115,13 @@ public async Task ProvideAsync_RemapsAndFixesEdits() // Assert var action = Assert.Single(providedCodeActions); Assert.NotNull(action.Edit); - Assert.True(action.Edit.TryGetTextDocumentEdits(out var documentEdits)); + var documentEdits = action.Edit.EnumerateTextDocumentEdits().ToArray(); + Assert.NotEmpty(documentEdits); Assert.Equal(documentPath, documentEdits[0].TextDocument.DocumentUri.GetRequiredParsedUri().AbsolutePath); - // Edit should be converted to 2 edits, to remove the tags - Assert.Collection(documentEdits[0].Edits, - e => - { - Assert.Equal("", ((TextEdit)e).NewText); - }, - e => - { - Assert.Equal("", ((TextEdit)e).NewText); - }); + + var text = SourceText.From(contents); + var changed = text.WithChanges(documentEdits[0].Edits.Select(e => text.GetTextChange((TextEdit)e))); + Assert.Equal("Goo @(DateTime.Now) Bar", changed.ToString()); } private static RazorCodeActionContext CreateRazorCodeActionContext( @@ -143,11 +132,11 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( bool supportsFileCreation = true, bool supportsCodeActionResolve = true) { - var tagHelpers = ImmutableArray.Empty; + var tagHelpers = TagHelperCollection.Empty; var sourceDocument = TestRazorSourceDocument.Create(text, filePath: filePath, relativePath: filePath); var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(tagHelpers); + builder.SetTagHelpers(tagHelpers); builder.ConfigureParserOptions(builder => { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Html/HtmlCodeActionResolverTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Html/HtmlCodeActionResolverTest.cs index 0855a7826aa..ab3bbb6f40d 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Html/HtmlCodeActionResolverTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Html/HtmlCodeActionResolverTest.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem; @@ -13,6 +14,7 @@ using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Testing; +using Microsoft.CodeAnalysis.Text; using Moq; using Xunit; using Xunit.Abstractions; @@ -33,29 +35,17 @@ public async Task ResolveAsync_RemapsAndFixesEdits() var documentContextFactory = CreateDocumentContextFactory(documentUri, contents); Assert.True(documentContextFactory.TryCreate(documentUri, out var context)); var sourceText = await context.GetSourceTextAsync(DisposalToken); - var remappedEdit = new WorkspaceEdit - { - DocumentChanges = new TextDocumentEdit[] - { - new() { - TextDocument = new OptionalVersionedTextDocumentIdentifier - { - DocumentUri = new(documentUri), - }, - Edits = [LspFactory.CreateTextEdit(sourceText.GetRange(span), "Goo /*~~~~~~~~~~~*/ Bar")] - } - } - }; - - var resolvedCodeAction = new RazorVSInternalCodeAction - { - Edit = remappedEdit - }; var editMappingServiceMock = new StrictMock(); editMappingServiceMock - .Setup(x => x.RemapWorkspaceEditAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(remappedEdit); + .Setup(x => x.MapWorkspaceEditAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((_, edit, _) => + { + var textDocumentEdit = edit.EnumerateTextDocumentEdits().First(); + textDocumentEdit.TextDocument.DocumentUri = new(documentPath); + textDocumentEdit.Edits = [LspFactory.CreateTextEdit(sourceText.GetRange(span), "Goo /*~~~~~~~~~~~*/ Bar")]; + }) + .Returns(Task.CompletedTask); var resolver = new HtmlCodeActionResolver(editMappingServiceMock.Object); @@ -65,16 +55,16 @@ public async Task ResolveAsync_RemapsAndFixesEdits() Edit = new WorkspaceEdit { DocumentChanges = new TextDocumentEdit[] + { + new() + { + TextDocument = new OptionalVersionedTextDocumentIdentifier { - new() - { - TextDocument = new OptionalVersionedTextDocumentIdentifier - { DocumentUri = new(new Uri("c:/Test.razor.html")), - }, - Edits = [LspFactory.CreateTextEdit(position: (0, 0), "Goo")] - } - } + }, + Edits = [LspFactory.CreateTextEdit(position: (0, 0), "Goo")] + } + } } }; @@ -83,17 +73,12 @@ public async Task ResolveAsync_RemapsAndFixesEdits() // Assert Assert.NotNull(action.Edit); - Assert.True(action.Edit.TryGetTextDocumentEdits(out var documentEdits)); + var documentEdits = action.Edit.EnumerateTextDocumentEdits().ToArray(); + Assert.NotEmpty(documentEdits); Assert.Equal(documentPath, documentEdits[0].TextDocument.DocumentUri.GetRequiredParsedUri().AbsolutePath); - // Edit should be converted to 2 edits, to remove the tags - Assert.Collection(documentEdits[0].Edits, - e => - { - Assert.Equal("", ((TextEdit)e).NewText); - }, - e => - { - Assert.Equal("", ((TextEdit)e).NewText); - }); + + var text = SourceText.From(contents); + var changed = text.WithChanges(documentEdits[0].Edits.Select(e => text.GetTextChange((TextEdit)e))); + Assert.Equal("Goo @(DateTime.Now) Bar", changed.ToString()); } } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ComponentAccessibilityCodeActionProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ComponentAccessibilityCodeActionProviderTest.cs index ead20806c3e..c90631c81ae 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ComponentAccessibilityCodeActionProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ComponentAccessibilityCodeActionProviderTest.cs @@ -466,12 +466,12 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( fullyQualifiedGenericComponent.CaseSensitive = true; fullyQualifiedGenericComponent.TagMatchingRule(rule => rule.TagName = "Fully.Qualified.GenericComponent"); - var tagHelpers = ImmutableArray.Create(shortComponent.Build(), fullyQualifiedComponent.Build(), shortGenericComponent.Build(), fullyQualifiedGenericComponent.Build()); + TagHelperCollection tagHelpers = [shortComponent.Build(), fullyQualifiedComponent.Build(), shortGenericComponent.Build(), fullyQualifiedGenericComponent.Build()]; var sourceDocument = TestRazorSourceDocument.Create(text, filePath: filePath, relativePath: filePath); var projectEngine = RazorProjectEngine.Create(builder => { - builder.AddTagHelpers(tagHelpers); + builder.SetTagHelpers(tagHelpers); builder.ConfigureParserOptions(builder => { @@ -487,7 +487,7 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( var diagnosticDescriptor = new RazorDiagnosticDescriptor("RZ10012", "diagnostic", RazorDiagnosticSeverity.Error); var diagnostic = RazorDiagnostic.Create(diagnosticDescriptor, componentSourceSpan); var csharpDocumentWithDiagnostic = new RazorCSharpDocument(codeDocument, csharpDocument.Text, [diagnostic]); - codeDocument.SetCSharpDocument(csharpDocumentWithDiagnostic); + codeDocument = codeDocument.WithCSharpDocument(csharpDocumentWithDiagnostic); var documentSnapshotMock = new StrictMock(); documentSnapshotMock diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/CreateComponentCodeActionResolverTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/CreateComponentCodeActionResolverTest.cs index e41476274ec..913ff6575e1 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/CreateComponentCodeActionResolverTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/CreateComponentCodeActionResolverTest.cs @@ -66,7 +66,7 @@ public async Task Handle_CreateComponent() Assert.Equal(1, workspaceEdit.DocumentChanges.Value.Count()); var createFileChange = workspaceEdit.DocumentChanges.Value.First(); - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); } [Fact] @@ -97,7 +97,7 @@ @namespace Another.Namespace Assert.Equal(2, workspaceEdit.DocumentChanges.Value.Count()); var createFileChange = workspaceEdit.DocumentChanges.Value.First(); - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editNewComponentChange = workspaceEdit.DocumentChanges.Value.Last(); var editNewComponentEdit = editNewComponentChange.First.Edits.First(); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionProviderTest.cs index 2f3113c76ca..b082cf5742a 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionProviderTest.cs @@ -399,7 +399,7 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( var syntaxTree = RazorSyntaxTree.Parse(source, codeDocument.ParserOptions); - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); var documentSnapshotMock = new StrictMock(); documentSnapshotMock diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionResolverTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionResolverTest.cs index e91121970d4..a2b2c94f76a 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionResolverTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionResolverTest.cs @@ -60,7 +60,7 @@ public async Task Handle_ExtractCodeBlock() var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var textDocumentEdit1)); @@ -125,7 +125,7 @@ public async Task Handle_ExtractCodeBlock2() var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var textDocumentEdit1)); @@ -198,7 +198,7 @@ private void M() var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var textDocumentEdit1)); @@ -281,7 +281,7 @@ private void M() var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var textDocumentEdit1)); @@ -366,7 +366,7 @@ private void M() var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var textDocumentEdit1)); @@ -439,7 +439,7 @@ public async Task Handle_ExtractFunctionsBlock() var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var editCodeDocument)); @@ -504,7 +504,7 @@ @using System.Diagnostics var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var editCodeDocument)); @@ -571,7 +571,7 @@ public async Task Handle_ExtractCodeBlockWithDirectives() var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var textDocumentEdit1)); @@ -642,7 +642,7 @@ public async Task Handle_ExtractCodeBlock_CallsRoslyn() var documentChanges = workspaceEdit.DocumentChanges.Value.ToArray(); var createFileChange = documentChanges[0]; - Assert.True(createFileChange.TryGetSecond(out var _)); + Assert.True(createFileChange.TryGetSecond(out _)); var editCodeDocumentChange = documentChanges[1]; Assert.True(editCodeDocumentChange.TryGetFirst(out var textDocumentEdit1)); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionProviderTest.cs index e396e1fcfe5..305184d260e 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionProviderTest.cs @@ -627,7 +627,7 @@ private static RazorCodeActionContext CreateRazorCodeActionContext( var syntaxTree = RazorSyntaxTree.Parse(source, codeDocument.ParserOptions); - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); var documentSnapshot = new StrictMock(); documentSnapshot diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/CompletionListProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/CompletionListProviderTest.cs index 6b5606c2352..83cf9383351 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/CompletionListProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/CompletionListProviderTest.cs @@ -9,8 +9,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.LanguageServer.Completion.Delegation; +using Microsoft.AspNetCore.Razor.LanguageServer.Test; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis.Razor.Completion; using Microsoft.CodeAnalysis.Razor.Logging; using Microsoft.CodeAnalysis.Razor.ProjectSystem; @@ -42,7 +42,7 @@ public CompletionListProviderTest(ITestOutputHelper testOutput) _documentContext = TestDocumentContext.Create("C:/path/to/file.cshtml"); _clientCapabilities = new VSInternalClientCapabilities(); _razorCompletionOptions = new RazorCompletionOptions(SnippetsSupported: true, AutoInsertAttributeQuotes: true, CommitElementsWithSpace: true, UseVsCodeCompletionCommitCharacters: false); - _triggerAndCommitCharacters = new(TestLanguageServerFeatureOptions.Instance); + _triggerAndCommitCharacters = new(new TestClientCapabilitiesService(_clientCapabilities)); } [Fact] diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/Delegation/CompletionTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/Delegation/CompletionTestBase.cs index 8f1571980aa..091840a0634 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/Delegation/CompletionTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/Delegation/CompletionTestBase.cs @@ -5,8 +5,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.LanguageServer.Hosting; using Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem; +using Microsoft.AspNetCore.Razor.LanguageServer.Test; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis.Razor; using Microsoft.CodeAnalysis.Razor.Completion; using Microsoft.CodeAnalysis.Razor.DocumentMapping; @@ -62,7 +62,7 @@ private protected DelegatedCompletionListProvider CreateDelegatedCompletionListP documentMappingService ?? DocumentMappingService, clientConnection, completionListCache ?? new(), - completionCharacters ?? new(TestLanguageServerFeatureOptions.Instance)); + completionCharacters ?? new(new TestClientCapabilitiesService(new VSInternalClientCapabilities()))); } private protected static IClientConnection CreateClientConnectionForCompletion( diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/RazorCompletionEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/RazorCompletionEndpointTest.cs index 1a8a5034969..ca2b94511ee 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/RazorCompletionEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/RazorCompletionEndpointTest.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis.Razor.Telemetry; using Xunit; using Xunit.Abstractions; @@ -22,7 +21,7 @@ public async Task Handle_NoDocumentContext_NoCompletionItems() // Arrange var documentPath = "C:/path/to/document.cshtml"; var optionsMonitor = GetOptionsMonitor(); - var completionEndpoint = new RazorCompletionEndpoint(completionListProvider: null, triggerAndCommitCharacters: null, NoOpTelemetryReporter.Instance, optionsMonitor, TestLanguageServerFeatureOptions.Instance); + var completionEndpoint = new RazorCompletionEndpoint(completionListProvider: null, triggerAndCommitCharacters: null, NoOpTelemetryReporter.Instance, optionsMonitor); var request = new CompletionParams() { TextDocument = new TextDocumentIdentifier() @@ -50,7 +49,7 @@ public async Task Handle_AutoShowCompletionDisabled_NoCompletionItems() var uri = new Uri(documentPath); var documentContext = CreateDocumentContext(uri, codeDocument); var optionsMonitor = GetOptionsMonitor(autoShowCompletion: false); - var completionEndpoint = new RazorCompletionEndpoint(completionListProvider: null, triggerAndCommitCharacters: null, NoOpTelemetryReporter.Instance, optionsMonitor, TestLanguageServerFeatureOptions.Instance); + var completionEndpoint = new RazorCompletionEndpoint(completionListProvider: null, triggerAndCommitCharacters: null, NoOpTelemetryReporter.Instance, optionsMonitor); var request = new CompletionParams() { TextDocument = new TextDocumentIdentifier() diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/RazorCompletionItemResolverTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/RazorCompletionItemResolverTest.cs index 93ddda414b7..2aa9d865326 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/RazorCompletionItemResolverTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/RazorCompletionItemResolverTest.cs @@ -145,7 +145,9 @@ public async Task ResolveAsync_DirectiveAttributeParameterCompletion_ReturnsComp var razorCompletionItem = RazorCompletionItem.CreateDirectiveAttributeParameter( displayText: "TestItem", insertText: "TestItem", - _attributeDescription); + _attributeDescription, + commitCharacters: [], + isSnippet: false); var completionList = CreateLSPCompletionList(razorCompletionItem); var completionItem = (VSInternalCompletionItem)completionList.Items.Single(); @@ -235,7 +237,9 @@ public async Task ResolveAsync_VS_DirectiveAttributeParameterCompletion_ReturnsC var razorCompletionItem = RazorCompletionItem.CreateDirectiveAttributeParameter( displayText: "TestItem", insertText: "TestItem", - _attributeDescription); + _attributeDescription, + commitCharacters: [], + isSnippet: false); var completionList = CreateLSPCompletionList(razorCompletionItem); var completionItem = (VSInternalCompletionItem)completionList.Items.Single(); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/TagHelperCompletionProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/TagHelperCompletionProviderTest.cs index 29cc3fc059b..e0e4ccefff1 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/TagHelperCompletionProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/TagHelperCompletionProviderTest.cs @@ -4,7 +4,6 @@ #nullable disable using System.Collections.Generic; -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.AspNetCore.Razor.Test.Common; @@ -561,7 +560,7 @@ public void GetCompletionAt_AtAttributeEdge_IndexerBoolAttribute_ReturnsCompleti """, isRazorFile: false, - tagHelpers: ImmutableArray.Create(tagHelper.Build())); + tagHelpers: [tagHelper.Build()]); // Act var completions = service.GetCompletionItems(context); @@ -604,7 +603,7 @@ public void GetCompletionAt_AtAttributeEdge_IndexerAttribute_ReturnsCompletions( """, isRazorFile: false, - tagHelpers: ImmutableArray.Create(tagHelper.Build())); + tagHelpers: [tagHelper.Build()]); // Act var completions = service.GetCompletionItems(context); @@ -971,17 +970,17 @@ public void GetCompletionAt_ComponentWithEditorRequiredAttributes_SnippetsSuppor """, isRazorFile: true, options, - tagHelpers: ImmutableArray.Create(componentBuilder.Build())); + tagHelpers: [componentBuilder.Build()]); // Act var completions = service.GetCompletionItems(context); // Assert - should have two completions: regular and snippet Assert.Equal(2, completions.Length); - + RazorCompletionItem regularCompletion = null; RazorCompletionItem snippetCompletion = null; - + foreach (var completion in completions) { if (completion.DisplayText == "ComponentWithRequiredParams") @@ -993,11 +992,11 @@ public void GetCompletionAt_ComponentWithEditorRequiredAttributes_SnippetsSuppor snippetCompletion = completion; } } - + Assert.NotNull(regularCompletion); Assert.False(regularCompletion.IsSnippet); Assert.Equal("ComponentWithRequiredParams", regularCompletion.InsertText); - + Assert.NotNull(snippetCompletion); Assert.True(snippetCompletion.IsSnippet); Assert.Contains("RequiredParam1", snippetCompletion.InsertText); @@ -1036,7 +1035,7 @@ public void GetCompletionAt_ComponentWithEditorRequiredAttributes_SnippetsNotSup """, isRazorFile: true, options, - tagHelpers: ImmutableArray.Create(componentBuilder.Build())); + tagHelpers: [componentBuilder.Build()]); // Act var completions = service.GetCompletionItems(context); @@ -1074,7 +1073,7 @@ public void GetCompletionAt_ComponentWithNoEditorRequiredAttributes_SnippetsSupp """, isRazorFile: true, options, - tagHelpers: ImmutableArray.Create(componentBuilder.Build())); + tagHelpers: [componentBuilder.Build()]); // Act var completions = service.GetCompletionItems(context); @@ -1086,9 +1085,13 @@ public void GetCompletionAt_ComponentWithNoEditorRequiredAttributes_SnippetsSupp Assert.Equal("ComponentWithoutRequired", completion.InsertText); } - private static RazorCompletionContext CreateRazorCompletionContext(string markup, bool isRazorFile, RazorCompletionOptions options = default, ImmutableArray tagHelpers = default) + private static RazorCompletionContext CreateRazorCompletionContext( + string markup, + bool isRazorFile, + RazorCompletionOptions options = default, + TagHelperCollection tagHelpers = null) { - tagHelpers = tagHelpers.NullToEmpty(); + tagHelpers ??= []; TestFileMarkupParser.GetPosition(markup, out var documentContent, out var position); var codeDocument = CreateCodeDocument(documentContent, isRazorFile, tagHelpers); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/TagHelperServiceTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/TagHelperServiceTestBase.cs index 778cfcf1672..14eb54161f9 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/TagHelperServiceTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Completion/TagHelperServiceTestBase.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; @@ -11,14 +10,14 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Completion; public abstract class TagHelperServiceTestBase(ITestOutputHelper testOutput) : LanguageServerTestBase(testOutput) { - protected static ImmutableArray DefaultTagHelpers => SimpleTagHelpers.Default; + protected static TagHelperCollection DefaultTagHelpers => SimpleTagHelpers.Default; protected static string GetFileName(bool isRazorFile) => RazorCodeDocumentFactory.GetFileName(isRazorFile); - protected static RazorCodeDocument CreateCodeDocument(string text, bool isRazorFile, params ImmutableArray tagHelpers) + protected static RazorCodeDocument CreateCodeDocument(string text, bool isRazorFile, params TagHelperCollection tagHelpers) => RazorCodeDocumentFactory.CreateCodeDocument(text, isRazorFile, tagHelpers); - protected static RazorCodeDocument CreateCodeDocument(string text, string filePath, params ImmutableArray tagHelpers) + protected static RazorCodeDocument CreateCodeDocument(string text, string filePath, params TagHelperCollection tagHelpers) => RazorCodeDocumentFactory.CreateCodeDocument(text, filePath, tagHelpers); } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/ConfigurableLanguageServerFeatureOptionsTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/ConfigurableLanguageServerFeatureOptionsTest.cs deleted file mode 100644 index e997418bd61..00000000000 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/ConfigurableLanguageServerFeatureOptionsTest.cs +++ /dev/null @@ -1,135 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using Microsoft.AspNetCore.Razor.LanguageServer.Hosting; -using Xunit; - -namespace Microsoft.AspNetCore.Razor.LanguageServer; - -public class ConfigurableLanguageServerFeatureOptionsTest -{ - [Fact] - public void NoArgs_AllDefault() - { - var expected = new DefaultLanguageServerFeatureOptions(); - - var actual = new ConfigurableLanguageServerFeatureOptions(Array.Empty()); - - Assert.Equal(expected.SupportsFileManipulation, actual.SupportsFileManipulation); - Assert.Equal(expected.CSharpVirtualDocumentSuffix, actual.CSharpVirtualDocumentSuffix); - Assert.Equal(expected.HtmlVirtualDocumentSuffix, actual.HtmlVirtualDocumentSuffix); - Assert.Equal(expected.SingleServerSupport, actual.SingleServerSupport); - Assert.Equal(expected.ReturnCodeActionAndRenamePathsWithPrefixedSlash, actual.ReturnCodeActionAndRenamePathsWithPrefixedSlash); - } - - [Fact] - public void ProvideStringOption_OthersDefault() - { - var expected = new DefaultLanguageServerFeatureOptions(); - - var singleServerSupport = !expected.SingleServerSupport; - var args = new[] { "--singleServerSupport", singleServerSupport.ToString() }; - - var actual = new ConfigurableLanguageServerFeatureOptions(args); - - Assert.Equal(expected.SupportsFileManipulation, actual.SupportsFileManipulation); - Assert.Equal(expected.CSharpVirtualDocumentSuffix, actual.CSharpVirtualDocumentSuffix); - Assert.Equal(expected.HtmlVirtualDocumentSuffix, actual.HtmlVirtualDocumentSuffix); - Assert.Equal(singleServerSupport, actual.SingleServerSupport); - Assert.Equal(expected.ReturnCodeActionAndRenamePathsWithPrefixedSlash, actual.ReturnCodeActionAndRenamePathsWithPrefixedSlash); - } - - [Fact] - public void ProvideStringOption_IgnoresNoise() - { - var expected = new DefaultLanguageServerFeatureOptions(); - - var singleServerSupport = !expected.SingleServerSupport; - var args = new[] { "--singleServerSupport", singleServerSupport.ToString(), "ignore", "this" }; - - var actual = new ConfigurableLanguageServerFeatureOptions(args); - - Assert.Equal(expected.SupportsFileManipulation, actual.SupportsFileManipulation); - Assert.Equal(expected.CSharpVirtualDocumentSuffix, actual.CSharpVirtualDocumentSuffix); - Assert.Equal(expected.HtmlVirtualDocumentSuffix, actual.HtmlVirtualDocumentSuffix); - Assert.Equal(singleServerSupport, actual.SingleServerSupport); - Assert.Equal(expected.ReturnCodeActionAndRenamePathsWithPrefixedSlash, actual.ReturnCodeActionAndRenamePathsWithPrefixedSlash); - } - - [Fact] - public void ProvideBoolOption_LastArgument() - { - var expected = new DefaultLanguageServerFeatureOptions(); - - var args = new[] { "hoo", "goo", "--singleServerSupport" }; - - var actual = new ConfigurableLanguageServerFeatureOptions(args); - - // If the default ever changes, this test would be invalid - Assert.False(expected.SingleServerSupport); - Assert.True(actual.SingleServerSupport); - - Assert.Equal(expected.SupportsFileManipulation, actual.SupportsFileManipulation); - Assert.Equal(expected.CSharpVirtualDocumentSuffix, actual.CSharpVirtualDocumentSuffix); - Assert.Equal(expected.HtmlVirtualDocumentSuffix, actual.HtmlVirtualDocumentSuffix); - Assert.Equal(expected.ReturnCodeActionAndRenamePathsWithPrefixedSlash, actual.ReturnCodeActionAndRenamePathsWithPrefixedSlash); - } - - [Fact] - public void ProvideBoolOption_SingleArgument() - { - var expected = new DefaultLanguageServerFeatureOptions(); - - var args = new[] { "--singleServerSupport", "--otherOption", "false" }; - - var actual = new ConfigurableLanguageServerFeatureOptions(args); - - // If the default ever changes, this test would be invalid - Assert.False(expected.SingleServerSupport); - Assert.True(actual.SingleServerSupport); - - Assert.Equal(expected.SupportsFileManipulation, actual.SupportsFileManipulation); - Assert.Equal(expected.CSharpVirtualDocumentSuffix, actual.CSharpVirtualDocumentSuffix); - Assert.Equal(expected.HtmlVirtualDocumentSuffix, actual.HtmlVirtualDocumentSuffix); - Assert.Equal(expected.ReturnCodeActionAndRenamePathsWithPrefixedSlash, actual.ReturnCodeActionAndRenamePathsWithPrefixedSlash); - } - - [Fact] - public void ProvideBoolOption_ExplicitTrue() - { - var expected = new DefaultLanguageServerFeatureOptions(); - - var args = new[] { "--singleServerSupport", "true", "false" }; - - var actual = new ConfigurableLanguageServerFeatureOptions(args); - - // If the default ever changes, this test would be invalid - Assert.False(expected.SingleServerSupport); - Assert.True(actual.SingleServerSupport); - - Assert.Equal(expected.SupportsFileManipulation, actual.SupportsFileManipulation); - Assert.Equal(expected.CSharpVirtualDocumentSuffix, actual.CSharpVirtualDocumentSuffix); - Assert.Equal(expected.HtmlVirtualDocumentSuffix, actual.HtmlVirtualDocumentSuffix); - Assert.Equal(expected.ReturnCodeActionAndRenamePathsWithPrefixedSlash, actual.ReturnCodeActionAndRenamePathsWithPrefixedSlash); - } - - [Fact] - public void ProvideBoolOption_ExplicitFalse() - { - var expected = new DefaultLanguageServerFeatureOptions(); - - var args = new[] { "--supportsFileManipulation", "false", "true" }; - - var actual = new ConfigurableLanguageServerFeatureOptions(args); - - // If the default ever changes, this test would be invalid - Assert.True(expected.SupportsFileManipulation); - Assert.False(actual.SupportsFileManipulation); - - Assert.Equal(expected.CSharpVirtualDocumentSuffix, actual.CSharpVirtualDocumentSuffix); - Assert.Equal(expected.HtmlVirtualDocumentSuffix, actual.HtmlVirtualDocumentSuffix); - Assert.Equal(expected.SingleServerSupport, actual.SingleServerSupport); - Assert.Equal(expected.ReturnCodeActionAndRenamePathsWithPrefixedSlash, actual.ReturnCodeActionAndRenamePathsWithPrefixedSlash); - } -} diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Debugging/DataTipRangeHandlerEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Debugging/DataTipRangeHandlerEndpointTest.cs index 76079879557..625214032f8 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Debugging/DataTipRangeHandlerEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Debugging/DataTipRangeHandlerEndpointTest.cs @@ -2,11 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Collections.Immutable; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem; -using Microsoft.CodeAnalysis.Testing; +using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.CodeAnalysis.Text; using Xunit; using Xunit.Abstractions; @@ -19,10 +18,10 @@ public sealed class DataTipRangeHandlerEndpointTest(ITestOutputHelper testOutput public async Task Handle_CSharpInHtml_DataTipRange_FirstExpression() { var input = """ - @{ - {|expression:{|hover:a$$aa|}|}.bbb.ccc; - } - """; + @{ + {|expression:{|hover:a$$aa|}|}.bbb.ccc; + } + """; await VerifyDataTipRangeAsync(input); } @@ -31,10 +30,10 @@ public async Task Handle_CSharpInHtml_DataTipRange_FirstExpression() public async Task Handle_CSharpInHtml_DataTipRange_SecondExpression() { var input = """ - @{ - {|expression:{|hover:aaa.b$$bb|}|}.ccc; - } - """; + @{ + {|expression:{|hover:aaa.b$$bb|}|}.ccc; + } + """; await VerifyDataTipRangeAsync(input); } @@ -43,10 +42,10 @@ public async Task Handle_CSharpInHtml_DataTipRange_SecondExpression() public async Task Handle_CSharpInHtml_DataTipRange_LastExpression() { var input = """ - @{ - {|expression:{|hover:aaa.bbb.c$$cc|}|}; - } - """; + @{ + {|expression:{|hover:aaa.bbb.c$$cc|}|}; + } + """; await VerifyDataTipRangeAsync(input); } @@ -55,48 +54,43 @@ public async Task Handle_CSharpInHtml_DataTipRange_LastExpression() public async Task Handle_CSharpInHtml_DataTipRange_LinqExpression() { var input = """ - @using System.Linq; + @using System.Linq; - @{ - int[] args; - var v = {|expression:{|hover:args.Se$$lect|}(a => a.ToString())|}.Where(a => a.Length >= 0); - } - """; + @{ + int[] args; + var v = {|expression:{|hover:args.Se$$lect|}(a => a.ToString())|}.Where(a => a.Length >= 0); + } + """; await VerifyDataTipRangeAsync(input, VSInternalDataTipTags.LinqExpression); } - private async Task VerifyDataTipRangeAsync(string input, VSInternalDataTipTags dataTipTags = 0) + private async Task VerifyDataTipRangeAsync(TestCode input, VSInternalDataTipTags dataTipTags = 0) { // Arrange - TestFileMarkupParser.GetPositionAndSpans(input, out var output, out int position, out ImmutableDictionary> spans); - - Assert.True(spans.TryGetValue("expression", out var expressionSpans), "Test authoring failure: Expected at least one span named 'expression'."); - Assert.True(expressionSpans.Length == 1, "Test authoring failure: Expected only one 'expression' span."); - Assert.True(spans.TryGetValue("hover", out var hoverSpans), "Test authoring failure: Expected at least one span named 'hover'."); - Assert.True(hoverSpans.Length == 1, "Test authoring failure: Expected only one 'hover' span."); - - var codeDocument = CreateCodeDocument(output); + var codeDocument = CreateCodeDocument(input.Text); var razorFilePath = "C:/path/to/file.razor"; // Act - var result = await GetDataTipRangeAsync(codeDocument, razorFilePath, position); + var result = await GetDataTipRangeAsync(codeDocument, razorFilePath, input.Position); // Assert - var expectedExpressionRange = codeDocument.Source.Text.GetRange(expressionSpans[0]); + var expectedExpressionSpan = input.GetNamedSpans("expression")[0]; + var expectedExpressionRange = codeDocument.Source.Text.GetRange(expectedExpressionSpan); Assert.Equal(expectedExpressionRange, result!.ExpressionRange); - var expectedHoverRange = codeDocument.Source.Text.GetRange(hoverSpans[0]); - Assert.Equal(expectedHoverRange, result!.HoverRange); + var expectedHoverSpan = input.GetNamedSpans("hover")[0]; + var expectedHoverRange = codeDocument.Source.Text.GetRange(expectedHoverSpan); + Assert.Equal(expectedHoverRange, result.HoverRange); - Assert.Equal(dataTipTags, result!.DataTipTags); + Assert.Equal(dataTipTags, result.DataTipTags); } private async Task GetDataTipRangeAsync(RazorCodeDocument codeDocument, string razorFilePath, int position) { await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath); - var endpoint = new DataTipRangeHandlerEndpoint(DocumentMappingService, LanguageServerFeatureOptions, languageServer, LoggerFactory); + var endpoint = new DataTipRangeHandlerEndpoint(DocumentMappingService, languageServer, LoggerFactory); var request = new TextDocumentPositionParams { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Debugging/ValidateBreakpointRangeEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Debugging/ValidateBreakpointRangeEndpointTest.cs index c8bbd70da09..aab806ac610 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Debugging/ValidateBreakpointRangeEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Debugging/ValidateBreakpointRangeEndpointTest.cs @@ -138,7 +138,7 @@ private async Task VerifyBreakpointRangeAsync(string input) { await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath); - var endpoint = new ValidateBreakpointRangeEndpoint(DocumentMappingService, LanguageServerFeatureOptions, languageServer, LoggerFactory); + var endpoint = new ValidateBreakpointRangeEndpoint(DocumentMappingService, languageServer, LoggerFactory); var request = new ValidateBreakpointRangeParams { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Definition/DefinitionEndpointDelegationTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Definition/DefinitionEndpointDelegationTest.cs index 5087d2bef4f..5d4b8867a39 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Definition/DefinitionEndpointDelegationTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Definition/DefinitionEndpointDelegationTest.cs @@ -194,7 +194,10 @@ @namespace BlazorApp1.Shared // Our tests don't currently support mapping multiple documents, so we just need to verify Roslyn sent back the right info. // Other tests verify mapping behavior - Assert.EndsWith("SurveyPrompt.razor.ide.g.cs", location.DocumentUri.UriString); + + Assert.NotNull(DocumentContextFactory); + Assert.True(DocumentContextFactory.TryCreate(new Uri(razorFilePath), out var docContext)); + Assert.EndsWith(FilePathService.GetRazorCSharpFilePath(docContext.Snapshot.Project.Key, "SurveyPrompt.razor"), location.DocumentUri.UriString); // We can still expect the character to be correct, even if the line won't match var surveyPromptSourceText = SourceText.From(surveyPrompt); @@ -245,7 +248,7 @@ await projectManager.UpdateAsync(updater => Assert.True(DocumentContextFactory.TryCreate(razorUri, out var documentContext)); var requestContext = CreateRazorRequestContext(documentContext); - var endpoint = new DefinitionEndpoint(definitionService, DocumentMappingService, projectManager, LanguageServerFeatureOptions, languageServer, LoggerFactory); + var endpoint = new DefinitionEndpoint(definitionService, DocumentMappingService, projectManager, languageServer, LoggerFactory); var request = new TextDocumentPositionParams { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Definition/RazorComponentDefinitionHelpersTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Definition/RazorComponentDefinitionHelpersTest.cs index 47cf8c5c5dc..35481d3bd1f 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Definition/RazorComponentDefinitionHelpersTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Definition/RazorComponentDefinitionHelpersTest.cs @@ -197,11 +197,11 @@ public void Increment() } """; - VerifyTryGetBoundTagHelpers(content, ignoreComponentAttributes: true); + VerifyTryGetBoundTagHelpers(content); } [Fact] - public void TryGetBoundTagHelpers_TagHelper_PropertyAttribute() + public void TryGetBoundTagHelpers_TagHelper_NotOnPropertyAttribute() { var content = """ @addTagHelper *, TestAssembly @@ -213,11 +213,11 @@ public void Increment() } """; - VerifyTryGetBoundTagHelpers(content, "Component1TagHelper", "BoolVal"); + VerifyTryGetBoundTagHelpers(content); } [Fact] - public void TryGetBoundTagHelpers_TagHelper_MinimizedPropertyAttribute() + public void TryGetBoundTagHelpers_TagHelper_NotOnMinimizedPropertyAttribute() { var content = """ @addTagHelper *, TestAssembly @@ -229,11 +229,11 @@ public void Increment() } """; - VerifyTryGetBoundTagHelpers(content, "Component1TagHelper", "BoolVal"); + VerifyTryGetBoundTagHelpers(content); } [Fact] - public void TryGetBoundTagHelpers_TagHelper_MinimizedPropertyAttributeEdge1() + public void TryGetBoundTagHelpers_TagHelper_NotOnMinimizedPropertyAttributeEdge1() { var content = """ @addTagHelper *, TestAssembly @@ -245,11 +245,11 @@ public void Increment() } """; - VerifyTryGetBoundTagHelpers(content, "Component1TagHelper", "BoolVal"); + VerifyTryGetBoundTagHelpers(content); } [Fact] - public void TryGetBoundTagHelpers_TagHelper_MinimizedPropertyAttributeEdge2() + public void TryGetBoundTagHelpers_TagHelper_NotOnMinimizedPropertyAttributeEdge2() { var content = """ @addTagHelper *, TestAssembly @@ -261,11 +261,11 @@ public void Increment() } """; - VerifyTryGetBoundTagHelpers(content, "Component1TagHelper", "BoolVal"); + VerifyTryGetBoundTagHelpers(content); } [Fact, WorkItem("https://github.com/dotnet/razor-tooling/issues/6775")] - public void TryGetBoundTagHelpers_TagHelper_PropertyAttributeEdge() + public void TryGetBoundTagHelpers_TagHelper_NotOnPropertyAttributeEdge() { var content = """ @addTagHelper *, TestAssembly @@ -277,7 +277,7 @@ public void Increment() } """; - VerifyTryGetBoundTagHelpers(content, "Component1TagHelper", "BoolVal"); + VerifyTryGetBoundTagHelpers(content); } [Fact] @@ -354,15 +354,13 @@ private class NotTheDroidsYoureLookingFor private void VerifyTryGetBoundTagHelpers( string content, string? tagHelperDescriptorName = null, - string? attributeDescriptorPropertyName = null, - bool isRazorFile = true, - bool ignoreComponentAttributes = false) + bool isRazorFile = true) { TestFileMarkupParser.GetPosition(content, out content, out var position); var codeDocument = CreateCodeDocument(content, isRazorFile); - var result = RazorComponentDefinitionHelpers.TryGetBoundTagHelpers(codeDocument, position, ignoreComponentAttributes, Logger, out var boundTagHelperResults); + var result = RazorComponentDefinitionHelpers.TryGetBoundTagHelpers(codeDocument, position, Logger, out var boundTagHelperResults); if (tagHelperDescriptorName is null) { @@ -374,14 +372,9 @@ private void VerifyTryGetBoundTagHelpers( var boundTagHelper = Assert.Single(boundTagHelperResults).ElementDescriptor; Assert.NotNull(boundTagHelper); Assert.Equal(tagHelperDescriptorName, boundTagHelper.Name); - } - if (attributeDescriptorPropertyName is not null) - { - Assert.True(result); - var boundAttribute = Assert.Single(boundTagHelperResults).AttributeDescriptor; - Assert.NotNull(boundAttribute); - Assert.Equal(attributeDescriptorPropertyName, boundAttribute.PropertyName); + Assert.All(boundTagHelperResults, + t => Assert.Null(t.AttributeDescriptor)); } } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/VSCSharpDiagnosticsEndToEndTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/VSCSharpDiagnosticsEndToEndTest.cs index 2574110478a..2bc01b97ddc 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/VSCSharpDiagnosticsEndToEndTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/VSCSharpDiagnosticsEndToEndTest.cs @@ -85,7 +85,7 @@ private async Task ValidateDiagnosticsAsync(string input, string? filePath = nul var translateDiagnosticsService = new RazorTranslateDiagnosticsService(DocumentMappingService, LoggerFactory); var optionsMonitor = TestRazorLSPOptionsMonitor.Create(); - var diagnosticsEndPoint = new VSDocumentDiagnosticsEndpoint(LanguageServerFeatureOptions, translateDiagnosticsService, optionsMonitor, languageServer, telemetryReporter: null); + var diagnosticsEndPoint = new VSDocumentDiagnosticsEndpoint(translateDiagnosticsService, optionsMonitor, languageServer, telemetryReporter: null); var diagnosticsRequest = new VSInternalDocumentDiagnosticsParams { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/VSDocumentDiagnosticsEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/VSDocumentDiagnosticsEndpointTest.cs index f8d6b677dae..5eb210fef6a 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/VSDocumentDiagnosticsEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/VSDocumentDiagnosticsEndpointTest.cs @@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Razor.LanguageServer.Diagnostics; using Microsoft.AspNetCore.Razor.LanguageServer.Hosting; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis.Razor.Diagnostics; using Moq; using Xunit; @@ -25,7 +24,6 @@ public void ApplyCapabilities_AddsExpectedCapabilities() var optionsMonitor = TestRazorLSPOptionsMonitor.Create(); var clientConnection = new Mock(MockBehavior.Strict); var endpoint = new VSDocumentDiagnosticsEndpoint( - TestLanguageServerFeatureOptions.Instance, razorTranslate.Object, optionsMonitor, clientConnection.Object, diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/DocumentHighlighting/DocumentHighlightEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/DocumentHighlighting/DocumentHighlightEndpointTest.cs index a9841a016da..abd3422aab0 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/DocumentHighlighting/DocumentHighlightEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/DocumentHighlighting/DocumentHighlightEndpointTest.cs @@ -112,17 +112,13 @@ private async Task VerifyHighlightingRangesAsync(string input) var razorFilePath = "C:/path/to/file.razor"; var documentContextFactory = new TestDocumentContextFactory(razorFilePath, codeDocument); var languageServerFeatureOptions = Mock.Of(options => - options.SupportsFileManipulation == true && - options.SingleServerSupport == true && - options.CSharpVirtualDocumentSuffix == ".g.cs" && - options.HtmlVirtualDocumentSuffix == ".g.html", + options.SupportsFileManipulation == true, MockBehavior.Strict); var languageServer = new DocumentHighlightServer(csharpServer, csharpDocumentUri); var documentMappingService = new LspDocumentMappingService(FilePathService, documentContextFactory, LoggerFactory); - var endpoint = new DocumentHighlightEndpoint( - languageServerFeatureOptions, documentMappingService, languageServer, LoggerFactory); + var endpoint = new DocumentHighlightEndpoint(documentMappingService, languageServer, LoggerFactory); var request = new DocumentHighlightParams { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/DocumentSymbols/DocumentSymbolEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/DocumentSymbols/DocumentSymbolEndpointTest.cs index d4a9810ea49..23c07eef689 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/DocumentSymbols/DocumentSymbolEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/DocumentSymbols/DocumentSymbolEndpointTest.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.LanguageServer.DocumentSymbols; using Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis.Razor.Protocol.DocumentSymbols; using Microsoft.CodeAnalysis.Testing; using Microsoft.CodeAnalysis.Text; @@ -23,7 +22,7 @@ public class DocumentSymbolEndpointTest(ITestOutputHelper testOutput) : SingleSe public Task DocumentSymbols_CSharpClassWithMethods(bool hierarchical) => VerifyDocumentSymbolsAsync( """ - @functions { + {|ExecuteAsync():|}@functions { class {|AspNetCoreGeneratedDocument.test.C:C|} { private void {|HandleString(string s):HandleString|}(string s) @@ -50,7 +49,7 @@ class {|AspNetCoreGeneratedDocument.test.C:C|} public Task DocumentSymbols_CSharpMethods(bool hierarchical) => VerifyDocumentSymbolsAsync( """ - @functions { + {|ExecuteAsync():|}@functions { private void {|HandleString(string s):HandleString|}(string s) { s += "Hello"; @@ -69,31 +68,6 @@ public Task DocumentSymbols_CSharpMethods(bool hierarchical) """, hierarchical); - [Fact] - public async Task DocumentSymbols_DisabledWhenNotSingleServer() - { - var input = """ -

                  Hello World

                  - """; - - var codeDocument = CreateCodeDocument(input); - var razorFilePath = "C:/path/to/file.razor"; - - await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath); - - // This test requires the SingleServerSupport to be disabled - Assert.False(TestLanguageServerFeatureOptions.Instance.SingleServerSupport); - var documentSymbolService = new DocumentSymbolService(DocumentMappingService); - var endpoint = new DocumentSymbolEndpoint(languageServer, documentSymbolService, TestLanguageServerFeatureOptions.Instance); - - var serverCapabilities = new VSInternalServerCapabilities(); - var clientCapabilities = new VSInternalClientCapabilities(); - - endpoint.ApplyCapabilities(serverCapabilities, clientCapabilities); - - Assert.Null(serverCapabilities.DocumentSymbolProvider?.Value); - } - private async Task VerifyDocumentSymbolsAsync(string input, bool hierarchical = false) { TestFileMarkupParser.GetSpans(input, out input, out ImmutableDictionary> spansDict); @@ -104,7 +78,7 @@ private async Task VerifyDocumentSymbolsAsync(string input, bool hierarchical = capabilitiesUpdater: c => c.TextDocument!.DocumentSymbol = new DocumentSymbolSetting() { HierarchicalDocumentSymbolSupport = hierarchical }); var documentSymbolService = new DocumentSymbolService(DocumentMappingService); - var endpoint = new DocumentSymbolEndpoint(languageServer, documentSymbolService, TestLanguageServerFeatureOptions.Instance); + var endpoint = new DocumentSymbolEndpoint(languageServer, documentSymbolService); var request = new DocumentSymbolParams() { @@ -158,7 +132,7 @@ private static void VerifyDocumentSymbols(ImmutableDictionary }); var endpoint = new FindAllReferencesEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, LoggerFactory, FilePathService, projectManager); + DocumentMappingService, languageServer, LoggerFactory, FilePathService, projectManager); var sourceText = codeDocument.Source.Text; diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/CodeDirectiveFormattingTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/CodeDirectiveFormattingTest.cs index 1aadee43d1e..389732eca72 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/CodeDirectiveFormattingTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/CodeDirectiveFormattingTest.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common; @@ -70,7 +69,7 @@ await RunFormattingTestAsync( private IEnumerable _items = new[] { 1, 2, 3, 4, 5 }; } """, - tagHelpers: GetComponentWithCascadingTypeParameter()); + tagHelpers: [.. GetComponentWithCascadingTypeParameter()]); } [FormattingTestFact] @@ -120,7 +119,7 @@ await RunFormattingTestAsync( private IEnumerable _items = new[] { 1, 2, 3, 4, 5 }; } """, - tagHelpers: GetComponentWithCascadingTypeParameter()); + tagHelpers: [.. GetComponentWithCascadingTypeParameter()]); } [FormattingTestFact] @@ -160,10 +159,10 @@ await RunFormattingTestAsync( private IEnumerable _items2 = new long[] { 1, 2, 3, 4, 5 }; } """, - tagHelpers: GetComponentWithTwoCascadingTypeParameter()); + tagHelpers: [.. GetComponentWithTwoCascadingTypeParameter()]); } - private ImmutableArray GetComponentWithCascadingTypeParameter() + private TagHelperCollection GetComponentWithCascadingTypeParameter() { var input = """ @using System.Collections.Generic @@ -185,7 +184,7 @@ @attribute [CascadingTypeParameter(nameof(TItem))] return generated.CodeDocument.GetRequiredTagHelperContext().TagHelpers; } - private ImmutableArray GetComponentWithTwoCascadingTypeParameter() + private TagHelperCollection GetComponentWithTwoCascadingTypeParameter() { var input = """ @using System.Collections.Generic diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/DocumentFormattingTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/DocumentFormattingTest.cs index 2014e5b617e..cdaff390f00 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/DocumentFormattingTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/DocumentFormattingTest.cs @@ -27,6 +27,89 @@ await RunFormattingTestAsync( expected: ""); } + [FormattingTestFact] + [WorkItem("https://github.com/dotnet/vscode-csharp/issues/8333")] + public async Task MultilineStringLiterals() + { + // The single line string doesn't fail in this test, because Web Tools' formatter doesn't produce + // a bad edit. VS Code does, and tests in FormattingLogTest validate that scenario with VS Code edits. + + await RunFormattingTestAsync( + input: """" +
                  + @{ + var s1 = " test test "; + + var s2 = """ + this is + async string + that shouldn't move + """; + + var s3 = @" + this is + async string + that shouldn't move + "; + } +
                  + """", + expected: """" +
                  + @{ + var s1 = " test test "; + + var s2 = """ + this is + async string + that shouldn't move + """; + + var s3 = @" + this is + async string + that shouldn't move + "; + } +
                  + """"); + } + + [FormattingTestFact] + [WorkItem("https://github.com/dotnet/razor/issues/12416")] + public async Task MixedIndentation() + { + // This doesn't actually fail because the Html formatter in Web Tools doesn't produce "bad" edits + // like VS Code does, but thought I'd put it here just in case. Tests in FormattingLogTest validate + // the same scenario with VS Code edits. + + await RunFormattingTestAsync( + input: """ +
                  + @switch (true) + { + case true: + @if (true) + { + } + break; + } +
                  + """, + expected: """ +
                  + @switch (true) + { + case true: + @if (true) + { + } + break; + } +
                  + """); + } + [FormattingTestFact] public async Task RangeFormatOpenBrace() { @@ -3290,7 +3373,7 @@ await RunFormattingTestAsync( .ToString()) @{ - var x = @

                  Hi there!

                  + var x = @

                  Hi there!

                  ; } @x() @(@x()) @@ -3333,7 +3416,7 @@ class C .ToString()) @{ - var x = @

                  Hi there!

                  + var x = @

                  Hi there!

                  ; } @x() @(@x()) @@ -6045,6 +6128,143 @@ string[] S(string s) => """); } + [FormattingTestFact] + [WorkItem("https://github.com/dotnet/razor/issues/9254")] + public async Task RenderFragmentPresent2() + { + await RunFormattingTestAsync( + input: """ + @page "/" + @code + { + void T() + { + S("first" + + "second" + + "third"); + } + + string[] S(string s) => + s.Split(',') + . Select(s => s.Trim()) + . ToArray(); + + RenderFragment R => @
                  ; + } + """, + expected: """ + @page "/" + @code + { + void T() + { + S("first" + + "second" + + "third"); + } + + string[] S(string s) => + s.Split(',') + .Select(s => s.Trim()) + .ToArray(); + + RenderFragment R => @
                  ; + } + """); + } + + [FormattingTestFact] + [WorkItem("https://github.com/dotnet/razor/issues/9254")] + public async Task RenderFragmentPresent3() + { + await RunFormattingTestAsync( + input: """ + @page "/" + @code + { + void T() + { + S("first" + + "second" + + "third"); + } + + string[] S(string s) => + s.Split(',') + . Select(s => s.Trim()) + . ToArray(); + + RenderFragment R=>@
                  ; + } + """, + expected: """ + @page "/" + @code + { + void T() + { + S("first" + + "second" + + "third"); + } + + string[] S(string s) => + s.Split(',') + .Select(s => s.Trim()) + .ToArray(); + + RenderFragment R => @
                  ; + } + """); + } + + [FormattingTestFact] + [WorkItem("https://github.com/dotnet/razor/issues/9254")] + public async Task RenderFragmentPresent4() + { + await RunFormattingTestAsync( + input: """ + @page "/" + @code + { + void T() + { + S("first" + + "second" + + "third"); + } + + string[] S(string s) => + s.Split(',') + . Select(s => s.Trim()) + . ToArray(); + + RenderFragment R => + @
                  ; + } + """, + expected: """ + @page "/" + @code + { + void T() + { + S("first" + + "second" + + "third"); + } + + string[] S(string s) => + s.Split(',') + .Select(s => s.Trim()) + .ToArray(); + + RenderFragment R => + @
                  ; + } + """); + } + [FormattingTestFact] [WorkItem("https://github.com/dotnet/razor/issues/6150")] public async Task RenderFragment_InLambda() @@ -6092,6 +6312,422 @@ @using RazorClassLibrary2.Models """); } + [FormattingTestTheory] + [CombinatorialData] + [WorkItem("https://github.com/dotnet/razor/issues/12310")] + public async Task RenderFragment_Multiline(bool newLineBeforeBraceInLambda) + { + await RunFormattingTestAsync( + input: """ + @page "/" + + @code{ + protected RenderFragment RootFragment() => + @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + expected: """ + @page "/" + + @code { + protected RenderFragment RootFragment() => + @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + csharpSyntaxFormattingOptions: RazorCSharpSyntaxFormattingOptions.Default with + { + NewLines = newLineBeforeBraceInLambda + ? RazorCSharpSyntaxFormattingOptions.Default.NewLines | RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + : RazorCSharpSyntaxFormattingOptions.Default.NewLines & ~RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + }); + } + + [FormattingTestTheory] + [CombinatorialData] + [WorkItem("https://github.com/dotnet/razor/issues/12310")] + public async Task RenderFragment_Multiline2(bool newLineBeforeBraceInLambda) + { + await RunFormattingTestAsync( + input: """ + @page "/" + + @code{ + protected RenderFragment RootFragment() => + @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + expected: """ + @page "/" + + @code { + protected RenderFragment RootFragment() => + @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + csharpSyntaxFormattingOptions: RazorCSharpSyntaxFormattingOptions.Default with + { + NewLines = newLineBeforeBraceInLambda + ? RazorCSharpSyntaxFormattingOptions.Default.NewLines | RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + : RazorCSharpSyntaxFormattingOptions.Default.NewLines & ~RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + }); + } + + [FormattingTestTheory] + [CombinatorialData] + [WorkItem("https://github.com/dotnet/razor/issues/12310")] + public async Task RenderFragment_Multiline3(bool newLineBeforeBraceInLambda) + { + await RunFormattingTestAsync( + input: """ + @page "/" + + @code{ + protected RenderFragment RootFragment() => @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + expected: """ + @page "/" + + @code { + protected RenderFragment RootFragment() => @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + csharpSyntaxFormattingOptions: RazorCSharpSyntaxFormattingOptions.Default with + { + NewLines = newLineBeforeBraceInLambda + ? RazorCSharpSyntaxFormattingOptions.Default.NewLines | RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + : RazorCSharpSyntaxFormattingOptions.Default.NewLines & ~RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + }); + } + + [FormattingTestTheory] + [CombinatorialData] + [WorkItem("https://github.com/dotnet/razor/issues/12310")] + public async Task RenderFragment_Multiline4(bool newLineBeforeBraceInLambda) + { + await RunFormattingTestAsync( + input: """ + @page "/" + + @code{ + protected RenderFragment RootFragment()=>@ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + expected: """ + @page "/" + + @code { + protected RenderFragment RootFragment() => @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + csharpSyntaxFormattingOptions: RazorCSharpSyntaxFormattingOptions.Default with + { + NewLines = newLineBeforeBraceInLambda + ? RazorCSharpSyntaxFormattingOptions.Default.NewLines | RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + : RazorCSharpSyntaxFormattingOptions.Default.NewLines & ~RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + }); + } + + [FormattingTestTheory] + [CombinatorialData] + [WorkItem("https://github.com/dotnet/razor/issues/12310")] + public async Task RenderFragment_Multiline5(bool newLineBeforeBraceInLambda) + { + await RunFormattingTestAsync( + input: """ + @page "/" + + @code{ + protected RenderFragment RootFragment() => @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + expected: """ + @page "/" + + @code { + protected RenderFragment RootFragment() => @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  ; + } + """, + csharpSyntaxFormattingOptions: RazorCSharpSyntaxFormattingOptions.Default with + { + NewLines = newLineBeforeBraceInLambda + ? RazorCSharpSyntaxFormattingOptions.Default.NewLines | RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + : RazorCSharpSyntaxFormattingOptions.Default.NewLines & ~RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + }); + } + + [FormattingTestTheory] + [CombinatorialData] + [WorkItem("https://github.com/dotnet/razor/issues/12310")] + public async Task RenderFragment_Multiline6(bool newLineBeforeBraceInLambda) + { + await RunFormattingTestAsync( + input: """ + @page "/" + + @code{ + protected RenderFragment RootFragment() => + @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  + ; + } + """, + expected: """ + @page "/" + + @code { + protected RenderFragment RootFragment() => + @ + @if (true) + { +
                  + Hello + @if (true) + { + World + } + else + { + Not World + } +
                  + } +
                  + ; + } + """, + csharpSyntaxFormattingOptions: RazorCSharpSyntaxFormattingOptions.Default with + { + NewLines = newLineBeforeBraceInLambda + ? RazorCSharpSyntaxFormattingOptions.Default.NewLines | RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + : RazorCSharpSyntaxFormattingOptions.Default.NewLines & ~RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + }); + } + + [FormattingTestTheory] + [CombinatorialData] + [WorkItem("https://github.com/dotnet/razor/issues/12310")] + public async Task RenderFragment_Multiline7(bool newLineBeforeBraceInLambda) + { + await RunFormattingTestAsync( + input: """ + @page "/" + + @code{ + protected RenderFragment RootFragment() => + @
                  +
                  + Hello +
                  + World +
                  +
                  +
                  + ; + } + """, + expected: """ + @page "/" + + @code { + protected RenderFragment RootFragment() => + @
                  +
                  + Hello +
                  + World +
                  +
                  +
                  + ; + } + """, + csharpSyntaxFormattingOptions: RazorCSharpSyntaxFormattingOptions.Default with + { + NewLines = newLineBeforeBraceInLambda + ? RazorCSharpSyntaxFormattingOptions.Default.NewLines | RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + : RazorCSharpSyntaxFormattingOptions.Default.NewLines & ~RazorNewLinePlacement.BeforeOpenBraceInLambdaExpressionBody + }); + } + [FormattingTestFact] [WorkItem("https://github.com/dotnet/razor/issues/9119")] public async Task CollectionInitializers() @@ -6715,4 +7351,21 @@ public Task NestedExplicitExpression4() } """); + + [FormattingTestFact] + [WorkItem("https://github.com/dotnet/razor/issues/12445")] + public Task TypeParameterAttribute() + => RunFormattingTestAsync( + input: """ +
                  + + +
                  + """, + expected: """ +
                  + + +
                  + """); } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingContentValidationPassTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingContentValidationPassTest.cs index a9121c3d38e..86947910032 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingContentValidationPassTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingContentValidationPassTest.cs @@ -97,11 +97,11 @@ private static FormattingContext CreateFormattingContext private static (RazorCodeDocument, IDocumentSnapshot) CreateCodeDocumentAndSnapshot( SourceText text, string path, - ImmutableArray tagHelpers = default, + TagHelperCollection? tagHelpers = null, RazorFileKind? fileKind = null) { var fileKindValue = fileKind ?? RazorFileKind.Component; - tagHelpers = tagHelpers.NullToEmpty(); + tagHelpers ??= []; var sourceDocument = RazorSourceDocument.Create(text, RazorSourceDocumentProperties.Create(path, path)); var projectEngine = RazorProjectEngine.Create(builder => diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingDiagnosticValidationPassTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingDiagnosticValidationPassTest.cs index ad52c5cbd3f..6cb25b593c2 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingDiagnosticValidationPassTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingDiagnosticValidationPassTest.cs @@ -95,11 +95,11 @@ private static FormattingContext CreateFormattingContext( private static (RazorCodeDocument, IDocumentSnapshot) CreateCodeDocumentAndSnapshot( SourceText text, string path, - ImmutableArray tagHelpers = default, + TagHelperCollection? tagHelpers = null, RazorFileKind? fileKind = null) { var fileKindValue = fileKind ?? RazorFileKind.Component; - tagHelpers = tagHelpers.NullToEmpty(); + tagHelpers ??= []; var sourceDocument = RazorSourceDocument.Create(text, RazorSourceDocumentProperties.Create(path, path)); var projectEngine = RazorProjectEngine.Create(builder => diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingLanguageServerClient.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingLanguageServerClient.cs index f1a782bcde5..659d84093ba 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingLanguageServerClient.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingLanguageServerClient.cs @@ -58,7 +58,7 @@ private async Task FormatAsync(DocumentFormatti private string GetGeneratedHtml(Uri uri) { var codeDocument = _documents[uri.GetAbsoluteOrUNCPath()]; - var generatedHtml = codeDocument.GetHtmlDocument().Text.ToString(); + var generatedHtml = RazorHtmlWriter.GetHtmlDocument(codeDocument).Text.ToString(); return generatedHtml.Replace("\r", "").Replace("\n", "\r\n"); } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingLanguageServerTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingLanguageServerTestBase.cs index 18c0344c747..9dd509b4c2f 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingLanguageServerTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingLanguageServerTestBase.cs @@ -24,8 +24,8 @@ internal static RazorCodeDocument CreateCodeDocument(string content, ImmutableAr var codeDocument = RazorCodeDocument.Create(source); var syntaxTree = RazorSyntaxTree.Parse(source, codeDocument.ParserOptions); var csharpDocument = TestRazorCSharpDocument.Create(codeDocument, content, sourceMappings); - codeDocument.SetSyntaxTree(syntaxTree); - codeDocument.SetCSharpDocument(csharpDocument); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithCSharpDocument(csharpDocument); return codeDocument; } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingTestBase.cs index 9d49ccb7004..5b45402332f 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/FormattingTestBase.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Formatting; public abstract class FormattingTestBase : RazorToolingIntegrationTestBase { - private static readonly AsyncLazy> s_standardTagHelpers = AsyncLazy.Create(GetStandardTagHelpersAsync); + private static readonly AsyncLazy s_standardTagHelpers = AsyncLazy.Create(GetStandardTagHelpersAsync); private readonly HtmlFormattingService _htmlFormattingService; private readonly FormattingTestContext _context; @@ -56,7 +56,7 @@ private protected async Task RunFormattingTestAsync( int tabSize = 4, bool insertSpaces = true, RazorFileKind? fileKind = null, - ImmutableArray tagHelpers = default, + TagHelperCollection? tagHelpers = null, bool allowDiagnostics = false, bool codeBlockBraceOnNextLine = false, bool inGlobalNamespace = false, @@ -78,7 +78,7 @@ private async Task RunFormattingTestInternalAsync( int tabSize, bool insertSpaces, RazorFileKind? fileKind, - ImmutableArray tagHelpers, + TagHelperCollection? tagHelpers, bool allowDiagnostics, RazorLSPOptions? razorLSPOptions, bool inGlobalNamespace, @@ -87,7 +87,7 @@ private async Task RunFormattingTestInternalAsync( { // Arrange var fileKindValue = fileKind ?? RazorFileKind.Component; - tagHelpers = tagHelpers.NullToEmpty(); + tagHelpers ??= []; TestFileMarkupParser.GetSpans(input, out input, out ImmutableArray spans); @@ -96,7 +96,7 @@ private async Task RunFormattingTestInternalAsync( ? null : source.GetLinePositionSpan(spans.Single()); - tagHelpers = tagHelpers.AddRange(await s_standardTagHelpers.GetValueAsync(DisposalToken)); + tagHelpers = TagHelperCollection.Merge(tagHelpers, await s_standardTagHelpers.GetValueAsync(DisposalToken)); var path = "file:///path/to/Document." + fileKindValue.ToString(); var uri = new Uri(path); @@ -166,7 +166,7 @@ private protected async Task RunOnTypeFormattingTestAsync( filePathService, new TestDocumentContextFactory(), LoggerFactory); var languageKind = codeDocument.GetLanguageKind(positionAfterTrigger, rightAssociative: false); - var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper, codeDocument, razorLSPOptions, languageServerFeatureOptions); + var formattingService = await TestRazorFormattingService.CreateWithFullSupportAsync(LoggerFactory, TestOutputHelper, codeDocument, razorLSPOptions, languageServerFeatureOptions, debugAssertsEnabled: true); var options = new FormattingOptions() { TabSize = tabSize, @@ -229,7 +229,7 @@ private protected async Task RunOnTypeFormattingTestAsync( private (RazorCodeDocument, IDocumentSnapshot) CreateCodeDocumentAndSnapshot( SourceText text, string path, - ImmutableArray tagHelpers, + TagHelperCollection tagHelpers, RazorFileKind? fileKind = null, bool allowDiagnostics = false, bool inGlobalNamespace = false) @@ -303,7 +303,7 @@ internal static IDocumentSnapshot CreateDocumentSnapshot( RazorProjectEngine projectEngine, ImmutableArray imports, ImmutableArray importDocuments, - ImmutableArray tagHelpers, + TagHelperCollection tagHelpers, bool inGlobalNamespace) { var projectKey = new ProjectKey(Path.Combine(path, "obj")); @@ -347,11 +347,14 @@ internal static IDocumentSnapshot CreateDocumentSnapshot( return CreateDocumentSnapshot( path, fileKind, codeDocument, projectEngine, imports, importDocuments, tagHelpers, inGlobalNamespace); }); + snapshotMock + .Setup(d => d.GetCSharpSyntaxTreeAsync(It.IsAny())) + .ReturnsAsync(codeDocument.GetOrParseCSharpSyntaxTree(CancellationToken.None)); return snapshotMock.Object; } - private static async Task> GetStandardTagHelpersAsync(CancellationToken cancellationToken) + private static async Task GetStandardTagHelpersAsync(CancellationToken cancellationToken) { var projectId = ProjectId.CreateNewId(); var projectInfo = ProjectInfo @@ -388,7 +391,7 @@ private static async Task> GetStandardTagHel fileSystem, configure: null); - var tagHelpers = await project.GetTagHelpersAsync(engine, NoOpTelemetryReporter.Instance, cancellationToken).ConfigureAwait(false); + var tagHelpers = await project.GetTagHelpersAsync(engine, cancellationToken).ConfigureAwait(false); Assert.NotEmpty(tagHelpers); return tagHelpers; diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/HtmlFormattingTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/HtmlFormattingTest.cs index 3d1b46534e0..23f85daf973 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/HtmlFormattingTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/HtmlFormattingTest.cs @@ -56,7 +56,7 @@ await RunFormattingTestAsync( } """, - tagHelpers: tagHelpers); + tagHelpers: [.. tagHelpers]); } [FormattingTestFact] @@ -80,7 +80,7 @@ await RunFormattingTestAsync( """, - tagHelpers: tagHelpers); + tagHelpers: [.. tagHelpers]); } [FormattingTestFact] @@ -102,7 +102,7 @@ await RunFormattingTestAsync( """, - tagHelpers: tagHelpers); + tagHelpers: [.. tagHelpers]); } [FormattingTestFact] @@ -124,7 +124,7 @@ await RunFormattingTestAsync( """, - tagHelpers: tagHelpers); + tagHelpers: [.. tagHelpers]); } [FormattingTestFact] @@ -150,7 +150,7 @@ await RunFormattingTestAsync( """, - tagHelpers: tagHelpers); + tagHelpers: [.. tagHelpers]); } [FormattingTestFact] @@ -198,7 +198,7 @@ await RunFormattingTestAsync( """, - tagHelpers: GetComponents()); + tagHelpers: [.. GetComponents()]); } [FormattingTestFact] @@ -260,7 +260,7 @@ await RunFormattingTestAsync( } """, - tagHelpers: GetComponents()); + tagHelpers: [.. GetComponents()]); } [FormattingTestFact(Skip = "Requires fix")] @@ -284,7 +284,7 @@ await RunFormattingTestAsync( ; } """, - tagHelpers: GetComponents()); + tagHelpers: [.. GetComponents()]); } [FormattingTestFact] @@ -307,12 +307,12 @@ await RunFormattingTestAsync( @{ RenderFragment fragment = @ + Caption="Title"> ; } """, - tagHelpers: GetComponents()); + tagHelpers: [.. GetComponents()]); } [FormattingTestFact] @@ -360,7 +360,7 @@ await RunFormattingTestAsync( """, - tagHelpers: GetComponents()); + tagHelpers: [.. GetComponents()]); } [FormattingTestFact] @@ -398,7 +398,7 @@ await RunFormattingTestAsync( } """, - tagHelpers: CreateTagHelpers()); + tagHelpers: [.. CreateTagHelpers()]); ImmutableArray CreateTagHelpers() { @@ -480,7 +480,7 @@ await RunFormattingTestAsync( allowDiagnostics: true); } - private ImmutableArray GetComponents() + private TagHelperCollection GetComponents() { AdditionalSyntaxTrees.Add(Parse(""" using Microsoft.AspNetCore.Components; diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/OnTypeFormattingTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/OnTypeFormattingTest.cs index 6b1b8189da3..b1b1cf4f19f 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/OnTypeFormattingTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Formatting_NetFx/OnTypeFormattingTest.cs @@ -18,6 +18,44 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Formatting; public class OnTypeFormattingTest(FormattingTestContext context, HtmlFormattingFixture fixture, ITestOutputHelper testOutput) : FormattingTestBase(context, fixture.Service, testOutput), IClassFixture { + [FormattingTestFact] + public async Task FormatsElseCloseBrace() + { + await RunOnTypeFormattingTestAsync( + input: """ + @page "/" + + @if (true) + { + + } + else { + + }$$ + + @code { + private string? streetKind; + } + """, + expected: """ + @page "/" + + @if (true) + { + + } + else + { + + } + + @code { + private string? streetKind; + } + """, + triggerCharacter: '}'); + } + [FormattingTestFact] public async Task FormatsIfStatementInComponent() { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/GeneratedDocumentPublisherTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/GeneratedDocumentPublisherTest.cs index 2eee7c1581a..6ea2021c27a 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/GeneratedDocumentPublisherTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/GeneratedDocumentPublisherTest.cs @@ -6,7 +6,6 @@ using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; using Microsoft.AspNetCore.Razor.Test.Common.ProjectSystem; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Text; using Xunit; @@ -42,7 +41,7 @@ await _projectManager.UpdateAsync(updater => public void PublishCSharp_FirstTime_PublishesEntireSourceText() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var content = "// C# content"; var sourceText = SourceText.From(content); @@ -61,7 +60,7 @@ public void PublishCSharp_FirstTime_PublishesEntireSourceText() public void PublishHtml_FirstTime_PublishesEntireSourceText() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var content = "HTML content"; var sourceText = SourceText.From(content); @@ -80,7 +79,7 @@ public void PublishHtml_FirstTime_PublishesEntireSourceText() public void PublishCSharp_SecondTime_PublishesSourceTextDifferences() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var initialSourceText = SourceText.From("// Initial content\n"); publisher.PublishCSharp(s_hostProject.Key, "/path/to/file.razor", initialSourceText, 123); var change = new TextChange( @@ -104,7 +103,7 @@ public void PublishCSharp_SecondTime_PublishesSourceTextDifferences() public void PublishHtml_SecondTime_PublishesSourceTextDifferences() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var initialSourceText = SourceText.From("HTML content\n"); publisher.PublishHtml(s_hostProject.Key, "/path/to/file.razor", initialSourceText, 123); var change = new TextChange( @@ -128,7 +127,7 @@ public void PublishHtml_SecondTime_PublishesSourceTextDifferences() public void PublishCSharp_SecondTime_IdenticalContent_NoTextChanges() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var sourceTextContent = "// The content"; var initialSourceText = SourceText.From(sourceTextContent); publisher.PublishCSharp(s_hostProject.Key, "/path/to/file.razor", initialSourceText, 123); @@ -149,7 +148,7 @@ public void PublishCSharp_SecondTime_IdenticalContent_NoTextChanges() public void PublishHtml_SecondTime_IdenticalContent_NoTextChanges() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var sourceTextContent = "HTMl content"; var initialSourceText = SourceText.From(sourceTextContent); publisher.PublishHtml(s_hostProject.Key, "/path/to/file.razor", initialSourceText, 123); @@ -170,7 +169,7 @@ public void PublishHtml_SecondTime_IdenticalContent_NoTextChanges() public void PublishCSharp_DifferentFileSameContent_PublishesEverything() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var sourceTextContent = "// The content"; var initialSourceText = SourceText.From(sourceTextContent); publisher.PublishCSharp(s_hostProject.Key, "/path/to/file1.razor", initialSourceText, 123); @@ -192,7 +191,7 @@ public void PublishCSharp_DifferentFileSameContent_PublishesEverything() public void PublishHtml_DifferentFileSameContent_PublishesEverything() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var sourceTextContent = "HTML content"; var initialSourceText = SourceText.From(sourceTextContent); publisher.PublishHtml(s_hostProject.Key, "/path/to/file1.razor", initialSourceText, 123); @@ -214,7 +213,7 @@ public void PublishHtml_DifferentFileSameContent_PublishesEverything() public async Task PublishCSharp_OpenDocument_SameText_DifferentHostDocumentVersions_PublishesEmptyTextChanges() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var initialSourceText = SourceText.From("// The content"); publisher.PublishCSharp(s_hostProject.Key, s_hostDocument.FilePath, initialSourceText, 123); @@ -239,7 +238,7 @@ await _projectManager.UpdateAsync(updater => public async Task PublishCSharp_OpenDocument_SameText_SameHostDocumentVersion_Ignored() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var initialSourceText = SourceText.From("// The content"); publisher.PublishCSharp(s_hostProject.Key, s_hostDocument.FilePath, initialSourceText, 123); @@ -262,7 +261,7 @@ await _projectManager.UpdateAsync(updater => public async Task PublishHtml_OpenDocument_SameText_DifferentHostDocumentVersions_PublishesEmptyTextChanges() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var initialSourceText = SourceText.From(""); publisher.PublishHtml(s_hostProject.Key, s_hostDocument.FilePath, initialSourceText, 123); @@ -287,7 +286,7 @@ await _projectManager.UpdateAsync(updater => public async Task PublishHtml_OpenDocument_SameText_SameHostDocumentVersion_Ignored() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var initialSourceText = SourceText.From(""); publisher.PublishHtml(s_hostProject.Key, s_hostDocument.FilePath, initialSourceText, 123); @@ -310,7 +309,7 @@ await _projectManager.UpdateAsync(updater => public async Task PublishCSharp_CloseDocument_RepublishesTextChanges() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var sourceTextContent = "// The content"; var initialSourceText = SourceText.From(sourceTextContent); @@ -339,10 +338,10 @@ await _projectManager.UpdateAsync(updater => } [Fact] - public async Task PublishCSharp_DocumentMoved_DoesntRepublishWholeDocument() + public async Task PublishCSharp_DocumentMoved_PublishWholeDocument() { // Arrange - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var sourceTextContent = """ public void Method() { @@ -378,7 +377,7 @@ await _projectManager.UpdateAsync(updater => var updateRequest = _serverClient.UpdateRequests.Last(); Assert.Equal(s_hostDocument.FilePath, updateRequest.HostDocumentFilePath); var textChange = Assert.Single(updateRequest.Changes); - Assert.Equal("// some new code here", textChange.NewText!.Trim()); + Assert.Equal(changedTextContent, textChange.NewText!.Trim()); Assert.Equal(124, updateRequest.HostDocumentVersion); } @@ -386,8 +385,7 @@ await _projectManager.UpdateAsync(updater => public async Task PublishCSharp_RemoveDocument_ClearsContent() { // Arrange - var options = new TestLanguageServerFeatureOptions(includeProjectKeyInGeneratedFilePath: true); - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, options, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var initialSourceText = SourceText.From("// The content"); publisher.PublishCSharp(s_hostProject.Key, s_hostDocument.FilePath, initialSourceText, 123); @@ -410,8 +408,7 @@ await _projectManager.UpdateAsync(updater => public async Task PublishCSharp_RemoveProject_ClearsContent() { // Arrange - var options = new TestLanguageServerFeatureOptions(includeProjectKeyInGeneratedFilePath: true); - var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, options, LoggerFactory); + var publisher = new GeneratedDocumentPublisher(_projectManager, _serverClient, LoggerFactory); var initialSourceText = SourceText.From("// The content"); publisher.PublishCSharp(s_hostProject.Key, s_hostDocument.FilePath, initialSourceText, 123); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/GeneratedDocumentSynchronizerTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/GeneratedDocumentSynchronizerTest.cs index 4599fbe1cf9..228d3c93789 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/GeneratedDocumentSynchronizerTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/GeneratedDocumentSynchronizerTest.cs @@ -6,7 +6,6 @@ using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; using Microsoft.AspNetCore.Razor.Test.Common.ProjectSystem; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Text; using Xunit; @@ -28,7 +27,7 @@ public GeneratedDocumentSynchronizerTest(ITestOutputHelper testOutput) { _publisher = new TestGeneratedDocumentPublisher(); _projectManager = CreateProjectSnapshotManager(); - _synchronizer = new GeneratedDocumentSynchronizer(_publisher, TestLanguageServerFeatureOptions.Instance, _projectManager); + _synchronizer = new GeneratedDocumentSynchronizer(_publisher, _projectManager); } protected override async Task InitializeAsync() @@ -60,23 +59,6 @@ await _projectManager.UpdateAsync(updater => Assert.True(_publisher.PublishedHtml); } - [Fact] - public async Task DocumentProcessed_CloseDocument_WithOption_Publishes() - { - var options = new TestLanguageServerFeatureOptions(updateBuffersForClosedDocuments: true); - var synchronizer = new GeneratedDocumentSynchronizer(_publisher, options, _projectManager); - - var document = _projectManager.GetRequiredDocument(s_hostProject.Key, s_hostDocument.FilePath); - var codeDocument = await document.GetGeneratedOutputAsync(DisposalToken); - - // Act - synchronizer.DocumentProcessed(codeDocument, document); - - // Assert - Assert.True(_publisher.PublishedCSharp); - Assert.True(_publisher.PublishedHtml); - } - [Fact] public async Task DocumentProcessed_CloseDocument_DoesntPublish() { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Hover/HoverEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Hover/HoverEndpointTest.cs index d6cdf4e77f0..f1ed98189dd 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Hover/HoverEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Hover/HoverEndpointTest.cs @@ -30,9 +30,6 @@ public class HoverEndpointTest(ITestOutputHelper testOutput) : TagHelperServiceT public async Task Handle_Hover_SingleServer_CallsDelegatedLanguageServer() { // Arrange - var languageServerFeatureOptions = StrictMock.Of(options => - options.SingleServerSupport == true); - var delegatedHover = new LspHover(); var clientConnection = TestMocks.CreateClientConnection(builder => @@ -53,7 +50,7 @@ public async Task Handle_Hover_SingleServer_CallsDelegatedLanguageServer() .Setup(x => x.TryMapToCSharpDocumentPosition(It.IsAny(), It.IsAny(), out projectedPosition, out projectedIndex)) .Returns(true); - var endpoint = CreateEndpoint(languageServerFeatureOptions, documentMappingServiceMock.Object, clientConnection); + var endpoint = CreateEndpoint(documentMappingServiceMock.Object, clientConnection); var (documentContext, position) = CreateDefaultDocumentContext(); var requestContext = CreateRazorRequestContext(documentContext); @@ -153,10 +150,7 @@ public async Task Handle_Hover_SingleServer_Component() var razorFilePath = "C:/path/to/file.razor"; var documentContextFactory = new TestDocumentContextFactory(razorFilePath, codeDocument); var languageServerFeatureOptions = StrictMock.Of(options => - options.SupportsFileManipulation == true && - options.SingleServerSupport == true && - options.CSharpVirtualDocumentSuffix == ".g.cs" && - options.HtmlVirtualDocumentSuffix == ".g.html"); + options.SupportsFileManipulation == true); var languageServer = new HoverLanguageServer(csharpServer, csharpDocumentUri); var documentMappingService = new LspDocumentMappingService(FilePathService, documentContextFactory, LoggerFactory); @@ -174,7 +168,6 @@ public async Task Handle_Hover_SingleServer_Component() var endpoint = new HoverEndpoint( componentAvailabilityService, clientCapabilitiesService, - languageServerFeatureOptions, documentMappingService, languageServer, LoggerFactory); @@ -241,14 +234,9 @@ private static (DocumentContext, Position) CreateDefaultDocumentContext() } private HoverEndpoint CreateEndpoint( - LanguageServerFeatureOptions? languageServerFeatureOptions = null, IDocumentMappingService? documentMappingService = null, IClientConnection? clientConnection = null) { - languageServerFeatureOptions ??= StrictMock.Of(options => - options.SupportsFileManipulation == true && - options.SingleServerSupport == false); - documentMappingService ??= StrictMock.Of(); clientConnection ??= StrictMock.Of(); @@ -267,7 +255,6 @@ private HoverEndpoint CreateEndpoint( var endpoint = new HoverEndpoint( componentAvailabilityService, clientCapabilitiesService, - languageServerFeatureOptions, documentMappingService, clientConnection, LoggerFactory); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/IFileSystemExtensionsTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/IFileSystemExtensionsTest.cs deleted file mode 100644 index 89de360b28c..00000000000 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/IFileSystemExtensionsTest.cs +++ /dev/null @@ -1,110 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.AspNetCore.Razor.LanguageServer.Completion; -using Microsoft.CodeAnalysis.Razor.Workspaces; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.AspNetCore.Razor.LanguageServer.Test; - -public class IFileSystemExtensionsTest(ITestOutputHelper testOutput) : TagHelperServiceTestBase(testOutput) -{ - [Fact] - public void GetFilteredFiles_FindsFiles() - { - // Arrange - var firstProjectRazorJson = @"HigherDirectory\project.razor.bin"; - var secondProjectRazorJson = @"HigherDirectory\RealDirectory\project.razor.bin"; - - var workspaceDirectory = Path.Combine("LowerDirectory"); - var searchPattern = "project.razor.bin"; - var ignoredDirectories = new[] { "node_modules" }; - var fileResults = new Dictionary() { - { "HigherDirectory", [firstProjectRazorJson] }, - { "RealDirectory", [secondProjectRazorJson] }, - { "LongDirectory", ["LONGPATH", "LONGPATH\\project.razor.bin"] }, - { "node_modules", null }, - }; - var directoryResults = new Dictionary() { - { "LowerDirectory", ["HigherDirectory"] }, - { "HigherDirectory", ["node_modules", "RealDirectory", "FakeDirectory", "LongDirectory"] }, - { "node_modules", null }, - }; - - var fileSystem = new TestFileSystem(fileResults, directoryResults); - - // Act - var files = fileSystem.GetFilteredFiles(workspaceDirectory, searchPattern, ignoredDirectories, Logger); - - // Assert - Assert.Collection(files, - result => result.Equals(firstProjectRazorJson), - result => result.Equals(secondProjectRazorJson) - ); - } - - private class TestFileSystem( - Dictionary fileResults, - Dictionary directoryResults) : IFileSystem - { - public IEnumerable GetDirectories(string workspaceDirectory) - { - var success = directoryResults.TryGetValue(workspaceDirectory, out var results); - if (success) - { - if (results is null) - { - Assert.Fail("Tried to walk a directory which should have been ignored"); - } - - if (results.Any(s => s.Equals("LONGPATH"))) - { - throw new PathTooLongException(); - } - - return results; - } - else - { - throw new DirectoryNotFoundException(); - } - } - - public IEnumerable GetFiles(string workspaceDirectory, string searchPattern, SearchOption searchOption) - { - var success = fileResults.TryGetValue(workspaceDirectory, out var results); - if (success) - { - if (results is null) - { - Assert.Fail("Tried to walk a directory which should have been ignored"); - } - - if (results.Any(s => s.Equals("LONGPATH"))) - { - throw new PathTooLongException(); - } - - return results; - } - else - { - throw new DirectoryNotFoundException(); - } - } - - public bool FileExists(string filePath) - => throw new NotImplementedException(); - - public string ReadFile(string filePath) - => throw new NotImplementedException(); - - public Stream OpenReadStream(string filePath) - => throw new NotImplementedException(); - } -} diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Implementation/ImplementationEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Implementation/ImplementationEndpointTest.cs index ffacdc29cc0..3bad7e76b7e 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Implementation/ImplementationEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Implementation/ImplementationEndpointTest.cs @@ -95,7 +95,7 @@ private async Task VerifyCSharpGoToImplementationAsync(string input) await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath); var endpoint = new ImplementationEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, LoggerFactory); + DocumentMappingService, languageServer, LoggerFactory); var request = new TextDocumentPositionParams { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorEditHelperTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorEditHelperTest.cs index 5160b97568f..f601bfed167 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorEditHelperTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorEditHelperTest.cs @@ -738,7 +738,7 @@ private async Task TestAsync( csharpSource.Text, sourceMappings.OrderByAsArray(s => s.GeneratedSpan.AbsoluteIndex)); - codeDocument.SetCSharpDocument(csharpDocument); + codeDocument = codeDocument.WithCSharpDocument(csharpDocument); var snapshot = TestDocumentSnapshot.Create(razorPath, codeDocument); var mappedChanges = await RazorEditHelper.MapCSharpEditsAsync( diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorLanguageQueryEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorLanguageQueryEndpointTest.cs index 1ba4e7475f3..342b4e99337 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorLanguageQueryEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorLanguageQueryEndpointTest.cs @@ -143,7 +143,7 @@ private static RazorCodeDocument CreateCodeDocumentWithCSharpProjection(string r codeDocument, projectedCSharpSource, sourceMappings); - codeDocument.SetCSharpDocument(csharpDocument); + codeDocument = codeDocument.WithCSharpDocument(csharpDocument); return codeDocument; } } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorMapToDocumentRangesEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorMapToDocumentRangesEndpointTest.cs index 5026d621068..4e6c2fa3427 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorMapToDocumentRangesEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorMapToDocumentRangesEndpointTest.cs @@ -238,7 +238,7 @@ private static RazorCodeDocument CreateCodeDocumentWithCSharpProjection(string r codeDocument, projectedCSharpSource, sourceMappings); - codeDocument.SetCSharpDocument(csharpDocument); + codeDocument = codeDocument.WithCSharpDocument(csharpDocument); return codeDocument; } } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/OpenDocumentGeneratorTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/OpenDocumentGeneratorTest.cs index f9a605bf2bf..91ff61aa25a 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/OpenDocumentGeneratorTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/OpenDocumentGeneratorTest.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis.Razor.ProjectSystem; using Microsoft.CodeAnalysis.Text; using Xunit; @@ -174,7 +173,7 @@ private OpenDocumentGenerator CreateOpenDocumentGenerator( ProjectSnapshotManager projectManager, params IDocumentProcessedListener[] listeners) { - return new OpenDocumentGenerator(listeners, projectManager, TestLanguageServerFeatureOptions.Instance, LoggerFactory); + return new OpenDocumentGenerator(listeners, projectManager, LoggerFactory); } private class TestDocumentProcessedListener : IDocumentProcessedListener diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/RazorDocumentMappingServiceTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/RazorDocumentMappingServiceTest.cs index 3226a9e792f..73a8f2f1646 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/RazorDocumentMappingServiceTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/RazorDocumentMappingServiceTest.cs @@ -711,7 +711,7 @@ private static RazorCodeDocument CreateCodeDocumentWithCSharpProjection(string r codeDocument, projectedCSharpSource, sourceMappings); - codeDocument.SetCSharpDocument(csharpDocument); + codeDocument = codeDocument.WithCSharpDocument(csharpDocument); return codeDocument; } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Refactoring/RenameEndpointDelegationTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Refactoring/RenameEndpointDelegationTest.cs index 66bc04b9384..8b321e142a7 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Refactoring/RenameEndpointDelegationTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Refactoring/RenameEndpointDelegationTest.cs @@ -64,7 +64,7 @@ await projectManager.UpdateAsync(updater => var searchEngine = new RazorComponentSearchEngine(LoggerFactory); - var renameService = new RenameService(searchEngine, LanguageServerFeatureOptions); + var renameService = new RenameService(searchEngine, new FileSystem(), LanguageServerFeatureOptions); var endpoint = new RenameEndpoint( renameService, @@ -91,7 +91,7 @@ await projectManager.UpdateAsync(updater => var result = await endpoint.HandleRequestAsync(request, requestContext, DisposalToken); // Assert - var edits = result.DocumentChanges.Value.First.FirstOrDefault().Edits.Select(e => codeDocument.Source.Text.GetTextChange(((TextEdit)e))); + var edits = result.EnumerateTextDocumentEdits().First().Edits.Select(e => codeDocument.Source.Text.GetTextChange(((TextEdit)e))); var newText = codeDocument.Source.Text.WithChanges(edits).ToString(); Assert.Equal(expected, newText); } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Refactoring/RenameEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Refactoring/RenameEndpointTest.cs index 6c911d4ab00..1e8c3636de5 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Refactoring/RenameEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Refactoring/RenameEndpointTest.cs @@ -25,6 +25,7 @@ using Moq; using Xunit; using Xunit.Abstractions; +using static Nerdbank.Streams.MultiplexingStream; namespace Microsoft.AspNetCore.Razor.LanguageServer.Refactoring; @@ -106,6 +107,7 @@ public async Task Handle_Rename_FileManipulationNotSupported_ReturnsNull() // Arrange var options = StrictMock.Of(static o => o.SupportsFileManipulation == false && + o.UseRazorCohostServer == false && o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_componentFilePath1); @@ -130,7 +132,11 @@ public async Task Handle_Rename_FileManipulationNotSupported_ReturnsNull() public async Task Handle_Rename_WithNamespaceDirective() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_componentFilePath1); var request = new RenameParams { @@ -171,7 +177,36 @@ public async Task Handle_Rename_WithNamespaceDirective() public async Task Handle_Rename_OnComponentParameter_ReturnsNull() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + + var delegatedEdit = new WorkspaceEdit(); + + var clientConnection = TestMocks.CreateClientConnection(builder => + { + builder.SetupSendRequest(CustomMessageNames.RazorRenameEndpointName, response: delegatedEdit); + }); + + var documentMappingServiceMock = new StrictMock(); + + var projectedPosition = new LinePosition(1, 1); + var projectedIndex = 1; + documentMappingServiceMock + .Setup(x => x.TryMapToCSharpDocumentPosition(It.IsAny(), It.IsAny(), out projectedPosition, out projectedIndex)) + .Returns(true); + + var editMappingServiceMock = new StrictMock(); + editMappingServiceMock + .Setup(x => x.MapWorkspaceEditAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(Task.CompletedTask); + + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync( + options, + documentMappingServiceMock.Object, + editMappingServiceMock.Object, + clientConnection); + var uri = TestPathUtilities.GetUri(s_componentWithParamFilePath); var request = new RenameParams { @@ -187,14 +222,43 @@ public async Task Handle_Rename_OnComponentParameter_ReturnsNull() var result = await endpoint.HandleRequestAsync(request, requestContext, DisposalToken); // Assert - Assert.Null(result); + Assert.Same(delegatedEdit, result); } [Fact] public async Task Handle_Rename_OnOpeningBrace_ReturnsNull() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + + var delegatedEdit = new WorkspaceEdit(); + + var clientConnection = TestMocks.CreateClientConnection(builder => + { + builder.SetupSendRequest(CustomMessageNames.RazorRenameEndpointName, response: delegatedEdit); + }); + + var documentMappingServiceMock = new StrictMock(); + + var projectedPosition = new LinePosition(1, 1); + var projectedIndex = 1; + documentMappingServiceMock + .Setup(x => x.TryMapToCSharpDocumentPosition(It.IsAny(), It.IsAny(), out projectedPosition, out projectedIndex)) + .Returns(true); + + var editMappingServiceMock = new StrictMock(); + editMappingServiceMock + .Setup(x => x.MapWorkspaceEditAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(Task.CompletedTask); + + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync( + options, + documentMappingServiceMock.Object, + editMappingServiceMock.Object, + clientConnection); + var uri = TestPathUtilities.GetUri(s_componentWithParamFilePath); var request = new RenameParams { @@ -210,14 +274,18 @@ public async Task Handle_Rename_OnOpeningBrace_ReturnsNull() var result = await endpoint.HandleRequestAsync(request, requestContext, DisposalToken); // Assert - Assert.Null(result); + Assert.Same(delegatedEdit, result); } [Fact] public async Task Handle_Rename_OnComponentNameLeadingEdge_ReturnsResult() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_componentWithParamFilePath); var request = new RenameParams { @@ -240,7 +308,11 @@ public async Task Handle_Rename_OnComponentNameLeadingEdge_ReturnsResult() public async Task Handle_Rename_OnComponentName_ReturnsResult() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_componentWithParamFilePath); var request = new RenameParams { @@ -263,7 +335,11 @@ public async Task Handle_Rename_OnComponentName_ReturnsResult() public async Task Handle_Rename_OnComponentEndTag_ReturnsResult() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_componentWithParamFilePath); var request = new RenameParams { @@ -286,7 +362,11 @@ public async Task Handle_Rename_OnComponentEndTag_ReturnsResult() public async Task Handle_Rename_OnComponentNameTrailingEdge_ReturnsResult() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_componentWithParamFilePath); var request = new RenameParams { @@ -309,7 +389,11 @@ public async Task Handle_Rename_OnComponentNameTrailingEdge_ReturnsResult() public async Task Handle_Rename_ComponentInSameFile() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_componentFilePath4); var request = new RenameParams { @@ -327,7 +411,7 @@ public async Task Handle_Rename_ComponentInSameFile() // Assert Assert.NotNull(result); var documentChanges = result.DocumentChanges.AssumeNotNull(); - Assert.Equal(5, documentChanges.Count()); + Assert.Equal(4, documentChanges.Count()); // We renamed Component3 to Component5, so we should expect file rename. var renameChange = documentChanges.ElementAt(0); @@ -335,20 +419,14 @@ public async Task Handle_Rename_ComponentInSameFile() Assert.Equal(TestPathUtilities.GetUri(s_componentFilePath3), renameFile.OldDocumentUri.GetRequiredParsedUri()); Assert.Equal(TestPathUtilities.GetUri(s_componentFilePath5), renameFile.NewDocumentUri.GetRequiredParsedUri()); - Assert.Collection(GetTextDocumentEdits(result, startIndex: 1, endIndex: 4), + Assert.Collection(GetTextDocumentEdits(result, startIndex: 1, endIndex: 3), textDocumentEdit => { Assert.Equal(TestPathUtilities.GetUri(s_componentFilePath4), textDocumentEdit.TextDocument.DocumentUri.GetRequiredParsedUri()); Assert.Collection( textDocumentEdit.Edits, AssertTextEdit("Component5", startLine: 1, startCharacter: 1, endLine: 1, endCharacter: 11), - AssertTextEdit("Component5", startLine: 1, startCharacter: 14, endLine: 1, endCharacter: 24)); - }, - textDocumentEdit => - { - Assert.Equal(TestPathUtilities.GetUri(s_componentFilePath4), textDocumentEdit.TextDocument.DocumentUri.GetRequiredParsedUri()); - Assert.Collection( - textDocumentEdit.Edits, + AssertTextEdit("Component5", startLine: 1, startCharacter: 14, endLine: 1, endCharacter: 24), AssertTextEdit("Component5", startLine: 2, startCharacter: 1, endLine: 2, endCharacter: 11), AssertTextEdit("Component5", startLine: 2, startCharacter: 14, endLine: 2, endCharacter: 24)); }, @@ -395,7 +473,11 @@ static IEnumerable GetTextDocumentEdits(WorkspaceEdit workspac public async Task Handle_Rename_FullyQualifiedAndNot() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_indexFilePath1); var request = new RenameParams { @@ -413,7 +495,7 @@ public async Task Handle_Rename_FullyQualifiedAndNot() // Assert Assert.NotNull(result); var documentChanges = result.DocumentChanges.AssumeNotNull(); - Assert.Equal(3, documentChanges.Count()); + Assert.Equal(2, documentChanges.Count()); var renameChange = documentChanges.ElementAt(0); Assert.True(renameChange.TryGetThird(out var renameFile)); @@ -426,13 +508,7 @@ public async Task Handle_Rename_FullyQualifiedAndNot() Assert.Collection( textDocumentEdit.Edits, AssertTextEdit("Component5", startLine: 2, startCharacter: 1, endLine: 2, endCharacter: 14), - AssertTextEdit("Component5", startLine: 2, startCharacter: 17, endLine: 2, endCharacter: 30)); - - var editChange2 = result.DocumentChanges.Value.ElementAt(2); - Assert.True(editChange2.TryGetFirst(out var textDocumentEdit2)); - Assert.Equal(TestPathUtilities.GetUri(s_indexFilePath1), textDocumentEdit2.TextDocument.DocumentUri.GetRequiredParsedUri()); - Assert.Collection( - textDocumentEdit2.Edits, + AssertTextEdit("Component5", startLine: 2, startCharacter: 17, endLine: 2, endCharacter: 30), AssertTextEdit("Test.Component5", startLine: 3, startCharacter: 1, endLine: 3, endCharacter: 19), AssertTextEdit("Test.Component5", startLine: 3, startCharacter: 22, endLine: 3, endCharacter: 40)); } @@ -441,7 +517,11 @@ public async Task Handle_Rename_FullyQualifiedAndNot() public async Task Handle_Rename_MultipleFileUsages() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_componentFilePath3); var request = new RenameParams { @@ -459,7 +539,7 @@ public async Task Handle_Rename_MultipleFileUsages() // Assert Assert.NotNull(result); var documentChanges = result.DocumentChanges.AssumeNotNull(); - Assert.Equal(5, documentChanges.Count()); + Assert.Equal(4, documentChanges.Count()); var renameChange = documentChanges.ElementAt(0); Assert.True(renameChange.TryGetThird(out var renameFile)); @@ -477,24 +557,29 @@ public async Task Handle_Rename_MultipleFileUsages() var editChange2 = documentChanges.ElementAt(2); Assert.True(editChange2.TryGetFirst(out var textDocumentEdit2)); Assert.Equal(TestPathUtilities.GetUri(s_componentFilePath4), textDocumentEdit2.TextDocument.DocumentUri.GetRequiredParsedUri()); - Assert.Equal(2, textDocumentEdit2.Edits.Length); + Assert.Collection( + textDocumentEdit.Edits, + AssertTextEdit("Component5", 1, 1, 1, 11), + AssertTextEdit("Component5", 1, 14, 1, 24)); var editChange3 = documentChanges.ElementAt(3); Assert.True(editChange3.TryGetFirst(out var textDocumentEdit3)); - Assert.Equal(TestPathUtilities.GetUri(s_componentFilePath4), textDocumentEdit3.TextDocument.DocumentUri.GetRequiredParsedUri()); - Assert.Equal(2, textDocumentEdit3.Edits.Length); - - var editChange4 = documentChanges.ElementAt(4); - Assert.True(editChange4.TryGetFirst(out var textDocumentEdit4)); - Assert.Equal(TestPathUtilities.GetUri(s_componentWithParamFilePath), textDocumentEdit4.TextDocument.DocumentUri.GetRequiredParsedUri()); - Assert.Equal(2, textDocumentEdit4.Edits.Length); + Assert.Equal(TestPathUtilities.GetUri(s_componentWithParamFilePath), textDocumentEdit3.TextDocument.DocumentUri.GetRequiredParsedUri()); + Assert.Collection( + textDocumentEdit.Edits, + AssertTextEdit("Component5", 1, 1, 1, 11), + AssertTextEdit("Component5", 1, 14, 1, 24)); } [Fact] public async Task Handle_Rename_DifferentDirectories() { // Arrange - var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(); + var options = StrictMock.Of(static o => + o.SupportsFileManipulation == true && + o.UseRazorCohostServer == false && + o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); + var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync(options); var uri = TestPathUtilities.GetUri(s_directoryFilePath1); var request = new RenameParams { @@ -534,7 +619,6 @@ public async Task Handle_Rename_SingleServer_CallsDelegatedLanguageServer() // Arrange var options = StrictMock.Of(static o => o.SupportsFileManipulation == true && - o.SingleServerSupport == true && o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); var delegatedEdit = new WorkspaceEdit(); @@ -554,8 +638,8 @@ public async Task Handle_Rename_SingleServer_CallsDelegatedLanguageServer() var editMappingServiceMock = new StrictMock(); editMappingServiceMock - .Setup(x => x.RemapWorkspaceEditAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(delegatedEdit); + .Setup(x => x.MapWorkspaceEditAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(Task.CompletedTask); var (endpoint, documentContextFactory) = await CreateEndpointAndDocumentContextFactoryAsync( options, @@ -587,7 +671,6 @@ public async Task Handle_Rename_SingleServer_DoesNotDelegateForRazor() // Arrange var options = StrictMock.Of(static o => o.SupportsFileManipulation == true && - o.SingleServerSupport == true && o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); var documentMappingService = StrictMock.Of(); @@ -617,16 +700,7 @@ public async Task Handle_Rename_SingleServer_DoesNotDelegateForRazor() IEditMappingService? editMappingService = null, IClientConnection? clientConnection = null) { - using PooledArrayBuilder builder = []; - builder.AddRange(CreateRazorComponentTagHelperDescriptors("First", RootNamespace1, "Component1")); - builder.AddRange(CreateRazorComponentTagHelperDescriptors("First", "Test", "Component2")); - builder.AddRange(CreateRazorComponentTagHelperDescriptors("Second", RootNamespace2, "Component3")); - builder.AddRange(CreateRazorComponentTagHelperDescriptors("Second", RootNamespace2, "Component4")); - builder.AddRange(CreateRazorComponentTagHelperDescriptors("First", "Test", "Component1337")); - builder.AddRange(CreateRazorComponentTagHelperDescriptors("First", "Test.Components", "Directory1")); - builder.AddRange(CreateRazorComponentTagHelperDescriptors("First", "Test.Components", "Directory2")); - var tagHelpers = builder.ToImmutable(); - + var tagHelpers = CreateRazorComponentTagHelpers(); var projectManager = CreateProjectSnapshotManager(); var documentContextFactory = new DocumentContextFactory(projectManager, LoggerFactory); @@ -691,7 +765,6 @@ await projectManager.UpdateAsync(updater => var searchEngine = new RazorComponentSearchEngine(LoggerFactory); options ??= StrictMock.Of(static o => o.SupportsFileManipulation == true && - o.SingleServerSupport == false && o.ReturnCodeActionAndRenamePathsWithPrefixedSlash == false); if (documentMappingService == null) @@ -710,7 +783,7 @@ await projectManager.UpdateAsync(updater => clientConnection ??= StrictMock.Of(); - var renameService = new RenameService(searchEngine, options); + var renameService = new RenameService(searchEngine, new FileSystem(), options); var endpoint = new RenameEndpoint( renameService, options, @@ -723,21 +796,36 @@ await projectManager.UpdateAsync(updater => return (endpoint, documentContextFactory); } - private static IEnumerable CreateRazorComponentTagHelperDescriptors(string assemblyName, string namespaceName, string tagName) + private static TagHelperCollection CreateRazorComponentTagHelpers() { - var fullyQualifiedName = $"{namespaceName}.{tagName}"; - var builder = TagHelperDescriptorBuilder.CreateComponent(fullyQualifiedName, assemblyName); - builder.SetTypeName(fullyQualifiedName, namespaceName, tagName); - builder.TagMatchingRule(rule => rule.TagName = tagName); + using var builder = new TagHelperCollection.RefBuilder(); + builder.AddRange(CreateRazorComponentTagHelpersCore("First", RootNamespace1, "Component1")); + builder.AddRange(CreateRazorComponentTagHelpersCore("First", "Test", "Component2")); + builder.AddRange(CreateRazorComponentTagHelpersCore("Second", RootNamespace2, "Component3")); + builder.AddRange(CreateRazorComponentTagHelpersCore("Second", RootNamespace2, "Component4")); + builder.AddRange(CreateRazorComponentTagHelpersCore("First", "Test", "Component1337")); + builder.AddRange(CreateRazorComponentTagHelpersCore("First", "Test.Components", "Directory1")); + builder.AddRange(CreateRazorComponentTagHelpersCore("First", "Test.Components", "Directory2")); + + return builder.ToCollection(); + + static IEnumerable CreateRazorComponentTagHelpersCore( + string assemblyName, string namespaceName, string tagName) + { + var fullyQualifiedName = $"{namespaceName}.{tagName}"; + var builder = TagHelperDescriptorBuilder.CreateComponent(fullyQualifiedName, assemblyName); + builder.SetTypeName(fullyQualifiedName, namespaceName, tagName); + builder.TagMatchingRule(rule => rule.TagName = tagName); - yield return builder.Build(); + yield return builder.Build(); - var fullyQualifiedBuilder = TagHelperDescriptorBuilder.CreateComponent(fullyQualifiedName, assemblyName); - fullyQualifiedBuilder.SetTypeName(fullyQualifiedName, namespaceName, tagName); - fullyQualifiedBuilder.TagMatchingRule(rule => rule.TagName = fullyQualifiedName); - fullyQualifiedBuilder.IsFullyQualifiedNameMatch = true; + var fullyQualifiedBuilder = TagHelperDescriptorBuilder.CreateComponent(fullyQualifiedName, assemblyName); + fullyQualifiedBuilder.SetTypeName(fullyQualifiedName, namespaceName, tagName); + fullyQualifiedBuilder.TagMatchingRule(rule => rule.TagName = fullyQualifiedName); + fullyQualifiedBuilder.IsFullyQualifiedNameMatch = true; - yield return fullyQualifiedBuilder.Build(); + yield return fullyQualifiedBuilder.Build(); + } } private static Action> AssertTextEdit(string fileName, int startLine, int startCharacter, int endLine, int endCharacter) diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Semantic/SemanticTokensTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Semantic/SemanticTokensTest.cs index f5764b61ca7..ed8ed02e44c 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Semantic/SemanticTokensTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Semantic/SemanticTokensTest.cs @@ -930,7 +930,7 @@ private async Task AssertSemanticTokensAsync( private static DocumentContext CreateDocumentContext( string documentText, bool isRazorFile, - ImmutableArray tagHelpers, + TagHelperCollection tagHelpers, int version) { var document = CreateCodeDocument(documentText, isRazorFile, tagHelpers); @@ -1042,7 +1042,7 @@ private void AssertSemanticTokensMatchesBaseline(SourceText sourceText, int[]? a testName += "_VSCode"; } - var fileName = $"Semantic\\TestFiles\\{testName}"; + var fileName = Path.Combine("Semantic", "TestFiles", testName); var baselineFileName = Path.ChangeExtension(fileName, ".semantic.txt"); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SignatureHelp/SignatureHelpEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SignatureHelp/SignatureHelpEndpointTest.cs index ca224c641a5..300b21f3fe7 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SignatureHelp/SignatureHelpEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SignatureHelp/SignatureHelpEndpointTest.cs @@ -100,7 +100,7 @@ private async Task VerifySignatureHelpWithContextAndOptionsAsync(string input, R optionsMonitor ??= GetOptionsMonitor(); var endpoint = new SignatureHelpEndpoint( - LanguageServerFeatureOptions, DocumentMappingService, languageServer, optionsMonitor, LoggerFactory); + DocumentMappingService, languageServer, optionsMonitor, LoggerFactory); var request = new SignatureHelpParams { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SingleServerDelegatingEndpointTestBase.TestLanguageServer.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SingleServerDelegatingEndpointTestBase.TestLanguageServer.cs index 8b653606562..ca61a460e92 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SingleServerDelegatingEndpointTestBase.TestLanguageServer.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SingleServerDelegatingEndpointTestBase.TestLanguageServer.cs @@ -252,6 +252,9 @@ private Task HandleReferencesAsync(TParams @ }, Position = delegatedParams.ProjectedPosition, Context = new ReferenceContext() + { + IncludeDeclaration = true + }, }; return _csharpServer.ExecuteRequestAsync( diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SingleServerDelegatingEndpointTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SingleServerDelegatingEndpointTestBase.cs index 8b65398155e..df57b026815 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SingleServerDelegatingEndpointTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SingleServerDelegatingEndpointTestBase.cs @@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer; using Microsoft.CodeAnalysis.Razor.DocumentMapping; using Microsoft.CodeAnalysis.Razor.ProjectSystem; +using Microsoft.CodeAnalysis.Razor.Telemetry; using Microsoft.CodeAnalysis.Razor.Workspaces; using Microsoft.CodeAnalysis.Text; using Moq; @@ -56,14 +57,11 @@ private protected async Task CreateLanguageServerAsync( DocumentContextFactory = new TestDocumentContextFactory(razorFilePath, codeDocument); LanguageServerFeatureOptions = Mock.Of(options => - options.SupportsFileManipulation == true && - options.SingleServerSupport == true && - options.CSharpVirtualDocumentSuffix == DefaultLanguageServerFeatureOptions.DefaultCSharpVirtualDocumentSuffix && - options.HtmlVirtualDocumentSuffix == DefaultLanguageServerFeatureOptions.DefaultHtmlVirtualDocumentSuffix, + options.SupportsFileManipulation == true, MockBehavior.Strict); DocumentMappingService = new LspDocumentMappingService(FilePathService, DocumentContextFactory, LoggerFactory); - EditMappingService = new LspEditMappingService(DocumentMappingService, FilePathService, DocumentContextFactory); + EditMappingService = new LspEditMappingService(DocumentMappingService, NoOpTelemetryReporter.Instance, FilePathService, DocumentContextFactory); // Don't declare this with an 'await using'. TestLanguageServer will own the lifetime of this C# LSP server. var csharpServer = await CSharpTestLspServerHelpers.CreateCSharpLspServerAsync( diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SpellCheck/DocumentSpellCheckEndpointTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SpellCheck/DocumentSpellCheckEndpointTest.cs index e33e1657623..4510bdcfb89 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SpellCheck/DocumentSpellCheckEndpointTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/SpellCheck/DocumentSpellCheckEndpointTest.cs @@ -174,7 +174,7 @@ private async Task ValidateSpellCheckRangesAsync(string originalInput, string? f var documentContext = CreateDocumentContext(uri, codeDocument); var requestContext = new RazorRequestContext(documentContext, null!, "lsp/method", uri: null); - var csharpSpellCheckService = new LspCSharpSpellCheckRangeProvider(LanguageServerFeatureOptions, languageServer); + var csharpSpellCheckService = new LspCSharpSpellCheckRangeProvider(languageServer); var spellCheckService = new SpellCheckService(csharpSpellCheckService, DocumentMappingService); var endpoint = new DocumentSpellCheckEndpoint(spellCheckService); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/TagHelperFactsServiceTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/TagHelperFactsServiceTest.cs index 1c181387342..dfd9cded377 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/TagHelperFactsServiceTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/TagHelperFactsServiceTest.cs @@ -4,7 +4,6 @@ #nullable disable using System; -using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Syntax; using Microsoft.AspNetCore.Razor.LanguageServer.Completion; @@ -20,7 +19,7 @@ public class TagHelperFactsServiceTest(ITestOutputHelper testOutput) : TagHelper public void StringifyAttributes_DirectiveAttribute() { // Arrange - var codeDocument = CreateComponentDocument($"", DefaultTagHelpers); + var codeDocument = CreateComponentDocument($"", [.. DefaultTagHelpers]); var root = codeDocument.GetRequiredSyntaxRoot(); var startTag = (MarkupTagHelperStartTagSyntax)root.FindInnermostNode(3); @@ -41,7 +40,7 @@ public void StringifyAttributes_DirectiveAttribute() public void StringifyAttributes_DirectiveAttributeWithParameter() { // Arrange - var codeDocument = CreateComponentDocument($"", DefaultTagHelpers); + var codeDocument = CreateComponentDocument($"", [.. DefaultTagHelpers]); var root = codeDocument.GetRequiredSyntaxRoot(); var startTag = (MarkupTagHelperStartTagSyntax)root.FindInnermostNode(3); @@ -62,7 +61,7 @@ public void StringifyAttributes_DirectiveAttributeWithParameter() public void StringifyAttributes_MinimizedDirectiveAttribute() { // Arrange - var codeDocument = CreateComponentDocument($"", DefaultTagHelpers); + var codeDocument = CreateComponentDocument($"", [.. DefaultTagHelpers]); var root = codeDocument.GetRequiredSyntaxRoot(); var startTag = (MarkupTagHelperStartTagSyntax)root.FindInnermostNode(3); @@ -83,7 +82,7 @@ public void StringifyAttributes_MinimizedDirectiveAttribute() public void StringifyAttributes_MinimizedDirectiveAttributeWithParameter() { // Arrange - var codeDocument = CreateComponentDocument($"", DefaultTagHelpers); + var codeDocument = CreateComponentDocument($"", [.. DefaultTagHelpers]); var root = codeDocument.GetRequiredSyntaxRoot(); var startTag = (MarkupTagHelperStartTagSyntax)root.FindInnermostNode(3); @@ -238,9 +237,9 @@ public void StringifyAttributes_IgnoresMiscContent() }); } - private static RazorCodeDocument CreateComponentDocument(string text, ImmutableArray tagHelpers) + private static RazorCodeDocument CreateComponentDocument(string text, TagHelperCollection tagHelpers) { - tagHelpers = tagHelpers.NullToEmpty(); + tagHelpers ??= []; var sourceDocument = TestRazorSourceDocument.Create(text); var projectEngine = RazorProjectEngine.Create(builder => { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/WorkspaceRootPathWatcherTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/WorkspaceRootPathWatcherTest.cs index 7d59b75a556..d2dbd83855a 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/WorkspaceRootPathWatcherTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/WorkspaceRootPathWatcherTest.cs @@ -3,14 +3,10 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem; using Microsoft.AspNetCore.Razor.Test.Common; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; -using Microsoft.CodeAnalysis.Razor.Logging; -using Microsoft.CodeAnalysis.Razor.Workspaces; using Moq; using Xunit; using Xunit.Abstractions; @@ -40,7 +36,7 @@ public async Task InitializedAsync_CallsStartAsync() var started = false; using var watcher = new TestWorkspaceRootPathWatcher( - capabilitiesManager, StrictMock.Of(), StrictMock.Of(), LoggerFactory, + capabilitiesManager, StrictMock.Of(), onStartAsync: (workspaceDirectory, _) => { started = true; @@ -55,39 +51,6 @@ public async Task InitializedAsync_CallsStartAsync() Assert.True(started); } - [Fact] - public async Task StartAsync_NotifiesProjectServiceOfExistingRazorFiles() - { - // Arrange - var actual = new List(); - - var projectServiceMock = new StrictMock(); - projectServiceMock - .Setup(x => x.AddDocumentsToMiscProjectAsync(It.IsAny>(), It.IsAny())) - .Callback((ImmutableArray filePaths, CancellationToken _) => actual.AddRange(filePaths)) - .Returns(Task.CompletedTask); - - var workspaceRootPathProviderMock = new StrictMock(); - workspaceRootPathProviderMock - .Setup(x => x.GetRootPathAsync(It.IsAny())) - .ReturnsAsync("/some/workspacedirectory"); - - ImmutableArray existingRazorFiles = ["c:/path/to/index.razor", "c:/other/path/_Host.cshtml"]; - - using var watcher = new TestWorkspaceRootPathWatcher( - workspaceRootPathProviderMock.Object, - projectServiceMock.Object, - StrictMock.Of(), - LoggerFactory, - existingRazorFiles); - - // Act - await watcher.OnInitializedAsync(DisposalToken); - - // Assert - Assert.Equal(existingRazorFiles, actual); - } - [Theory] [MemberData(nameof(NotificationBehaviorData))] internal async Task TestNotificationBehavior((string, RazorFileChangeKind)[] work, (string, RazorFileChangeKind)[] expected) @@ -111,9 +74,7 @@ internal async Task TestNotificationBehavior((string, RazorFileChangeKind)[] wor using var watcher = new TestWorkspaceRootPathWatcher( workspaceRootPathProviderMock.Object, - projectServiceMock.Object, - StrictMock.Of(), - LoggerFactory); + projectServiceMock.Object); var watcherAccessor = watcher.GetTestAccessor(); @@ -150,11 +111,8 @@ public static TheoryData NotificationBehaviorData private class TestWorkspaceRootPathWatcher( IWorkspaceRootPathProvider workspaceRootPathProvider, IRazorProjectService projectService, - IFileSystem fileSystem, - ILoggerFactory loggerFactory, - ImmutableArray existingRazorFiles = default, Func? onStartAsync = null) - : WorkspaceRootPathWatcher(workspaceRootPathProvider, projectService, TestLanguageServerFeatureOptions.Instance, fileSystem, loggerFactory, delay: TimeSpan.Zero) + : WorkspaceRootPathWatcher(workspaceRootPathProvider, projectService, delay: TimeSpan.Zero) { protected override Task StartAsync(string workspaceDirectory, CancellationToken cancellationToken) { @@ -164,8 +122,5 @@ protected override Task StartAsync(string workspaceDirectory, CancellationToken } protected override bool InitializeFileWatchers => false; - - protected override ImmutableArray GetExistingRazorFiles(string workspaceDirectory) - => existingRazorFiles.NullToEmpty(); } } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/CohostTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/CohostTestBase.cs index 6b9c368f408..6a2a5c3b608 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/CohostTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/CohostTestBase.cs @@ -85,13 +85,10 @@ protected override async Task InitializeAsync() _clientInitializationOptions = new() { - HtmlVirtualDocumentSuffix = ".g.html", UseRazorCohostServer = true, ReturnCodeActionAndRenamePathsWithPrefixedSlash = false, SupportsFileManipulation = true, ShowAllCSharpCodeActions = false, - SupportsSoftSelectionInCompletion = true, - UseVsCodeCompletionCommitCharacters = false, }; UpdateClientInitializationOptions(c => c); @@ -146,22 +143,26 @@ private protected void UpdateClientLSPInitializationOptions(Func? projectConfigure = null); - protected TextDocument CreateProjectAndRazorDocument( + private protected TextDocument CreateProjectAndRazorDocument( CodeAnalysis.Workspace remoteWorkspace, string contents, RazorFileKind? fileKind = null, string? documentFilePath = null, (string fileName, string contents)[]? additionalFiles = null, bool inGlobalNamespace = false, - bool miscellaneousFile = false) + bool miscellaneousFile = false, + bool addDefaultImports = true, + Action? projectConfigure = null) { // Using IsLegacy means null == component, so easier for test authors var isComponent = fileKind != RazorFileKind.Legacy; @@ -173,18 +174,34 @@ protected TextDocument CreateProjectAndRazorDocument( var projectId = ProjectId.CreateNewId(debugName: TestProjectData.SomeProject.DisplayName); var documentId = DocumentId.CreateNewId(projectId, debugName: documentFilePath); - return CreateProjectAndRazorDocument(remoteWorkspace, projectId, miscellaneousFile, documentId, documentFilePath, contents, additionalFiles, inGlobalNamespace); + return CreateProjectAndRazorDocument(remoteWorkspace, projectId, miscellaneousFile, documentId, documentFilePath, contents, additionalFiles, inGlobalNamespace, addDefaultImports, projectConfigure); } - protected static TextDocument CreateProjectAndRazorDocument(CodeAnalysis.Workspace workspace, ProjectId projectId, bool miscellaneousFile, DocumentId documentId, string documentFilePath, string contents, (string fileName, string contents)[]? additionalFiles, bool inGlobalNamespace) + private protected static TextDocument CreateProjectAndRazorDocument(CodeAnalysis.Workspace workspace, ProjectId projectId, bool miscellaneousFile, DocumentId documentId, string documentFilePath, string contents, (string fileName, string contents)[]? additionalFiles, bool inGlobalNamespace, bool addDefaultImports, Action? projectConfigure) { - return AddProjectAndRazorDocument(workspace.CurrentSolution, TestProjectData.SomeProject.FilePath, projectId, miscellaneousFile, documentId, documentFilePath, contents, additionalFiles, inGlobalNamespace); + return AddProjectAndRazorDocument(workspace.CurrentSolution, TestProjectData.SomeProject.FilePath, projectId, documentId, documentFilePath, contents, miscellaneousFile, additionalFiles, inGlobalNamespace, addDefaultImports, projectConfigure); } - protected static TextDocument AddProjectAndRazorDocument(Solution solution, [DisallowNull] string? projectFilePath, ProjectId projectId, bool miscellaneousFile, DocumentId documentId, string documentFilePath, string contents, (string fileName, string contents)[]? additionalFiles, bool inGlobalNamespace) + private protected static TextDocument AddProjectAndRazorDocument( + Solution solution, + [DisallowNull] string? projectFilePath, + ProjectId projectId, + DocumentId documentId, + string documentFilePath, + string contents, + bool miscellaneousFile = false, + (string fileName, string contents)[]? additionalFiles = null, + bool inGlobalNamespace = false, + bool addDefaultImports = true, + Action? projectConfigure = null) { var builder = new RazorProjectBuilder(projectId); + if (projectConfigure is not null) + { + projectConfigure(builder); + } + builder.AddReferences(miscellaneousFile ? Net461.ReferenceInfos.All.Select(r => r.Reference) // This isn't quite what Roslyn does, but its close enough for our tests : AspNet80.ReferenceInfos.All.Select(r => r.Reference)); @@ -202,7 +219,9 @@ protected static TextDocument AddProjectAndRazorDocument(Solution solution, [Dis builder.RootNamespace = TestProjectData.SomeProject.RootNamespace; } - builder.AddAdditionalDocument( + if (addDefaultImports) + { + builder.AddAdditionalDocument( filePath: TestProjectData.SomeProjectComponentImportFile1.FilePath, text: SourceText.From(""" @using Microsoft.AspNetCore.Components @@ -211,11 +230,12 @@ @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web """)); - builder.AddAdditionalDocument( + builder.AddAdditionalDocument( filePath: TestProjectData.SomeProjectImportFile.FilePath, text: SourceText.From(""" @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers """)); + } if (additionalFiles is not null) { diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/RazorProjectBuilder.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/RazorProjectBuilder.cs index 8bd7ebb30ad..54de1c57d39 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/RazorProjectBuilder.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/RazorProjectBuilder.cs @@ -6,6 +6,7 @@ using System.IO; using System.Text; using Microsoft.AspNetCore.Razor; +using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Diagnostics; @@ -40,6 +41,8 @@ public string? ProjectFilePath public bool GenerateMSBuildProjectDirectory { get; set; } = true; public bool GenerateAdditionalDocumentMetadata { get; set; } = true; + public RazorLanguageVersion RazorLanguageVersion { get; set; } = RazorLanguageVersion.Preview; + private readonly List _references = []; private readonly List<(DocumentId id, string name, SourceText text, string filePath)> _documents = []; private readonly List<(DocumentId id, string name, SourceText text, string filePath)> _additionalDocuments = []; @@ -111,7 +114,7 @@ public Solution Build(Solution solution) globalConfigContent.AppendLine($""" is_global = true - build_property.RazorLangVersion = {FallbackRazorConfiguration.Latest.LanguageVersion} + build_property.RazorLangVersion = {RazorLanguageVersion} build_property.RazorConfiguration = {FallbackRazorConfiguration.Latest.ConfigurationName} build_property.RootNamespace = {RootNamespace} diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/TestFileSystem.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/TestFileSystem.cs new file mode 100644 index 00000000000..03837ca83a7 --- /dev/null +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/TestFileSystem.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Microsoft.AspNetCore.Razor; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Razor.Utilities; +using Microsoft.CodeAnalysis.Razor.Workspaces; + +namespace Microsoft.VisualStudio.Razor.LanguageClient.Cohost; + +internal sealed class TestFileSystem((string filePath, string contents)[]? files) : IFileSystem +{ + public bool FileExists(string filePath) + => files?.Any(f => FilePathNormalizingComparer.Instance.Equals(f.filePath, filePath)) ?? false; + + public string ReadFile(string filePath) + => files.AssumeNotNull().Single(f => FilePathNormalizingComparer.Instance.Equals(f.filePath, filePath)).contents; + + public Stream OpenReadStream(string filePath) + => new MemoryStream(Encoding.UTF8.GetBytes(ReadFile(filePath))); + + public IEnumerable GetDirectories(string workspaceDirectory) + => throw new NotImplementedException(); + + public IEnumerable GetFiles(string workspaceDirectory, string searchPattern, SearchOption searchOption) + => throw new NotImplementedException(); +} diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/AssertExtensions.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/AssertExtensions.cs index e03a5a47bbd..54aafd5fd23 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/AssertExtensions.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/AssertExtensions.cs @@ -1,6 +1,16 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; +using Microsoft.CodeAnalysis.Razor; +using Roslyn.Test.Utilities; using Roslyn.Text.Adornments; using Xunit; @@ -18,4 +28,83 @@ internal static void AssertExpectedClassification( Assert.Equal(expectedClassificationType, run.ClassificationTypeName); Assert.Equal(expectedClassificationStyle, run.Style); } + + public static async Task AssertWorkspaceEditAsync(this WorkspaceEdit workspaceEdit, Solution solution, IEnumerable<(Uri fileUri, string contents)> expectedChanges, CancellationToken cancellationToken) + { + var changes = Assert.NotNull(workspaceEdit.DocumentChanges); + + foreach (var change in Flatten(changes)) + { + if (change.TryGetFirst(out var textDocumentEdit)) + { + var uri = textDocumentEdit.TextDocument.DocumentUri.GetRequiredParsedUri(); + var documentId = solution.GetDocumentIdsWithFilePath(RazorUri.GetDocumentFilePathFromUri(uri)).Single(); + var document = solution.GetDocument(documentId) ?? solution.GetAdditionalDocument(documentId); + Assert.NotNull(document); + var text = await document.GetTextAsync(cancellationToken); + + text = text.WithChanges(textDocumentEdit.Edits.Select(e => text.GetTextChange((TextEdit)e))); + + solution = document is Document + ? solution.WithDocumentText(document.Id, text) + : solution.WithAdditionalDocumentText(document.Id, text); + } + else if (change.TryGetSecond(out var createFile)) + { + var uri = createFile.DocumentUri.GetRequiredParsedUri(); + var documentId = DocumentId.CreateNewId(solution.ProjectIds.Single()); + var filePath = createFile.DocumentUri.GetRequiredParsedUri().GetDocumentFilePath(); + var documentInfo = DocumentInfo.Create(documentId, Path.GetFileName(filePath), filePath: filePath); + solution = solution.AddDocument(documentInfo); + } + else if (change.TryGetThird(out var renameFile)) + { + var (oldUri, newUri) = (renameFile.OldDocumentUri.GetRequiredParsedUri(), renameFile.NewDocumentUri.GetRequiredParsedUri()); + var documentId = solution.GetDocumentIdsWithFilePath(RazorUri.GetDocumentFilePathFromUri(oldUri)).Single(); + var document = solution.GetDocument(documentId) ?? solution.GetAdditionalDocument(documentId); + Assert.NotNull(document); + if (document is Document) + { + solution = solution.WithDocumentFilePath(document.Id, newUri.GetDocumentFilePath()); + } + else + { + var filePath = newUri.GetDocumentFilePath(); + var text = await document.GetTextAsync(cancellationToken); + solution = document.Project + .RemoveAdditionalDocument(document.Id) + .AddAdditionalDocument(Path.GetFileName(filePath), text, filePath: filePath).Project.Solution; + } + } + else + { + Assert.Fail($"Don't know how to process a {change.Value?.GetType().Name}."); + } + } + + foreach (var (uri, contents) in expectedChanges) + { + var document = solution.GetTextDocuments(uri).First(); + var text = await document.GetTextAsync(cancellationToken); + AssertEx.EqualOrDiff(contents, text.ToString()); + } + + static IEnumerable> Flatten(SumType[]> documentChanges) + { + if (documentChanges.TryGetFirst(out var textDocumentEdits)) + { + foreach (var edit in textDocumentEdits) + { + yield return edit; + } + } + else if (documentChanges.TryGetSecond(out var changes)) + { + foreach (var change in changes) + { + yield return change; + } + } + } + } } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/LanguageServer/LanguageServerTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/LanguageServer/LanguageServerTestBase.cs index 2a8a13f2530..ec292c917e5 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/LanguageServer/LanguageServerTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/LanguageServer/LanguageServerTestBase.cs @@ -47,16 +47,20 @@ private protected static RazorRequestContext CreateRazorRequestContext( LspServices? lspServices = null) => new(documentContext, lspServices ?? LspServices.Empty, "lsp/method", uri: null); - protected static RazorCodeDocument CreateCodeDocument(string text, ImmutableArray tagHelpers = default, string? filePath = null, string? rootNamespace = null) + protected static RazorCodeDocument CreateCodeDocument( + string text, + TagHelperCollection? tagHelpers = null, + string? filePath = null, + string? rootNamespace = null) { filePath ??= "test.cshtml"; var fileKind = FileKinds.GetFileKindFromPath(filePath); - tagHelpers = tagHelpers.NullToEmpty(); + tagHelpers ??= []; if (fileKind == RazorFileKind.Component) { - tagHelpers = tagHelpers.AddRange(RazorTestResources.BlazorServerAppTagHelpers); + tagHelpers = TagHelperCollection.Merge(tagHelpers, [.. RazorTestResources.BlazorServerAppTagHelpers]); } var sourceDocument = TestRazorSourceDocument.Create(text, filePath: filePath, relativePath: filePath); diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/Microsoft.AspNetCore.Razor.Test.Common.Tooling.csproj b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/Microsoft.AspNetCore.Razor.Test.Common.Tooling.csproj index 860631080d2..5b493fc1cc2 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/Microsoft.AspNetCore.Razor.Test.Common.Tooling.csproj +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/Microsoft.AspNetCore.Razor.Test.Common.Tooling.csproj @@ -83,7 +83,6 @@ -
                  ] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 local name [] [r] +0 2 1 operator [] [=] +0 2 9 namespace name [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace name [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace name [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace name [] [Web] +0 3 1 operator [] [.] +0 1 10 class name [static] [RenderMode] +0 10 1 operator [] [.] +0 1 15 property name [static] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression.txt new file mode 100644 index 00000000000..28d12e8de61 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression.txt @@ -0,0 +1,38 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 1 razorTransition [] [@] +0 1 1 razorTransition [] [(] +0 1 9 namespace name [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace name [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace name [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace name [] [Web] +0 3 1 operator [] [.] +0 1 10 class name [static] [RenderMode] +0 10 1 operator [] [.] +0 1 17 property name [static] [InteractiveServer] +0 17 1 razorTransition [] [)] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 local name [] [r] +0 2 1 operator [] [=] +0 2 9 namespace name [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace name [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace name [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace name [] [Web] +0 3 1 operator [] [.] +0 1 10 class name [static] [RenderMode] +0 10 1 operator [] [.] +0 1 15 property name [static] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_misc_file.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_misc_file.txt new file mode 100644 index 00000000000..57368b36cae --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_misc_file.txt @@ -0,0 +1,38 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 1 razorTransition [] [@] +0 1 1 razorTransition [] [(] +0 1 9 namespace name [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 variable [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 variable [] [Components] +0 10 1 operator [] [.] +0 1 3 variable [] [Web] +0 3 1 operator [] [.] +0 1 10 variable [] [RenderMode] +0 10 1 operator [] [.] +0 1 17 variable [] [InteractiveServer] +0 17 1 razorTransition [] [)] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 local name [] [r] +0 2 1 operator [] [=] +0 2 9 namespace name [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 variable [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 variable [] [Components] +0 10 1 operator [] [.] +0 1 3 variable [] [Web] +0 3 1 operator [] [.] +0 1 10 variable [] [RenderMode] +0 10 1 operator [] [.] +0 1 15 variable [] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background.txt new file mode 100644 index 00000000000..e85ca4e2705 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background.txt @@ -0,0 +1,42 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 1 razorTransition [] [@] +0 1 1 razorTransition [razorCode] [(] +0 1 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace name [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class name [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 17 property name [static, razorCode] [InteractiveServer] +0 17 1 razorTransition [razorCode] [)] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 local name [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace name [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class name [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 property name [static, razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background_misc_file.txt new file mode 100644 index 00000000000..380fdce4e32 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background_misc_file.txt @@ -0,0 +1,42 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 1 razorTransition [] [@] +0 1 1 razorTransition [razorCode] [(] +0 1 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 variable [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 17 variable [razorCode] [InteractiveServer] +0 17 1 razorTransition [razorCode] [)] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 local name [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 variable [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 variable [razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9.txt new file mode 100644 index 00000000000..9f9f101a1d7 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9.txt @@ -0,0 +1,24 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 local name [] [r] +0 2 1 operator [] [=] +0 2 9 namespace name [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace name [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace name [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace name [] [Web] +0 3 1 operator [] [.] +0 1 10 class name [static] [RenderMode] +0 10 1 operator [] [.] +0 1 15 property name [static] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_misc_file.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_misc_file.txt new file mode 100644 index 00000000000..ffac864b56b --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_misc_file.txt @@ -0,0 +1,24 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 local name [] [r] +0 2 1 operator [] [=] +0 2 9 namespace name [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 variable [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 variable [] [Components] +0 10 1 operator [] [.] +0 1 3 variable [] [Web] +0 3 1 operator [] [.] +0 1 10 variable [] [RenderMode] +0 10 1 operator [] [.] +0 1 15 variable [] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background.txt new file mode 100644 index 00000000000..f1930a86698 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background.txt @@ -0,0 +1,28 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 local name [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace name [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class name [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 property name [static, razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background_misc_file.txt new file mode 100644 index 00000000000..4e21ae47ba6 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background_misc_file.txt @@ -0,0 +1,28 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 local name [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 variable [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 variable [razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_misc_file.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_misc_file.txt new file mode 100644 index 00000000000..00903218742 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_misc_file.txt @@ -0,0 +1,24 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 local name [] [r] +0 2 1 operator [] [=] +0 2 9 namespace name [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 variable [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 variable [] [Components] +0 10 1 operator [] [.] +0 1 3 variable [] [Web] +0 3 1 operator [] [.] +0 1 10 variable [] [RenderMode] +0 10 1 operator [] [.] +0 1 15 variable [] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_with_background.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_with_background.txt new file mode 100644 index 00000000000..73fe1225f61 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_with_background.txt @@ -0,0 +1,39 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace name [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class name [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 17 property name [static, razorCode] [InteractiveServer] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 local name [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace name [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace name [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class name [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 property name [static, razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_with_background_misc_file.txt new file mode 100644 index 00000000000..144c9cc2670 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/TestFiles/SemanticTokens/RenderMode_with_background_misc_file.txt @@ -0,0 +1,28 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 local name [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace name [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 variable [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 variable [razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Completion/LegacyTagHelperCompletionServiceTest.cs b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Completion/LegacyTagHelperCompletionServiceTest.cs index 0bc031aac44..67d45228f6c 100644 --- a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Completion/LegacyTagHelperCompletionServiceTest.cs +++ b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Completion/LegacyTagHelperCompletionServiceTest.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.CodeAnalysis.Razor.Completion; @@ -18,12 +17,10 @@ public class LegacyTagHelperCompletionServiceTest(ITestOutputHelper testOutput) [WorkItem("https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1452432")] public void GetAttributeCompletions_OnlyIndexerNamePrefix() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("FormTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("form")) + .TagMatchingRule(tagName: "form") .BoundAttributeDescriptor(attribute => attribute .TypeName("System.Collections.Generic.IDictionary") .PropertyName("RouteValues") @@ -33,32 +30,29 @@ public void GetAttributeCompletions_OnlyIndexerNamePrefix() var expectedCompletions = AttributeCompletionResult.Create(new() { - ["asp-route-..."] = [documentDescriptors[0].BoundAttributes.Last()] + ["asp-route-..."] = [tagHelpers[0].BoundAttributes[^1]] }); var completionContext = BuildAttributeCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], attributes: [], currentTagName: "form"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_BoundDictionaryAttribute_ReturnsPrefixIndexerAndFullSetter() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("FormTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("form")) + .TagMatchingRule(tagName: "form") .BoundAttributeDescriptor(attribute => attribute .Name("asp-all-route-data") .TypeName("System.Collections.Generic.IDictionary") @@ -69,41 +63,33 @@ public void GetAttributeCompletions_BoundDictionaryAttribute_ReturnsPrefixIndexe var expectedCompletions = AttributeCompletionResult.Create(new() { - ["asp-all-route-data"] = [documentDescriptors[0].BoundAttributes.Last()], - ["asp-route-..."] = [documentDescriptors[0].BoundAttributes.Last()] + ["asp-all-route-data"] = [tagHelpers[0].BoundAttributes[^1]], + ["asp-route-..."] = [tagHelpers[0].BoundAttributes[^1]] }); var completionContext = BuildAttributeCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], attributes: [], currentTagName: "form"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_RequiredBoundDictionaryAttribute_ReturnsPrefixIndexerAndFullSetter() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("FormTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("form") - .RequireAttributeDescriptor(builder => - { - builder.Name = "asp-route-"; - builder.NameComparison = RequiredAttributeNameComparison.PrefixMatch; - })) - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("form") - .RequireAttributeDescriptor(builder => builder.Name = "asp-all-route-data")) + .TagMatchingRule(tagName: "form", static b => b + .RequiredAttribute(name: "asp-route-", nameComparison: RequiredAttributeNameComparison.PrefixMatch)) + .TagMatchingRule(tagName: "form", static b => b + .RequiredAttribute(name: "asp-all-route-data")) .BoundAttributeDescriptor(attribute => attribute .Name("asp-all-route-data") .TypeName("System.Collections.Generic.IDictionary") @@ -114,41 +100,38 @@ public void GetAttributeCompletions_RequiredBoundDictionaryAttribute_ReturnsPref var expectedCompletions = AttributeCompletionResult.Create(new() { - ["asp-all-route-data"] = [documentDescriptors[0].BoundAttributes.Last()], - ["asp-route-..."] = [documentDescriptors[0].BoundAttributes.Last()] + ["asp-all-route-data"] = [tagHelpers[0].BoundAttributes[^1]], + ["asp-route-..."] = [tagHelpers[0].BoundAttributes[^1]] }); var completionContext = BuildAttributeCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], attributes: [], currentTagName: "form"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_DoesNotReturnCompletionsForAlreadySuppliedAttributes() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("div") - .RequireAttributeDescriptor(attribute => attribute.Name("repeat"))) + .TagMatchingRule(tagName: "div", static b => b + .RequiredAttribute(name: "repeat")) .BoundAttributeDescriptor(attribute => attribute .Name("visible") .TypeName(typeof(bool).FullName) .PropertyName("Visible")) .Build(), TagHelperDescriptorBuilder.CreateTagHelper("StyleTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule(tagName: "*") .BoundAttributeDescriptor(attribute => attribute .Name("class") .TypeName(typeof(string).FullName) @@ -159,43 +142,39 @@ public void GetAttributeCompletions_DoesNotReturnCompletionsForAlreadySuppliedAt var expectedCompletions = AttributeCompletionResult.Create(new() { ["onclick"] = [], - ["visible"] = [documentDescriptors[0].BoundAttributes.Last()] + ["visible"] = [tagHelpers[0].BoundAttributes[^1]] }); - var existingCompletions = new[] { "onclick" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["onclick"], attributes: [ KeyValuePair.Create("class", "something"), KeyValuePair.Create("repeat", "4")], currentTagName: "div"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_ReturnsCompletionForAlreadySuppliedAttribute_IfCurrentAttributeMatches() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("div") - .RequireAttributeDescriptor(attribute => attribute.Name("repeat"))) + .TagMatchingRule(tagName: "div", static b => b + .RequiredAttribute(name: "repeat")) .BoundAttributeDescriptor(attribute => attribute .Name("visible") .TypeName(typeof(bool).FullName) .PropertyName("Visible")) .Build(), TagHelperDescriptorBuilder.CreateTagHelper("StyleTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule("*") .BoundAttributeDescriptor(attribute => attribute .Name("class") .TypeName(typeof(string).FullName) @@ -206,45 +185,41 @@ public void GetAttributeCompletions_ReturnsCompletionForAlreadySuppliedAttribute var expectedCompletions = AttributeCompletionResult.Create(new() { ["onclick"] = [], - ["visible"] = [documentDescriptors[0].BoundAttributes.Last()] + ["visible"] = [tagHelpers[0].BoundAttributes[^1]] }); - var existingCompletions = new[] { "onclick" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["onclick"], attributes: [ KeyValuePair.Create("class", "something"), KeyValuePair.Create("repeat", "4"), KeyValuePair.Create("visible", "false")], currentTagName: "div", currentAttributeName: "visible"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_DoesNotReturnAlreadySuppliedAttribute_IfCurrentAttributeDoesNotMatch() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("div") - .RequireAttributeDescriptor(attribute => attribute.Name("repeat"))) + .TagMatchingRule(tagName: "div", static b => b + .RequiredAttribute(name: "repeat")) .BoundAttributeDescriptor(attribute => attribute .Name("visible") .TypeName(typeof(bool).FullName) .PropertyName("Visible")) .Build(), TagHelperDescriptorBuilder.CreateTagHelper("StyleTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule("*") .BoundAttributeDescriptor(attribute => attribute .Name("class") .TypeName(typeof(string).FullName) @@ -257,40 +232,35 @@ public void GetAttributeCompletions_DoesNotReturnAlreadySuppliedAttribute_IfCurr ["onclick"] = [] }); - var existingCompletions = new[] { "onclick" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["onclick"], attributes: [ KeyValuePair.Create("class", "something"), KeyValuePair.Create("repeat", "4"), KeyValuePair.Create("visible", "false")], currentTagName: "div", currentAttributeName: "repeat"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_PossibleDescriptorsReturnUnboundRequiredAttributesWithExistingCompletions() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("div") - .RequireAttributeDescriptor(attribute => attribute.Name("repeat"))) + .TagMatchingRule(tagName: "div", static b => b + .RequiredAttribute(name: "repeat")) .Build(), TagHelperDescriptorBuilder.CreateTagHelper("StyleTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("*") - .RequireAttributeDescriptor(attribute => attribute.Name("class"))) + .TagMatchingRule(tagName: "*", static b => b + .RequiredAttribute(name: "class")) .Build(), ]; @@ -301,30 +271,26 @@ public void GetAttributeCompletions_PossibleDescriptorsReturnUnboundRequiredAttr ["repeat"] = [] }); - var existingCompletions = new[] { "onclick", "class" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["onclick", "class"], currentTagName: "div"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_PossibleDescriptorsReturnBoundRequiredAttributesWithExistingCompletions() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("div") - .RequireAttributeDescriptor(attribute => attribute.Name("repeat"))) + .TagMatchingRule(tagName: "div", static b => b + .RequiredAttribute(name: "repeat")) .BoundAttributeDescriptor(attribute => attribute .Name("repeat") .TypeName(typeof(bool).FullName) @@ -335,9 +301,8 @@ public void GetAttributeCompletions_PossibleDescriptorsReturnBoundRequiredAttrib .PropertyName("Visible")) .Build(), TagHelperDescriptorBuilder.CreateTagHelper("StyleTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("*") - .RequireAttributeDescriptor(attribute => attribute.Name("class"))) + .TagMatchingRule(tagName: "*", static b => b + .RequiredAttribute(name: "class")) .BoundAttributeDescriptor(attribute => attribute .Name("class") .TypeName(typeof(string).FullName) @@ -347,33 +312,30 @@ public void GetAttributeCompletions_PossibleDescriptorsReturnBoundRequiredAttrib var expectedCompletions = AttributeCompletionResult.Create(new() { - ["class"] = [.. documentDescriptors[1].BoundAttributes], + ["class"] = [.. tagHelpers[1].BoundAttributes], ["onclick"] = [], - ["repeat"] = [documentDescriptors[0].BoundAttributes.First()] + ["repeat"] = [tagHelpers[0].BoundAttributes[0]] }); - var existingCompletions = new[] { "onclick" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["onclick"], currentTagName: "div"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_AppliedDescriptorsReturnAllBoundAttributesWithExistingCompletionsForSchemaTags() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) + .TagMatchingRule("div") .BoundAttributeDescriptor(attribute => attribute .Name("repeat") .TypeName(typeof(bool).FullName) @@ -384,52 +346,49 @@ public void GetAttributeCompletions_AppliedDescriptorsReturnAllBoundAttributesWi .PropertyName("Visible")) .Build(), TagHelperDescriptorBuilder.CreateTagHelper("StyleTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("*") - .RequireAttributeDescriptor(attribute => attribute.Name("class"))) + .TagMatchingRule(tagName: "*", static b => b + .RequiredAttribute(name: "class")) .BoundAttributeDescriptor(attribute => attribute .Name("class") .TypeName(typeof(string).FullName) .PropertyName("Class")) .Build(), TagHelperDescriptorBuilder.CreateTagHelper("StyleTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule(tagName: "*") .BoundAttributeDescriptor(attribute => attribute .Name("visible") .TypeName(typeof(bool).FullName) .PropertyName("Visible")) .Build(), ]; + var expectedCompletions = AttributeCompletionResult.Create(new() { ["onclick"] = [], - ["class"] = [.. documentDescriptors[1].BoundAttributes], - ["repeat"] = [documentDescriptors[0].BoundAttributes.First()], - ["visible"] = [documentDescriptors[0].BoundAttributes.Last(), documentDescriptors[2].BoundAttributes.First()] + ["class"] = [.. tagHelpers[1].BoundAttributes], + ["repeat"] = [tagHelpers[0].BoundAttributes[0]], + ["visible"] = [tagHelpers[0].BoundAttributes[^1], tagHelpers[2].BoundAttributes[0]] }); - var existingCompletions = new[] { "class", "onclick" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["class", "onclick"], currentTagName: "div"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_AppliedTagOutputHintDescriptorsReturnBoundAttributesWithExistingCompletionsForNonSchemaTags() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("CustomTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("custom")) + .TagMatchingRule(tagName: "custom") .BoundAttributeDescriptor(attribute => attribute .Name("repeat") .TypeName(typeof(bool).FullName) @@ -441,31 +400,28 @@ public void GetAttributeCompletions_AppliedTagOutputHintDescriptorsReturnBoundAt var expectedCompletions = AttributeCompletionResult.Create(new() { ["class"] = [], - ["repeat"] = [.. documentDescriptors[0].BoundAttributes] + ["repeat"] = [.. tagHelpers[0].BoundAttributes] }); - var existingCompletions = new[] { "class" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["class"], currentTagName: "custom"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_AppliedDescriptorsReturnBoundAttributesCompletionsForNonSchemaTags() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("CustomTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("custom")) + .TagMatchingRule(tagName: "custom") .BoundAttributeDescriptor(attribute => attribute .Name("repeat") .TypeName(typeof(bool).FullName) @@ -475,31 +431,28 @@ public void GetAttributeCompletions_AppliedDescriptorsReturnBoundAttributesCompl var expectedCompletions = AttributeCompletionResult.Create(new() { - ["repeat"] = [.. documentDescriptors[0].BoundAttributes] + ["repeat"] = [.. tagHelpers[0].BoundAttributes] }); - var existingCompletions = new[] { "class" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["class"], currentTagName: "custom"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_AppliedDescriptorsReturnBoundAttributesWithExistingCompletionsForSchemaTags() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) + .TagMatchingRule(tagName: "div") .BoundAttributeDescriptor(attribute => attribute .Name("repeat") .TypeName(typeof(bool).FullName) @@ -510,119 +463,105 @@ public void GetAttributeCompletions_AppliedDescriptorsReturnBoundAttributesWithE var expectedCompletions = AttributeCompletionResult.Create(new() { ["class"] = [], - ["repeat"] = [.. documentDescriptors[0].BoundAttributes] + ["repeat"] = [.. tagHelpers[0].BoundAttributes] }); - var existingCompletions = new[] { "class" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["class"], currentTagName: "div"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_NoDescriptorsReturnsExistingCompletions() { - // Arrange var expectedCompletions = AttributeCompletionResult.Create(new() { - ["class"] = [], + ["class"] = [] }); - var existingCompletions = new[] { "class" }; var completionContext = BuildAttributeCompletionContext( - descriptors: [], - existingCompletions, + tagHelpers: [], + existingCompletions: ["class"], currentTagName: "div"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_NoDescriptorsForUnprefixedTagReturnsExistingCompletions() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("div") - .RequireAttributeDescriptor(attribute => attribute.Name("special"))) + .TagMatchingRule(tagName: "div", static b => b + .RequiredAttribute(name: "special")) .Build(), ]; var expectedCompletions = AttributeCompletionResult.Create(new() { - ["class"] = [], + ["class"] = [] }); - var existingCompletions = new[] { "class" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["class"], currentTagName: "div", tagHelperPrefix: "th:"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetAttributeCompletions_NoDescriptorsForTagReturnsExistingCompletions() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("MyTableTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule - .RequireTagName("table") - .RequireAttributeDescriptor(attribute => attribute.Name("special"))) + .TagMatchingRule(tagName: "table", static b => b + .RequiredAttribute(name: "special")) .Build(), ]; var expectedCompletions = AttributeCompletionResult.Create(new() { - ["class"] = [], + ["class"] = [] }); - var existingCompletions = new[] { "class" }; var completionContext = BuildAttributeCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["class"], currentTagName: "div"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetAttributeCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_IgnoresDirectiveAttributes() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("BindAttribute", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("input")) + .TagMatchingRule(tagName: "input") .BoundAttributeDescriptor(builder => { builder.Name = "@bind"; @@ -634,559 +573,524 @@ public void GetElementCompletions_IgnoresDirectiveAttributes() var expectedCompletions = ElementCompletionResult.Create(new() { - ["table"] = [], + ["table"] = [] }); - var existingCompletions = new[] { "table" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["table"], containingTagName: "body", containingParentTagName: null); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_FiltersFullyQualifiedElementsIfShortNameExists() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("Test")) + .TagMatchingRule("Test") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("TestTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("TestAssembly.Test")) + .TagMatchingRule("TestAssembly.Test") .IsFullyQualifiedNameMatch(true) .Build(), TagHelperDescriptorBuilder.CreateTagHelper("Test2TagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("Test2Assembly.Test")) + .TagMatchingRule("Test2Assembly.Test") .IsFullyQualifiedNameMatch(true) .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["Test"] = [documentDescriptors[0]], - ["Test2Assembly.Test"] = [documentDescriptors[2]], + ["Test"] = [tagHelpers[0]], + ["Test2Assembly.Test"] = [tagHelpers[2]] }); var completionContext = BuildElementCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], containingTagName: "body", containingParentTagName: null); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_TagOutputHintDoesNotFallThroughToSchemaCheck() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("MyTableTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("my-table")) + .TagMatchingRule("my-table") .TagOutputHint("table") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("MyTrTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("my-tr")) + .TagMatchingRule("my-tr") .TagOutputHint("tr") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["my-table"] = [documentDescriptors[0]], - ["table"] = [], + ["my-table"] = [tagHelpers[0]], + ["table"] = [] }); - var existingCompletions = new[] { "table" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["table"], containingTagName: "body", containingParentTagName: null); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_CatchAllsOnlyApplyToCompletionsStartingWithPrefix() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("CatchAllTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule("*") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li")) + .TagMatchingRule("li") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["th:li"] = [documentDescriptors[1], documentDescriptors[0]], - ["li"] = [], + ["th:li"] = [tagHelpers[1], tagHelpers[0]], + ["li"] = [] }); - var existingCompletions = new[] { "li" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["li"], containingTagName: "ul", tagHelperPrefix: "th:"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_TagHelperPrefixIsPrependedToTagHelperCompletions() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("SuperLiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("superli")) + .TagMatchingRule("superli") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li")) + .TagMatchingRule("li") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["th:superli"] = [documentDescriptors[0]], - ["th:li"] = [documentDescriptors[1]], - ["li"] = [], + ["th:superli"] = [tagHelpers[0]], + ["th:li"] = [tagHelpers[1]], + ["li"] = [] }); - var existingCompletions = new[] { "li" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["li"], containingTagName: "ul", tagHelperPrefix: "th:"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_IsCaseSensitive() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("MyliTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("myli")) + .TagMatchingRule("myli") .SetCaseSensitive() .Build(), TagHelperDescriptorBuilder.CreateTagHelper("MYLITagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("MYLI")) + .TagMatchingRule("MYLI") .SetCaseSensitive() .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["myli"] = [documentDescriptors[0]], - ["MYLI"] = [documentDescriptors[1]], - ["li"] = [], + ["myli"] = [tagHelpers[0]], + ["MYLI"] = [tagHelpers[1]], + ["li"] = [] }); - var existingCompletions = new[] { "li" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, - containingTagName: "ul", - tagHelperPrefix: null); + tagHelpers, + existingCompletions: ["li"], + containingTagName: "ul"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_HTMLSchemaTagName_IsCaseSensitive() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("LITagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("LI")) + .TagMatchingRule("LI") .SetCaseSensitive() .Build(), TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li")) + .TagMatchingRule("li") .SetCaseSensitive() .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["LI"] = [documentDescriptors[0]], - ["li"] = [documentDescriptors[1]], + ["LI"] = [tagHelpers[0]], + ["li"] = [tagHelpers[1]] }); - var existingCompletions = new[] { "li" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, - containingTagName: "ul", - tagHelperPrefix: null); + tagHelpers, + existingCompletions: ["li"], + containingTagName: "ul"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_CatchAllsApplyToOnlyTagHelperCompletions() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("SuperLiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("superli")) + .TagMatchingRule(tagName: "superli") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("CatchAll", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule(tagName: "*") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["superli"] = [documentDescriptors[0], documentDescriptors[1]], - ["li"] = [], + ["superli"] = [tagHelpers[0], tagHelpers[1]], + ["li"] = [] }); - var existingCompletions = new[] { "li" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["li"], containingTagName: "ul"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_CatchAllsApplyToNonTagHelperCompletionsIfStartsWithTagHelperPrefix() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("SuperLiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("superli")) + .TagMatchingRule(tagName: "superli") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("CatchAll", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule(tagName: "*") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["th:superli"] = [documentDescriptors[0], documentDescriptors[1]], - ["th:li"] = [documentDescriptors[1]], + ["th:superli"] = [tagHelpers[0], tagHelpers[1]], + ["th:li"] = [tagHelpers[1]] }); - var existingCompletions = new[] { "th:li" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["th:li"], containingTagName: "ul", tagHelperPrefix: "th:"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_AllowsMultiTargetingTagHelpers() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("BoldTagHelper1", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("strong")) - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("b")) - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("bold")) + .TagMatchingRule(tagName: "strong") + .TagMatchingRule(tagName: "b") + .TagMatchingRule(tagName: "bold") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("BoldTagHelper2", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("strong")) + .TagMatchingRule(tagName: "strong") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["strong"] = [documentDescriptors[0], documentDescriptors[1]], - ["b"] = [documentDescriptors[0]], - ["bold"] = [documentDescriptors[0]], + ["strong"] = [tagHelpers[0], tagHelpers[1]], + ["b"] = [tagHelpers[0]], + ["bold"] = [tagHelpers[0]] }); - var existingCompletions = new[] { "strong", "b", "bold" }; var completionContext = BuildElementCompletionContext( - documentDescriptors, - existingCompletions, + tagHelpers, + existingCompletions: ["strong", "b", "bold"], containingTagName: "ul"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_CombinesDescriptorsOnExistingCompletions() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper1", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li")) + .TagMatchingRule(tagName: "li") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper2", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li")) + .TagMatchingRule(tagName: "li") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["li"] = [documentDescriptors[0], documentDescriptors[1]], + ["li"] = [tagHelpers[0], tagHelpers[1]] }); - var existingCompletions = new[] { "li" }; - var completionContext = BuildElementCompletionContext(documentDescriptors, existingCompletions, containingTagName: "ul"); + var completionContext = BuildElementCompletionContext( + tagHelpers, + existingCompletions: ["li"], + containingTagName: "ul"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_NewCompletionsForSchemaTagsNotInExistingCompletionsAreIgnored() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("SuperLiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("superli")) + .TagMatchingRule(tagName: "superli") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li")) + .TagMatchingRule(tagName: "li") .TagOutputHint("strong") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) + .TagMatchingRule(tagName: "div") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["li"] = [documentDescriptors[1]], - ["superli"] = [documentDescriptors[0]], + ["li"] = [tagHelpers[1]], + ["superli"] = [tagHelpers[0]] }); - var existingCompletions = new[] { "li" }; - var completionContext = BuildElementCompletionContext(documentDescriptors, existingCompletions, containingTagName: "ul"); + var completionContext = BuildElementCompletionContext( + tagHelpers, + existingCompletions: ["li"], + containingTagName: "ul"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_OutputHintIsCrossReferencedWithExistingCompletions() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("DivTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) + .TagMatchingRule(tagName: "div") .TagOutputHint("li") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li")) + .TagMatchingRule(tagName: "li") .TagOutputHint("strong") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["div"] = [documentDescriptors[0]], - ["li"] = [documentDescriptors[1]], + ["div"] = [tagHelpers[0]], + ["li"] = [tagHelpers[1]] }); - var existingCompletions = new[] { "li" }; - var completionContext = BuildElementCompletionContext(documentDescriptors, existingCompletions, containingTagName: "ul"); + var completionContext = BuildElementCompletionContext( + tagHelpers, + existingCompletions: ["li"], + containingTagName: "ul"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_EnsuresDescriptorsHaveSatisfiedParent() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper1", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li")) + .TagMatchingRule(tagName: "li") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("LiTagHelper2", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("li").RequireParentTag("ol")) + .TagMatchingRule(tagName: "li", parentTagName: "ol") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["li"] = [documentDescriptors[0]], + ["li"] = [tagHelpers[0]] }); - var existingCompletions = new[] { "li" }; - var completionContext = BuildElementCompletionContext(documentDescriptors, existingCompletions, containingTagName: "ul"); + var completionContext = BuildElementCompletionContext( + tagHelpers, + existingCompletions: ["li"], + containingTagName: "ul"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_NoContainingParentTag_DoesNotGetCompletionForRuleWithParentTag() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("Tag1", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("outer-child-tag")) - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("child-tag").RequireParentTag("parent-tag")) + .TagMatchingRule(tagName: "outer-child-tag") + .TagMatchingRule(tagName: "child-tag", parentTagName: "parent-tag") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("Tag2", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("parent-tag")) + .TagMatchingRule(tagName: "parent-tag") .AllowChildTag("child-tag") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["outer-child-tag"] = [documentDescriptors[0]], - ["parent-tag"] = [documentDescriptors[1]], + ["outer-child-tag"] = [tagHelpers[0]], + ["parent-tag"] = [tagHelpers[1]] }); var completionContext = BuildElementCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], containingTagName: null, containingParentTagName: null); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_WithContainingParentTag_GetsCompletionForRuleWithParentTag() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("Tag1", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("outer-child-tag")) - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("child-tag").RequireParentTag("parent-tag")) + .TagMatchingRule(tagName: "outer-child-tag") + .TagMatchingRule(tagName: "child-tag", parentTagName: "parent-tag") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("Tag2", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("parent-tag")) + .TagMatchingRule(tagName: "parent-tag") .AllowChildTag("child-tag") .Build(), ]; var expectedCompletions = ElementCompletionResult.Create(new() { - ["child-tag"] = [documentDescriptors[0]], + ["child-tag"] = [tagHelpers[0]] }); var completionContext = BuildElementCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], containingTagName: "parent-tag", containingParentTagName: null); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_AllowedChildrenAreIgnoredWhenAtRoot() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("CatchAll", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule("*") .AllowChildTag("b") .AllowChildTag("bold") .AllowChildTag("div") @@ -1196,27 +1100,25 @@ public void GetElementCompletions_AllowedChildrenAreIgnoredWhenAtRoot() var expectedCompletions = ElementCompletionResult.Create([]); var completionContext = BuildElementCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], containingTagName: null, containingParentTagName: null); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_DoesNotReturnExistingCompletionsWhenAllowedChildren() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("BoldParent", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) + .TagMatchingRule("div") .AllowChildTag("b") .AllowChildTag("bold") .AllowChildTag("div") @@ -1227,28 +1129,29 @@ public void GetElementCompletions_DoesNotReturnExistingCompletionsWhenAllowedChi { ["b"] = [], ["bold"] = [], - ["div"] = [documentDescriptors[0]] + ["div"] = [tagHelpers[0]] }); - var existingCompletions = new[] { "p", "em" }; - var completionContext = BuildElementCompletionContext(documentDescriptors, existingCompletions, containingTagName: "div", containingParentTagName: "thing"); + var completionContext = BuildElementCompletionContext( + tagHelpers, + existingCompletions: ["p", "em"], + containingTagName: "div", + containingParentTagName: "thing"); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_CapturesAllAllowedChildTagsFromParentTagHelpers_NoneTagHelpers() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("BoldParent", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) + .TagMatchingRule("div") .AllowChildTag("b") .AllowChildTag("bold") .Build(), @@ -1257,31 +1160,29 @@ public void GetElementCompletions_CapturesAllAllowedChildTagsFromParentTagHelper var expectedCompletions = ElementCompletionResult.Create(new() { ["b"] = [], - ["bold"] = [], + ["bold"] = [] }); var completionContext = BuildElementCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], containingTagName: "div", containingParentTagName: ""); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_CapturesAllAllowedChildTagsFromParentTagHelpers_SomeTagHelpers() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("BoldParent", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) + .TagMatchingRule("div") .AllowChildTag("b") .AllowChildTag("bold") .AllowChildTag("div") @@ -1292,37 +1193,35 @@ public void GetElementCompletions_CapturesAllAllowedChildTagsFromParentTagHelper { ["b"] = [], ["bold"] = [], - ["div"] = [documentDescriptors[0]] + ["div"] = [tagHelpers[0]] }); var completionContext = BuildElementCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], containingTagName: "div", - containingParentTagName: ""); + containingParentTagName: null); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } [Fact] public void GetElementCompletions_CapturesAllAllowedChildTagsFromParentTagHelpers_AllTagHelpers() { - // Arrange - ImmutableArray documentDescriptors = + TagHelperCollection tagHelpers = [ TagHelperDescriptorBuilder.CreateTagHelper("BoldParentCatchAll", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("*")) + .TagMatchingRule("*") .AllowChildTag("strong") .AllowChildTag("div") .AllowChildTag("b") .Build(), TagHelperDescriptorBuilder.CreateTagHelper("BoldParent", "TestAssembly") - .TagMatchingRuleDescriptor(rule => rule.RequireTagName("div")) + .TagMatchingRule("div") .AllowChildTag("b") .AllowChildTag("bold") .Build(), @@ -1330,23 +1229,22 @@ public void GetElementCompletions_CapturesAllAllowedChildTagsFromParentTagHelper var expectedCompletions = ElementCompletionResult.Create(new() { - ["strong"] = [documentDescriptors[0]], - ["b"] = [documentDescriptors[0]], - ["bold"] = [documentDescriptors[0]], - ["div"] = [documentDescriptors[0], documentDescriptors[1]], + ["strong"] = [tagHelpers[0]], + ["b"] = [tagHelpers[0]], + ["bold"] = [tagHelpers[0]], + ["div"] = [tagHelpers[0], tagHelpers[1]] }); var completionContext = BuildElementCompletionContext( - documentDescriptors, + tagHelpers, existingCompletions: [], containingTagName: "div", - containingParentTagName: ""); + containingParentTagName: null); + var service = CreateTagHelperCompletionFactsService(); - // Act var completions = service.GetElementCompletions(completionContext); - // Assert AssertCompletionsAreEquivalent(expectedCompletions, completions); } @@ -1377,37 +1275,37 @@ private static void AssertCompletionsAreEquivalent(AttributeCompletionResult exp } private static ElementCompletionContext BuildElementCompletionContext( - ImmutableArray descriptors, + TagHelperCollection tagHelpers, IEnumerable existingCompletions, string? containingTagName, string? containingParentTagName = "body", bool containingParentIsTagHelper = false, - string? tagHelperPrefix = "") + string? tagHelperPrefix = null) { - var documentContext = TagHelperDocumentContext.Create(tagHelperPrefix, descriptors); + var documentContext = TagHelperDocumentContext.GetOrCreate(tagHelperPrefix, tagHelpers); var completionContext = new ElementCompletionContext( documentContext, existingCompletions, containingTagName, attributes: [], - containingParentTagName: containingParentTagName, - containingParentIsTagHelper: containingParentIsTagHelper, - inHTMLSchema: (tag) => tag == "strong" || tag == "b" || tag == "bold" || tag == "li" || tag == "div"); + containingParentTagName, + containingParentIsTagHelper, + inHTMLSchema: static tag => tag is "strong" or "b" or "bold" or "li" or "div"); return completionContext; } private static AttributeCompletionContext BuildAttributeCompletionContext( - ImmutableArray descriptors, + TagHelperCollection tagHelpers, IEnumerable existingCompletions, string currentTagName, string? currentAttributeName = null, ImmutableArray> attributes = default, - string tagHelperPrefix = "") + string? tagHelperPrefix = null) { attributes = attributes.NullToEmpty(); - var documentContext = TagHelperDocumentContext.Create(tagHelperPrefix, descriptors); + var documentContext = TagHelperDocumentContext.GetOrCreate(tagHelperPrefix, tagHelpers); var completionContext = new AttributeCompletionContext( documentContext, existingCompletions, @@ -1416,7 +1314,7 @@ private static AttributeCompletionContext BuildAttributeCompletionContext( attributes, currentParentTagName: "body", currentParentIsTagHelper: false, - inHTMLSchema: (tag) => tag == "strong" || tag == "b" || tag == "bold" || tag == "li" || tag == "div"); + inHTMLSchema: static tag => tag is "strong" or "b" or "bold" or "li" or "div"); return completionContext; } diff --git a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Completion/RazorDirectiveCompletionSourceTest.cs b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Completion/RazorDirectiveCompletionSourceTest.cs index 8d24812aa5e..5485cc10304 100644 --- a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Completion/RazorDirectiveCompletionSourceTest.cs +++ b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Completion/RazorDirectiveCompletionSourceTest.cs @@ -209,9 +209,9 @@ private static IVisualStudioRazorParser CreateParser(string text, params Directi parserOptions: RazorParserOptions.Default.WithDirectives([.. directives])); var syntaxTree = RazorSyntaxTree.Parse(source, codeDocument.ParserOptions); - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); - codeDocument.SetTagHelperContext(TagHelperDocumentContext.Create(prefix: null, tagHelpers: [])); + codeDocument = codeDocument.WithTagHelperContext(TagHelperDocumentContext.GetOrCreate(tagHelpers: [])); var parserMock = new StrictMock(); parserMock diff --git a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Indentation/BraceSmartIndenterTestBase.cs b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Indentation/BraceSmartIndenterTestBase.cs index d652f013ce4..b6d591bcbf3 100644 --- a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Indentation/BraceSmartIndenterTestBase.cs +++ b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Indentation/BraceSmartIndenterTestBase.cs @@ -90,7 +90,7 @@ private protected static TestTextBuffer CreateTextBuffer(StringTextSnapshot init .WithFlags(enableSpanEditHandlers: true)); var codeDocument = TestRazorCodeDocument.Create(content); - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); var parserMock = new StrictMock(); parserMock diff --git a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Parsing/RazorSyntaxTreePartialParserTest.cs b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Parsing/RazorSyntaxTreePartialParserTest.cs index cd58b74d648..432198eccf9 100644 --- a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Parsing/RazorSyntaxTreePartialParserTest.cs +++ b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Parsing/RazorSyntaxTreePartialParserTest.cs @@ -3,7 +3,6 @@ #nullable disable -using System.Collections.Generic; using Microsoft.AspNetCore.Mvc.Razor.Extensions; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.Legacy; @@ -43,11 +42,8 @@ public void TagHelperTagBodiesRejectPartialChanges(object objectEdit) var builder = TagHelperDescriptorBuilder.CreateTagHelper("PTagHelper", "TestAssembly"); builder.TypeName = "PTagHelper"; builder.TagMatchingRule(rule => rule.TagName = "p"); - var descriptors = new[] - { - builder.Build() - }; - var projectEngine = CreateProjectEngine(tagHelpers: descriptors); + TagHelperCollection tagHelpers = [builder.Build()]; + var projectEngine = CreateProjectEngine(tagHelpers); var projectItem = new TestRazorProjectItem("Index.cshtml") { Content = edit.OldSnapshot.GetText() @@ -116,8 +112,8 @@ public void TagHelperAttributesAreLocatedAndAcceptChangesCorrectly(object editOb attribute.TypeName = typeof(string).FullName; attribute.PropertyName = "StringAttribute"; }); - var descriptors = new[] { builder.Build() }; - var projectEngine = CreateProjectEngine(tagHelpers: descriptors); + TagHelperCollection tagHelpers = [builder.Build()]; + var projectEngine = CreateProjectEngine(tagHelpers); var sourceDocument = new TestRazorProjectItem("Index.cshtml") { Content = edit.OldSnapshot.GetText() @@ -357,7 +353,7 @@ private static void RunPartialParseRejectionTest(TestEdit edit, PartialParseResu { var templateEngine = CreateProjectEngine(); var codeDocument = templateEngine.CreateCodeDocument(edit.OldSnapshot.GetText()); - templateEngine.Engine.Process(codeDocument); + codeDocument = templateEngine.Engine.Process(codeDocument); var syntaxTree = codeDocument.GetRequiredSyntaxTree(); var parser = new RazorSyntaxTreePartialParser(syntaxTree); @@ -369,7 +365,7 @@ private void RunPartialParseTest(TestEdit edit, PartialParseResultInternal addit { var templateEngine = CreateProjectEngine(); var codeDocument = templateEngine.CreateCodeDocument(edit.OldSnapshot.GetText()); - templateEngine.Engine.Process(codeDocument); + codeDocument = templateEngine.Engine.Process(codeDocument); var syntaxTree = codeDocument.GetRequiredSyntaxTree(); var parser = new RazorSyntaxTreePartialParser(syntaxTree); @@ -390,8 +386,7 @@ private static TestEdit CreateInsertionChange(string initialText, int insertionL return new TestEdit(sourceChange, oldSnapshot, changedSnapshot); } - private static RazorProjectEngine CreateProjectEngine( - IEnumerable tagHelpers = null) + private static RazorProjectEngine CreateProjectEngine(TagHelperCollection tagHelpers = null) { var fileSystem = new TestRazorProjectFileSystem(); var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem, builder => @@ -402,7 +397,7 @@ private static RazorProjectEngine CreateProjectEngine( if (tagHelpers != null) { - builder.AddTagHelpers(tagHelpers); + builder.SetTagHelpers(tagHelpers); } builder.ConfigureParserOptions(VisualStudioRazorParser.ConfigureParserOptions); diff --git a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Parsing/VisualStudioRazorParserTest.cs b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Parsing/VisualStudioRazorParserTest.cs index 8d0ad0e05ec..c1ecfbff159 100644 --- a/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Parsing/VisualStudioRazorParserTest.cs +++ b/src/Razor/test/Microsoft.VisualStudio.LegacyEditor.Razor.Test/Parsing/VisualStudioRazorParserTest.cs @@ -75,7 +75,7 @@ public async Task GetLatestCodeDocumentAsync_WaitsForParse() parser._latestChangeReference = new BackgroundParser.ChangeReference(latestChange, latestSnapshot); var codeDocument = TestRazorCodeDocument.CreateEmpty(); var syntaxTree = RazorSyntaxTree.Parse(TestRazorSourceDocument.Create()); - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); var args = new BackgroundParserResultsReadyEventArgs( parser._latestChangeReference, codeDocument); @@ -110,7 +110,7 @@ public async Task GetLatestCodeDocumentAsync_NoPendingChangesReturnsImmediately( parser._latestChangeReference = new BackgroundParser.ChangeReference(latestChange, latestSnapshot); var codeDocument = TestRazorCodeDocument.CreateEmpty(); var syntaxTree = RazorSyntaxTree.Parse(TestRazorSourceDocument.Create()); - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); var args = new BackgroundParserResultsReadyEventArgs( parser._latestChangeReference, codeDocument); @@ -182,7 +182,7 @@ public async Task GetLatestCodeDocumentAsync_LatestChangeIsNewerThenRequested_Re parser._latestChangeReference = new BackgroundParser.ChangeReference(latestChange, latestSnapshot); var codeDocument = TestRazorCodeDocument.CreateEmpty(); var syntaxTree = RazorSyntaxTree.Parse(TestRazorSourceDocument.Create()); - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); var args = new BackgroundParserResultsReadyEventArgs( parser._latestChangeReference, codeDocument); @@ -211,7 +211,7 @@ public async Task GetLatestCodeDocumentAsync_ParserDisposed_ReturnsImmediately() var codeDocument = TestRazorCodeDocument.CreateEmpty(); var syntaxTree = RazorSyntaxTree.Parse(TestRazorSourceDocument.Create()); VisualStudioRazorParser parser; - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); using (parser = CreateParser(documentTracker)) { var latestChange = new SourceChange(0, 0, string.Empty); @@ -413,7 +413,7 @@ public void OnDocumentStructureChanged_FiresForLatestTextBufferEdit() var latestSnapshot = documentTracker.TextBuffer.CurrentSnapshot; parser._latestChangeReference = new BackgroundParser.ChangeReference(latestChange, latestSnapshot); var codeDocument = TestRazorCodeDocument.CreateEmpty(); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(TestRazorSourceDocument.Create())); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(TestRazorSourceDocument.Create())); var args = new BackgroundParserResultsReadyEventArgs( parser._latestChangeReference, codeDocument); @@ -436,7 +436,7 @@ public void OnDocumentStructureChanged_FiresForOnlyLatestTextBufferReparseEdit() var latestSnapshot = documentTracker.TextBuffer.CurrentSnapshot; parser._latestChangeReference = new BackgroundParser.ChangeReference(null, latestSnapshot); var codeDocument = TestRazorCodeDocument.CreateEmpty(); - codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(TestRazorSourceDocument.Create())); + codeDocument = codeDocument.WithSyntaxTree(RazorSyntaxTree.Parse(TestRazorSourceDocument.Create())); var badArgs = new BackgroundParserResultsReadyEventArgs( // This is a different reparse edit, shouldn't be fired for this call new BackgroundParser.ChangeReference(null, latestSnapshot), diff --git a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/AbstractIntegrationTest.cs b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/AbstractIntegrationTest.cs index 8fbafd222e0..7e483e5079f 100644 --- a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/AbstractIntegrationTest.cs +++ b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/AbstractIntegrationTest.cs @@ -26,7 +26,7 @@ namespace Microsoft.VisualStudio.Razor.IntegrationTests; /// /// /// -[IdeSettings(MinVersion = VisualStudioVersion.VS18, RootSuffix = "RoslynDev", MaxAttempts = 2)] +[IdeSettings(MinVersion = VisualStudioVersion.VS18, RootSuffix = "RoslynDev", MaxAttempts = 10)] public abstract class AbstractIntegrationTest : AbstractIdeIntegrationTest { protected CancellationToken ControlledHangMitigatingCancellationToken => HangMitigatingCancellationToken; diff --git a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/AbstractRazorEditorTest.cs b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/AbstractRazorEditorTest.cs index eb8260993ba..8c1bf0124b7 100644 --- a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/AbstractRazorEditorTest.cs +++ b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/AbstractRazorEditorTest.cs @@ -48,8 +48,7 @@ public override async Task InitializeAsync() VisualStudioLogging.AddCustomLoggers(); - // Our expected test results have spaces not tabs - await TestServices.Shell.SetInsertSpacesAsync(ControlledHangMitigatingCancellationToken); + await TestServices.Shell.ResetEnvironmentAsync(ControlledHangMitigatingCancellationToken); _projectFilePath = await CreateAndOpenBlazorProjectAsync(ControlledHangMitigatingCancellationToken); @@ -84,8 +83,6 @@ public override async Task InitializeAsync() // fast pace of running integration tests, it's worth taking a slight delay at the start for a more reliable run. TestServices.Input.Send("{ENTER}"); - await Task.Delay(2500); - // Close the file we opened, just in case, so the test can start with a clean slate await TestServices.Editor.CloseCodeFileAsync(RazorProjectConstants.BlazorProjectName, RazorProjectConstants.IndexRazorFile, saveFile: false, ControlledHangMitigatingCancellationToken); @@ -96,7 +93,7 @@ private async Task CreateAndOpenBlazorProjectAsync(CancellationToken can { await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); - await TestServices.SolutionExplorer.CloseSolutionAsync(ControlledHangMitigatingCancellationToken); + await TestServices.SolutionExplorer.CloseSolutionAndWaitAsync(cancellationToken); var solutionPath = CreateTemporaryPath(); @@ -141,11 +138,13 @@ private static string CreateTemporaryPath() public override async Task DisposeAsync() { - // TODO: Would be good to have this as a last ditch check, but need to improve the detection and reporting here to be more robust - //await TestServices.Editor.ValidateNoDiscoColorsAsync(HangMitigatingCancellationToken); - _testLogger!.LogInformation($"#### Razor integration test dispose."); + using (var disposeSource = new CancellationTokenSource(TimeSpan.FromMinutes(5))) + { + await TestServices.Shell.CloseEverythingAsync(disposeSource.Token); + } + TestServices.Output.ClearIntegrationTestLogger(); await base.DisposeAsync(); diff --git a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/BreakpointSpanTests.cs b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/BreakpointSpanTests.cs index ca9d4dbffab..1703abc8180 100644 --- a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/BreakpointSpanTests.cs +++ b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/BreakpointSpanTests.cs @@ -18,7 +18,7 @@ public async Task SetBreakpoint_FirstCharacter_SpanAdjusts() // Wait for classifications to indicate Razor LSP is up and running await TestServices.Editor.WaitForComponentClassificationAsync(ControlledHangMitigatingCancellationToken); - await TestServices.RazorProjectSystem.WaitForCSharpVirtualDocumentUpdateAsync(RazorProjectConstants.BlazorProjectName, RazorProjectConstants.CounterRazorFile, async () => + await TestServices.RazorProjectSystem.WaitForHtmlVirtualDocumentUpdateAsync(RazorProjectConstants.BlazorProjectName, RazorProjectConstants.CounterRazorFile, async () => { await TestServices.Editor.SetTextAsync("

                  @{ var abc = 123; }

                  ", ControlledHangMitigatingCancellationToken); }, ControlledHangMitigatingCancellationToken); @@ -37,7 +37,7 @@ public async Task SetBreakpoint_FirstCharacter_InvalidLine() // Wait for classifications to indicate Razor LSP is up and running await TestServices.Editor.WaitForComponentClassificationAsync(ControlledHangMitigatingCancellationToken); - await TestServices.RazorProjectSystem.WaitForCSharpVirtualDocumentUpdateAsync(RazorProjectConstants.BlazorProjectName, RazorProjectConstants.CounterRazorFile, async () => + await TestServices.RazorProjectSystem.WaitForHtmlVirtualDocumentUpdateAsync(RazorProjectConstants.BlazorProjectName, RazorProjectConstants.CounterRazorFile, async () => { await TestServices.Editor.SetTextAsync("""

                  @{ @@ -58,7 +58,7 @@ public async Task SetBreakpoint_FirstCharacter_ValidLine() // Wait for classifications to indicate Razor LSP is up and running await TestServices.Editor.WaitForComponentClassificationAsync(ControlledHangMitigatingCancellationToken); - await TestServices.RazorProjectSystem.WaitForCSharpVirtualDocumentUpdateAsync(RazorProjectConstants.BlazorProjectName, RazorProjectConstants.CounterRazorFile, async () => + await TestServices.RazorProjectSystem.WaitForHtmlVirtualDocumentUpdateAsync(RazorProjectConstants.BlazorProjectName, RazorProjectConstants.CounterRazorFile, async () => { await TestServices.Editor.SetTextAsync("""

                  @{ diff --git a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/CSharpCodeActionsTests.cs b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/CSharpCodeActionsTests.cs index 2b4c65269c3..1c7c00eef3e 100644 --- a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/CSharpCodeActionsTests.cs +++ b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/CSharpCodeActionsTests.cs @@ -128,7 +128,7 @@ @using System.Data """, ControlledHangMitigatingCancellationToken); } - [IdeFact] + [IdeFact(Skip = "Failing in CI")] public async Task CSharpCodeActionsTests_IntroduceLocal() { // Open the file @@ -179,7 +179,7 @@ void M(string[] args) """, ControlledHangMitigatingCancellationToken); } - [IdeFact] + [IdeFact(Skip = "Failing in CI")] public async Task CSharpCodeActionsTests_IntroduceLocal_All() { // Open the file diff --git a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/CompletionIntegrationTests.cs b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/CompletionIntegrationTests.cs index efeb24d82f8..7cee2799be8 100644 --- a/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/CompletionIntegrationTests.cs +++ b/src/Razor/test/Microsoft.VisualStudio.Razor.IntegrationTests/CompletionIntegrationTests.cs @@ -16,12 +16,12 @@ public class CompletionIntegrationTests(ITestOutputHelper testOutputHelper) : Ab { private static readonly TimeSpan s_snippetTimeout = TimeSpan.FromSeconds(10); - [IdeFact] + [IdeFact(Skip = "We're returning the right completion item, but the editor isn't applying it?")] public async Task SnippetCompletion_Html() { await VerifyTypeAndCommitCompletionAsync( input: """ - @page "Test" + @page "/Test" Test @@ -37,7 +37,7 @@ private void IncrementCount() } """, output: """ - @page "Test" + @page "/Test" Test @@ -57,6 +57,7 @@ private void IncrementCount() } """, search: "

                  Test

                  ", + expectedSelectedItemLabel: "dd", stringsToType: ["{ENTER}", "d", "d"]); } @@ -65,7 +66,7 @@ public async Task CompletionCommit_HtmlAttributeWithoutValue() { await VerifyTypeAndCommitCompletionAsync( input: """ - @page "Test" + @page "/Test" Test @@ -81,7 +82,7 @@ private void IncrementCount() } """, output: """ - @page "Test" + @page "/Test" Test @@ -106,7 +107,7 @@ public async Task CompletionCommit_HtmlAttributeWithValue() { await VerifyTypeAndCommitCompletionAsync( input: """ - @page "Test" + @page "/Test" Test @@ -122,7 +123,7 @@ private void IncrementCount() } """, output: """ - @page "Test" + @page "/Test" Test @@ -158,10 +159,11 @@ await VerifyTypeAndCommitCompletionAsync( Test - + """, search: " + """; + + var expected = """ + @using Microsoft.AspNetCore.Components.Web + + """; + + await VerifyCodeActionAsync(input, expected, LanguageServerConstants.CodeActions.AddUsing, addDefaultImports: false); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/9747")] + public async Task NoCodeAction_WhenBoundAttribute() + { + var input = """ + @using Microsoft.AspNetCore.Components.Web + + + """; + + await VerifyCodeActionAsync(input, expected: null, LanguageServerConstants.CodeActions.AddUsing, addDefaultImports: false); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/9747")] + public async Task NoCodeAction_WhenNotOnDirectiveAttribute() + { + var input = """ + + """; + + await VerifyCodeActionAsync(input, expected: null, LanguageServerConstants.CodeActions.AddUsing, addDefaultImports: false); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/9747")] + public async Task NoCodeAction_WhenNotOnAttributeName() + { + var input = """ + + """; + + await VerifyCodeActionAsync(input, expected: null, LanguageServerConstants.CodeActions.AddUsing, addDefaultImports: false); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/9747")] + public async Task AddUsing_Bind() + { + var input = """ + + """; + + var expected = """ + @using Microsoft.AspNetCore.Components.Web + + """; + + await VerifyCodeActionAsync(input, expected, LanguageServerConstants.CodeActions.AddUsing, addDefaultImports: false); + } + + [Fact, WorkItem("https://github.com/dotnet/razor/issues/9747")] + public async Task AddUsing_BindWithParameter() + { + var input = """ + + """; + + var expected = """ + @using Microsoft.AspNetCore.Components.Web + + """; + + await VerifyCodeActionAsync(input, expected, LanguageServerConstants.CodeActions.AddUsing, addDefaultImports: false); + } +} diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostDocumentCompletionEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostDocumentCompletionEndpointTest.cs index 7091944070c..50996fb595f 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostDocumentCompletionEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostDocumentCompletionEndpointTest.cs @@ -1,8 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; using System.Linq; using System.Text; using System.Text.Json; @@ -11,7 +13,6 @@ using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.AspNetCore.Razor.Test.Common; -using Microsoft.AspNetCore.Razor.Test.Common.Workspaces; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor.Completion; @@ -19,11 +20,11 @@ using Microsoft.CodeAnalysis.Razor.Settings; using Microsoft.CodeAnalysis.Razor.Telemetry; using Microsoft.CodeAnalysis.Razor.Workspaces.Resources; +using Microsoft.CodeAnalysis.Text; using Roslyn.Test.Utilities; using Roslyn.Text.Adornments; using Xunit; using Xunit.Abstractions; -using Microsoft.CodeAnalysis.Text; using WorkItemAttribute = Roslyn.Test.Utilities.WorkItemAttribute; #if !VSCODE @@ -33,8 +34,31 @@ namespace Microsoft.VisualStudio.Razor.LanguageClient.Cohost; -public class CohostDocumentCompletionEndpointTest(ITestOutputHelper testOutputHelper) : CohostEndpointTestBase(testOutputHelper) +public partial class CohostDocumentCompletionEndpointTest(ITestOutputHelper testOutputHelper) : CohostEndpointTestBase(testOutputHelper) { + [Fact] + public async Task NotWhenAutoShowCompletionIsOff() + { + var settings = ClientSettingsManager.GetClientSettings(); + ClientSettingsManager.Update(settings.ClientCompletionSettings with { AutoShowCompletion = false }); + + await VerifyCompletionListAsync( + input: """ + This is a Razor document. + + @$$ + + The end. + """, + completionContext: new VSInternalCompletionContext() + { + InvokeKind = VSInternalCompletionInvokeKind.Typing, + TriggerCharacter = "@", + TriggerKind = CompletionTriggerKind.TriggerCharacter + }, + expectedItemLabels: null); + } + [Fact] public async Task CSharpInEmptyExplicitStatement() { @@ -524,109 +548,6 @@ The end. commitElementsWithSpace: false); } -#if !VSCODE - [Fact] - public async Task HtmlSnippetsCompletion() - { - await VerifyCompletionListAsync( - input: """ - This is a Razor document. - - $$ - - The end. - """, - completionContext: new VSInternalCompletionContext() - { - InvokeKind = VSInternalCompletionInvokeKind.Explicit, - TriggerCharacter = null, - TriggerKind = CompletionTriggerKind.Invoked - }, - expectedItemLabels: ["snippet1", "snippet2"], - htmlItemLabels: [], - snippetLabels: ["snippet1", "snippet2"]); - } - - [Fact] - public async Task HtmlSnippetsCompletion_EmptyDocument() - { - await VerifyCompletionListAsync( - input: """ - $$ - """, - completionContext: new VSInternalCompletionContext() - { - InvokeKind = VSInternalCompletionInvokeKind.Explicit, - TriggerCharacter = null, - TriggerKind = CompletionTriggerKind.Invoked - }, - expectedItemLabels: ["snippet1", "snippet2"], - htmlItemLabels: [], - snippetLabels: ["snippet1", "snippet2"]); - } - - [Fact] - public async Task HtmlSnippetsCompletion_WhitespaceOnlyDocument1() - { - await VerifyCompletionListAsync( - input: """ - - $$ - """, - completionContext: new VSInternalCompletionContext() - { - InvokeKind = VSInternalCompletionInvokeKind.Explicit, - TriggerCharacter = null, - TriggerKind = CompletionTriggerKind.Invoked - }, - expectedItemLabels: ["snippet1", "snippet2"], - htmlItemLabels: [], - snippetLabels: ["snippet1", "snippet2"]); - } - - [Fact] - public async Task HtmlSnippetsCompletion_WhitespaceOnlyDocument2() - { - await VerifyCompletionListAsync( - input: """ - $$ - - """, - completionContext: new VSInternalCompletionContext() - { - InvokeKind = VSInternalCompletionInvokeKind.Explicit, - TriggerCharacter = null, - TriggerKind = CompletionTriggerKind.Invoked - }, - expectedItemLabels: ["snippet1", "snippet2"], - htmlItemLabels: [], - snippetLabels: ["snippet1", "snippet2"]); - } - - [Fact] - public async Task HtmlSnippetsCompletion_NotInStartTag() - { - await VerifyCompletionListAsync( - input: """ - This is a Razor document. - -
                  - - The end. - """, - completionContext: new VSInternalCompletionContext() - { - InvokeKind = VSInternalCompletionInvokeKind.Typing, - TriggerCharacter = " ", - TriggerKind = CompletionTriggerKind.TriggerCharacter - }, - expectedItemLabels: ["style", "dir"], - unexpectedItemLabels: ["snippet1", "snippet2"], - htmlItemLabels: ["style", "dir"], - snippetLabels: ["snippet1", "snippet2"]); - } -#endif - // Tests HTML attributes and DirectiveAttributeTransitionCompletionItemProvider [Fact] public async Task HtmlAndDirectiveAttributeTransitionNamesCompletion() @@ -641,9 +562,9 @@ The end. """, completionContext: new VSInternalCompletionContext() { - InvokeKind = VSInternalCompletionInvokeKind.Typing, - TriggerCharacter = " ", - TriggerKind = CompletionTriggerKind.TriggerCharacter + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked }, expectedItemLabels: ["style", "dir", "@..."], htmlItemLabels: ["style", "dir"]); @@ -797,9 +718,36 @@ The end. """, completionContext: new VSInternalCompletionContext() { - InvokeKind = VSInternalCompletionInvokeKind.Typing, - TriggerCharacter = " ", - TriggerKind = CompletionTriggerKind.TriggerCharacter + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked + }, + expectedItemLabels: ["style", "dir", "FormName", "OnValidSubmit", "@..."], + htmlItemLabels: ["style", "dir"], + itemToResolve: "FormName", +#if VSCODE + expectedResolvedItemDescription: "string EditForm.FormName"); +#else + expectedResolvedItemDescription: "string Microsoft.AspNetCore.Components.Forms.EditForm.FormName"); +#endif + } + + [Fact] + public async Task HtmlAttributeNamesAndTagHelpersCompletion_SelfClosing() + { + await VerifyCompletionListAsync( + input: """ + This is a Razor document. + + + + The end. + """, + completionContext: new VSInternalCompletionContext() + { + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked }, expectedItemLabels: ["style", "dir", "FormName", "OnValidSubmit", "@..."], htmlItemLabels: ["style", "dir"], @@ -843,24 +791,19 @@ The end. """, completionContext: new VSInternalCompletionContext() { - InvokeKind = VSInternalCompletionInvokeKind.Typing, - TriggerCharacter = " ", - TriggerKind = CompletionTriggerKind.TriggerCharacter + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked }, expectedItemLabels: ["FormName", "OnValidSubmit", "@...", "style"], htmlItemLabels: ["style"], autoInsertAttributeQuotes: false); } +#if VSCODE [Fact] public async Task TagHelperAttributes_NoCommitChars_VSCode() { - UpdateClientInitializationOptions(c => - { - c.UseVsCodeCompletionCommitCharacters = true; - return c; - }); - var list = await VerifyCompletionListAsync( input: """ This is a Razor document. @@ -876,12 +819,49 @@ The end. }, expectedItemLabels: ["FormName", "OnValidSubmit", "@...", "style"], htmlItemLabels: ["style"], - autoInsertAttributeQuotes: false, - useVsCodeCompletionCommitCharacters: true); + autoInsertAttributeQuotes: false); + Assert.NotNull(list); Assert.All(list.Items, item => Assert.DoesNotContain("=", item.CommitCharacters ?? [])); } + [Fact] + public async Task CSharp_WithUsing() + { + // Roslyn won't send unimported types if SupportsVisualStudioExtensions is true + + await VerifyCompletionListAsync( + input: """ + @{ + void Foo() + { + String$$ + } + } + """, + completionContext: new VSInternalCompletionContext() + { + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked + }, + expectedItemLabels: ["char", "DateTime", "StringBuilder"], + itemToResolve: "StringBuilder", + expectedResolvedItemDescription: "class System.Text.StringBuilder", + expected: """ + @using System.Text + @{ + void Foo() + { + StringBuilder + } + } + """, + // Completion from unimported types is computed in the background + retryTimeout: TimeSpan.FromSeconds(5)); + } +#endif + [Fact] public async Task ComponentWithEditorRequiredAttributes() { @@ -926,9 +906,9 @@ The end. """, completionContext: new VSInternalCompletionContext() { - InvokeKind = VSInternalCompletionInvokeKind.Typing, - TriggerCharacter = " ", - TriggerKind = CompletionTriggerKind.TriggerCharacter + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked }, expectedItemLabels: ["data-enhance", "data-enhance-nav", "data-permanent", "dir", "@..."], htmlItemLabels: ["dir"]); @@ -948,9 +928,9 @@ The end. """, completionContext: new VSInternalCompletionContext() { - InvokeKind = VSInternalCompletionInvokeKind.Typing, - TriggerCharacter = " ", - TriggerKind = CompletionTriggerKind.TriggerCharacter + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked }, expectedItemLabels: ["data-enhance-nav", "data-permanent", "dir", "@..."], unexpectedItemLabels: ["data-enhance"], @@ -971,9 +951,9 @@ The end. """, completionContext: new VSInternalCompletionContext() { - InvokeKind = VSInternalCompletionInvokeKind.Typing, - TriggerCharacter = " ", - TriggerKind = CompletionTriggerKind.TriggerCharacter + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked }, expectedItemLabels: ["data-enhance-nav", "data-permanent", "dir", "@..."], unexpectedItemLabels: ["data-enhance"], @@ -994,19 +974,178 @@ The end. """, completionContext: new VSInternalCompletionContext() { - InvokeKind = VSInternalCompletionInvokeKind.Typing, - TriggerCharacter = " ", - TriggerKind = CompletionTriggerKind.TriggerCharacter + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked }, expectedItemLabels: ["data-enhance-nav", "data-permanent", "dir", "@..."], unexpectedItemLabels: ["data-enhance"], htmlItemLabels: ["dir"]); } - private async Task VerifyCompletionListAsync( + [Fact] + public async Task RazorCSharpKeywordCompletion_ReturnsKeywords() + { + await VerifyCompletionListAsync( + input: """ + This is a Razor document. + + @$$ + + The end. + """, + completionContext: new VSInternalCompletionContext() + { + InvokeKind = VSInternalCompletionInvokeKind.Typing, + TriggerCharacter = "@", + TriggerKind = CompletionTriggerKind.TriggerCharacter + }, + expectedItemLabels: [.. CSharpRazorKeywordCompletionItemProvider.CSharpRazorKeywords]); + } + + [Fact] + public async Task CSharp_AwaitKeyword() + { + await VerifyCompletionListAsync( + input: """ + @{ + Task FooAsync() + { + awai$$ + } + } + """, + completionContext: new VSInternalCompletionContext() + { + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked + }, + expectedItemLabels: ["char", "DateTime", "await"], + itemToResolve: "await", + expectedResolvedItemDescription: "await Keyword\r\nAsynchronously waits for the task to finish.", + expected: """ + @{ + async Task FooAsync() + { + await + } + } + """); + } + + [Fact] + public async Task RazorHelpersFilteredOut() + { + await VerifyCompletionListAsync( + input: """ + This is a Razor document. + + @{ var __helper = 3; } + + @$$ + + The end. + """, + completionContext: new VSInternalCompletionContext() + { + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked, + }, + expectedItemLabels: ["char", "DateTime", "Exception"], + unexpectedItemLabels: ["__builder", "__helper"]); + } + + [Fact] + public async Task RazorHelpersNotFilteredIfTyping() + { + await VerifyCompletionListAsync( + input: """ + This is a Razor document. + + @{ var __helper = 3; } + + @__$$ + + The end. + """, + completionContext: new VSInternalCompletionContext() + { + InvokeKind = VSInternalCompletionInvokeKind.Explicit, + TriggerCharacter = null, + TriggerKind = CompletionTriggerKind.Invoked, + }, + expectedItemLabels: ["char", "DateTime", "Exception", "__helper"], + unexpectedItemLabels: ["__builder"]); + } + + [Fact] + public async Task IndexerAttributes1() + { + await VerifyCompletionListAsync( + input: """ + This is a Razor document. + + Microsoft.AspNetCore.Mvc.TagHelpers.AnchorTagHelper.RouteValues", +#endif + fileKind: RazorFileKind.Legacy); + } + + private async Task VerifyCompletionListAsync( TestCode input, VSInternalCompletionContext completionContext, - string[] expectedItemLabels, + string[]? expectedItemLabels, string[]? unexpectedItemLabels = null, string[]? htmlItemLabels = null, string[]? htmlItemCommitCharacters = null, @@ -1016,8 +1155,8 @@ private async Task VerifyCompletionListAsync( string? expectedResolvedItemDescription = null, bool autoInsertAttributeQuotes = true, bool commitElementsWithSpace = true, - bool useVsCodeCompletionCommitCharacters = false, - RazorFileKind? fileKind = null) + RazorFileKind? fileKind = null, + TimeSpan? retryTimeout = null) { var document = CreateProjectAndRazorDocument(input.Text, fileKind); var sourceText = await document.GetTextAsync(DisposalToken); @@ -1053,8 +1192,6 @@ private async Task VerifyCompletionListAsync( snippetCompletionItemProvider.SnippetCache.Update(SnippetLanguage.Html, snippetInfos); #endif - var languageServerFeatureOptions = new TestLanguageServerFeatureOptions(useVsCodeCompletionCommitCharacters: useVsCodeCompletionCommitCharacters); - var completionListCache = new CompletionListCache(); var endpoint = new CohostDocumentCompletionEndpoint( IncompatibleProjectService, @@ -1062,7 +1199,6 @@ private async Task VerifyCompletionListAsync( ClientSettingsManager, ClientCapabilitiesService, snippetCompletionItemProvider, - languageServerFeatureOptions, requestInvoker, completionListCache, NoOpTelemetryReporter.Instance, @@ -1080,7 +1216,28 @@ private async Task VerifyCompletionListAsync( var result = await endpoint.GetTestAccessor().HandleRequestAsync(request, document, DisposalToken); - Assert.NotNull(result); + if (result is null) + { + Assert.Null(expectedItemLabels); + return null; + } + + Assert.NotNull(expectedItemLabels); + + if (retryTimeout is not null && itemToResolve is not null) + { + var sw = Stopwatch.StartNew(); + while (result.Items.FirstOrDefault(i => i.Label == itemToResolve) == null) + { + Assert.True(sw.Elapsed < TimeSpan.FromSeconds(5), "Failed to resolve unimported completion item after 5 second."); + + // Roslyn only computes unimported types in the background, and we have no access to its internal workings to wait for it to be + // finished, so we just have to delay and ask for completion items again. + await Task.Delay(100, DisposalToken); + result = await endpoint.GetTestAccessor().HandleRequestAsync(request, document, DisposalToken); + Assert.NotNull(result); + } + } using var _ = HashSetPool.GetPooledObject(out var labelSet); labelSet.AddRange(result.Items.SelectAsArray((item) => item.Label)); @@ -1142,8 +1299,6 @@ private async Task VerifyCompletionListParamsTypeAsync( // Assert the request invoker is passed a RazorVSInternalCompletionParams var requestInvoker = new TestHtmlRequestInvoker((Methods.TextDocumentCompletionName, ValidateArgType)); - var languageServerFeatureOptions = new TestLanguageServerFeatureOptions(); - var completionListCache = new CompletionListCache(); var endpoint = new CohostDocumentCompletionEndpoint( IncompatibleProjectService, @@ -1151,7 +1306,6 @@ private async Task VerifyCompletionListParamsTypeAsync( ClientSettingsManager, ClientCapabilitiesService, new ThrowingSnippetCompletionItemResolveProvider(), - languageServerFeatureOptions, requestInvoker, completionListCache, NoOpTelemetryReporter.Instance, @@ -1228,7 +1382,18 @@ private async Task VerifyCompletionResolveAsync(CodeAnalysis.TextDocument docume var text = await document.GetTextAsync(DisposalToken).ConfigureAwait(false); var insertIndex = text.GetRequiredAbsoluteIndex(position); - changedText = text.WithChanges(new TextChange(new TextSpan(insertIndex, 0), label)); + var startIndex = insertIndex; + // If there is already a word in the document, replace it + for (var i = insertIndex - 1; i > 0; i--) + { + if (!char.IsLetter(text[i])) + { + startIndex = i + 1; + break; + } + } + + changedText = text.WithChanges(new TextChange(TextSpan.FromBounds(startIndex, insertIndex), label)); } else if (expected is not null) { diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostDocumentSymbolEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostDocumentSymbolEndpointTest.cs index bab97ce3211..688f72e7cae 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostDocumentSymbolEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostDocumentSymbolEndpointTest.cs @@ -6,9 +6,10 @@ using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.AspNetCore.Razor.Utilities; using Microsoft.CodeAnalysis.Razor.Protocol; -using Microsoft.CodeAnalysis.Testing; using Microsoft.CodeAnalysis.Text; using Xunit; using Xunit.Abstractions; @@ -22,7 +23,7 @@ public class CohostDocumentSymbolEndpointTest(ITestOutputHelper testOutput) : Co public Task DocumentSymbols_CSharpClassWithMethods(bool hierarchical) => VerifyDocumentSymbolsAsync( """ - @functions { + {|BuildRenderTree():|}@code { class {|SomeProject.File1.C:C|} { private void {|HandleString(string s):HandleString|}(string s) @@ -42,7 +43,8 @@ class {|SomeProject.File1.C:C|} } } - """, hierarchical); + """, + hierarchical); [Theory] [CombinatorialData] @@ -54,7 +56,7 @@ public Task DocumentSymbols_CSharpClassWithMethods_MiscFile(bool hierarchical) : "home.example.SomeProject"; return VerifyDocumentSymbolsAsync( $$""" - @functions { + {|BuildRenderTree():|}@code { class {|ASP.{{generatedNamespace}}.File1.C:C|} { private void {|HandleString(string s):HandleString|}(string s) @@ -74,7 +76,9 @@ class {|ASP.{{generatedNamespace}}.File1.C:C|} } } - """, hierarchical, miscellaneousFile: true); + """, + hierarchical, + miscellaneousFile: true); } [Theory] @@ -82,7 +86,7 @@ class {|ASP.{{generatedNamespace}}.File1.C:C|} public Task DocumentSymbols_CSharpMethods(bool hierarchical) => VerifyDocumentSymbolsAsync( """ - @functions { + {|BuildRenderTree():|}@code { private void {|HandleString(string s):HandleString|}(string s) { s += "Hello"; @@ -99,12 +103,40 @@ public Task DocumentSymbols_CSharpMethods(bool hierarchical) } } - """, hierarchical); + """, + hierarchical); - private async Task VerifyDocumentSymbolsAsync(string input, bool hierarchical = false, bool miscellaneousFile = false) + [Theory] + [CombinatorialData] + public Task DocumentSymbols_CSharpMethods_Legacy(bool hierarchical) + => VerifyDocumentSymbolsAsync( + """ + {|ExecuteAsync():|}@functions { + private void {|HandleString(string s):HandleString|}(string s) + { + s += "Hello"; + } + + private void {|M(int i):M|}(int i) + { + i++; + } + + private string {|ObjToString(object o):ObjToString|}(object o) + { + return o.ToString(); + } + } + + """, + hierarchical, + fileKind: RazorFileKind.Legacy); + + private async Task VerifyDocumentSymbolsAsync(TestCode input, bool hierarchical = false, bool miscellaneousFile = false, RazorFileKind? fileKind = null) { - TestFileMarkupParser.GetSpans(input, out input, out ImmutableDictionary> spansDict); - var document = CreateProjectAndRazorDocument(input, miscellaneousFile: miscellaneousFile); + fileKind ??= RazorFileKind.Component; + + var document = CreateProjectAndRazorDocument(input.Text, fileKind, miscellaneousFile: miscellaneousFile); var endpoint = new CohostDocumentSymbolEndpoint(IncompatibleProjectService, RemoteServiceInvoker); @@ -113,10 +145,12 @@ private async Task VerifyDocumentSymbolsAsync(string input, bool hierarchical = // Roslyn's DocumentSymbol type has an annoying property that makes it hard to serialize Assert.NotNull(JsonSerializer.SerializeToDocument(result, JsonHelpers.JsonSerializerOptions)); + var spansDict = input.NamedSpans; + var sourceText = SourceText.From(input.Text); + if (hierarchical) { var documentSymbols = result.Value.First; - var sourceText = SourceText.From(input); var seen = 0; VerifyDocumentSymbols(spansDict, documentSymbols, sourceText, ref seen); @@ -128,7 +162,6 @@ private async Task VerifyDocumentSymbolsAsync(string input, bool hierarchical = var symbolsInformations = result.Value.Second; Assert.Equal(spansDict.Values.Count(), symbolsInformations.Length); - var sourceText = SourceText.From(input); #pragma warning disable CS0618 // Type or member is obsolete // SymbolInformation is obsolete, but things still return it so we have to handle it foreach (var symbolInformation in symbolsInformations) @@ -146,7 +179,7 @@ private static void VerifyDocumentSymbols(ImmutableDictionary (f.fileName, f.testCode.Text))]); - var inputText = await document.GetTextAsync(DisposalToken); - var position = inputText.GetPosition(input.Position); + TestCode input = """ + <[|Surv$$eyPrompt|] Title="InputValue" /> + """; - var endpoint = new CohostFindAllReferencesEndpoint(IncompatibleProjectService, RemoteServiceInvoker); + // lang=c#-test + TestCode surveyPrompt = """ + using Microsoft.AspNetCore.Components; + using Microsoft.AspNetCore.Components.Rendering; - var textDocumentPositionParams = new TextDocumentPositionParams - { - Position = position, - TextDocument = new TextDocumentIdentifier { DocumentUri = document.CreateDocumentUri() }, - }; + namespace SomeProject; - var results = await endpoint.GetTestAccessor().HandleRequestAsync(document, position, DisposalToken); + public class [|SurveyPrompt|] : ComponentBase + { + [Parameter] + public string Title { get; set; } = "Hello"; - Assumes.NotNull(results); + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.OpenElement(0, "div"); + builder.AddContent(1, Title + " from a C#-defined component!"); + builder.CloseElement(); + } + } + """; + + await VerifyFindAllReferencesAsync(input, + (FilePath("SurveyPrompt.cs"), surveyPrompt)); + } + + [Fact] + public async Task ComponentEndTag_DefinedInCSharp() + { + TestCode input = """ + <[|SurveyPrompt|] Title="InputValue"> + """; + + // lang=c#-test + TestCode surveyPrompt = """ + using Microsoft.AspNetCore.Components; + using Microsoft.AspNetCore.Components.Rendering; + + namespace SomeProject; + + public class [|SurveyPrompt|] : ComponentBase + { + [Parameter] + public string Title { get; set; } = "Hello"; + + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.OpenElement(0, "div"); + builder.AddContent(1, Title + " from a C#-defined component!"); + builder.CloseElement(); + } + } + """; + + await VerifyFindAllReferencesAsync(input, + (FilePath("SurveyPrompt.cs"), surveyPrompt)); + } + + [Fact] + public async Task Component_FromRazor() + { + TestCode input = """ + <[|Sur$$veyPrompt|] Title="InputValue" /> + + @nameof([|SurveyPrompt|]) + """; + + TestCode surveyPrompt = """ + [||]
                  +
                  + """; + + await VerifyFindAllReferencesAsync(input, + (FilePath("SurveyPrompt.razor"), surveyPrompt)); + } + + [Fact] + public async Task Component_FromCSharp() + { + TestCode input = """ + <[|SurveyPrompt|] Title="InputValue" /> + + @nameof([|Survey$$Prompt|]) + """; + + TestCode surveyPrompt = """ + [||]
                  +
                  + """; + + await VerifyFindAllReferencesAsync(input, + (FilePath("SurveyPrompt.razor"), surveyPrompt)); + } + + + [Fact] + public async Task ComponentAttribute_CrossProject() + { + // Note: This test doesn't simulate syncing solutions to the remote workspace, so strictly speaking is running in the "wrong" MEF composition + // but thats not an important aspect of this scenario. + + var someProjectId = ProjectId.CreateNewId(); + var surveyPromptId = DocumentId.CreateNewId(someProjectId); + TestCode surveyPrompt = """ + @namespace SomeProject + +
                  + + @code + { + [Parameter] + public string [|Title|] { get; set; } + } + """; + + var anotherProjectId = ProjectId.CreateNewId(); + var componentId = DocumentId.CreateNewId(anotherProjectId); + TestCode component = """ + @using SomeProject + + + """; + + var solution = LocalWorkspace.CurrentSolution; + var project1 = AddProjectAndRazorDocument(solution, TestProjectData.SomeProject.FilePath, someProjectId, surveyPromptId, TestProjectData.SomeProjectComponentFile1.FilePath, surveyPrompt.Text).Project; + var project2 = AddProjectAndRazorDocument(project1.Solution, TestProjectData.AnotherProject.FilePath, anotherProjectId, componentId, TestProjectData.AnotherProjectComponentFile2.FilePath, component.Text).Project; + project2 = project2.AddProjectReference(new ProjectReference(project1.Id)); + project1 = project2.Solution.GetRequiredProject(project1.Id); + + var surveyPromptDocument = project1.GetAdditionalDocument(surveyPromptId); + Assert.NotNull(surveyPromptDocument); + var componentDocument = project2.GetAdditionalDocument(componentId); + Assert.NotNull(componentDocument); + + var position = (await componentDocument.GetTextAsync(DisposalToken)).GetPosition(component.Position); + var result = await GetFindAllReferencesResultsAsync(componentDocument, position); + + Assert.Collection(result, + t => + { + var location = GetLocation(t); + Assert.Equal(surveyPromptDocument.CreateUri(), location.DocumentUri.GetRequiredParsedUri()); + var text = SourceText.From(surveyPrompt.Text); + var range = text.GetRange(surveyPrompt.Spans[0]); + Assert.Equal(range, location.Range); + }, + t => + { + var location = GetLocation(t); + Assert.Equal(componentDocument.CreateUri(), location.DocumentUri.GetRequiredParsedUri()); + var text = SourceText.From(component.Text); + var range = text.GetRange(component.Spans[0]); + Assert.Equal(range, location.Range); + }); + } + + private async Task VerifyFindAllReferencesAsync(TestCode input, params (string fileName, TestCode testCode)[] additionalFiles) + { + var document = CreateProjectAndRazorDocument(input.Text, additionalFiles: [.. additionalFiles.Select(f => (f.fileName, f.testCode.Text))]); + var inputText = await document.GetTextAsync(DisposalToken); + var position = inputText.GetPosition(input.Position); + var results = await GetFindAllReferencesResultsAsync(document, position); var totalSpans = input.Spans.Length + additionalFiles.Sum(f => f.testCode.TryGetNamedSpans("", out var spans) ? spans.Length : 0); Assert.Equal(totalSpans, results.Length); @@ -149,6 +301,16 @@ private async Task VerifyFindAllReferencesAsync(TestCode input, params (string f } } + private async Task[]> GetFindAllReferencesResultsAsync(TextDocument document, Position position) + { + var endpoint = new CohostFindAllReferencesEndpoint(IncompatibleProjectService, RemoteServiceInvoker); + + var results = await endpoint.GetTestAccessor().HandleRequestAsync(document, position, DisposalToken); + + Assumes.NotNull(results); + return results; + } + private static string GetText(VSInternalReferenceItem referenceItem) { if (referenceItem.Text is ClassifiedTextElement classifiedText) diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostFoldingRangeEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostFoldingRangeEndpointTest.cs index 609d06469c7..219fcaf4e55 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostFoldingRangeEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostFoldingRangeEndpointTest.cs @@ -239,8 +239,79 @@ public void M() {[| }|] """); - private async Task VerifyFoldingRangesAsync(string input, RazorFileKind? fileKind = null, bool miscellaneousFile = false, string? razorFilePath = null) + [Fact] + public Task CSharp_LineFoldingOnly() + => VerifyFoldingRangesAsync(""" +
                  {|html: + Hello @_name +
                  |} + + @code {[| + class C { public void M1() {[| + var x = 1; + |] } + } + }|] + """, + lineFoldingOnly: true); + + [Fact] + public Task CSharp_NotLineFoldingOnly() + => VerifyFoldingRangesAsync(""" +
                  {|html: + Hello @_name +
                  |} + + @code {[| + class C { public void M1() {[| + var x = 1; + } + }|] + }|] + """, + lineFoldingOnly: false); + + [Fact] + public Task IfElseStatements_LineFoldingOnly() + => VerifyFoldingRangesAsync(""" +
                  + @if (true) {[| +
                  + Hello World +
                  + } else {[| +
                  + Goodbye World +
                  + |] } + |] } +
                  + + @code[| + { + void M()[| + { + if (true) {[| + |] var x = 1; + } else {[| + var y = 2; + |] } + |] } + }|] + """, + lineFoldingOnly: true); + + private async Task VerifyFoldingRangesAsync(string input, RazorFileKind? fileKind = null, bool miscellaneousFile = false, string? razorFilePath = null, bool lineFoldingOnly = false) { + UpdateClientLSPInitializationOptions(c => + { + c.ClientCapabilities.TextDocument!.FoldingRange = new FoldingRangeSetting() + { + LineFoldingOnly = lineFoldingOnly, + }; + return c; + }); + TestFileMarkupParser.GetSpans(input, out var source, out ImmutableDictionary> spans); var document = CreateProjectAndRazorDocument(source, fileKind, miscellaneousFile: miscellaneousFile, documentFilePath: razorFilePath); var inputText = await document.GetTextAsync(DisposalToken); diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostGoToDefinitionEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostGoToDefinitionEndpointTest.cs index 59f8d81ab52..7278f3ff6ad 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostGoToDefinitionEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostGoToDefinitionEndpointTest.cs @@ -7,8 +7,10 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common; +using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor; +using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Text; using Xunit; using Xunit.Abstractions; @@ -156,6 +158,40 @@ public async Task Component() Assert.Equal(range, location.Range); } + [Fact] + public async Task Component_FromCSharp() + { + TestCode input = """ + + + @typeof(Surv$$eyPrompt).ToString() + """; + + TestCode surveyPrompt = """ + [||]@namespace SomeProject + +
                  + + @code + { + [Parameter] + public string Title { get; set; } + } + """; + + var result = await GetGoToDefinitionResultAsync(input, RazorFileKind.Component, + additionalFiles: (FilePath("SurveyPrompt.razor"), surveyPrompt.Text)); + + Assert.NotNull(result.Value.Second); + var locations = result.Value.Second; + var location = Assert.Single(locations); + + Assert.Equal(FileUri("SurveyPrompt.razor"), location.DocumentUri.GetRequiredParsedUri()); + var text = SourceText.From(surveyPrompt.Text); + var range = text.GetRange(surveyPrompt.Span); + Assert.Equal(range, location.Range); + } + [Fact] public async Task ComponentEndTag() { @@ -257,6 +293,47 @@ @namespace SomeProject Assert.Equal(range, location.Range); } + [Fact] + public async Task Component_DefinedInCSharp() + { + TestCode input = """ + + """; + + // lang=c#-test + TestCode surveyPrompt = """ + using Microsoft.AspNetCore.Components; + using Microsoft.AspNetCore.Components.Rendering; + + namespace SomeProject; + + public class [|SurveyPrompt|] : ComponentBase + { + [Parameter] + public string Title { get; set; } = "Hello"; + + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.OpenElement(0, "div"); + builder.AddContent(1, Title + " from a C#-defined component!"); + builder.CloseElement(); + } + } + """; + + var result = await GetGoToDefinitionResultAsync(input, RazorFileKind.Component, + additionalFiles: (FilePath("SurveyPrompt.cs"), surveyPrompt.Text)); + + Assert.NotNull(result.Value.Second); + var locations = result.Value.Second; + var location = Assert.Single(locations); + + Assert.Equal(FileUri("SurveyPrompt.cs"), location.DocumentUri.GetRequiredParsedUri()); + var text = SourceText.From(surveyPrompt.Text); + var range = text.GetRange(surveyPrompt.Span); + Assert.Equal(range, location.Range); + } + [Fact] public async Task ComponentAttribute_DefinedInCSharp() { @@ -365,7 +442,7 @@ public async Task Html() var htmlResponse = new SumType?(new LspLocation[] { new() { - DocumentUri = new(new Uri(document.CreateUri(), document.Name + FeatureOptions.HtmlVirtualDocumentSuffix)), + DocumentUri = new(new Uri(document.CreateUri(), document.Name + LanguageServerConstants.HtmlVirtualDocumentSuffix)), Range = inputText.GetRange(input.Span), }, }); @@ -780,28 +857,6 @@ public override void Process(TagHelperContext context, TagHelperOutput output) Assert.Equal(expected.Spans[1], SourceText.From(expected.Text).GetTextSpan(location.Range)); } - private async Task VerifyGoToDefinitionAsync( - TestCode input, - RazorFileKind? fileKind = null, - SumType? htmlResponse = null, - TextDocument? razorDocument = null) - { - var document = razorDocument ?? CreateProjectAndRazorDocument(input.Text, fileKind); - var result = await GetGoToDefinitionResultCoreAsync(document, input, htmlResponse); - - Assumes.NotNull(result); - - Assert.NotNull(result.Value.Second); - var locations = result.Value.Second; - var location = Assert.Single(locations); - - var text = SourceText.From(input.Text); - var range = text.GetRange(input.Span); - Assert.Equal(range, location.Range); - - Assert.Equal(document.CreateUri(), location.DocumentUri.GetRequiredParsedUri()); - } - [Fact, WorkItem("https://github.com/dotnet/razor/issues/4325")] public async Task StringLiteral_TildePath() { @@ -905,6 +960,79 @@ public async Task StringLiteral_NotFileReference(string literalContents) Assert.Contains("public sealed class String", line); } + [Fact] + public async Task ComponentAttribute_CrossProject() + { + // Note: This test doesn't simulate syncing solutions to the remote workspace, so strictly speaking is running in the "wrong" MEF composition + // but thats not an important aspect of this scenario. + + var someProjectId = ProjectId.CreateNewId(); + var surveyPromptId = DocumentId.CreateNewId(someProjectId); + TestCode surveyPrompt = """ + @namespace SomeProject + +
                  + + @code + { + [Parameter] + public string [|Title|] { get; set; } + } + """; + + var anotherProjectId = ProjectId.CreateNewId(); + var componentId = DocumentId.CreateNewId(anotherProjectId); + TestCode component = """ + @using SomeProject + + + """; + + var solution = LocalWorkspace.CurrentSolution; + var project1 = AddProjectAndRazorDocument(solution, TestProjectData.SomeProject.FilePath, someProjectId, surveyPromptId, TestProjectData.SomeProjectComponentFile1.FilePath, surveyPrompt.Text).Project; + var project2 = AddProjectAndRazorDocument(project1.Solution, TestProjectData.AnotherProject.FilePath, anotherProjectId, componentId, TestProjectData.AnotherProjectComponentFile2.FilePath, component.Text).Project; + project2 = project2.AddProjectReference(new ProjectReference(project1.Id)); + project1 = project2.Solution.GetRequiredProject(project1.Id); + + var surveyPromptDocument = project1.GetAdditionalDocument(surveyPromptId); + Assert.NotNull(surveyPromptDocument); + var componentDocument = project2.GetAdditionalDocument(componentId); + Assert.NotNull(componentDocument); + + var result = await GetGoToDefinitionResultCoreAsync(componentDocument, component, htmlResponse: null); + + Assert.NotNull(result.Value.Second); + var locations = result.Value.Second; + var location = Assert.Single(locations); + + Assert.Equal(surveyPromptDocument.CreateUri(), location.DocumentUri.GetRequiredParsedUri()); + var text = SourceText.From(surveyPrompt.Text); + var range = text.GetRange(surveyPrompt.Span); + Assert.Equal(range, location.Range); + } + + private async Task VerifyGoToDefinitionAsync( + TestCode input, + RazorFileKind? fileKind = null, + SumType? htmlResponse = null, + TextDocument? razorDocument = null) + { + var document = razorDocument ?? CreateProjectAndRazorDocument(input.Text, fileKind); + var result = await GetGoToDefinitionResultCoreAsync(document, input, htmlResponse); + + Assumes.NotNull(result); + + Assert.NotNull(result.Value.Second); + var locations = result.Value.Second; + var location = Assert.Single(locations); + + var text = SourceText.From(input.Text); + var range = text.GetRange(input.Span); + Assert.Equal(range, location.Range); + + Assert.Equal(document.CreateUri(), location.DocumentUri.GetRequiredParsedUri()); + } + private async Task?> GetGoToDefinitionResultAsync( TestCode input, RazorFileKind? fileKind = null, diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostGoToImplementationEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostGoToImplementationEndpointTest.cs index 30496b84a0a..0ad1c02ec88 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostGoToImplementationEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostGoToImplementationEndpointTest.cs @@ -8,7 +8,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor; -using Microsoft.CodeAnalysis.Razor.Cohost; +using Microsoft.CodeAnalysis.Razor.Protocol; using Microsoft.CodeAnalysis.Remote.Razor; using Microsoft.CodeAnalysis.Text; using Xunit; @@ -37,7 +37,7 @@ public async Task CSharp_Method() } """; - await VerifyCSharpGoToImplementationAsync(input); + await VerifyGoToImplementationAsync(input); } [Fact] @@ -61,7 +61,7 @@ string GetX() } """; - await VerifyCSharpGoToImplementationAsync(input); + await VerifyGoToImplementationAsync(input); } [Fact] @@ -82,7 +82,7 @@ void M(Ba$$se b) } """; - await VerifyCSharpGoToImplementationAsync(input); + await VerifyGoToImplementationAsync(input); } [Fact] @@ -103,36 +103,86 @@ public async Task Html() var document = CreateProjectAndRazorDocument(input.Text); var inputText = await document.GetTextAsync(DisposalToken); - var htmlResponse = new SumType?(new LspLocation[] + var htmlResponse = new LspLocation { - new LspLocation + DocumentUri = new(new Uri(document.CreateUri(), document.Name + LanguageServerConstants.HtmlVirtualDocumentSuffix)), + Range = inputText.GetRange(input.Span), + }; + + await VerifyGoToImplementationAsync(input, document, htmlResponse); + } + + [Fact] + public async Task Component_FromCSharp() + { + TestCode input = """ + + + @typeof(Surv$$eyPrompt).ToString() + """; + + TestCode surveyPrompt = """ + [||]@namespace SomeProject + +
                  + + @code { - DocumentUri = new(new Uri(document.CreateUri(), document.Name + FeatureOptions.HtmlVirtualDocumentSuffix)), - Range = inputText.GetRange(input.Span), - }, - }); + [Parameter] + public string Title { get; set; } + } + """; + + var result = await GetGoToImplementationResultAsync(input, + additionalFiles: (FilePath("SurveyPrompt.razor"), surveyPrompt.Text)); - var requestInvoker = new TestHtmlRequestInvoker([(Methods.TextDocumentImplementationName, htmlResponse)]); + Assert.NotNull(result); + var locations = result.Value.First; + var location = Assert.Single(locations); - await VerifyGoToImplementationResultAsync(input, document, requestInvoker); + Assert.Equal(FileUri("SurveyPrompt.razor"), location.DocumentUri.GetRequiredParsedUri()); + var text = SourceText.From(surveyPrompt.Text); + var range = text.GetRange(surveyPrompt.Span); + Assert.Equal(range, location.Range); } - private async Task VerifyCSharpGoToImplementationAsync(TestCode input) + private async Task VerifyGoToImplementationAsync(TestCode input, TextDocument? document = null, LspLocation? htmlResponse = null) { - var document = CreateProjectAndRazorDocument(input.Text); + document ??= CreateProjectAndRazorDocument(input.Text); + var result = await GetGoToImplementationResultCoreAsync(input, document, htmlResponse); + + Assert.NotNull(result); - var requestInvoker = new TestHtmlRequestInvoker(); + var inputText = SourceText.From(input.Text); + if (result.Value.TryGetFirst(out var roslynLocations)) + { + var expected = input.Spans.Select(s => inputText.GetRange(s).ToLinePositionSpan()).OrderBy(r => r.Start.Line).ToArray(); + var actual = roslynLocations.Select(l => l.Range.ToLinePositionSpan()).OrderBy(r => r.Start.Line).ToArray(); + Assert.Equal(expected, actual); - await VerifyGoToImplementationResultCoreAsync(input, document, requestInvoker); + Assert.All(roslynLocations, l => l.DocumentUri.GetRequiredParsedUri().Equals(document.CreateUri())); + } + else + { + Assert.Fail($"Unsupported result type: {result.Value.GetType()}"); + } } - private async Task VerifyGoToImplementationResultAsync(TestCode input, TextDocument document, IHtmlRequestInvoker requestInvoker) + private async Task?> GetGoToImplementationResultAsync( + TestCode input, + LspLocation? htmlResponse = null, + params (string fileName, string contents)[]? additionalFiles) { - await VerifyGoToImplementationResultCoreAsync(input, document, requestInvoker); + var document = CreateProjectAndRazorDocument(input.Text, additionalFiles: additionalFiles); + return await GetGoToImplementationResultCoreAsync(input, document, htmlResponse); } - private async Task VerifyGoToImplementationResultCoreAsync(TestCode input, TextDocument document, IHtmlRequestInvoker requestInvoker) + private async Task?> GetGoToImplementationResultCoreAsync(TestCode input, TextDocument document, LspLocation? htmlResponse) { + var requestInvoker = htmlResponse is null + ? new TestHtmlRequestInvoker() + : new TestHtmlRequestInvoker([(Methods.TextDocumentImplementationName, new SumType?(new LspLocation[] { htmlResponse }))]); + var inputText = await document.GetTextAsync(DisposalToken); var filePathService = new RemoteFilePathService(FeatureOptions); @@ -145,19 +195,6 @@ private async Task VerifyGoToImplementationResultCoreAsync(TestCode input, TextD TextDocument = new TextDocumentIdentifier { DocumentUri = document.CreateDocumentUri() }, }; - var result = await endpoint.GetTestAccessor().HandleRequestAsync(textDocumentPositionParams, document, DisposalToken); - - if (result.Value.TryGetFirst(out var roslynLocations)) - { - var expected = input.Spans.Select(s => inputText.GetRange(s).ToLinePositionSpan()).OrderBy(r => r.Start.Line).ToArray(); - var actual = roslynLocations.Select(l => l.Range.ToLinePositionSpan()).OrderBy(r => r.Start.Line).ToArray(); - Assert.Equal(expected, actual); - - Assert.All(roslynLocations, l => l.DocumentUri.GetRequiredParsedUri().Equals(document.CreateUri())); - } - else - { - Assert.Fail($"Unsupported result type: {result.Value.GetType()}"); - } + return await endpoint.GetTestAccessor().HandleRequestAsync(textDocumentPositionParams, document, DisposalToken); } } diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostHoverEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostHoverEndpointTest.cs index d81f0f657e0..5569dd772f6 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostHoverEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostHoverEndpointTest.cs @@ -3,6 +3,7 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.ExternalAccess.Razor; @@ -38,16 +39,18 @@ await VerifyHoverAsync(code, async (hover, document) => Container( Container( Image, - ClassifiedText( // Microsoft.AspNetCore.Components.Web.PageTitle - Text("Microsoft"), + ClassifiedText( // class Microsoft.AspNetCore.Components.Web.PageTitle + Keyword("class"), + WhiteSpace(" "), + Namespace("Microsoft"), Punctuation("."), - Text("AspNetCore"), + Namespace("AspNetCore"), Punctuation("."), - Text("Components"), + Namespace("Components"), Punctuation("."), - Text("Web"), + Namespace("Web"), Punctuation("."), - Type("PageTitle"))))); + ClassName("PageTitle"))))); }); } @@ -71,6 +74,56 @@ public async Task Html() await VerifyHoverAsync(code, htmlResponse, h => Assert.Same(htmlResponse, h)); } + [Fact] + public async Task Html_TagHelper() + { + TestCode code = """ + <[|bo$$dy|]> + """; + + // This verifies Hover calls into both razor and HTML, aggregating their results + const string BodyDescription = "body description"; + var htmlResponse = new VSInternalHover + { + Range = new LspRange() + { + Start = new Position(0, 1), + End = new Position(0, " + { + await VerifyRangeAsync(hover, code.Span, document); + + hover.VerifyContents( + Container( + Container( + ClassifiedText( + Text(BodyDescription)), + HorizontalRule), + Container( + Image, + ClassifiedText( + Text("Microsoft"), + Punctuation("."), + Text("AspNetCore"), + Punctuation("."), + Text("Mvc"), + Punctuation("."), + Text("Razor"), + Punctuation("."), + Text("TagHelpers"), + Punctuation("."), + Type("BodyTagHelper"))))); + }); + } + [Fact] public async Task Html_EndTag() { @@ -188,20 +241,22 @@ await VerifyHoverAsync(code, async (hover, document) => Container( Container( Image, - ClassifiedText( // Microsoft.ApsNetCore.Components.Forms.InputText - Text("Microsoft"), + ClassifiedText( // class Microsoft.ApsNetCore.Components.Forms.InputText + Keyword("class"), + WhiteSpace(" "), + Namespace("Microsoft"), Punctuation("."), - Text("AspNetCore"), + Namespace("AspNetCore"), Punctuation("."), - Text("Components"), + Namespace("Components"), Punctuation("."), - Text("Forms"), + Namespace("Forms"), Punctuation("."), - Type("InputText"))))); + ClassName("InputText"))))); }); } - [Fact(Skip = "Skipped due to revert of https://github.com/dotnet/razor/pull/12287, but don't want to delete the tests because the feature will come back")] + [Fact] public async Task ComponentEndTag() { TestCode code = """ @@ -226,19 +281,19 @@ await VerifyHoverAsync(code, async (hover, document) => ClassifiedText( // class Microsoft.AspNetCore.Components.Web.PageTitle Keyword("class"), WhiteSpace(" "), - Text("Microsoft"), + Namespace("Microsoft"), Punctuation("."), - Text("AspNetCore"), + Namespace("AspNetCore"), Punctuation("."), - Text("Components"), + Namespace("Components"), Punctuation("."), - Text("Web"), + Namespace("Web"), Punctuation("."), ClassName("PageTitle"))))); }); } - [Fact(Skip = "Skipped due to revert of https://github.com/dotnet/razor/pull/12287, but don't want to delete the tests because the feature will come back")] + [Fact] public async Task ComponentEndTag_FullyQualified() { TestCode code = """ @@ -263,19 +318,19 @@ await VerifyHoverAsync(code, async (hover, document) => ClassifiedText( // class Microsoft.AspNetCore.Components.Web.PageTitle Keyword("class"), WhiteSpace(" "), - Text("Microsoft"), + Namespace("Microsoft"), Punctuation("."), - Text("AspNetCore"), + Namespace("AspNetCore"), Punctuation("."), - Text("Components"), + Namespace("Components"), Punctuation("."), - Text("Web"), + Namespace("Web"), Punctuation("."), ClassName("PageTitle"))))); }); } - [Fact(Skip = "Skipped due to revert of https://github.com/dotnet/razor/pull/12287, but don't want to delete the tests because the feature will come back")] + [Fact] public async Task ComponentEndTag_FullyQualified_Namespace() { TestCode code = """ @@ -300,16 +355,19 @@ await VerifyHoverAsync(code, async (hover, document) => ClassifiedText( // namespace Microsoft.AspNetCore Keyword("namespace"), WhiteSpace(" "), - Text("Microsoft"), + Namespace("Microsoft"), Punctuation("."), - Text("AspNetCore"))))); + Namespace("AspNetCore"))))); }); } - private async Task VerifyHoverAsync(TestCode input, Func verifyHover) + private Task VerifyHoverAsync(TestCode input, Func verifyHover) + => VerifyHoverAsync(input, fileKind: null, htmlResponse: null, verifyHover); + + private async Task VerifyHoverAsync(TestCode input, RazorFileKind? fileKind, Hover? htmlResponse, Func verifyHover) { - var document = CreateProjectAndRazorDocument(input.Text); - var result = await GetHoverResultAsync(document, input); + var document = CreateProjectAndRazorDocument(input.Text, fileKind); + var result = await GetHoverResultAsync(document, input, htmlResponse); Assert.NotNull(result); await verifyHover(result, document); diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostOnAutoInsertEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostOnAutoInsertEndpointTest.cs index 025da4561fd..938a9c57d53 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostOnAutoInsertEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostOnAutoInsertEndpointTest.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Razor.AutoInsert; @@ -41,6 +42,295 @@ The end. triggerCharacter: ">"); } + [Theory] + [InlineData("PageTitle")] + [InlineData("div")] + [InlineData("text")] + public async Task EndTag_InCSharp(string startTag) + { + await VerifyOnAutoInsertAsync( + input: $$""" +
                  + @if (true) + { + <{{startTag}}>$$ + } +
                  + """, + output: $$""" +
                  + @if (true) + { + <{{startTag}}>$0 + } +
                  + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_AlreadyExists() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + + $$ + + The end. + """, + output: null, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_TagStructure_WithoutEndTag() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + + $$ + + The end. + """, + output: """ + This is a Razor document. + + + + The end. + """, + triggerCharacter: ">", + fileKind: RazorFileKind.Legacy); + } + + [Fact] + public async Task EndTag_TagStructure_WithoutEndTag_AlreadyExists() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + + $$ + + The end. + """, + output: """ + This is a Razor document. + + + + The end. + """, + triggerCharacter: ">", + fileKind: RazorFileKind.Legacy); + } + + [Fact] + public async Task EndTag_CloseOutOfScope() + { + await VerifyOnAutoInsertAsync( + input: """ +
                  + @if (true) + { +
                  $$
                  + } + """, + output: """ +
                  + @if (true) + { +
                  $0
                  + } + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_VoidElement() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + + $$ + + The end. + """, + output: """ + This is a Razor document. + + + + The end. + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_VoidElement_CaseInsensitive() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + + $$ + + The end. + """, + output: """ + This is a Razor document. + + + + The end. + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_Nested() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + +
                  $$
                  + + The end. + """, + output: """ + This is a Razor document. + +
                  $0
                  + + The end. + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_Nested_WithAttribute() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + +
                  + + The end. + """, + output: """ + This is a Razor document. + + + + The end. + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_Nested_WithAttribute_WithSpace() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + + + + The end. + """, + output: """ + This is a Razor document. + + + + The end. + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_Nested_WithMinimizedAttribute() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + +
                  $$
                  + + The end. + """, + output: """ + This is a Razor document. + +
                  $0
                  + + The end. + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_Nested_WithMinimizedAttribute_WithSpace() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + +
                  $$
                  + + The end. + """, + output: """ + This is a Razor document. + +
                  $0
                  + + The end. + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_Nested_VoidElement() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + + $$ + + The end. + """, + output: """ + This is a Razor document. + + + + The end. + """, + triggerCharacter: ">"); + } + + [Fact] + public async Task EndTag_VoidElement_AlreadyClosed() + { + await VerifyOnAutoInsertAsync( + input: """ + This is a Razor document. + + $$ + + The end. + """, + output: null, + triggerCharacter: ">"); + } + [Theory] [InlineData("PageTitle")] [InlineData("div")] @@ -82,6 +372,27 @@ The end. delegatedResponseText: "\"$0\""); } + [Fact] + public async Task CSharp_RawStringLiteral() + { + await VerifyOnAutoInsertAsync( + input: """" + @code { + void TestMethod() { + var x = """$$ + } + } + """", + output: """"""" + @code { + void TestMethod() { + var x = """$0""" + } + } + """"""", + triggerCharacter: "\""); + } + [Fact] public async Task CSharp_OnForwardSlash() { @@ -103,6 +414,31 @@ void TestMethod() {} triggerCharacter: "/"); } + [Fact] + public async Task CSharp_DocComment_OnEnter() + { + await VerifyOnAutoInsertAsync( + input: """ + @code { + /// + /// This is some text + $$ + /// + void TestMethod() {} + } + """, + output: """ + @code { + /// + /// This is some text + /// $0 + /// + void TestMethod() {} + } + """, + triggerCharacter: "\n"); + } + [Fact] public async Task DoNotAutoInsertCSharp_OnForwardSlashWithFormatOnTypeDisabled() { @@ -210,9 +546,11 @@ private async Task VerifyOnAutoInsertAsync( bool insertSpaces = true, int tabSize = 4, bool formatOnType = true, - bool autoClosingTags = true) + bool autoClosingTags = true, + RazorFileKind? fileKind = null) { - var document = CreateProjectAndRazorDocument(input.Text); + fileKind ??= RazorFileKind.Component; + var document = CreateProjectAndRazorDocument(input.Text, fileKind: fileKind); var sourceText = await document.GetTextAsync(DisposalToken); ClientSettingsManager.Update(ClientAdvancedSettings.Default with { FormatOnType = formatOnType, AutoClosingTags = autoClosingTags }); diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostRenameEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostRenameEndpointTest.cs index 1e089c54cb8..437ce361eea 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostRenameEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostRenameEndpointTest.cs @@ -3,25 +3,26 @@ using System; using System.Linq; -using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.ExternalAccess.Razor; -using Microsoft.CodeAnalysis.Razor; +using Microsoft.CodeAnalysis.Razor.Workspaces; +using Microsoft.CodeAnalysis.Remote.Razor; using Microsoft.CodeAnalysis.Testing; using Microsoft.CodeAnalysis.Text; -using Roslyn.Test.Utilities; using Xunit; using Xunit.Abstractions; namespace Microsoft.VisualStudio.Razor.LanguageClient.Cohost; +[CollectionDefinition(nameof(CohostRenameEndpointTest), DisableParallelization = true)] +[Collection(nameof(CohostRenameEndpointTest))] public class CohostRenameEndpointTest(ITestOutputHelper testOutputHelper) : CohostEndpointTestBase(testOutputHelper) { [Fact] - public Task CSharp_Method() + public Task CSharp_SameFile() => VerifyRenamesAsync( input: """ This is a Razor document. @@ -55,6 +56,287 @@ public string CallThisFunction() The end. """); + [Fact] + public Task CSharp_WithOtherFile() + => VerifyRenamesAsync( + input: """ + This is a Razor document. + +

                  @_other.MyMethod()

                  + + @code + { + private OtherClass _other; + + public string MyMethod() + { + _other.MyMet$$hod(); + return $"Hi from {nameof(OtherClass.MyMethod)}"; + } + } + + The end. + """, + additionalFiles: [ + (FilePath("OtherFile.cs"), """ + public class OtherClass + { + public void MyMethod() + { + } + } + """) + ], + newName: "CallThisFunction", + expected: """ + This is a Razor document. + +

                  @_other.CallThisFunction()

                  + + @code + { + private OtherClass _other; + + public string MyMethod() + { + _other.CallThisFunction(); + return $"Hi from {nameof(OtherClass.CallThisFunction)}"; + } + } + + The end. + """, + additionalExpectedFiles: [ + (FileUri("OtherFile.cs"), """ + public class OtherClass + { + public void CallThisFunction() + { + } + } + """) + ]); + + [Fact] + public Task CSharp_Inherits() + => VerifyRenamesAsync( + input: """ + @inherits MyComponent$$Base + + This is a Razor document. + + The end. + """, + additionalFiles: [ + (FilePath("OtherFile.cs"), """ + using Microsoft.AspNetCore.Components; + + public class MyComponentBase : ComponentBase + { + } + """) + ], + newName: "OtherName", + expected: """ + @inherits OtherName + + This is a Razor document. + + The end. + """, + additionalExpectedFiles: [ + (FileUri("OtherFile.cs"), """ + using Microsoft.AspNetCore.Components; + + public class OtherName : ComponentBase + { + } + """) + ]); + + [Fact] + public Task CSharp_Model() + => VerifyRenamesAsync( + input: """ + @model MyMod$$el + + This is a Razor document. + + The end. + """, + additionalFiles: [ + (FilePath("OtherFile.cs"), """ + public class MyModel + { + } + """) + ], + newName: "OtherModel", + expected: """ + @model OtherModel + + This is a Razor document. + + The end. + """, + additionalExpectedFiles: [ + (FileUri("OtherFile.cs"), """ + public class OtherModel + { + } + """) + ], + fileKind: RazorFileKind.Legacy); + + [Fact] + public Task CSharp_Implements() + => VerifyRenamesAsync( + input: """ + @implements MyInter$$face + + This is a Razor document. + + The end. + """, + additionalFiles: [ + (FilePath("OtherFile.cs"), """ + public interface MyInterface + { + } + """) + ], + newName: "IMyFace", + expected: """ + @implements IMyFace + + This is a Razor document. + + The end. + """, + additionalExpectedFiles: [ + (FileUri("OtherFile.cs"), """ + public interface IMyFace + { + } + """) + ]); + + [Fact] + public Task CSharp_TypeParam() + => VerifyRenamesAsync( + input: """ + @typeparam TItem where TItem : MyInter$$face + + This is a Razor document. + + The end. + """, + additionalFiles: [ + (FilePath("OtherFile.cs"), """ + public interface MyInterface + { + } + """) + ], + newName: "IMyFace", + expected: """ + @typeparam TItem where TItem : IMyFace + + This is a Razor document. + + The end. + """, + additionalExpectedFiles: [ + (FileUri("OtherFile.cs"), """ + public interface IMyFace + { + } + """) + ]); + + [Fact] + public Task CSharp_Attribute() + => VerifyRenamesAsync( + input: """ + @attribute [HasPa$$nts] + + This is a Razor document. + + The end. + """, + additionalFiles: [ + (FilePath("OtherFile.cs"), """ + public class HasPantsAttribute : Attribute + { + } + """) + ], + newName: "HasJacketAttribute", + expected: """ + @attribute [HasJacket] + + This is a Razor document. + + The end. + """, + additionalExpectedFiles: [ + (FileUri("OtherFile.cs"), """ + public class HasJacketAttribute : Attribute + { + } + """) + ]); + + [Fact] + public Task CSharp_Attribute_FullName() + => VerifyRenamesAsync( + input: """ + @attribute [HasPa$$ntsAttribute] + + This is a Razor document. + + The end. + """, + additionalFiles: [ + (FilePath("OtherFile.cs"), """ + public class HasPantsAttribute : Attribute + { + } + """) + ], + newName: "HasJacketAttribute", + expected: """ + @attribute [HasJacketAttribute] + + This is a Razor document. + + The end. + """, + additionalExpectedFiles: [ + (FileUri("OtherFile.cs"), """ + public class HasJacketAttribute : Attribute + { + } + """) + ]); + + [Fact] + public Task Component_ExistingFile() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), ""), + (FilePath("DifferentName.razor"), "") + ], + newName: "DifferentName", + expected: ""); + [Theory] [InlineData("$$Component")] [InlineData("Com$$ponent")] @@ -101,143 +383,1087 @@ This is a Razor document. The end. """, - renames: [("Component.razor", "DifferentName.razor")]); + additionalExpectedFiles: + [(FileUri("DifferentName.razor"), "")]); [Theory] - [InlineData("$$Component")] - [InlineData("Com$$ponent")] - [InlineData("Component$$")] - public Task Component_EndTag(string endTag) + [InlineData("My.$$Foo.Component")] + [InlineData("My.F$$oo.Component")] + [InlineData("My.Foo$$.Component")] + public Task Component_StartTag_FullyQualified_Namespace(string startTag) => VerifyRenamesAsync( input: $""" This is a Razor document. - + + + +
                  - - - + <{startTag} /> + + +
                  - - - + + + +
                  The end. """, additionalFiles: [ - (FilePath("Component.razor"), "") + (FilePath("Component.razor"), """ + @namespace My.Foo + """) ], newName: "DifferentName", expected: """ This is a Razor document. - - + + + + +
                  - - - + + + +
                  - - - + + + +
                  The end. """, - renames: [("Component.razor", "DifferentName.razor")]); + additionalExpectedFiles: + [(FileUri("Component.razor"), """ + @namespace My.DifferentName + """)]); [Fact] - public Task Component_Attribute() + public Task Component_CSharp_FullyQualified_Namespace() => VerifyRenamesAsync( input: $""" This is a Razor document. - + + + +
                  - - - + + + +
                  - - - + + + +
                  The end. + + @typeof(My.Fo$$o.Component).Name """, additionalFiles: [ (FilePath("Component.razor"), """ -
                  - - @code { - [Parameter] - public string Title { get; set; } - } - + @namespace My.Foo """) ], - newName: "Name", + newName: "DifferentName", expected: """ This is a Razor document. - - + + + + +
                  - - - + + + +
                  - - - + + + +
                  - - The end. - """, - additionalExpectedFiles: [ - (FileUri("Component.razor"), """ -
                  - @code { - [Parameter] - public string Name { get; set; } - } + The end. - """) - ]); + @typeof(My.DifferentName.Component).Name + """, + additionalExpectedFiles: + [(FileUri("Component.razor"), """ + @namespace My.DifferentName + """)]); - [Fact] - public Task Mvc() + [Theory] + [InlineData("My.Foo.$$Component")] + [InlineData("My.Foo.Com$$ponent")] + [InlineData("My.Foo.Component$$")] + public Task Component_StartTag_FullyQualified(string startTag) => VerifyRenamesAsync( - input: """ + input: $""" This is a Razor document. - + + + + + +
                  + <{startTag} /> + + + +
                  + + + + +
                  +
                  The end. """, additionalFiles: [ - (FilePath("Component.razor"), "") + (FilePath("Component.razor"), """ + @namespace My.Foo + """) ], newName: "DifferentName", - expected: "", - fileKind: RazorFileKind.Legacy); + expected: """ + This is a Razor document. - private async Task VerifyRenamesAsync( - string input, - string newName, + + + + + +
                  + + + + +
                  + + + + +
                  +
                  + + The end. + """, + additionalExpectedFiles: + [(FileUri("DifferentName.razor"), """ + @namespace My.Foo + """)]); + + [Theory] + [InlineData("$$Component")] + [InlineData("Com$$ponent")] + [InlineData("Component$$")] + public Task Component_EndTag(string endTag) + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + +
                  + + + +
                  + + + +
                  +
                  + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), "") + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + + +
                  + + + +
                  + + + +
                  +
                  + + The end. + """, + additionalExpectedFiles: + [(FileUri("DifferentName.razor"), "")]); + + [Fact] + public Task Component_Attribute() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + +
                  + + + +
                  + + + +
                  +
                  + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), """ +
                  + + @code { + [Parameter] + public string Title { get; set; } + } + + """) + ], + newName: "Name", + expected: """ + This is a Razor document. + + + +
                  + + + +
                  + + + +
                  +
                  + + The end. + """, + additionalExpectedFiles: [ + (FileUri("Component.razor"), """ +
                  + + @code { + [Parameter] + public string Name { get; set; } + } + + """) + ]); + + [Fact] + public Task Component_BindAttribute() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + +
                  + + + +
                  + + + +
                  +
                  + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), """ +
                  + + @code { + [Parameter] + public string Title { get; set; } + } + + """) + ], + newName: "Name", + expected: """ + This is a Razor document. + + + +
                  + + + +
                  + + + +
                  +
                  + + The end. + """, + additionalExpectedFiles: [ + (FileUri("Component.razor"), """ +
                  + + @code { + [Parameter] + public string Name { get; set; } + } + + """) + ]); + + [Fact] + public Task Mvc() + => VerifyRenamesAsync( + input: """ + This is a Razor document. + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), "") + ], + newName: "DifferentName", + expected: "", + fileKind: RazorFileKind.Legacy); + + [Fact] + public Task Component_WithContent() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + Hello + + Hello + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), "") + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + Hello + + Hello + + + The end. + """, + additionalExpectedFiles: + [(FileUri("DifferentName.razor"), "")]); + + [Fact] + public Task Component_WithContent_FullyQualified() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + Hello + + Hello + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), """ + @namespace My.Namespace + """) + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + Hello + + Hello + + + The end. + """, + additionalExpectedFiles: + [(FileUri("DifferentName.razor"), """ + @namespace My.Namespace + """)]); + + [Fact] + public Task Component_WithOtherFile() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), ""), + (FilePath("OtherComponent.razor"), """ + + + + + """) + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("DifferentName.razor"), ""), + (FileUri("OtherComponent.razor"), """ + + + + + """) + ]); + + [Fact] + public Task Component_FullyQualified() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), """ + @namespace My.Namespace + """) + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: + [(FileUri("DifferentName.razor"), """ + @namespace My.Namespace + """)]); + + [Fact] + public Task Component_WithOtherFile_FullyQualified() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), """ + @namespace My.Namespace + """), + (FilePath("OtherComponent.razor"), """ + + + + + """) + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("DifferentName.razor"), """ + @namespace My.Namespace + """), + (FileUri("OtherComponent.razor"), """ + + + + + """) + ]); + + [Fact] + public Task Component_OwnFile() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + newName: "ABetterName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + newFileUri: FileUri("ABetterName.razor")); + + [Fact] + public Task Component_WithOtherFile_OwnFile() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor"), """ + + + + + """), + (FilePath("OtherComponent.razor"), """ + + + + + """) + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("DifferentName.razor"), """ + + + + + """), + (FileUri("OtherComponent.razor"), """ + + + + + """) + ]); + + [Fact] + public Task Component_WithNonRazorCSharpFile() + => VerifyRenamesAsync( + input: $""" + @using My.Fancy.Namespace + + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.cs"), """ + using Microsoft.AspNetCore.Components; + + namespace My.Fancy.Namespace; + + public class Component : ComponentBase + { + } + """), + (FilePath("OtherComponent.razor"), """ + @using My.Fancy.Namespace + + + + + + """) + ], + newName: "DifferentName", + expected: """ + @using My.Fancy.Namespace + + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("Component.cs"), """ + using Microsoft.AspNetCore.Components; + + namespace My.Fancy.Namespace; + + public class DifferentName : ComponentBase + { + } + """), + (FileUri("OtherComponent.razor"), """ + @using My.Fancy.Namespace + + + + + + """) + ]); + + [Fact] + public Task Component_WithNonRazorCSharpFile_FullyQualifiedAndNon() + => VerifyRenamesAsync( + input: $""" + @using My.Product + + This is a Razor document. + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.cs"), """ + using Microsoft.AspNetCore.Components; + + namespace My.Product; + + public class Component : ComponentBase + { + } + """), + (FilePath("OtherComponent.razor"), """ + @using My.Product + + + + """) + ], + newName: "DifferentName", + expected: """ + @using My.Product + + This is a Razor document. + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("Component.cs"), """ + using Microsoft.AspNetCore.Components; + + namespace My.Product; + + public class DifferentName : ComponentBase + { + } + """), + (FileUri("OtherComponent.razor"), """ + @using My.Product + + + + """) + ]); + + [Fact] + public Task Component_WithNonRazorCSharpFile_GlobalNamespace() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.cs"), """ + using Microsoft.AspNetCore.Components; + + public class Component : ComponentBase + { + } + """), + (FilePath("OtherComponent.razor"), """ + + + + + """) + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("Component.cs"), """ + using Microsoft.AspNetCore.Components; + + public class DifferentName : ComponentBase + { + } + """), + (FileUri("OtherComponent.razor"), """ + + + + + """) + ]); + + [Fact] + public Task Component_Namespace_WithNonRazorCSharpFile() + => VerifyRenamesAsync( + input: $""" + @using My.Fancy.Namespace + + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.cs"), """ + using Microsoft.AspNetCore.Components; + + namespace My.Fancy.Namespace; + + public class Component : ComponentBase + { + } + """), + (FilePath("OtherComponent.razor"), """ + @using My.Fancy.Namespace + + + + + + """) + ], + newName: "DifferentName", + expected: """ + @using My.DifferentName.Namespace + + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("Component.cs"), """ + using Microsoft.AspNetCore.Components; + + namespace My.DifferentName.Namespace; + + public class Component : ComponentBase + { + } + """), + (FileUri("OtherComponent.razor"), """ + @using My.DifferentName.Namespace + + + + + + """) + ]); + + [Fact] + public Task Component_OwnFile_WithCss() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("File1.razor.css"), "") + ], + newName: "ABetterName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + newFileUri: FileUri("ABetterName.razor"), + additionalExpectedFiles: [ + (FileUri("ABetterName.razor.css"), "")]); + + [Fact] + public Task Component_OwnFile_WithCodeBehind() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("File1.razor.cs"), """ + namespace SomeProject; + + public partial class File1 + { + } + """) + ], + newName: "ABetterName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + newFileUri: FileUri("ABetterName.razor"), + additionalExpectedFiles: [ + (FileUri("ABetterName.razor.cs"), """ + namespace SomeProject; + + public partial class ABetterName + { + } + """)]); + + [Fact] + public Task Component_WithOtherFile_WithCss() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor.css"), ""), + (FilePath("Component.razor"), """ + + + + + """) + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("DifferentName.razor.css"), ""), + (FileUri("DifferentName.razor"), """ + + + + + """), + ]); + + [Fact] + public Task Component_WithOtherFile_WithCodeBehindAndCss() + => VerifyRenamesAsync( + input: $""" + This is a Razor document. + + + + + + + The end. + """, + additionalFiles: [ + (FilePath("Component.razor.css"), ""), + (FilePath("Component.razor.cs"), """ + namespace SomeProject; + + public partial class Component + { + } + """), + (FilePath("Component.razor"), """ + + + + + """) + ], + newName: "DifferentName", + expected: """ + This is a Razor document. + + + + + + + The end. + """, + additionalExpectedFiles: [ + (FileUri("DifferentName.razor.css"), ""), + (FileUri("DifferentName.razor.cs"), """ + namespace SomeProject; + + public partial class DifferentName + { + } + """), + (FileUri("DifferentName.razor"), """ + + + + + """), + ]); + + private async Task VerifyRenamesAsync( + string input, + string newName, string expected, RazorFileKind? fileKind = null, + Uri? newFileUri = null, (string fileName, string contents)[]? additionalFiles = null, - (string oldName, string newName)[]? renames = null, (Uri fileUri, string contents)[]? additionalExpectedFiles = null) { TestFileMarkupParser.GetPosition(input, out var source, out var cursorPosition); @@ -247,6 +1473,9 @@ private async Task VerifyRenamesAsync( var requestInvoker = new TestHtmlRequestInvoker([(Methods.TextDocumentRenameName, (object?)null)]); + var fileSystem = (RemoteFileSystem)OOPExportProvider.GetExportedValue(); + fileSystem.GetTestAccessor().SetFileSystem(new TestFileSystem(additionalFiles)); + var endpoint = new CohostRenameEndpoint(IncompatibleProjectService, RemoteServiceInvoker, requestInvoker); var renameParams = new RenameParams @@ -260,64 +1489,14 @@ private async Task VerifyRenamesAsync( if (expected.Length == 0) { - Assert.True(renames is null or []); Assert.Null(result); return; } Assert.NotNull(result); - if (result.DocumentChanges.AssumeNotNull().TryGetSecond(out var changes)) - { - Assert.NotNull(renames); - - foreach (var change in changes) - { - if (change.TryGetThird(out var renameEdit)) - { - Assert.Contains(renames, - r => renameEdit.OldDocumentUri.GetRequiredParsedUri().GetDocumentFilePath().EndsWith(r.oldName) && - renameEdit.NewDocumentUri.GetRequiredParsedUri().GetDocumentFilePath().EndsWith(r.newName)); - } - } - } - - await ProcessRazorDocumentEditsAsync(inputText, expected, document, additionalExpectedFiles, result, DisposalToken).ConfigureAwait(false); - - } - - private static async Task ProcessRazorDocumentEditsAsync(SourceText inputText, string expected, TextDocument razorDocument, (Uri fileUri, string contents)[]? additionalExpectedFiles, WorkspaceEdit result, CancellationToken cancellationToken) - { - var razorDocumentUri = razorDocument.CreateUri(); - var solution = razorDocument.Project.Solution; - - Assert.True(result.TryGetTextDocumentEdits(out var textDocumentEdits)); - foreach (var textDocumentEdit in textDocumentEdits) - { - if (textDocumentEdit.TextDocument.DocumentUri.GetRequiredParsedUri() == razorDocumentUri) - { - foreach (var edit in textDocumentEdit.Edits) - { - inputText = inputText.WithChanges(inputText.GetTextChange((TextEdit)edit)); - } - } - else if (additionalExpectedFiles is not null) - { - foreach (var (uri, contents) in additionalExpectedFiles) - { - var additionalDocument = solution.GetTextDocuments(uri).First(); - var text = await additionalDocument.GetTextAsync(cancellationToken).ConfigureAwait(false); - - foreach (var edit in textDocumentEdit.Edits) - { - text = text.WithChanges(text.GetTextChange((TextEdit)edit)); - } - - AssertEx.EqualOrDiff(contents, text.ToString()); - } - } - } - - AssertEx.EqualOrDiff(expected, inputText.ToString()); + var documentUri = newFileUri ?? document.CreateUri(); + var expectedChanges = (additionalExpectedFiles ?? []).Concat([(documentUri, expected)]); + await result.AssertWorkspaceEditAsync(document.Project.Solution, expectedChanges, DisposalToken); } } diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostSemanticTokensRangeEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostSemanticTokensRangeEndpointTest.cs index 73b37005b22..b17fe22f4db 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostSemanticTokensRangeEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostSemanticTokensRangeEndpointTest.cs @@ -30,6 +30,11 @@ public async Task RazorComponents(bool colorBackground, bool miscellaneousFile) + + @typeof(InputText).ToString() @typeof(Microsoft.AspNetCore.Components.Forms.InputText).ToString() """; @@ -136,14 +141,245 @@ public void M() await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile, fileKind: RazorFileKind.Legacy); } + [Theory] + [CombinatorialData] + public async Task RenderMode(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + + + + @{ + var r = Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveAuto; + } + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task RenderMode_Razor9(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer + + + + @{ + var r = Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveAuto; + } + """; + + await VerifySemanticTokensAsync( + input, + colorBackground, + miscellaneousFile, + projectConfigure: p => p.RazorLanguageVersion = RazorLanguageVersion.Version_9_0); + } + + [Theory] + [CombinatorialData] + public async Task RenderMode_Expression(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @rendermode @(Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer) + + + + @{ + var r = Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveAuto; + } + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task RenderFragment(bool colorBackground, bool miscellaneousFile) + { + var input = """ +
                  This is some HTML
                  + @code + { + public void M() + { + RenderFragment x = @
                  This is some HTML
                  ; + } + } + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task Expressions(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @DateTime.Now + + @("hello" + "\\n" + "world" + Environment.NewLine + "how are you?") + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + + [Theory] + [CombinatorialData] + public async Task GetSemanticTokens_Razor_NestedTextDirectives(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @using System + @functions { + private void BidsByShipment(string generatedId, int bids) + { + if (bids > 0) + { + + @if(bids > 0) + { + @DateTime.Now + } + + } + } + } + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task GetSemanticTokens_Razor_NestedTransitions(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @using System + @code { + Action abc = @; + } + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task GetSemanticTokens_Razor_CommentAsync(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @* A comment *@ + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task GetSemanticTokens_Razor_MultiLineCommentMidlineAsync(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @* kdl + skd + slf*@ + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task GetSemanticTokens_Razor_MultiLineCommentWithBlankLines(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @* kdl + + skd + + sdfasdfasdf + slf*@ + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + [WorkItem("https://github.com/dotnet/razor/issues/8176")] + public async Task GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF(bool colorBackground, bool miscellaneousFile) + { + var input = "@* kdl\n\nskd\n \n sdfasdfasdf\nslf*@"; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task GetSemanticTokens_Razor_MultiLineCommentAsync(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @*stuff + things *@ + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task GetSemanticTokens_CSharp_Static(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @using System + @code + { + private static bool _isStatic; + + public void M() + { + if (_isStatic) + { + } + } + } + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile); + } + + [Theory] + [CombinatorialData] + public async Task GetSemanticTokens_Legacy_Model(bool colorBackground, bool miscellaneousFile) + { + var input = """ + @using System + @model SampleApp.Pages.ErrorModel + +
                  + + @{ + @Model.ToString(); + } + +
                  + """; + + await VerifySemanticTokensAsync(input, colorBackground, miscellaneousFile, fileKind: RazorFileKind.Legacy); + } + private async Task VerifySemanticTokensAsync( string input, bool colorBackground, bool miscellaneousFile, RazorFileKind? fileKind = null, + Action? projectConfigure = null, [CallerMemberName] string? testName = null) { - var document = CreateProjectAndRazorDocument(input, fileKind, miscellaneousFile: miscellaneousFile); + var document = CreateProjectAndRazorDocument(input, fileKind, miscellaneousFile: miscellaneousFile, projectConfigure: projectConfigure); var sourceText = await document.GetTextAsync(DisposalToken); // We need to manually initialize the OOP service so we can get semantic token info later @@ -177,7 +413,7 @@ private async Task VerifySemanticTokensAsync( testName += "_misc_file"; } - var baselineFileName = $@"TestFiles\SemanticTokens\{testName}.txt"; + var baselineFileName = Path.Combine("TestFiles", "SemanticTokens", $"{testName}.txt"); if (GenerateBaselines.ShouldGenerate) { WriteBaselineFile(actualFileContents, baselineFileName); diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/ComputedTargetPathTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/ComputedTargetPathTest.cs index ac4c0b17878..1d943b97324 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/ComputedTargetPathTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/ComputedTargetPathTest.cs @@ -1,11 +1,13 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.AspNetCore.Razor.Utilities; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.Text; using Microsoft.VisualStudio.Razor.LanguageClient.Cohost; using Xunit; @@ -17,8 +19,39 @@ public class ComputedTargetPathTest(ITestOutputHelper testOutputHelper) : Cohost { // What the source generator would produce for TestProjectData.SomeProjectPath private static readonly string s_hintNamePrefix = PlatformInformation.IsWindows - ? "c__users_example_src_SomeProject" - : "_home_example_SomeProject"; + ? "c_/users/example/src/SomeProject" + : "_home/example/SomeProject"; + + [Fact] + public async Task DoubleSlashInUri() + { + // Directly from a real VS Code agent session: https://github.com/dotnet/razor/issues/12595 + var uriString = "chat-editing-snapshot-text-model:/d:/HashR/src/HashR/Pages/LibraryUsage.razor?%7B%22session%22:%7B%22$mid%22:1,%22external%22:%22vscode-chat-session://local/MzczZWU3N2YtZTBmOS00ZWRhLThmYTktZWI0MjM3ZDE2NTIw%22,%22path%22:%22/MzczZWU3N2YtZTBmOS00ZWRhLThmYTktZWI0MjM3ZDE2NTIw%22,%22scheme%22:%22vscode-chat-session%22,%22authority%22:%22local%22%7D,%22requestId%22:%22request_8e668a63-5ac8-43fe-ad18-65e38621cce4%22,%22undoStop%22:%22__epoch_9007199254740991%22%7D."; + + var uri = new Uri(uriString); + // This calls the same method that Roslyn calls when creating a misc file for unknown documents + var documentFilePath = RazorUri.GetDocumentFilePathFromUri(uri); + + var builder = new RazorProjectBuilder + { + ProjectFilePath = null, + GenerateGlobalConfigFile = false, + GenerateAdditionalDocumentMetadata = false, + GenerateMSBuildProjectDirectory = false + }; + + var id = builder.AddAdditionalDocument(documentFilePath, SourceText.From("
                  ")); + + var solution = LocalWorkspace.CurrentSolution; + solution = builder.Build(solution); + + var document = solution.GetAdditionalDocument(id).AssumeNotNull(); + + _ = await document.Project.GetCompilationAsync(DisposalToken); + + var generatedDocument = await document.Project.TryGetSourceGeneratedDocumentForRazorDocumentAsync(document, DisposalToken); + Assert.NotNull(generatedDocument); + } [Theory] [InlineData(true, false)] @@ -45,14 +78,14 @@ public async Task SingleDocument(bool projectPath, bool generateConfigFile) var generatedDocument = await document.Project.TryGetSourceGeneratedDocumentForRazorDocumentAsync(document, DisposalToken); Assert.NotNull(generatedDocument); - Assert.Equal($"{s_hintNamePrefix}_File1_razor.g.cs", generatedDocument.HintName); + Assert.Equal($"{s_hintNamePrefix}/File1_razor.g.cs", generatedDocument.HintName); } [Theory] [CombinatorialData] public async Task TwoDocumentsWithTheSameBaseFileName(bool generateTargetPath) { - // This test just proves the "correct" behaviour, with the Razor SDL + // This test just proves the "correct" behaviour, with the Razor SDK var builder = new RazorProjectBuilder { ProjectFilePath = TestProjectData.SomeProject.FilePath, @@ -70,11 +103,11 @@ public async Task TwoDocumentsWithTheSameBaseFileName(bool generateTargetPath) var generatedDocument = await doc1.Project.TryGetSourceGeneratedDocumentForRazorDocumentAsync(doc1, DisposalToken); Assert.NotNull(generatedDocument); - Assert.Equal($"Pages_Index_razor.g.cs", generatedDocument.HintName); + Assert.Equal($"Pages/Index_razor.g.cs", generatedDocument.HintName); generatedDocument = await doc2.Project.TryGetSourceGeneratedDocumentForRazorDocumentAsync(doc2, DisposalToken); Assert.NotNull(generatedDocument); - Assert.Equal($"Components_Index_razor.g.cs", generatedDocument.HintName); + Assert.Equal($"Components/Index_razor.g.cs", generatedDocument.HintName); } [Theory] @@ -102,10 +135,42 @@ public async Task TwoDocumentsWithTheSameBaseFileName_FullPathHintName(bool proj var generatedDocument = await doc1.Project.TryGetSourceGeneratedDocumentForRazorDocumentAsync(doc1, DisposalToken); Assert.NotNull(generatedDocument); - Assert.Equal($"{s_hintNamePrefix}_Pages_Index_razor.g.cs", generatedDocument.HintName); + Assert.Equal($"{s_hintNamePrefix}/Pages/Index_razor.g.cs", generatedDocument.HintName); + + generatedDocument = await doc2.Project.TryGetSourceGeneratedDocumentForRazorDocumentAsync(doc2, DisposalToken); + Assert.NotNull(generatedDocument); + Assert.Equal($"{s_hintNamePrefix}/Components/Index_razor.g.cs", generatedDocument.HintName); + } + + [Theory] + [InlineData(true, false)] + [InlineData(true, true)] + [InlineData(false, false)] + public async Task TwoDocumentsWithTheSameBaseHintName(bool projectPath, bool generateConfigFile) + { + var builder = new RazorProjectBuilder + { + ProjectFilePath = projectPath ? TestProjectData.SomeProject.FilePath : null, + GenerateGlobalConfigFile = generateConfigFile, + GenerateAdditionalDocumentMetadata = false, + GenerateMSBuildProjectDirectory = false + }; + + var doc1Id = builder.AddAdditionalDocument(FilePath(@"Pages\Index.razor"), SourceText.From("")); + var doc2Id = builder.AddAdditionalDocument(FilePath(@"Pages_Index.razor"), SourceText.From("")); + + var solution = LocalWorkspace.CurrentSolution; + solution = builder.Build(solution); + + var doc1 = solution.GetAdditionalDocument(doc1Id).AssumeNotNull(); + var doc2 = solution.GetAdditionalDocument(doc2Id).AssumeNotNull(); + + var generatedDocument = await doc1.Project.TryGetSourceGeneratedDocumentForRazorDocumentAsync(doc1, DisposalToken); + Assert.NotNull(generatedDocument); + Assert.Equal($"{s_hintNamePrefix}/Pages/Index_razor.g.cs", generatedDocument.HintName); generatedDocument = await doc2.Project.TryGetSourceGeneratedDocumentForRazorDocumentAsync(doc2, DisposalToken); Assert.NotNull(generatedDocument); - Assert.Equal($"{s_hintNamePrefix}_Components_Index_razor.g.cs", generatedDocument.HintName); + Assert.Equal($"{s_hintNamePrefix}/Pages_Index_razor.g.cs", generatedDocument.HintName); } } diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/HoverAssertions.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/HoverAssertions.cs index ad7ba56516d..cb9a62ed9b6 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/HoverAssertions.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/HoverAssertions.cs @@ -3,7 +3,6 @@ using System.Collections.Immutable; using Roslyn.Test.Utilities; -using Xunit; namespace Microsoft.VisualStudio.Razor.LanguageClient.Cohost; @@ -12,7 +11,7 @@ internal static class HoverAssertions public static void VerifyContents(this LspHover hover, object expected) { var markup = hover.Contents.Fourth; - Assert.Equal(MarkupKind.PlainText, markup.Kind); + AssertEx.EqualOrDiff(expected.ToString(), markup.Value.TrimEnd('\r', '\n')); } @@ -55,4 +54,7 @@ public static string Type(string text) public static string WhiteSpace(string text) => text; + + public static string HorizontalRule + => "\n\n---\n\n"; } diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/MEFCompositionTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/MEFCompositionTest.cs index b8bc4751771..dcf33b568e3 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/MEFCompositionTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/MEFCompositionTest.cs @@ -4,6 +4,7 @@ using System.Linq; using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.AspNetCore.Razor.Test.Common.Mef; +using Microsoft.VisualStudioCode.RazorExtension.Services; using Roslyn.Test.Utilities; using Xunit; using Xunit.Abstractions; @@ -16,7 +17,7 @@ public class MEFCompositionTest(ITestOutputHelper testOutputHelper) : ToolingTes public void Composes() { var testComposition = TestComposition.RoslynFeatures - .AddAssemblies(typeof(RazorVSCodeEndpoint).Assembly); + .AddAssemblies(typeof(VSCodeLanguageServerFeatureOptions).Assembly); var errors = testComposition.GetCompositionErrors().Order().ToArray(); @@ -27,12 +28,6 @@ public void Composes() Contract name: Microsoft.CodeAnalysis.ExternalAccess.Pythia.Api.IPythiaSignatureHelpProviderImplementation TypeIdentityName: Microsoft.CodeAnalysis.ExternalAccess.Pythia.Api.IPythiaSignatureHelpProviderImplementation but found 0. - """, e), - e => AssertEx.AssertEqualToleratingWhitespaceDifferences(""" - Microsoft.VisualStudioCode.RazorExtension.Services.WorkspaceService.ctor(loggerFactory): expected exactly 1 export matching constraints: - Contract name: Microsoft.Extensions.Logging.ILoggerFactory - TypeIdentityName: Microsoft.Extensions.Logging.ILoggerFactory - but found 0. """, e)); ; } diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/RazorProjectInfoFactoryTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/RazorProjectInfoFactoryTest.cs deleted file mode 100644 index 0d8b13f3379..00000000000 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/RazorProjectInfoFactoryTest.cs +++ /dev/null @@ -1,93 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.AspNetCore.Razor.Test.Common; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Host.Mef; -using Microsoft.CodeAnalysis.Razor.Utilities; -using Microsoft.CodeAnalysis.Text; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.VisualStudioCode.RazorExtension.Test; - -public class RazorProjectInfoFactoryTest(ITestOutputHelper testOutputHelper) : ToolingTestBase(testOutputHelper) -{ - [Fact] - public void GeneratedDocument() - { - using var workspace = new AdhocWorkspace(MefHostServices.DefaultHost); - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - project = workspace.AddDocument(project.Id, "Goo.cshtml__virtual.cs", SourceText.From("Hi there")) - .WithFilePath("virtualcsharp-razor:///e:/Scratch/RazorInConsole/Goo.cshtml__virtual.cs") - .Project; - - var documents = RazorProjectInfoFactory.GetDocuments(project, "temp"); - - Assert.Single(documents); - } - - [Fact] - public void AdditionalDocument() - { - using var workspace = new AdhocWorkspace(MefHostServices.DefaultHost); - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - workspace.TryApplyChanges(project.AddAdditionalDocument("Goo.cshtml", SourceText.From("Hi there"), filePath: @"\E:\Scratch\RazorInConsole\Goo.cshtml").Project.Solution); - - project = workspace.CurrentSolution.GetProject(project.Id)!; - - var documents = RazorProjectInfoFactory.GetDocuments(project, "temp"); - - Assert.Single(documents); - } - - [Fact] - public void AdditionalAndGeneratedDocument() - { - using var workspace = new AdhocWorkspace(MefHostServices.DefaultHost); - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - workspace.TryApplyChanges(project.AddAdditionalDocument("Goo.cshtml", SourceText.From("Hi there"), filePath: @"\E:\Scratch\RazorInConsole\Goo.cshtml").Project.Solution); - - project = workspace.CurrentSolution.GetProject(project.Id)!; - - project = workspace.AddDocument(project.Id, "Another.cshtml__virtual.cs", SourceText.From("Hi there")) - .WithFilePath("virtualcsharp-razor:///e:/Scratch/RazorInConsole/Another.cshtml__virtual.cs") - .Project; - - var documents = RazorProjectInfoFactory.GetDocuments(project, "temp"); - - Assert.Single(documents); - } - - [Fact] - public void AdditionalNonRazorAndGeneratedDocument() - { - using var workspace = new AdhocWorkspace(MefHostServices.DefaultHost); - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - workspace.TryApplyChanges(project.AddAdditionalDocument("Goo.txt", SourceText.From("Hi there"), filePath: @"\E:\Scratch\RazorInConsole\Goo.txt").Project.Solution); - - project = workspace.CurrentSolution.GetProject(project.Id)!; - - project = workspace.AddDocument(project.Id, "Another.cshtml__virtual.cs", SourceText.From("Hi there")) - .WithFilePath("virtualcsharp-razor:///e:/Scratch/RazorInConsole/Another.cshtml__virtual.cs") - .Project; - - var documents = RazorProjectInfoFactory.GetDocuments(project, "temp"); - - Assert.Single(documents); - } - - [Fact] - public void NormalDocument() - { - using var workspace = new AdhocWorkspace(MefHostServices.DefaultHost); - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - project = workspace.AddDocument(project.Id, "Goo.cs", SourceText.From("Hi there")) - .WithFilePath("e:/Scratch/RazorInConsole/Goo.cs") - .Project; - - var documents = RazorProjectInfoFactory.GetDocuments(project, "temp"); - - Assert.Empty(documents); - } -} diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/RazorWorkspaceListenerTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/RazorWorkspaceListenerTest.cs deleted file mode 100644 index 9f68a0bd451..00000000000 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/RazorWorkspaceListenerTest.cs +++ /dev/null @@ -1,341 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Concurrent; -using System.Collections.Immutable; -using System.IO; -using System.IO.Pipelines; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor; -using Microsoft.AspNetCore.Razor.Test.Common; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Razor.Utilities; -using Microsoft.CodeAnalysis.Text; -using Microsoft.Extensions.Logging.Abstractions; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.VisualStudioCode.RazorExtension.Test; - -public class RazorWorkspaceListenerTest(ITestOutputHelper testOutputHelper) : ToolingTestBase(testOutputHelper) -{ - [Fact] - public async Task ProjectAdded_SchedulesTask() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - listener.EnsureInitialized(workspace); - - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - listener.NotifyDynamicFile(project.Id); - - await listener.WaitForDebounceAsync(); - - Assert.Equal(1, listener.SerializeCalls[project.Id]); - } - - [Fact] - public async Task TwoProjectsAdded_OneWithDynamicFiles_SchedulesOneTask() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - listener.EnsureInitialized(workspace); - - var project1 = workspace.AddProject("TestProject1", LanguageNames.CSharp); - - var project2 = workspace.AddProject("TestProject2", LanguageNames.CSharp); - listener.NotifyDynamicFile(project2.Id); - - await listener.WaitForDebounceAsync(); - - // These are different projects, so should cause two calls - Assert.False(listener.SerializeCalls.ContainsKey(project1.Id)); - Assert.Equal(1, listener.SerializeCalls[project2.Id]); - } - - [ConditionalFact(Is.Windows)] - public async Task TwoProjectsAdded_SchedulesTwoTasks() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - listener.EnsureInitialized(workspace); - - var project1 = workspace.AddProject("TestProject1", LanguageNames.CSharp); - listener.NotifyDynamicFile(project1.Id); - - await listener.WaitForDebounceAsync(); - - var project2 = workspace.AddProject("TestProject2", LanguageNames.CSharp); - listener.NotifyDynamicFile(project2.Id); - - await listener.WaitForDebounceAsync(); - - // These are different projects, so should cause two calls - Assert.Equal(1, listener.SerializeCalls[project1.Id]); - Assert.Equal(1, listener.SerializeCalls[project2.Id]); - } - - [ConditionalFact(Is.Windows)] - public async Task ProjectAddedAndRemoved_NoTasks() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - listener.EnsureInitialized(workspace); - - // IntermediateOutput information is needed for project removal to be communicated properly - var projectInfo = ProjectInfo.Create( - ProjectId.CreateNewId(), - VersionStamp.Create(), - "TestProject", - "TestProject", - LanguageNames.CSharp); - - projectInfo = projectInfo.WithCompilationOutputInfo(projectInfo.CompilationOutputInfo.WithAssemblyPath(@"C:\test\out\test.dll")); - projectInfo = projectInfo.WithFilePath(@"C:\test\test.csproj"); - - var project = workspace.AddProject(projectInfo); - listener.NotifyDynamicFile(project.Id); - await listener.WaitForDebounceAsync(); - Assert.Single(listener.SerializeCalls); - - var newSolution = project.Solution.RemoveProject(project.Id); - Assert.True(workspace.TryApplyChanges(newSolution)); - - await listener.WaitForDebounceAsync(); - Assert.Single(listener.RemoveCalls); - } - - [Fact] - public async Task TwoProjectChanges_SchedulesOneTask() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - listener.EnsureInitialized(workspace); - - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - listener.NotifyDynamicFile(project.Id); - - var newSolution = project.Solution.WithProjectDefaultNamespace(project.Id, "NewDefaultNamespace"); - Assert.True(workspace.TryApplyChanges(newSolution)); - - await listener.WaitForDebounceAsync(); - - Assert.Equal(1, listener.SerializeCalls[project.Id]); - } - - [Fact] - public async Task DocumentAdded_NoDynamicFiles_NoTasks() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - listener.EnsureInitialized(workspace); - - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - - workspace.AddDocument(project.Id, "Document", SourceText.From("Hi there")); - - // We can't wait for debounce here, because it won't happen, but if we don't wait for _something_ we won't know - // if the test fails, so a delay is annoyingly necessary. - await Task.Delay(500); - - Assert.Empty(listener.SerializeCalls); - } - - [Fact] - public async Task DocumentAdded_SchedulesTask() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - listener.EnsureInitialized(workspace); - - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - listener.NotifyDynamicFile(project.Id); - - workspace.AddDocument(project.Id, "Document", SourceText.From("Hi there")); - - await listener.WaitForDebounceAsync(); - - Assert.Equal(1, listener.SerializeCalls[project.Id]); - } - - [ConditionalFact(Is.Windows)] - public async Task DocumentAdded_WithDelay_SchedulesTwoTasks() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - listener.EnsureInitialized(workspace); - - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - listener.NotifyDynamicFile(project.Id); - - await listener.WaitForDebounceAsync(); - - workspace.AddDocument(project.Id, "Document", SourceText.From("Hi there")); - - await listener.WaitForDebounceAsync(); - - Assert.Equal(2, listener.SerializeCalls[project.Id]); - } - - [Fact] - public async Task ProjectAddedAndRemoved_DeferredInitialization_NoTasks() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - using var listener = new TestRazorWorkspaceListener(); - - var project = workspace.AddProject("TestProject", LanguageNames.CSharp); - - var newSolution = project.Solution.RemoveProject(project.Id); - Assert.True(workspace.TryApplyChanges(newSolution)); - - // Initialize everything now, in a deferred manner - listener.EnsureInitialized(workspace); - listener.NotifyDynamicFile(project.Id); - - // We can't wait for debounce here, because it won't happen, but if we don't wait for _something_ we won't know - // if the test fails, so a delay is annoyingly necessary. - await Task.Delay(500); - - Assert.Empty(listener.SerializeCalls); - } - - [ConditionalFact(Is.Windows)] - public async Task TestSerialization() - { - using var workspace = new AdhocWorkspace(CodeAnalysis.Host.Mef.MefHostServices.DefaultHost); - - var pipe = new Pipe(); - using var readerStream = pipe.Reader.AsStream(); - using var listener = new StreamBasedListener(workspace, pipe.Writer.AsStream()); - - var projectInfo = ProjectInfo.Create( - ProjectId.CreateNewId(), - VersionStamp.Create(), - "TestProject", - "TestProject", - LanguageNames.CSharp); - - projectInfo = projectInfo.WithCompilationOutputInfo(projectInfo.CompilationOutputInfo.WithAssemblyPath(@"C:\test\out\test.dll")); - projectInfo = projectInfo.WithFilePath(@"C:\test\test.csproj"); - projectInfo = projectInfo.WithAdditionalDocuments([DocumentInfo.Create(DocumentId.CreateNewId(projectInfo.Id), @"Page.razor", filePath: @"C:\test\Page.razor")]); - - var intermediateDirectory = Path.GetDirectoryName(projectInfo.CompilationOutputInfo.AssemblyPath); - - // Test update action - var project = workspace.AddProject(projectInfo); - listener.NotifyDynamicFile(project.Id); - - var action = readerStream.ReadProjectInfoAction(); - Assert.Equal(RazorProjectInfoAction.Update, action); - - var deserializedProjectInfo = await readerStream.ReadProjectInfoAsync(DisposalToken); - Assert.NotNull(deserializedProjectInfo); - Assert.Single(deserializedProjectInfo.Documents); - Assert.Equal("TestProject", deserializedProjectInfo.DisplayName); - Assert.Equal("ASP", deserializedProjectInfo.RootNamespace); - Assert.Equal(@"C:/test/out/", deserializedProjectInfo.ProjectKey.Id); - Assert.Equal(@"C:\test\test.csproj", deserializedProjectInfo.FilePath); - - // Test remove action - var newSolution = project.Solution.RemoveProject(project.Id); - Assert.True(workspace.TryApplyChanges(newSolution)); - - action = readerStream.ReadProjectInfoAction(); - Assert.Equal(RazorProjectInfoAction.Remove, action); - - Assert.Equal(intermediateDirectory, await readerStream.ReadProjectInfoRemovalAsync(DisposalToken)); - } - - private class TestRazorWorkspaceListener : RazorWorkspaceListenerBase - { - private ConcurrentDictionary _serializeCalls = new(); - private ConcurrentDictionary _removeCalls = new(); - - private TaskCompletionSource _completionSource = new(); - - public ConcurrentDictionary SerializeCalls => _serializeCalls; - public ConcurrentDictionary RemoveCalls => _removeCalls; - - public TestRazorWorkspaceListener() - : base(NullLoggerFactory.Instance.CreateLogger("")) - { - } - - public void EnsureInitialized(Workspace workspace) - { - EnsureInitialized(workspace, static () => Stream.Null); - } - - private protected override ValueTask ProcessWorkAsync(ImmutableArray work, CancellationToken cancellationToken) - { - foreach (var unit in work) - { - cancellationToken.ThrowIfCancellationRequested(); - - if (unit is UpdateWork updateWork) - { - UpdateProject(updateWork.ProjectId); - } - - if (unit is RemovalWork removeWork) - { - RemoveProject(removeWork.ProjectId); - } - } - - return ValueTask.CompletedTask; - } - - private void RemoveProject(ProjectId projectId) - { - _removeCalls.AddOrUpdate(projectId, 1, (id, curr) => curr + 1); - - _completionSource.TrySetResult(); - _completionSource = new(); - } - - private void UpdateProject(ProjectId projectId) - { - _serializeCalls.AddOrUpdate(projectId, 1, (id, curr) => curr + 1); - - _completionSource.TrySetResult(); - _completionSource = new(); - } - - internal async Task WaitForDebounceAsync() - { - await _completionSource.Task.WaitAsync(TimeSpan.FromSeconds(20)); - _completionSource = new(); - } - - private protected override Task CheckConnectionAsync(Stream stream, CancellationToken cancellationToken) - { - return Task.CompletedTask; - } - } - - private sealed class StreamBasedListener : RazorWorkspaceListenerBase - { - public StreamBasedListener(Workspace workspace, Stream stream) - : base(NullLoggerFactory.Instance.CreateLogger("")) - { - EnsureInitialized(workspace, () => stream); - } - - private protected override Task CheckConnectionAsync(Stream stream, CancellationToken cancellationToken) - { - return Task.CompletedTask; - } - } -} diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions.txt new file mode 100644 index 00000000000..0b6a278fa0a --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions.txt @@ -0,0 +1,21 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 8 struct [] [DateTime] +0 8 1 operator [] [.] +0 1 3 property [static] [Now] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [(] +0 1 7 string [] ["hello"] +0 8 1 operator [] [+] +0 2 1 string [] ["] +0 1 2 stringEscapeCharacter [] [\\] +0 2 2 string [] [n"] +0 3 1 operator [] [+] +0 2 7 string [] ["world"] +0 8 1 operator [] [+] +0 2 11 class [static] [Environment] +0 11 1 operator [] [.] +0 1 7 property [static] [NewLine] +0 8 1 operator [] [+] +0 2 14 string [] ["how are you?"] +0 14 1 razorTransition [] [)] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_misc_file.txt new file mode 100644 index 00000000000..0b6a278fa0a --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_misc_file.txt @@ -0,0 +1,21 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 8 struct [] [DateTime] +0 8 1 operator [] [.] +0 1 3 property [static] [Now] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [(] +0 1 7 string [] ["hello"] +0 8 1 operator [] [+] +0 2 1 string [] ["] +0 1 2 stringEscapeCharacter [] [\\] +0 2 2 string [] [n"] +0 3 1 operator [] [+] +0 2 7 string [] ["world"] +0 8 1 operator [] [+] +0 2 11 class [static] [Environment] +0 11 1 operator [] [.] +0 1 7 property [static] [NewLine] +0 8 1 operator [] [+] +0 2 14 string [] ["how are you?"] +0 14 1 razorTransition [] [)] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_with_background.txt new file mode 100644 index 00000000000..4fad6e6ce06 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_with_background.txt @@ -0,0 +1,29 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [razorCode] [@] +0 1 8 struct [razorCode] [DateTime] +0 8 1 operator [razorCode] [.] +0 1 3 property [static, razorCode] [Now] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [(] +0 1 7 string [razorCode] ["hello"] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [+] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 string [razorCode] ["] +0 1 2 stringEscapeCharacter [razorCode] [\\] +0 2 2 string [razorCode] [n"] +0 2 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [+] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 7 string [razorCode] ["world"] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [+] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 11 class [static, razorCode] [Environment] +0 11 1 operator [razorCode] [.] +0 1 7 property [static, razorCode] [NewLine] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [+] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 14 string [razorCode] ["how are you?"] +0 14 1 razorTransition [razorCode] [)] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_with_background_misc_file.txt new file mode 100644 index 00000000000..4fad6e6ce06 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/Expressions_with_background_misc_file.txt @@ -0,0 +1,29 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [razorCode] [@] +0 1 8 struct [razorCode] [DateTime] +0 8 1 operator [razorCode] [.] +0 1 3 property [static, razorCode] [Now] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [(] +0 1 7 string [razorCode] ["hello"] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [+] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 string [razorCode] ["] +0 1 2 stringEscapeCharacter [razorCode] [\\] +0 2 2 string [razorCode] [n"] +0 2 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [+] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 7 string [razorCode] ["world"] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [+] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 11 class [static, razorCode] [Environment] +0 11 1 operator [razorCode] [.] +0 1 7 property [static, razorCode] [NewLine] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [+] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 14 string [razorCode] ["how are you?"] +0 14 1 razorTransition [razorCode] [)] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static.txt new file mode 100644 index 00000000000..b71e3385aae --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static.txt @@ -0,0 +1,26 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [] [using] +0 6 6 namespace [] [System] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +1 0 1 razorTransition [] [{] +1 4 7 keyword [] [private] +0 8 6 keyword [] [static] +0 7 4 keyword [] [bool] +0 5 9 field [static] [_isStatic] +0 9 1 punctuation [] [;] +2 4 6 keyword [] [public] +0 7 4 keyword [] [void] +0 5 1 method [] [M] +0 1 1 punctuation [] [(] +0 1 1 punctuation [] [)] +1 4 1 punctuation [] [{] +1 8 2 controlKeyword [] [if] +0 3 1 punctuation [] [(] +0 1 9 field [static] [_isStatic] +0 9 1 punctuation [] [)] +1 8 1 punctuation [] [{] +1 8 1 punctuation [] [}] +1 4 1 punctuation [] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_misc_file.txt new file mode 100644 index 00000000000..b71e3385aae --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_misc_file.txt @@ -0,0 +1,26 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [] [using] +0 6 6 namespace [] [System] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +1 0 1 razorTransition [] [{] +1 4 7 keyword [] [private] +0 8 6 keyword [] [static] +0 7 4 keyword [] [bool] +0 5 9 field [static] [_isStatic] +0 9 1 punctuation [] [;] +2 4 6 keyword [] [public] +0 7 4 keyword [] [void] +0 5 1 method [] [M] +0 1 1 punctuation [] [(] +0 1 1 punctuation [] [)] +1 4 1 punctuation [] [{] +1 8 2 controlKeyword [] [if] +0 3 1 punctuation [] [(] +0 1 9 field [static] [_isStatic] +0 9 1 punctuation [] [)] +1 8 1 punctuation [] [{] +1 8 1 punctuation [] [}] +1 4 1 punctuation [] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_with_background.txt new file mode 100644 index 00000000000..2d785ec4e47 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_with_background.txt @@ -0,0 +1,40 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [razorCode] [using] +0 5 1 markupTextLiteral [razorCode] [ ] +0 1 6 namespace [razorCode] [System] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +1 0 1 razorTransition [] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 7 keyword [razorCode] [private] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 6 keyword [razorCode] [static] +0 6 1 markupTextLiteral [razorCode] [ ] +0 1 4 keyword [razorCode] [bool] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 9 field [static, razorCode] [_isStatic] +0 9 1 punctuation [razorCode] [;] +2 0 4 markupTextLiteral [razorCode] [ ] +0 4 6 keyword [razorCode] [public] +0 6 1 markupTextLiteral [razorCode] [ ] +0 1 4 keyword [razorCode] [void] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 1 method [razorCode] [M] +0 1 1 punctuation [razorCode] [(] +0 1 1 punctuation [razorCode] [)] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [{] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 2 controlKeyword [razorCode] [if] +0 2 1 markupTextLiteral [razorCode] [ ] +0 1 1 punctuation [razorCode] [(] +0 1 9 field [static, razorCode] [_isStatic] +0 9 1 punctuation [razorCode] [)] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 1 punctuation [razorCode] [{] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 1 punctuation [razorCode] [}] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_with_background_misc_file.txt new file mode 100644 index 00000000000..2d785ec4e47 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_CSharp_Static_with_background_misc_file.txt @@ -0,0 +1,40 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [razorCode] [using] +0 5 1 markupTextLiteral [razorCode] [ ] +0 1 6 namespace [razorCode] [System] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +1 0 1 razorTransition [] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 7 keyword [razorCode] [private] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 6 keyword [razorCode] [static] +0 6 1 markupTextLiteral [razorCode] [ ] +0 1 4 keyword [razorCode] [bool] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 9 field [static, razorCode] [_isStatic] +0 9 1 punctuation [razorCode] [;] +2 0 4 markupTextLiteral [razorCode] [ ] +0 4 6 keyword [razorCode] [public] +0 6 1 markupTextLiteral [razorCode] [ ] +0 1 4 keyword [razorCode] [void] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 1 method [razorCode] [M] +0 1 1 punctuation [razorCode] [(] +0 1 1 punctuation [razorCode] [)] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [{] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 2 controlKeyword [razorCode] [if] +0 2 1 markupTextLiteral [razorCode] [ ] +0 1 1 punctuation [razorCode] [(] +0 1 9 field [static, razorCode] [_isStatic] +0 9 1 punctuation [razorCode] [)] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 1 punctuation [razorCode] [{] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 1 punctuation [razorCode] [}] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model.txt new file mode 100644 index 00000000000..c089116a8b8 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model.txt @@ -0,0 +1,28 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [] [using] +0 6 6 namespace [] [System] +1 0 1 razorTransition [] [@] +0 1 5 razorDirective [] [model] +0 6 9 variable [] [SampleApp] +0 9 1 operator [] [.] +0 1 5 variable [] [Pages] +0 5 1 operator [] [.] +0 1 10 variable [] [ErrorModel] +2 0 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +2 4 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 8 1 razorTransition [] [@] +0 1 5 property [] [Model] +0 5 1 operator [] [.] +0 1 8 variable [] [ToString] +0 8 1 punctuation [] [(] +0 1 1 punctuation [] [)] +0 1 1 punctuation [] [;] +1 4 1 razorTransition [] [}] +2 0 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_misc_file.txt new file mode 100644 index 00000000000..9fcd05694ff --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_misc_file.txt @@ -0,0 +1,28 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [] [using] +0 6 6 namespace [] [System] +1 0 1 razorTransition [] [@] +0 1 5 razorDirective [] [model] +0 6 9 variable [] [SampleApp] +0 9 1 operator [] [.] +0 1 5 variable [] [Pages] +0 5 1 operator [] [.] +0 1 10 variable [] [ErrorModel] +2 0 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +2 4 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 8 1 razorTransition [] [@] +0 1 5 variable [] [Model] +0 5 1 operator [] [.] +0 1 8 variable [] [ToString] +0 8 1 punctuation [] [(] +0 1 1 punctuation [] [)] +0 1 1 punctuation [] [;] +1 4 1 razorTransition [] [}] +2 0 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_with_background.txt new file mode 100644 index 00000000000..66078d5136c --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_with_background.txt @@ -0,0 +1,29 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [razorCode] [using] +0 5 1 markupTextLiteral [razorCode] [ ] +0 1 6 namespace [razorCode] [System] +1 0 1 razorTransition [] [@] +0 1 5 razorDirective [] [model] +0 6 9 variable [razorCode] [SampleApp] +0 9 1 operator [razorCode] [.] +0 1 5 variable [razorCode] [Pages] +0 5 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [ErrorModel] +2 0 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +2 4 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 8 1 razorTransition [razorCode] [@] +0 1 5 property [razorCode] [Model] +0 5 1 operator [razorCode] [.] +0 1 8 variable [razorCode] [ToString] +0 8 1 punctuation [razorCode] [(] +0 1 1 punctuation [razorCode] [)] +0 1 1 punctuation [razorCode] [;] +1 4 1 razorTransition [razorCode] [}] +2 0 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_with_background_misc_file.txt new file mode 100644 index 00000000000..f40a12f91d6 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Legacy_Model_with_background_misc_file.txt @@ -0,0 +1,29 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [razorCode] [using] +0 5 1 markupTextLiteral [razorCode] [ ] +0 1 6 namespace [razorCode] [System] +1 0 1 razorTransition [] [@] +0 1 5 razorDirective [] [model] +0 6 9 variable [razorCode] [SampleApp] +0 9 1 operator [razorCode] [.] +0 1 5 variable [razorCode] [Pages] +0 5 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [ErrorModel] +2 0 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +2 4 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 8 1 razorTransition [razorCode] [@] +0 1 5 variable [razorCode] [Model] +0 5 1 operator [razorCode] [.] +0 1 8 variable [razorCode] [ToString] +0 8 1 punctuation [razorCode] [(] +0 1 1 punctuation [razorCode] [)] +0 1 1 punctuation [razorCode] [;] +1 4 1 razorTransition [razorCode] [}] +2 0 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync.txt new file mode 100644 index 00000000000..387010ee930 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync.txt @@ -0,0 +1,6 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 11 razorComment [] [ A comment ] +0 11 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_misc_file.txt new file mode 100644 index 00000000000..387010ee930 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_misc_file.txt @@ -0,0 +1,6 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 11 razorComment [] [ A comment ] +0 11 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_with_background.txt new file mode 100644 index 00000000000..387010ee930 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_with_background.txt @@ -0,0 +1,6 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 11 razorComment [] [ A comment ] +0 11 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_with_background_misc_file.txt new file mode 100644 index 00000000000..387010ee930 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_CommentAsync_with_background_misc_file.txt @@ -0,0 +1,6 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 11 razorComment [] [ A comment ] +0 11 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync.txt new file mode 100644 index 00000000000..a60a8821ae3 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync.txt @@ -0,0 +1,7 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 5 razorComment [] [stuff] +1 0 7 razorComment [] [things ] +0 7 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_misc_file.txt new file mode 100644 index 00000000000..a60a8821ae3 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_misc_file.txt @@ -0,0 +1,7 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 5 razorComment [] [stuff] +1 0 7 razorComment [] [things ] +0 7 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_with_background.txt new file mode 100644 index 00000000000..a60a8821ae3 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_with_background.txt @@ -0,0 +1,7 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 5 razorComment [] [stuff] +1 0 7 razorComment [] [things ] +0 7 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_with_background_misc_file.txt new file mode 100644 index 00000000000..a60a8821ae3 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentAsync_with_background_misc_file.txt @@ -0,0 +1,7 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 5 razorComment [] [stuff] +1 0 7 razorComment [] [things ] +0 7 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync.txt new file mode 100644 index 00000000000..31196b3e573 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync.txt @@ -0,0 +1,12 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 markupTagDelimiter [] [<] +0 1 1 markupElement [] [a] +0 2 1 markupTagDelimiter [] [/] +0 1 1 markupTagDelimiter [] [>] +0 1 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +1 0 3 razorComment [] [skd] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_misc_file.txt new file mode 100644 index 00000000000..31196b3e573 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_misc_file.txt @@ -0,0 +1,12 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 markupTagDelimiter [] [<] +0 1 1 markupElement [] [a] +0 2 1 markupTagDelimiter [] [/] +0 1 1 markupTagDelimiter [] [>] +0 1 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +1 0 3 razorComment [] [skd] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_with_background.txt new file mode 100644 index 00000000000..31196b3e573 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_with_background.txt @@ -0,0 +1,12 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 markupTagDelimiter [] [<] +0 1 1 markupElement [] [a] +0 2 1 markupTagDelimiter [] [/] +0 1 1 markupTagDelimiter [] [>] +0 1 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +1 0 3 razorComment [] [skd] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_with_background_misc_file.txt new file mode 100644 index 00000000000..31196b3e573 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentMidlineAsync_with_background_misc_file.txt @@ -0,0 +1,12 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 markupTagDelimiter [] [<] +0 1 1 markupElement [] [a] +0 2 1 markupTagDelimiter [] [/] +0 1 1 markupTagDelimiter [] [>] +0 1 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +1 0 3 razorComment [] [skd] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines.txt new file mode 100644 index 00000000000..8c8488c5abc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines.txt @@ -0,0 +1,10 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +2 0 3 razorComment [] [skd] +1 0 4 razorComment [] [ ] +1 0 19 razorComment [] [ sdfasdfasdf] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF.txt new file mode 100644 index 00000000000..8c8488c5abc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF.txt @@ -0,0 +1,10 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +2 0 3 razorComment [] [skd] +1 0 4 razorComment [] [ ] +1 0 19 razorComment [] [ sdfasdfasdf] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_misc_file.txt new file mode 100644 index 00000000000..8c8488c5abc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_misc_file.txt @@ -0,0 +1,10 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +2 0 3 razorComment [] [skd] +1 0 4 razorComment [] [ ] +1 0 19 razorComment [] [ sdfasdfasdf] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_with_background.txt new file mode 100644 index 00000000000..8c8488c5abc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_with_background.txt @@ -0,0 +1,10 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +2 0 3 razorComment [] [skd] +1 0 4 razorComment [] [ ] +1 0 19 razorComment [] [ sdfasdfasdf] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_with_background_misc_file.txt new file mode 100644 index 00000000000..8c8488c5abc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_LF_with_background_misc_file.txt @@ -0,0 +1,10 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +2 0 3 razorComment [] [skd] +1 0 4 razorComment [] [ ] +1 0 19 razorComment [] [ sdfasdfasdf] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_misc_file.txt new file mode 100644 index 00000000000..8c8488c5abc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_misc_file.txt @@ -0,0 +1,10 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +2 0 3 razorComment [] [skd] +1 0 4 razorComment [] [ ] +1 0 19 razorComment [] [ sdfasdfasdf] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_with_background.txt new file mode 100644 index 00000000000..8c8488c5abc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_with_background.txt @@ -0,0 +1,10 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +2 0 3 razorComment [] [skd] +1 0 4 razorComment [] [ ] +1 0 19 razorComment [] [ sdfasdfasdf] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_with_background_misc_file.txt new file mode 100644 index 00000000000..8c8488c5abc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_MultiLineCommentWithBlankLines_with_background_misc_file.txt @@ -0,0 +1,10 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorCommentTransition [] [@] +0 1 1 razorCommentStar [] [*] +0 1 4 razorComment [] [ kdl] +2 0 3 razorComment [] [skd] +1 0 4 razorComment [] [ ] +1 0 19 razorComment [] [ sdfasdfasdf] +1 0 3 razorComment [] [slf] +0 3 1 razorCommentStar [] [*] +0 1 1 razorCommentTransition [] [@] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives.txt new file mode 100644 index 00000000000..95aeaea58a7 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives.txt @@ -0,0 +1,55 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [] [using] +0 6 6 namespace [] [System] +1 0 1 razorTransition [] [@] +0 1 9 razorDirective [] [functions] +0 10 1 razorTransition [] [{] +1 4 7 keyword [] [private] +0 8 4 keyword [] [void] +0 5 14 method [] [BidsByShipment] +0 14 1 punctuation [] [(] +0 1 6 keyword [] [string] +0 7 11 parameter [] [generatedId] +0 11 1 punctuation [] [,] +0 2 3 keyword [] [int] +0 4 4 parameter [] [bids] +0 4 1 punctuation [] [)] +1 4 1 punctuation [] [{] +1 8 2 controlKeyword [] [if] +0 3 1 punctuation [] [(] +0 1 4 parameter [] [bids] +0 5 1 operator [] [>] +0 2 1 number [] [0] +0 1 1 punctuation [] [)] +1 8 1 punctuation [] [{] +1 12 1 markupTagDelimiter [] [<] +0 1 1 markupElement [] [a] +0 2 5 markupAttribute [] [class] +0 5 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 1 markupAttributeQuote [] ["] +0 1 7 markupAttribute [] [Thing""] +0 7 1 markupTagDelimiter [] [>] +1 16 1 razorTransition [] [@] +0 1 2 controlKeyword [] [if] +0 2 1 punctuation [] [(] +0 1 4 parameter [] [bids] +0 5 1 operator [] [>] +0 2 1 number [] [0] +0 1 1 punctuation [] [)] +1 16 1 punctuation [] [{] +1 20 6 razorDirective [] [] +0 6 1 razorTransition [] [@] +0 1 8 struct [] [DateTime] +0 8 1 operator [] [.] +0 1 3 property [static] [Now] +0 3 7 razorDirective [] [] +1 16 1 punctuation [] [}] +1 12 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 1 markupElement [] [a] +0 1 1 markupTagDelimiter [] [>] +1 8 1 punctuation [] [}] +1 4 1 punctuation [] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_misc_file.txt new file mode 100644 index 00000000000..95aeaea58a7 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_misc_file.txt @@ -0,0 +1,55 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [] [using] +0 6 6 namespace [] [System] +1 0 1 razorTransition [] [@] +0 1 9 razorDirective [] [functions] +0 10 1 razorTransition [] [{] +1 4 7 keyword [] [private] +0 8 4 keyword [] [void] +0 5 14 method [] [BidsByShipment] +0 14 1 punctuation [] [(] +0 1 6 keyword [] [string] +0 7 11 parameter [] [generatedId] +0 11 1 punctuation [] [,] +0 2 3 keyword [] [int] +0 4 4 parameter [] [bids] +0 4 1 punctuation [] [)] +1 4 1 punctuation [] [{] +1 8 2 controlKeyword [] [if] +0 3 1 punctuation [] [(] +0 1 4 parameter [] [bids] +0 5 1 operator [] [>] +0 2 1 number [] [0] +0 1 1 punctuation [] [)] +1 8 1 punctuation [] [{] +1 12 1 markupTagDelimiter [] [<] +0 1 1 markupElement [] [a] +0 2 5 markupAttribute [] [class] +0 5 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 1 markupAttributeQuote [] ["] +0 1 7 markupAttribute [] [Thing""] +0 7 1 markupTagDelimiter [] [>] +1 16 1 razorTransition [] [@] +0 1 2 controlKeyword [] [if] +0 2 1 punctuation [] [(] +0 1 4 parameter [] [bids] +0 5 1 operator [] [>] +0 2 1 number [] [0] +0 1 1 punctuation [] [)] +1 16 1 punctuation [] [{] +1 20 6 razorDirective [] [] +0 6 1 razorTransition [] [@] +0 1 8 struct [] [DateTime] +0 8 1 operator [] [.] +0 1 3 property [static] [Now] +0 3 7 razorDirective [] [] +1 16 1 punctuation [] [}] +1 12 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 1 markupElement [] [a] +0 1 1 markupTagDelimiter [] [>] +1 8 1 punctuation [] [}] +1 4 1 punctuation [] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_with_background.txt new file mode 100644 index 00000000000..56f63864b66 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_with_background.txt @@ -0,0 +1,74 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [razorCode] [using] +0 5 1 markupTextLiteral [razorCode] [ ] +0 1 6 namespace [razorCode] [System] +1 0 1 razorTransition [] [@] +0 1 9 razorDirective [] [functions] +0 10 1 razorTransition [] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 7 keyword [razorCode] [private] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 4 keyword [razorCode] [void] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 14 method [razorCode] [BidsByShipment] +0 14 1 punctuation [razorCode] [(] +0 1 6 keyword [razorCode] [string] +0 6 1 markupTextLiteral [razorCode] [ ] +0 1 11 parameter [razorCode] [generatedId] +0 11 1 punctuation [razorCode] [,] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 3 keyword [razorCode] [int] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 4 parameter [razorCode] [bids] +0 4 1 punctuation [razorCode] [)] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [{] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 2 controlKeyword [razorCode] [if] +0 2 1 markupTextLiteral [razorCode] [ ] +0 1 1 punctuation [razorCode] [(] +0 1 4 parameter [razorCode] [bids] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [>] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 number [razorCode] [0] +0 1 1 punctuation [razorCode] [)] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 1 punctuation [razorCode] [{] +1 12 1 markupTagDelimiter [] [<] +0 1 1 markupElement [] [a] +0 2 5 markupAttribute [] [class] +0 5 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 1 markupAttributeQuote [] ["] +0 1 7 markupAttribute [] [Thing""] +0 7 1 markupTagDelimiter [] [>] +1 16 1 razorTransition [razorCode] [@] +0 1 2 controlKeyword [razorCode] [if] +0 2 1 punctuation [razorCode] [(] +0 1 4 parameter [razorCode] [bids] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [>] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 number [razorCode] [0] +0 1 1 punctuation [razorCode] [)] +1 0 16 markupTextLiteral [razorCode] [ ] +0 16 1 punctuation [razorCode] [{] +1 20 6 razorDirective [] [] +0 6 1 razorTransition [razorCode] [@] +0 1 8 struct [razorCode] [DateTime] +0 8 1 operator [razorCode] [.] +0 1 3 property [static, razorCode] [Now] +0 3 7 razorDirective [] [] +1 0 16 markupTextLiteral [razorCode] [ ] +0 16 1 punctuation [razorCode] [}] +1 12 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 1 markupElement [] [a] +0 1 1 markupTagDelimiter [] [>] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 1 punctuation [razorCode] [}] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_with_background_misc_file.txt new file mode 100644 index 00000000000..56f63864b66 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTextDirectives_with_background_misc_file.txt @@ -0,0 +1,74 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [razorCode] [using] +0 5 1 markupTextLiteral [razorCode] [ ] +0 1 6 namespace [razorCode] [System] +1 0 1 razorTransition [] [@] +0 1 9 razorDirective [] [functions] +0 10 1 razorTransition [] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 7 keyword [razorCode] [private] +0 7 1 markupTextLiteral [razorCode] [ ] +0 1 4 keyword [razorCode] [void] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 14 method [razorCode] [BidsByShipment] +0 14 1 punctuation [razorCode] [(] +0 1 6 keyword [razorCode] [string] +0 6 1 markupTextLiteral [razorCode] [ ] +0 1 11 parameter [razorCode] [generatedId] +0 11 1 punctuation [razorCode] [,] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 3 keyword [razorCode] [int] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 4 parameter [razorCode] [bids] +0 4 1 punctuation [razorCode] [)] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [{] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 2 controlKeyword [razorCode] [if] +0 2 1 markupTextLiteral [razorCode] [ ] +0 1 1 punctuation [razorCode] [(] +0 1 4 parameter [razorCode] [bids] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [>] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 number [razorCode] [0] +0 1 1 punctuation [razorCode] [)] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 1 punctuation [razorCode] [{] +1 12 1 markupTagDelimiter [] [<] +0 1 1 markupElement [] [a] +0 2 5 markupAttribute [] [class] +0 5 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 1 markupAttributeQuote [] ["] +0 1 7 markupAttribute [] [Thing""] +0 7 1 markupTagDelimiter [] [>] +1 16 1 razorTransition [razorCode] [@] +0 1 2 controlKeyword [razorCode] [if] +0 2 1 punctuation [razorCode] [(] +0 1 4 parameter [razorCode] [bids] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [>] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 number [razorCode] [0] +0 1 1 punctuation [razorCode] [)] +1 0 16 markupTextLiteral [razorCode] [ ] +0 16 1 punctuation [razorCode] [{] +1 20 6 razorDirective [] [] +0 6 1 razorTransition [razorCode] [@] +0 1 8 struct [razorCode] [DateTime] +0 8 1 operator [razorCode] [.] +0 1 3 property [static, razorCode] [Now] +0 3 7 razorDirective [] [] +1 0 16 markupTextLiteral [razorCode] [ ] +0 16 1 punctuation [razorCode] [}] +1 12 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 1 markupElement [] [a] +0 1 1 markupTagDelimiter [] [>] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 1 punctuation [razorCode] [}] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions.txt new file mode 100644 index 00000000000..ae2c47deaa2 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions.txt @@ -0,0 +1,23 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [] [using] +0 6 6 namespace [] [System] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +0 5 1 razorTransition [] [{] +1 4 6 delegate [] [Action] +0 6 1 punctuation [] [<] +0 1 6 keyword [] [object] +0 6 1 punctuation [] [>] +0 2 3 field [] [abc] +0 4 1 operator [] [=] +0 2 1 razorTransition [] [@] +0 1 1 markupTagDelimiter [] [<] +0 1 4 markupElement [] [span] +0 4 1 markupTagDelimiter [] [>] +0 1 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 4 markupElement [] [span] +0 4 1 markupTagDelimiter [] [>] +0 1 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_misc_file.txt new file mode 100644 index 00000000000..ae2c47deaa2 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_misc_file.txt @@ -0,0 +1,23 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [] [using] +0 6 6 namespace [] [System] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +0 5 1 razorTransition [] [{] +1 4 6 delegate [] [Action] +0 6 1 punctuation [] [<] +0 1 6 keyword [] [object] +0 6 1 punctuation [] [>] +0 2 3 field [] [abc] +0 4 1 operator [] [=] +0 2 1 razorTransition [] [@] +0 1 1 markupTagDelimiter [] [<] +0 1 4 markupElement [] [span] +0 4 1 markupTagDelimiter [] [>] +0 1 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 4 markupElement [] [span] +0 4 1 markupTagDelimiter [] [>] +0 1 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_with_background.txt new file mode 100644 index 00000000000..6c668627153 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_with_background.txt @@ -0,0 +1,27 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [razorCode] [using] +0 5 1 markupTextLiteral [razorCode] [ ] +0 1 6 namespace [razorCode] [System] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +0 5 1 razorTransition [] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 6 delegate [razorCode] [Action] +0 6 1 punctuation [razorCode] [<] +0 1 6 keyword [razorCode] [object] +0 6 1 punctuation [razorCode] [>] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 3 field [razorCode] [abc] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 2 1 razorTransition [razorCode] [@] +0 1 1 markupTagDelimiter [] [<] +0 1 4 markupElement [] [span] +0 4 1 markupTagDelimiter [] [>] +0 1 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 4 markupElement [] [span] +0 4 1 markupTagDelimiter [] [>] +0 1 1 punctuation [razorCode] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_with_background_misc_file.txt new file mode 100644 index 00000000000..6c668627153 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/GetSemanticTokens_Razor_NestedTransitions_with_background_misc_file.txt @@ -0,0 +1,27 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 5 keyword [razorCode] [using] +0 5 1 markupTextLiteral [razorCode] [ ] +0 1 6 namespace [razorCode] [System] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +0 5 1 razorTransition [] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 6 delegate [razorCode] [Action] +0 6 1 punctuation [razorCode] [<] +0 1 6 keyword [razorCode] [object] +0 6 1 punctuation [razorCode] [>] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 3 field [razorCode] [abc] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 2 1 razorTransition [razorCode] [@] +0 1 1 markupTagDelimiter [] [<] +0 1 4 markupElement [] [span] +0 4 1 markupTagDelimiter [] [>] +0 1 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 4 markupElement [] [span] +0 4 1 markupTagDelimiter [] [>] +0 1 1 punctuation [razorCode] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents.txt index 729ec4f8992..9874150f958 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents.txt +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents.txt @@ -41,6 +41,26 @@ Line Δ, Char Δ, Length, Type, Modifier(s), Text 0 1 1 markupTagDelimiter [] [/] 0 1 47 razorComponentElement [] [Microsoft.AspNetCore.Components.Forms.InputText] 0 47 1 markupTagDelimiter [] [>] +2 0 1 markupTagDelimiter [] [<] +0 1 9 razorComponentElement [] [InputText] +1 4 5 razorComponentAttribute [] [Value] +0 5 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 9 markupAttributeValue [] [someValue] +0 9 1 markupAttributeQuote [] ["] +1 4 8 markupAttribute [] [CssClass] +0 8 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 8 markupAttributeValue [] [my-class] +0 8 1 markupAttributeQuote [] ["] +1 4 11 razorComponentAttribute [] [DisplayName] +0 11 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 2 markupAttributeValue [] [My] +0 2 6 markupAttributeValue [] [ Input] +0 6 1 markupAttributeQuote [] ["] +0 2 1 markupTagDelimiter [] [/] +0 1 1 markupTagDelimiter [] [>] 2 0 1 razorTransition [] [@] 0 1 6 keyword [] [typeof] 0 6 1 punctuation [] [(] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_misc_file.txt index 344aa6e5a99..22e3a323587 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_misc_file.txt +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_misc_file.txt @@ -41,6 +41,26 @@ Line Δ, Char Δ, Length, Type, Modifier(s), Text 0 1 1 markupTagDelimiter [] [/] 0 1 47 markupElement [] [Microsoft.AspNetCore.Components.Forms.InputText] 0 47 1 markupTagDelimiter [] [>] +2 0 1 markupTagDelimiter [] [<] +0 1 9 markupElement [] [InputText] +1 4 5 markupAttribute [] [Value] +0 5 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 9 markupAttributeValue [] [someValue] +0 9 1 markupAttributeQuote [] ["] +1 4 8 markupAttribute [] [CssClass] +0 8 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 8 markupAttributeValue [] [my-class] +0 8 1 markupAttributeQuote [] ["] +1 4 11 markupAttribute [] [DisplayName] +0 11 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 2 markupAttributeValue [] [My] +0 2 6 markupAttributeValue [] [ Input] +0 6 1 markupAttributeQuote [] ["] +0 2 1 markupTagDelimiter [] [/] +0 1 1 markupTagDelimiter [] [>] 2 0 1 razorTransition [] [@] 0 1 6 keyword [] [typeof] 0 6 1 punctuation [] [(] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_with_background.txt index 1b8e3c533bd..f461b335ffa 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_with_background.txt +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_with_background.txt @@ -41,6 +41,26 @@ Line Δ, Char Δ, Length, Type, Modifier(s), Text 0 1 1 markupTagDelimiter [] [/] 0 1 47 razorComponentElement [] [Microsoft.AspNetCore.Components.Forms.InputText] 0 47 1 markupTagDelimiter [] [>] +2 0 1 markupTagDelimiter [] [<] +0 1 9 razorComponentElement [] [InputText] +1 4 5 razorComponentAttribute [] [Value] +0 5 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 9 markupAttributeValue [] [someValue] +0 9 1 markupAttributeQuote [] ["] +1 4 8 markupAttribute [] [CssClass] +0 8 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 8 markupAttributeValue [] [my-class] +0 8 1 markupAttributeQuote [] ["] +1 4 11 razorComponentAttribute [] [DisplayName] +0 11 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 2 markupAttributeValue [] [My] +0 2 6 markupAttributeValue [] [ Input] +0 6 1 markupAttributeQuote [] ["] +0 2 1 markupTagDelimiter [] [/] +0 1 1 markupTagDelimiter [] [>] 2 0 1 razorTransition [razorCode] [@] 0 1 6 keyword [razorCode] [typeof] 0 6 1 punctuation [razorCode] [(] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_with_background_misc_file.txt index d8b85cd0a86..eb59bf0f92a 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_with_background_misc_file.txt +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RazorComponents_with_background_misc_file.txt @@ -41,6 +41,26 @@ Line Δ, Char Δ, Length, Type, Modifier(s), Text 0 1 1 markupTagDelimiter [] [/] 0 1 47 markupElement [] [Microsoft.AspNetCore.Components.Forms.InputText] 0 47 1 markupTagDelimiter [] [>] +2 0 1 markupTagDelimiter [] [<] +0 1 9 markupElement [] [InputText] +1 4 5 markupAttribute [] [Value] +0 5 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 9 markupAttributeValue [] [someValue] +0 9 1 markupAttributeQuote [] ["] +1 4 8 markupAttribute [] [CssClass] +0 8 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 8 markupAttributeValue [] [my-class] +0 8 1 markupAttributeQuote [] ["] +1 4 11 markupAttribute [] [DisplayName] +0 11 1 markupOperator [] [=] +0 1 1 markupAttributeQuote [] ["] +0 1 2 markupAttributeValue [] [My] +0 2 6 markupAttributeValue [] [ Input] +0 6 1 markupAttributeQuote [] ["] +0 2 1 markupTagDelimiter [] [/] +0 1 1 markupTagDelimiter [] [>] 2 0 1 razorTransition [razorCode] [@] 0 1 6 keyword [razorCode] [typeof] 0 6 1 punctuation [razorCode] [(] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment.txt new file mode 100644 index 00000000000..bd3ad05091b --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment.txt @@ -0,0 +1,31 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 18 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +1 0 1 razorTransition [] [{] +1 4 6 keyword [] [public] +0 7 4 keyword [] [void] +0 5 1 method [] [M] +0 1 1 punctuation [] [(] +0 1 1 punctuation [] [)] +1 4 1 punctuation [] [{] +1 8 14 delegate [] [RenderFragment] +0 15 1 variable [] [x] +0 2 1 operator [] [=] +0 2 1 razorTransition [] [@] +0 1 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 18 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 1 1 punctuation [] [;] +1 4 1 punctuation [] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_misc_file.txt new file mode 100644 index 00000000000..f77a89a6e24 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_misc_file.txt @@ -0,0 +1,31 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 18 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +1 0 1 razorTransition [] [{] +1 4 6 keyword [] [public] +0 7 4 keyword [] [void] +0 5 1 method [] [M] +0 1 1 punctuation [] [(] +0 1 1 punctuation [] [)] +1 4 1 punctuation [] [{] +1 8 14 variable [] [RenderFragment] +0 15 1 variable [] [x] +0 2 1 operator [] [=] +0 2 1 razorTransition [] [@] +0 1 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 18 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 1 1 punctuation [] [;] +1 4 1 punctuation [] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_with_background.txt new file mode 100644 index 00000000000..f7bd93c9a42 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_with_background.txt @@ -0,0 +1,39 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 18 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +1 0 1 razorTransition [] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 6 keyword [razorCode] [public] +0 6 1 markupTextLiteral [razorCode] [ ] +0 1 4 keyword [razorCode] [void] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 1 method [razorCode] [M] +0 1 1 punctuation [razorCode] [(] +0 1 1 punctuation [razorCode] [)] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [{] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 14 delegate [razorCode] [RenderFragment] +0 14 1 markupTextLiteral [razorCode] [ ] +0 1 1 variable [razorCode] [x] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 2 1 razorTransition [razorCode] [@] +0 1 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 18 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 1 1 punctuation [razorCode] [;] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_with_background_misc_file.txt new file mode 100644 index 00000000000..5d59d1104f6 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderFragment_with_background_misc_file.txt @@ -0,0 +1,39 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 18 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +1 0 1 razorTransition [] [@] +0 1 4 razorDirective [] [code] +1 0 1 razorTransition [] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 6 keyword [razorCode] [public] +0 6 1 markupTextLiteral [razorCode] [ ] +0 1 4 keyword [razorCode] [void] +0 4 1 markupTextLiteral [razorCode] [ ] +0 1 1 method [razorCode] [M] +0 1 1 punctuation [razorCode] [(] +0 1 1 punctuation [razorCode] [)] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [{] +1 0 8 markupTextLiteral [razorCode] [ ] +0 8 14 variable [razorCode] [RenderFragment] +0 14 1 markupTextLiteral [razorCode] [ ] +0 1 1 variable [razorCode] [x] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 2 1 razorTransition [razorCode] [@] +0 1 1 markupTagDelimiter [] [<] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 18 1 markupTagDelimiter [] [<] +0 1 1 markupTagDelimiter [] [/] +0 1 3 markupElement [] [div] +0 3 1 markupTagDelimiter [] [>] +0 1 1 punctuation [razorCode] [;] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 1 punctuation [razorCode] [}] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode.txt new file mode 100644 index 00000000000..9663a1806fa --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode.txt @@ -0,0 +1,35 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace [] [Web] +0 3 1 operator [] [.] +0 1 10 class [static] [RenderMode] +0 10 1 operator [] [.] +0 1 17 property [static] [InteractiveServer] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 variable [] [r] +0 2 1 operator [] [=] +0 2 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace [] [Web] +0 3 1 operator [] [.] +0 1 10 class [static] [RenderMode] +0 10 1 operator [] [.] +0 1 15 property [static] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression.txt new file mode 100644 index 00000000000..c3614859f15 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression.txt @@ -0,0 +1,38 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 1 razorTransition [] [@] +0 1 1 razorTransition [] [(] +0 1 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace [] [Web] +0 3 1 operator [] [.] +0 1 10 class [static] [RenderMode] +0 10 1 operator [] [.] +0 1 17 property [static] [InteractiveServer] +0 17 1 razorTransition [] [)] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 variable [] [r] +0 2 1 operator [] [=] +0 2 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace [] [Web] +0 3 1 operator [] [.] +0 1 10 class [static] [RenderMode] +0 10 1 operator [] [.] +0 1 15 property [static] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_misc_file.txt new file mode 100644 index 00000000000..8534957dfa0 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_misc_file.txt @@ -0,0 +1,38 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 1 razorTransition [] [@] +0 1 1 razorTransition [] [(] +0 1 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 variable [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 variable [] [Components] +0 10 1 operator [] [.] +0 1 3 variable [] [Web] +0 3 1 operator [] [.] +0 1 10 variable [] [RenderMode] +0 10 1 operator [] [.] +0 1 17 variable [] [InteractiveServer] +0 17 1 razorTransition [] [)] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 variable [] [r] +0 2 1 operator [] [=] +0 2 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 variable [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 variable [] [Components] +0 10 1 operator [] [.] +0 1 3 variable [] [Web] +0 3 1 operator [] [.] +0 1 10 variable [] [RenderMode] +0 10 1 operator [] [.] +0 1 15 variable [] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background.txt new file mode 100644 index 00000000000..6d454600f9e --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background.txt @@ -0,0 +1,42 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 1 razorTransition [] [@] +0 1 1 razorTransition [razorCode] [(] +0 1 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 17 property [static, razorCode] [InteractiveServer] +0 17 1 razorTransition [razorCode] [)] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 variable [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 property [static, razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background_misc_file.txt new file mode 100644 index 00000000000..f70ea619c52 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Expression_with_background_misc_file.txt @@ -0,0 +1,42 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 1 razorTransition [] [@] +0 1 1 razorTransition [razorCode] [(] +0 1 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 variable [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 17 variable [razorCode] [InteractiveServer] +0 17 1 razorTransition [razorCode] [)] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 variable [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 variable [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 variable [razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9.txt new file mode 100644 index 00000000000..cb5fd2fa4bc --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9.txt @@ -0,0 +1,24 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 variable [] [r] +0 2 1 operator [] [=] +0 2 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 namespace [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 namespace [] [Components] +0 10 1 operator [] [.] +0 1 3 namespace [] [Web] +0 3 1 operator [] [.] +0 1 10 class [static] [RenderMode] +0 10 1 operator [] [.] +0 1 15 property [static] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_misc_file.txt new file mode 100644 index 00000000000..e0835ae4ff3 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_misc_file.txt @@ -0,0 +1,24 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 variable [] [r] +0 2 1 operator [] [=] +0 2 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 variable [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 variable [] [Components] +0 10 1 operator [] [.] +0 1 3 variable [] [Web] +0 3 1 operator [] [.] +0 1 10 variable [] [RenderMode] +0 10 1 operator [] [.] +0 1 15 variable [] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background.txt new file mode 100644 index 00000000000..21f9e8c06e0 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background.txt @@ -0,0 +1,28 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 variable [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 property [static, razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background_misc_file.txt new file mode 100644 index 00000000000..7f717ed7d6e --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_Razor9_with_background_misc_file.txt @@ -0,0 +1,28 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 variable [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 variable [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 variable [razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_misc_file.txt new file mode 100644 index 00000000000..14e50aad65a --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_misc_file.txt @@ -0,0 +1,24 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [] [@] +0 1 1 razorTransition [] [{] +1 4 3 keyword [] [var] +0 4 1 variable [] [r] +0 2 1 operator [] [=] +0 2 9 namespace [] [Microsoft] +0 9 1 operator [] [.] +0 1 10 variable [] [AspNetCore] +0 10 1 operator [] [.] +0 1 10 variable [] [Components] +0 10 1 operator [] [.] +0 1 3 variable [] [Web] +0 3 1 operator [] [.] +0 1 10 variable [] [RenderMode] +0 10 1 operator [] [.] +0 1 15 variable [] [InteractiveAuto] +0 15 1 punctuation [] [;] +1 0 1 razorTransition [] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_with_background.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_with_background.txt new file mode 100644 index 00000000000..54072f691e4 --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_with_background.txt @@ -0,0 +1,39 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +0 11 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 17 property [static, razorCode] [InteractiveServer] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 variable [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 namespace [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 namespace [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 class [static, razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 property [static, razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_with_background_misc_file.txt b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_with_background_misc_file.txt new file mode 100644 index 00000000000..efafbb18d7a --- /dev/null +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/TestFiles/SemanticTokens/RenderMode_with_background_misc_file.txt @@ -0,0 +1,28 @@ +Line Δ, Char Δ, Length, Type, Modifier(s), Text +0 0 1 razorTransition [] [@] +0 1 10 razorDirective [] [rendermode] +2 0 4 markupCommentPunctuation [] [] +2 0 1 razorTransition [razorCode] [@] +0 1 1 razorTransition [razorCode] [{] +1 0 4 markupTextLiteral [razorCode] [ ] +0 4 3 keyword [razorCode] [var] +0 3 1 markupTextLiteral [razorCode] [ ] +0 1 1 variable [razorCode] [r] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 1 operator [razorCode] [=] +0 1 1 markupTextLiteral [razorCode] [ ] +0 1 9 namespace [razorCode] [Microsoft] +0 9 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [AspNetCore] +0 10 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [Components] +0 10 1 operator [razorCode] [.] +0 1 3 variable [razorCode] [Web] +0 3 1 operator [razorCode] [.] +0 1 10 variable [razorCode] [RenderMode] +0 10 1 operator [razorCode] [.] +0 1 15 variable [razorCode] [InteractiveAuto] +0 15 1 punctuation [razorCode] [;] +1 0 1 razorTransition [razorCode] [}] diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataReader.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataReader.Policy.cs deleted file mode 100644 index 3083859e6b5..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataReader.Policy.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.AspNetCore.Razor.Serialization.Json; - -internal partial class JsonDataReader -{ - private sealed class Policy : IPooledObjectPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public JsonDataReader Create() => new(); - - public bool Return(JsonDataReader dataWriter) - { - dataWriter._reader = null; - return true; - } - } -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataReader.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataReader.cs index 2a8df6d673b..20756cbddb7 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataReader.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataReader.cs @@ -18,9 +18,9 @@ namespace Microsoft.AspNetCore.Razor.Serialization.Json; /// This is an abstraction used to read JSON data. Currently, this /// wraps a from JSON.NET. /// -internal partial class JsonDataReader +internal partial class JsonDataReader : IPoolableObject { - private static readonly ObjectPool s_pool = DefaultPool.Create(Policy.Instance); + private static readonly ObjectPool s_pool = DefaultPool.Create(() => new JsonDataReader()); public static JsonDataReader Get(JsonReader reader) { @@ -33,6 +33,11 @@ public static JsonDataReader Get(JsonReader reader) public static void Return(JsonDataReader dataReader) => s_pool.Return(dataReader); + void IPoolableObject.Reset() + { + _reader = null; + } + [AllowNull] private JsonReader _reader; diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataWriter.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataWriter.Policy.cs deleted file mode 100644 index aae1541065e..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataWriter.Policy.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.AspNetCore.Razor.Serialization.Json; - -internal partial class JsonDataWriter -{ - private sealed class Policy : IPooledObjectPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public JsonDataWriter Create() => new(); - - public bool Return(JsonDataWriter dataWriter) - { - dataWriter._writer = null; - return true; - } - } -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataWriter.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataWriter.cs index 06053d85468..5ef23a22273 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataWriter.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/JsonDataWriter.cs @@ -19,9 +19,9 @@ namespace Microsoft.AspNetCore.Razor.Serialization.Json; /// This is an abstraction used to write JSON data. Currently, this /// wraps a from JSON.NET. /// -internal partial class JsonDataWriter +internal partial class JsonDataWriter : IPoolableObject { - private static readonly ObjectPool s_pool = DefaultPool.Create(Policy.Instance); + private static readonly ObjectPool s_pool = DefaultPool.Create(() => new JsonDataWriter()); public static JsonDataWriter Get(JsonWriter writer) { @@ -34,6 +34,11 @@ public static JsonDataWriter Get(JsonWriter writer) public static void Return(JsonDataWriter dataWriter) => s_pool.Return(dataWriter); + void IPoolableObject.Reset() + { + _writer = null; + } + [AllowNull] private JsonWriter _writer; diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/Microsoft.AspNetCore.Razor.Serialization.Json.projitems b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/Microsoft.AspNetCore.Razor.Serialization.Json.projitems index ae65dff8446..4326d060f4b 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/Microsoft.AspNetCore.Razor.Serialization.Json.projitems +++ b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/Microsoft.AspNetCore.Razor.Serialization.Json.projitems @@ -12,9 +12,7 @@ - - diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders.cs index 5da79f45d09..59997625b15 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders.cs @@ -14,14 +14,10 @@ public static Checksum ReadChecksum(JsonDataReader reader) public static Checksum ReadChecksumFromProperties(JsonDataReader reader) { - var data1 = reader.ReadInt64(nameof(Checksum.HashData.Data1)); - var data2 = reader.ReadInt64(nameof(Checksum.HashData.Data2)); - var data3 = reader.ReadInt64(nameof(Checksum.HashData.Data3)); - var data4 = reader.ReadInt64(nameof(Checksum.HashData.Data4)); + var data1 = reader.ReadInt64(nameof(Checksum.Data1)); + var data2 = reader.ReadInt64(nameof(Checksum.Data2)); - var hashData = new Checksum.HashData(data1, data2, data3, data4); - - return new Checksum(hashData); + return new Checksum(data1, data2); } public static RazorConfiguration ReadConfigurationFromProperties(JsonDataReader reader) diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders_ProjectSystem.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders_ProjectSystem.cs index 840a796aa4c..c226bb85a2f 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders_ProjectSystem.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders_ProjectSystem.cs @@ -36,13 +36,15 @@ public static DocumentSnapshotHandle ReadDocumentSnapshotHandleFromProperties(Js public static ProjectWorkspaceState ReadProjectWorkspaceStateFromProperties(JsonDataReader reader) { - var tagHelpers = reader.ReadImmutableArrayOrEmpty(nameof(ProjectWorkspaceState.TagHelpers), + var array = reader.ReadImmutableArrayOrEmpty(nameof(ProjectWorkspaceState.TagHelpers), static r => ReadTagHelper(r #if JSONSERIALIZATION_ENABLETAGHELPERCACHE , useCache: true #endif )); + var tagHelpers = TagHelperCollection.Create(array); + return ProjectWorkspaceState.Create(tagHelpers); } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters.cs index 2cbac6a2cd5..3d6645a901d 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters.cs @@ -14,12 +14,8 @@ public static void Write(JsonDataWriter writer, Checksum value) public static void WriteProperties(JsonDataWriter writer, Checksum value) { - var data = value.Data; - - writer.Write(nameof(data.Data1), data.Data1); - writer.Write(nameof(data.Data2), data.Data2); - writer.Write(nameof(data.Data3), data.Data3); - writer.Write(nameof(data.Data4), data.Data4); + writer.Write(nameof(value.Data1), value.Data1); + writer.Write(nameof(value.Data2), value.Data2); } public static void Write(JsonDataWriter writer, RazorConfiguration? value) diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters_ProjectSystem.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters_ProjectSystem.cs index c70979cf9f3..532374ff235 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters_ProjectSystem.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters_ProjectSystem.cs @@ -35,7 +35,7 @@ public static void Write(JsonDataWriter writer, ProjectWorkspaceState? value) public static void WriteProperties(JsonDataWriter writer, ProjectWorkspaceState value) { - writer.WriteArrayIfNotDefaultOrEmpty(nameof(value.TagHelpers), value.TagHelpers, Write); + writer.WriteArrayIfNotNullOrEmpty(nameof(value.TagHelpers), value.TagHelpers, Write); } public static void Write(JsonDataWriter writer, RazorProjectInfo value) diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/SerializationFormat.cs b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/SerializationFormat.cs index 82ba41c8930..9dee6f06b45 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/SerializationFormat.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/SerializationFormat.cs @@ -9,5 +9,5 @@ internal static class SerializationFormat // or any of the types that compose it changes. This includes: RazorConfiguration, // ProjectWorkspaceState, TagHelperDescriptor, and DocumentSnapshotHandle. // NOTE: If this version is changed, a coordinated insertion is required between Roslyn and Razor for the C# extension. - public const int Version = 14; + public const int Version = 16; } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/AssertExtensions.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/AssertExtensions.cs new file mode 100644 index 00000000000..84d97f65a3d --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/AssertExtensions.cs @@ -0,0 +1,45 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Linq; + +namespace Xunit; + +internal static class AssertExtensions +{ + extension(Assert) + { + public static void SameItems(IEnumerable? expected, IEnumerable? actual) + { + if (expected is null && actual is null) + { + return; + } + + if (expected is null || actual is null) + { + Assert.Fail($"Expected: {expected?.ToString() ?? "null"}, Actual: {actual?.ToString() ?? "null"}"); + return; + } + + var expectedArray = expected.ToArray(); + var actualArray = actual.ToArray(); + + if (expectedArray.Length != actualArray.Length) + { + Assert.Fail($"Expected collection length: {expectedArray.Length}, Actual collection length: {actualArray.Length}"); + return; + } + + for (var i = 0; i < expectedArray.Length; i++) + { + if (!ReferenceEquals(expectedArray[i], actualArray[i])) + { + Assert.Fail($"Expected and actual collections differ at index {i}. Expected: {expectedArray[i]}, Actual: {actualArray[i]}"); + return; + } + } + } + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/ErrorCode.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/ErrorCode.cs index 94231654484..b6430a65b3d 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/ErrorCode.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/ErrorCode.cs @@ -18,6 +18,7 @@ public enum ErrorCode WRN_UnreferencedVarAssg = 219, ERR_DottedTypeNameNotFoundInNS = 234, ERR_SingleTypeNameNotFound = 246, + ERR_BadArity = 305, ERR_CantInferMethTypeArgs = 411, WRN_UnreferencedFieldAssg = 414, WRN_InvalidAttributeLocation = 658, @@ -45,5 +46,6 @@ public enum ErrorCode WRN_NullReferenceReceiver = 8602, WRN_UninitializedNonNullableField = 8618, WRN_MissingNonNullTypesContextForAnnotationInGeneratedCode = 8669, + ERR_FeatureNotAvailableInVersion10 = 8936, ERR_IllegalAtSequence = 9008, } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorBaselineIntegrationTestBase.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorBaselineIntegrationTestBase.cs index afd5ff97775..525e983b83d 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorBaselineIntegrationTestBase.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorBaselineIntegrationTestBase.cs @@ -208,15 +208,8 @@ protected void AssertLinePragmas(RazorCodeDocument codeDocument) } } - // check that the pragmas in the main document have matching span maps and are enhanced - var pragmasInDocument = linePragmas.Where(p => p.FilePath == codeDocument.Source.FilePath).ToArray(); - - foreach(var pragma in pragmasInDocument) - { - Assert.True(pragma.IsEnhanced); - } - - Assert.Equal(pragmasInDocument.Length, csharpDocument.SourceMappings.Length); + // check that the pragmas in the main document are enhanced + Assert.All(linePragmas.Where(p => p.FilePath == codeDocument.Source.FilePath), p => Assert.True(p.IsEnhanced)); } } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorIntegrationTestBase.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorIntegrationTestBase.cs index 7e34e9906d5..ac1f8025249 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorIntegrationTestBase.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorIntegrationTestBase.cs @@ -49,7 +49,7 @@ public RazorIntegrationTestBase() ImportItems = ImmutableArray.CreateBuilder(); BaseCompilation = DefaultBaseCompilation; - Configuration = RazorConfiguration.Default; + Configuration = RazorConfiguration.Default with { LanguageVersion = RazorLanguageVersion.Preview }; FileSystem = new VirtualRazorProjectFileSystem(); PathSeparator = Path.DirectorySeparatorChar.ToString(); WorkingDirectory = PlatformInformation.IsWindows ? ArbitraryWindowsPath : ArbitraryMacLinuxPath; @@ -384,11 +384,17 @@ private static MemoryStream EmitCompilation(Compilation compilation) return peStream; } - protected INamedTypeSymbol CompileToComponent(string cshtmlSource) + protected INamedTypeSymbol CompileToComponent(string cshtmlSource, int genericArity = 0) { var assemblyResult = CompileToAssembly(DefaultFileName, cshtmlSource); var componentFullTypeName = $"{DefaultRootNamespace}.{Path.GetFileNameWithoutExtension(DefaultFileName)}"; + + if (genericArity > 0) + { + componentFullTypeName += "`" + genericArity; + } + return CompileToComponent(assemblyResult, componentFullTypeName); } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/Intermediate/IntermediateNodeAssert.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/Intermediate/IntermediateNodeAssert.cs index 174bf215658..a1675327ef4 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/Intermediate/IntermediateNodeAssert.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/Intermediate/IntermediateNodeAssert.cs @@ -307,7 +307,12 @@ internal static void PreallocatedTagHelperPropertyValue( } } - internal static void TagHelper(string tagName, TagMode tagMode, IEnumerable tagHelpers, IntermediateNode node, params Action[] childValidators) + internal static void TagHelper( + string tagName, + TagMode tagMode, + TagHelperCollection tagHelpers, + IntermediateNode node, + params Action[] childValidators) { var tagHelperNode = Assert.IsType(node); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs index bbc8395a09c..45b4869d076 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs @@ -228,7 +228,7 @@ internal virtual RazorSyntaxTree ParseDocument( var diagnostics = context.ErrorSink.GetErrorsAndClear(); var syntaxTree = new RazorSyntaxTree(root, source, diagnostics, parseOptions); - codeDocument.SetSyntaxTree(syntaxTree); + codeDocument = codeDocument.WithSyntaxTree(syntaxTree); var defaultDirectivePass = new DefaultDirectiveSyntaxTreePass(); syntaxTree = defaultDirectivePass.Execute(codeDocument, syntaxTree); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorCodeDocumentProcessor.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorCodeDocumentProcessor.cs index 1697043eff3..05024cfd5ee 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorCodeDocumentProcessor.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorCodeDocumentProcessor.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language; public sealed class RazorCodeDocumentProcessor { public RazorProjectEngine ProjectEngine { get; } - public RazorCodeDocument CodeDocument { get; } + public RazorCodeDocument CodeDocument { get; private set; } private RazorCodeDocumentProcessor(RazorProjectEngine projectEngine, RazorCodeDocument codeDocument) { @@ -24,7 +24,7 @@ public static RazorCodeDocumentProcessor From(RazorProjectEngine projectEngine, public RazorCodeDocumentProcessor ExecutePhasesThrough() where T : IRazorEnginePhase { - ProjectEngine.ExecutePhasesThrough(CodeDocument); + CodeDocument = ProjectEngine.ExecutePhasesThrough(CodeDocument); return this; } @@ -45,22 +45,6 @@ public RazorCodeDocumentProcessor ExecutePass(Func passFactory) return this; } - public RazorCodeDocumentProcessor ExecutePhase(RazorCodeDocument codeDocument) - where T : IRazorEnginePhase, new() - { - ProjectEngine.ExecutePhase(codeDocument); - - return this; - } - - public RazorCodeDocumentProcessor ExecutePhase(RazorCodeDocument codeDocument, Func phaseFactory) - where T : IRazorEnginePhase - { - ProjectEngine.ExecutePhase(codeDocument, phaseFactory); - - return this; - } - public DocumentIntermediateNode GetDocumentNode() { var documentNode = CodeDocument.GetDocumentNode(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorProjectEngineBuilderExtensions.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorProjectEngineBuilderExtensions.cs index 09d0fc9b180..10761e45eb8 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorProjectEngineBuilderExtensions.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorProjectEngineBuilderExtensions.cs @@ -30,12 +30,7 @@ public static RazorProjectEngineBuilder AddDefaultImports(this RazorProjectEngin return builder; } - public static RazorProjectEngineBuilder AddTagHelpers(this RazorProjectEngineBuilder builder, params TagHelperDescriptor[] tagHelpers) - { - return AddTagHelpers(builder, (IEnumerable)tagHelpers); - } - - public static RazorProjectEngineBuilder AddTagHelpers(this RazorProjectEngineBuilder builder, IEnumerable tagHelpers) + public static RazorProjectEngineBuilder SetTagHelpers(this RazorProjectEngineBuilder builder, params TagHelperCollection tagHelpers) { var feature = (TestTagHelperFeature)builder.Features.OfType().FirstOrDefault(); if (feature == null) @@ -44,7 +39,7 @@ public static RazorProjectEngineBuilder AddTagHelpers(this RazorProjectEngineBui builder.Features.Add(feature); } - feature.TagHelpers.AddRange(tagHelpers); + feature.SetTagHelpers(tagHelpers); return builder; } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorProjectEngineExtensions.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorProjectEngineExtensions.cs index 3113d6ab4ed..569f98902b8 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorProjectEngineExtensions.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/RazorProjectEngineExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.Language.Intermediate; using Xunit; @@ -32,33 +31,33 @@ public static RazorCodeDocument CreateEmptyCodeDocument( public static RazorCodeDocument CreateEmptyCodeDocument( this RazorProjectEngine projectEngine, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateEmptyCodeDocumentCore(tagHelpers: tagHelpers); public static RazorCodeDocument CreateEmptyCodeDocument( this RazorProjectEngine projectEngine, RazorFileKind fileKind, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateEmptyCodeDocumentCore(fileKind, tagHelpers: tagHelpers); public static RazorCodeDocument CreateEmptyCodeDocument( this RazorProjectEngine projectEngine, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateEmptyCodeDocumentCore(importSources: importSources, tagHelpers: tagHelpers); public static RazorCodeDocument CreateEmptyCodeDocument( this RazorProjectEngine projectEngine, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateEmptyCodeDocumentCore(fileKind, importSources, tagHelpers); private static RazorCodeDocument CreateEmptyCodeDocumentCore( this RazorProjectEngine projectEngine, RazorFileKind? fileKind = null, ImmutableArray importSources = default, - IReadOnlyList? tagHelpers = null) + TagHelperCollection? tagHelpers = null) => projectEngine.CreateCodeDocumentCore(string.Empty, fileKind, importSources, tagHelpers); public static RazorCodeDocument CreateEmptyDesignTimeCodeDocument(this RazorProjectEngine projectEngine) @@ -80,33 +79,33 @@ public static RazorCodeDocument CreateEmptyDesignTimeCodeDocument( public static RazorCodeDocument CreateEmptyDesignTimeCodeDocument( this RazorProjectEngine projectEngine, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateEmptyDesignTimeCodeDocumentCore(tagHelpers: tagHelpers); public static RazorCodeDocument CreateEmptyDesignTimeCodeDocument( this RazorProjectEngine projectEngine, RazorFileKind fileKind, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateEmptyDesignTimeCodeDocumentCore(fileKind, tagHelpers: tagHelpers); public static RazorCodeDocument CreateEmptyDesignTimeCodeDocument( this RazorProjectEngine projectEngine, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateEmptyDesignTimeCodeDocumentCore(importSources: importSources, tagHelpers: tagHelpers); public static RazorCodeDocument CreateEmptyDesignTimeCodeDocument( this RazorProjectEngine projectEngine, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateEmptyDesignTimeCodeDocumentCore(fileKind, importSources, tagHelpers); private static RazorCodeDocument CreateEmptyDesignTimeCodeDocumentCore( this RazorProjectEngine projectEngine, RazorFileKind? fileKind = null, ImmutableArray importSources = default, - IReadOnlyList? tagHelpers = null) + TagHelperCollection? tagHelpers = null) => projectEngine.CreateDesignTimeCodeDocumentCore(string.Empty, fileKind, importSources, tagHelpers); public static RazorCodeDocument CreateCodeDocument(this RazorProjectEngine projectEngine, string content) @@ -131,21 +130,21 @@ public static RazorCodeDocument CreateCodeDocument( public static RazorCodeDocument CreateCodeDocument( this RazorProjectEngine projectEngine, string content, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateCodeDocumentCore(content, tagHelpers: tagHelpers); public static RazorCodeDocument CreateCodeDocument( this RazorProjectEngine projectEngine, string content, RazorFileKind fileKind, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateCodeDocumentCore(content, fileKind, tagHelpers: tagHelpers); public static RazorCodeDocument CreateCodeDocument( this RazorProjectEngine projectEngine, string content, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateCodeDocumentCore(content, importSources: importSources, tagHelpers: tagHelpers); public static RazorCodeDocument CreateCodeDocument( @@ -153,7 +152,7 @@ public static RazorCodeDocument CreateCodeDocument( string content, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateCodeDocumentCore(content, fileKind, importSources, tagHelpers); private static RazorCodeDocument CreateCodeDocumentCore( @@ -161,7 +160,7 @@ private static RazorCodeDocument CreateCodeDocumentCore( string content, RazorFileKind? fileKind = null, ImmutableArray importSources = default, - IReadOnlyList? tagHelpers = null) + TagHelperCollection? tagHelpers = null) { var source = TestRazorSourceDocument.Create(content); @@ -174,7 +173,7 @@ public static RazorCodeDocument CreateDesignTimeCodeDocument(this RazorProjectEn public static RazorCodeDocument CreateDesignTimeCodeDocument( this RazorProjectEngine projectEngine, string content, - IReadOnlyList? tagHelpers) + TagHelperCollection? tagHelpers) => projectEngine.CreateDesignTimeCodeDocumentCore(content, tagHelpers: tagHelpers); public static RazorCodeDocument CreateDesignTimeCodeDocument(this RazorProjectEngine projectEngine, string content, RazorFileKind fileKind) @@ -184,7 +183,7 @@ public static RazorCodeDocument CreateDesignTimeCodeDocument( this RazorProjectEngine projectEngine, string content, RazorFileKind fileKind, - IReadOnlyList? tagHelpers) + TagHelperCollection? tagHelpers) => projectEngine.CreateDesignTimeCodeDocumentCore(content, fileKind, tagHelpers: tagHelpers); public static RazorCodeDocument CreateDesignTimeCodeDocument( @@ -197,7 +196,7 @@ public static RazorCodeDocument CreateDesignTimeCodeDocument( this RazorProjectEngine projectEngine, string content, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateDesignTimeCodeDocumentCore(content, importSources: importSources, tagHelpers: tagHelpers); public static RazorCodeDocument CreateDesignTimeCodeDocument( @@ -212,7 +211,7 @@ public static RazorCodeDocument CreateDesignTimeCodeDocument( string content, RazorFileKind fileKind, ImmutableArray importSources, - IReadOnlyList tagHelpers) + TagHelperCollection tagHelpers) => projectEngine.CreateDesignTimeCodeDocumentCore(content, fileKind, importSources, tagHelpers); private static RazorCodeDocument CreateDesignTimeCodeDocumentCore( @@ -220,38 +219,40 @@ private static RazorCodeDocument CreateDesignTimeCodeDocumentCore( string content, RazorFileKind? fileKind = null, ImmutableArray importSources = default, - IReadOnlyList? tagHelpers = null) + TagHelperCollection? tagHelpers = null) { var source = TestRazorSourceDocument.Create(content); return projectEngine.CreateDesignTimeCodeDocument(source, fileKind ?? DefaultFileKind, importSources, tagHelpers); } - public static void ExecutePhasesThrough( + public static RazorCodeDocument ExecutePhasesThrough( this RazorProjectEngine projectEngine, RazorCodeDocument codeDocument) where T : IRazorEnginePhase { foreach (var phase in projectEngine.Engine.Phases) { - phase.Execute(codeDocument); + codeDocument = phase.Execute(codeDocument); if (phase is T) { break; } } + + return codeDocument; } - public static void ExecutePhase( + public static RazorCodeDocument ExecutePhase( this RazorProjectEngine projectEngine, RazorCodeDocument codeDocument) where T : IRazorEnginePhase, new() { - projectEngine.ExecutePhase(codeDocument, () => new()); + return projectEngine.ExecutePhase(codeDocument, () => new()); } - public static void ExecutePhase( + public static RazorCodeDocument ExecutePhase( this RazorProjectEngine projectEngine, RazorCodeDocument codeDocument, Func phaseFactory) @@ -260,7 +261,7 @@ public static void ExecutePhase( var pass = phaseFactory(); pass.Initialize(projectEngine.Engine); - pass.Execute(codeDocument); + return pass.Execute(codeDocument); } public static void ExecutePass( diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/TestTagHelperFeature.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/TestTagHelperFeature.cs index 1c025f604ae..f573bdc1774 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/TestTagHelperFeature.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/TestTagHelperFeature.cs @@ -1,25 +1,19 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; using System.Threading; namespace Microsoft.AspNetCore.Razor.Language; public class TestTagHelperFeature : RazorEngineFeatureBase, ITagHelperFeature { - public TestTagHelperFeature() - { - TagHelpers = []; - } + private TagHelperCollection? _tagHelpers; - public TestTagHelperFeature(IEnumerable tagHelpers) + public void SetTagHelpers(TagHelperCollection tagHelpers) { - TagHelpers = [.. tagHelpers]; + _tagHelpers = tagHelpers; } - public List TagHelpers { get; } - - public IReadOnlyList GetDescriptors(CancellationToken cancellationToken = default) - => [.. TagHelpers]; + public TagHelperCollection GetTagHelpers(CancellationToken cancellationToken = default) + => _tagHelpers ?? []; } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/TestTagMatchingRuleDescriptorBuilderExtensions.cs b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/TestTagMatchingRuleDescriptorBuilderExtensions.cs index 705e3768fe9..c7e1aa65e80 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/TestTagMatchingRuleDescriptorBuilderExtensions.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Test.Common/Language/TestTagMatchingRuleDescriptorBuilderExtensions.cs @@ -4,7 +4,6 @@ #nullable disable using System; -using Microsoft.CodeAnalysis; namespace Microsoft.AspNetCore.Razor.Language; diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/PooledObjects/PooledHashSetTests.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/PooledObjects/PooledHashSetTests.cs new file mode 100644 index 00000000000..863f72d1eb4 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/PooledObjects/PooledHashSetTests.cs @@ -0,0 +1,661 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Xunit; + +namespace Microsoft.AspNetCore.Razor.Utilities.Shared.Test.PooledObjects; + +public class PooledHashSetTests +{ + [Fact] + public void Constructor_Default_CreatesEmptySet() + { + using var set = new PooledHashSet(); + + Assert.Equal(0, set.Count); + } + + [Fact] + public void Constructor_WithCapacity_CreatesEmptySet() + { + using var set = new PooledHashSet(10); + + Assert.Equal(0, set.Count); + } + + [Fact] + public void Constructor_WithComparer_CreatesEmptySet() + { + using var set = new PooledHashSet(StringComparer.OrdinalIgnoreCase); + + Assert.Equal(0, set.Count); + } + + [Fact] + public void Constructor_WithComparerAndCapacity_CreatesEmptySet() + { + using var set = new PooledHashSet(StringComparer.OrdinalIgnoreCase, 10); + + Assert.Equal(0, set.Count); + } + + [Fact] + public void Constructor_WithPool_CreatesEmptySet() + { + var pool = HashSetPool.Default; + using var set = new PooledHashSet(pool); + + Assert.Equal(0, set.Count); + } + + [Fact] + public void Constructor_WithPoolAndCapacity_CreatesEmptySet() + { + var pool = HashSetPool.Default; + using var set = new PooledHashSet(pool, 10); + + Assert.Equal(0, set.Count); + } + + [Fact] + public void Add_SingleItem_ReturnsTrue() + { + using var set = new PooledHashSet(); + + var result = set.Add(42); + + Assert.True(result); + Assert.Equal(1, set.Count); + } + + [Fact] + public void Add_DuplicateSingleItem_ReturnsFalse() + { + using var set = new PooledHashSet(); + + set.Add(42); + var result = set.Add(42); + + Assert.False(result); + Assert.Equal(1, set.Count); + } + + [Fact] + public void Add_TwoItems_CreatesHashSet() + { + using var set = new PooledHashSet(); + + var result1 = set.Add(42); + var result2 = set.Add(24); + + Assert.True(result1); + Assert.True(result2); + Assert.Equal(2, set.Count); + } + + [Fact] + public void Add_DuplicateInHashSet_ReturnsFalse() + { + using var set = new PooledHashSet(); + + set.Add(42); + set.Add(24); + var result = set.Add(42); + + Assert.False(result); + Assert.Equal(2, set.Count); + } + + [Fact] + public void Add_WithCustomComparer_UsesSameComparerForSingleItem() + { + using var set = new PooledHashSet(StringComparer.OrdinalIgnoreCase); + + set.Add("Hello"); + var result = set.Add("HELLO"); + + Assert.False(result); + Assert.Equal(1, set.Count); + } + + [Fact] + public void Add_WithCustomComparer_UsesSameComparerForHashSet() + { + using var set = new PooledHashSet(StringComparer.OrdinalIgnoreCase); + + set.Add("Hello"); + set.Add("World"); + var result = set.Add("HELLO"); + + Assert.False(result); + Assert.Equal(2, set.Count); + } + + [Fact] + public void Contains_EmptySet_ReturnsFalse() + { + using var set = new PooledHashSet(); + + var result = set.Contains(42); + + Assert.False(result); + } + + [Fact] + public void Contains_SingleItem_Exists_ReturnsTrue() + { + using var set = new PooledHashSet(); + set.Add(42); + + var result = set.Contains(42); + + Assert.True(result); + } + + [Fact] + public void Contains_SingleItem_DoesNotExist_ReturnsFalse() + { + using var set = new PooledHashSet(); + set.Add(42); + + var result = set.Contains(24); + + Assert.False(result); + } + + [Fact] + public void Contains_HashSet_Exists_ReturnsTrue() + { + using var set = new PooledHashSet(); + set.Add(42); + set.Add(24); + + var result = set.Contains(42); + + Assert.True(result); + } + + [Fact] + public void Contains_HashSet_DoesNotExist_ReturnsFalse() + { + using var set = new PooledHashSet(); + set.Add(42); + set.Add(24); + + var result = set.Contains(99); + + Assert.False(result); + } + + [Fact] + public void Contains_WithCustomComparer_UsesSameComparerForSingleItem() + { + using var set = new PooledHashSet(StringComparer.OrdinalIgnoreCase); + set.Add("Hello"); + + var result = set.Contains("HELLO"); + + Assert.True(result); + } + + [Fact] + public void Contains_WithCustomComparer_UsesSameComparerForHashSet() + { + using var set = new PooledHashSet(StringComparer.OrdinalIgnoreCase); + set.Add("Hello"); + set.Add("World"); + + var result = set.Contains("HELLO"); + + Assert.True(result); + } + + [Fact] + public void Count_EmptySet_ReturnsZero() + { + using var set = new PooledHashSet(); + + Assert.Equal(0, set.Count); + } + + [Fact] + public void Count_SingleItem_ReturnsOne() + { + using var set = new PooledHashSet(); + set.Add(42); + + Assert.Equal(1, set.Count); + } + + [Fact] + public void Count_MultipleItems_ReturnsCorrectCount() + { + using var set = new PooledHashSet(); + set.Add(42); + set.Add(24); + set.Add(99); + + Assert.Equal(3, set.Count); + } + + [Fact] + public void ToArray_EmptySet_ReturnsEmptyArray() + { + using var set = new PooledHashSet(); + + var result = set.ToArray(); + + Assert.Empty(result); + } + + [Fact] + public void ToArray_SingleItem_ReturnsArrayWithSingleItem() + { + using var set = new PooledHashSet(); + set.Add(42); + + var result = set.ToArray(); + + Assert.Single(result); + Assert.Equal(42, result[0]); + } + + [Fact] + public void ToArray_MultipleItems_ReturnsArrayWithAllItems() + { + using var set = new PooledHashSet(); + set.Add(42); + set.Add(24); + set.Add(99); + + var result = set.ToArray(); + + Assert.Equal(3, result.Length); + Assert.Contains(42, result); + Assert.Contains(24, result); + Assert.Contains(99, result); + } + + [Fact] + public void ToImmutableArray_EmptySet_ReturnsEmptyImmutableArray() + { + using var set = new PooledHashSet(); + + var result = set.ToImmutableArray(); + + Assert.True(result.IsEmpty); + } + + [Fact] + public void ToImmutableArray_SingleItem_ReturnsImmutableArrayWithSingleItem() + { + using var set = new PooledHashSet(); + set.Add(42); + + var result = set.ToImmutableArray(); + + Assert.Single(result); + Assert.Equal(42, result[0]); + } + + [Fact] + public void ToImmutableArray_MultipleItems_ReturnsImmutableArrayWithAllItems() + { + using var set = new PooledHashSet(); + set.Add(42); + set.Add(24); + set.Add(99); + + var result = set.ToImmutableArray(); + + Assert.Equal(3, result.Length); + Assert.Contains(42, result); + Assert.Contains(24, result); + Assert.Contains(99, result); + } + + [Fact] + public void OrderByAsArray_EmptySet_ReturnsEmptyImmutableArray() + { + using var set = new PooledHashSet(); + + var result = set.OrderByAsArray(x => x); + + Assert.True(result.IsEmpty); + } + + [Fact] + public void OrderByAsArray_SingleItem_ReturnsImmutableArrayWithSingleItem() + { + using var set = new PooledHashSet(); + set.Add(42); + + var result = set.OrderByAsArray(x => x); + + Assert.Single(result); + Assert.Equal(42, result[0]); + } + + [Fact] + public void OrderByAsArray_MultipleItems_ReturnsOrderedImmutableArray() + { + using var set = new PooledHashSet(); + set.Add(99); + set.Add(24); + set.Add(42); + + var result = set.OrderByAsArray(x => x); + + Assert.Equal(3, result.Length); + Assert.Equal(24, result[0]); + Assert.Equal(42, result[1]); + Assert.Equal(99, result[2]); + } + + [Fact] + public void UnionWith_ImmutableArray_Empty_NoChange() + { + using var set = new PooledHashSet(); + set.Add(42); + + ImmutableArray other = []; + set.UnionWith(other); + + Assert.Equal(1, set.Count); + Assert.True(set.Contains(42)); + } + + [Fact] + public void UnionWith_ImmutableArray_Default_NoChange() + { + using var set = new PooledHashSet(); + set.Add(42); + + ImmutableArray other = default; + set.UnionWith(other); + + Assert.Equal(1, set.Count); + Assert.True(set.Contains(42)); + } + + [Fact] + public void UnionWith_ImmutableArray_SingleItem_AddsItem() + { + using var set = new PooledHashSet(); + + ImmutableArray other = [42]; + set.UnionWith(other); + + Assert.Equal(1, set.Count); + Assert.True(set.Contains(42)); + } + + [Fact] + public void UnionWith_ImmutableArray_MultipleItems_AddsAllItems() + { + using var set = new PooledHashSet(); + + ImmutableArray other = [42, 24, 99]; + set.UnionWith(other); + + Assert.Equal(3, set.Count); + Assert.True(set.Contains(42)); + Assert.True(set.Contains(24)); + Assert.True(set.Contains(99)); + } + + [Fact] + public void UnionWith_ImmutableArray_WithExistingItems_UnionCorrectly() + { + using var set = new PooledHashSet(); + set.Add(42); + + ImmutableArray other = [24, 99, 42]; + set.UnionWith(other); + + Assert.Equal(3, set.Count); + Assert.True(set.Contains(42)); + Assert.True(set.Contains(24)); + Assert.True(set.Contains(99)); + } + + [Fact] + public void UnionWith_ReadOnlyList_Null_NoChange() + { + using var set = new PooledHashSet(); + set.Add(42); + + IReadOnlyList? other = null; + set.UnionWith(other); + + Assert.Equal(1, set.Count); + Assert.True(set.Contains(42)); + } + + [Fact] + public void UnionWith_ReadOnlyList_Empty_NoChange() + { + using var set = new PooledHashSet(); + set.Add(42); + + set.UnionWith(Array.Empty()); + + Assert.Equal(1, set.Count); + Assert.True(set.Contains(42)); + } + + [Fact] + public void UnionWith_ReadOnlyList_SingleItem_AddsItem() + { + using var set = new PooledHashSet(); + + int[] other = [42]; + set.UnionWith(other); + + Assert.Equal(1, set.Count); + Assert.True(set.Contains(42)); + } + + [Fact] + public void UnionWith_ReadOnlyList_MultipleItems_AddsAllItems() + { + using var set = new PooledHashSet(); + + int[] other = [42, 24, 99]; + set.UnionWith(other); + + Assert.Equal(3, set.Count); + Assert.True(set.Contains(42)); + Assert.True(set.Contains(24)); + Assert.True(set.Contains(99)); + } + + [Fact] + public void UnionWith_ReadOnlyList_WithExistingItems_UnionCorrectly() + { + using var set = new PooledHashSet(); + set.Add(42); + + int[] other = [24, 99, 42]; + set.UnionWith(other); + + Assert.Equal(3, set.Count); + Assert.True(set.Contains(42)); + Assert.True(set.Contains(24)); + Assert.True(set.Contains(99)); + } + + [Fact] + public void ClearAndFree_EmptySet_DoesNotThrow() + { + var set = new PooledHashSet(); + + set.ClearAndFree(); + + Assert.Equal(0, set.Count); + } + + [Fact] + public void ClearAndFree_SingleItem_ClearsSet() + { + var set = new PooledHashSet(); + set.Add(42); + + set.ClearAndFree(); + + Assert.Equal(0, set.Count); + Assert.False(set.Contains(42)); + } + + [Fact] + public void ClearAndFree_MultipleItems_ClearsSet() + { + var set = new PooledHashSet(); + set.Add(42); + set.Add(24); + + set.ClearAndFree(); + + Assert.Equal(0, set.Count); + Assert.False(set.Contains(42)); + Assert.False(set.Contains(24)); + } + + [Fact] + public void Dispose_CallsClearAndFree() + { + var set = new PooledHashSet(); + set.Add(42); + set.Add(24); + + set.Dispose(); + + Assert.Equal(0, set.Count); + Assert.False(set.Contains(42)); + Assert.False(set.Contains(24)); + } + + [Fact] + public void UsingStatement_AutomaticallyDisposesSet() + { + PooledHashSet capturedSet; + + using (var set = new PooledHashSet()) + { + set.Add(42); + set.Add(24); + capturedSet = set; + Assert.Equal(2, capturedSet.Count); + } + + // After using statement, set should be disposed + Assert.Equal(0, capturedSet.Count); + } + + [Fact] + public void MultipleOperations_WorkCorrectly() + { + using var set = new PooledHashSet(); + + // Start with single item optimization + Assert.True(set.Add("first")); + Assert.Equal(1, set.Count); + Assert.True(set.Contains("first")); + + // Transition to HashSet + Assert.True(set.Add("second")); + Assert.Equal(2, set.Count); + Assert.True(set.Contains("first")); + Assert.True(set.Contains("second")); + + // Add more items + Assert.True(set.Add("third")); + Assert.False(set.Add("first")); // Duplicate + Assert.Equal(3, set.Count); + + // Union with array + string[] other = ["fourth", "first", "fifth"]; + set.UnionWith(other); + Assert.Equal(5, set.Count); + + // Check final state + var array = set.ToArray(); + Assert.Equal(5, array.Length); + Assert.Contains("first", array); + Assert.Contains("second", array); + Assert.Contains("third", array); + Assert.Contains("fourth", array); + Assert.Contains("fifth", array); + } + + [Fact] + public void StringComparer_Ordinal_WorksCorrectly() + { + using var set = new PooledHashSet(StringComparer.Ordinal); + + set.Add("Hello"); + set.Add("hello"); + + Assert.Equal(2, set.Count); + Assert.True(set.Contains("Hello")); + Assert.True(set.Contains("hello")); + Assert.False(set.Contains("HELLO")); + } + + [Fact] + public void StringComparer_OrdinalIgnoreCase_WorksCorrectly() + { + using var set = new PooledHashSet(StringComparer.OrdinalIgnoreCase); + + set.Add("Hello"); + Assert.False(set.Add("hello")); + Assert.False(set.Add("HELLO")); + + Assert.Equal(1, set.Count); + Assert.True(set.Contains("Hello")); + Assert.True(set.Contains("hello")); + Assert.True(set.Contains("HELLO")); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(10)] + [InlineData(100)] + public void Capacity_Constructor_DoesNotAffectFunctionality(int capacity) + { + using var set = new PooledHashSet(capacity); + + for (var i = 0; i < 50; i++) + { + set.Add(i); + } + + Assert.Equal(50, set.Count); + + for (var i = 0; i < 50; i++) + { + Assert.True(set.Contains(i)); + } + } + + [Fact] + public void OrderByAsArray_WithComplexKeySelector_WorksCorrectly() + { + using var set = new PooledHashSet(); + set.Add("apple"); + set.Add("banana"); + set.Add("cherry"); + + var result = set.OrderByAsArray(s => s.Length); + + Assert.Equal(3, result.Length); + Assert.Equal("apple", result[0]); // Length 5 + Assert.Equal("banana", result[1]); // Length 6 + Assert.Equal("cherry", result[2]); // Length 6 (stable sort) + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/PooledObjects/TestArrayBuilderPool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/PooledObjects/TestArrayBuilderPool`1.cs index d7b8feb1109..1554e3b28ec 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/PooledObjects/TestArrayBuilderPool`1.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/PooledObjects/TestArrayBuilderPool`1.cs @@ -3,17 +3,16 @@ using System.Collections.Immutable; using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.Utilities.Shared.Test.PooledObjects; internal static class TestArrayBuilderPool { - public static ObjectPool.Builder> Create( - IPooledObjectPolicy.Builder>? policy = null, int size = 1) - => DefaultPool.Create(policy ?? NoReturnPolicy.Instance, size); + public static ArrayBuilderPool Create( + ArrayBuilderPool.PooledObjectPolicy? policy = null, int size = 1) + => ArrayBuilderPool.Create(policy ?? NoReturnPolicy.Instance, size); - public sealed class NoReturnPolicy : IPooledObjectPolicy.Builder> + public sealed class NoReturnPolicy : ArrayBuilderPool.PooledObjectPolicy { public static readonly NoReturnPolicy Instance = new(); @@ -21,10 +20,10 @@ private NoReturnPolicy() { } - public ImmutableArray.Builder Create() + public override ImmutableArray.Builder Create() => ImmutableArray.CreateBuilder(); - public bool Return(ImmutableArray.Builder obj) + public override bool Return(ImmutableArray.Builder obj) => false; } } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/Threading/CleanableWeakCacheTests.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/Threading/CleanableWeakCacheTests.cs new file mode 100644 index 00000000000..c2206d107b5 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/Threading/CleanableWeakCacheTests.cs @@ -0,0 +1,464 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNetCore.Razor.Utilities.Shared.Test.Threading; + +public class CleanableWeakCacheTests +{ + private record TestKey(string Value); + + private sealed class TestValue(string value) + { + public string Value => value; + + public override string ToString() => value; + } + + private static void ForceGC() + { + GC.Collect(); + GC.WaitForPendingFinalizers(); + GC.Collect(); + } + + [Fact] + public void Constructor_ValidCleanupThreshold_CreatesInstance() + { + var cache = new CleanableWeakCache(10); + + Assert.NotNull(cache); + } + + [Theory] + [InlineData(0)] + [InlineData(-1)] + [InlineData(-10)] + public void Constructor_InvalidCleanupThreshold_ThrowsArgumentOutOfRangeException(int cleanupThreshold) + { + Assert.Throws(() => new CleanableWeakCache(cleanupThreshold)); + } + + [Fact] + public void GetOrAdd_WithValue_NewKey_ReturnsProvidedValue() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + var value = new TestValue("test"); + + var result = cache.GetOrAdd(Key, value); + + Assert.Same(value, result); + } + + [Fact] + public void GetOrAdd_WithValue_ExistingKey_ReturnsExistingValue() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + var existingValue = new TestValue("existing"); + var newValue = new TestValue("new"); + + cache.GetOrAdd(Key, existingValue); + + var result = cache.GetOrAdd(Key, newValue); + + Assert.Same(existingValue, result); + Assert.NotSame(newValue, result); + } + + [Fact] + public void GetOrAdd_WithFactory_NewKey_ReturnsFactoryCreatedValue() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + var expectedValue = new TestValue("factory"); + + var result = cache.GetOrAdd(Key, () => expectedValue); + + Assert.Same(expectedValue, result); + } + + [Fact] + public void GetOrAdd_WithFactory_ExistingKey_ReturnsExistingValueWithoutCallingFactory() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + var existingValue = new TestValue("existing"); + var factoryCalled = false; + + cache.GetOrAdd(Key, existingValue); + + var result = cache.GetOrAdd(Key, () => + { + factoryCalled = true; + return new TestValue("factory"); + }); + + Assert.Same(existingValue, result); + Assert.False(factoryCalled); + } + + [Fact] + public void GetOrAdd_WithArgAndFactory_NewKey_ReturnsFactoryCreatedValue() + { + const string Key = "key1"; + const string Arg = "factory-arg"; + + var cache = new CleanableWeakCache(10); + + var result = cache.GetOrAdd(Key, Arg, argument => new TestValue(argument)); + + Assert.Equal(Arg, result.Value); + } + + [Fact] + public void GetOrAdd_WithArgAndFactory_ExistingKey_ReturnsExistingValueWithoutCallingFactory() + { + const string Key = "key1"; + const string Arg = "factory-arg"; + + var cache = new CleanableWeakCache(10); + var existingValue = new TestValue("existing"); + var factoryCalled = false; + + cache.GetOrAdd(Key, existingValue); + + var result = cache.GetOrAdd(Key, Arg, argument => + { + factoryCalled = true; + return new TestValue(argument); + }); + + Assert.Same(existingValue, result); + Assert.False(factoryCalled); + } + + [Fact] + public void TryAdd_NewKey_ReturnsTrue() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + var value = new TestValue("test"); + + var result = cache.TryAdd(Key, value); + + Assert.True(result); + } + + [Fact] + public void TryAdd_ExistingKey_ReturnsFalse() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + var existingValue = new TestValue("existing"); + var newValue = new TestValue("new"); + + cache.TryAdd(Key, existingValue); + + var result = cache.TryAdd(Key, newValue); + + Assert.False(result); + } + + [Fact] + public void TryGet_ExistingKey_ReturnsTrueAndValue() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + var value = new TestValue("test"); + + cache.TryAdd(Key, value); + + Assert.True(cache.TryGet(Key, out var retrievedValue)); + Assert.Same(value, retrievedValue); + } + + [Fact] + public void TryGet_NonExistentKey_ReturnsFalseAndNull() + { + var cache = new CleanableWeakCache(10); + + Assert.False(cache.TryGet("nonexistent", out var value)); + Assert.Null(value); + } + + [Fact] + public void Cache_HandlesGarbageCollectedValues() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + + // Add a value that will be garbage collected - use local static method to ensure object goes out of scope + AddTemporaryValue(cache, Key); + + ForceGC(); + + // Try to get the value after GC + Assert.False(cache.TryGet(Key, out var value)); + Assert.Null(value); + + static void AddTemporaryValue(CleanableWeakCache cache, string key) + { + // This ensures the TestValue object goes out of scope after this method returns + cache.TryAdd(key, new TestValue("temporary")); + } + } + + [Fact] + public void Cache_ReplacesGarbageCollectedValue_WithNewValue() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + + // Add a value that will be garbage collected - use local static method to ensure object goes out of scope + AddTemporaryValue(cache, Key); + + ForceGC(); + + var newValue = new TestValue("new"); + + // Add a new value for the same key + var result = cache.GetOrAdd(Key, newValue); + + Assert.Same(newValue, result); + + static void AddTemporaryValue(CleanableWeakCache cache, string key) + { + // This ensures the TestValue object goes out of scope after this method returns + cache.TryAdd(key, new TestValue("temporary")); + } + } + + [Fact] + public void Cache_PerformsCleanupAtThreshold() + { + const string Key1 = "key1"; + const string Key2 = "key2"; + const string Key3 = "key3"; + const string Key4 = "key4"; + + var cache = new CleanableWeakCache(3); + + // Add values that will be garbage collected - use local static method to ensure objects go out of scope + AddTemporaryValues(cache, Key1, Key2); + + ForceGC(); + + // Keep a strong reference to this value + var persistentValue = new TestValue("persistent"); + cache.TryAdd(Key3, persistentValue); + + // This should trigger cleanup (3rd add operation) + var newValue = new TestValue("new"); + cache.TryAdd(Key4, newValue); + + // Verify the dead references were cleaned up + Assert.False(cache.TryGet(Key1, out _)); + Assert.False(cache.TryGet(Key2, out _)); + Assert.True(cache.TryGet(Key3, out var key3Value)); + Assert.Same(persistentValue, key3Value); + Assert.True(cache.TryGet(Key4, out var key4Value)); + Assert.Same(newValue, key4Value); + + static void AddTemporaryValues(CleanableWeakCache cache, string key1, string key2) + { + // These objects will go out of scope after this method returns + cache.TryAdd(key1, new TestValue("temp1")); + cache.TryAdd(key2, new TestValue("temp2")); + } + } + + [Fact] + public async Task Cache_ThreadSafety_ConcurrentAccess() + { + const int CleanUpThreshold = 1000; + const int IterationsPerTask = 100; + + var cache = new CleanableWeakCache(CleanUpThreshold); + var taskCount = Environment.ProcessorCount * 2; + var tasks = new Task[taskCount]; + + for (var i = 0; i < taskCount; i++) + { + var taskId = i; + tasks[i] = Task.Run(() => + { + for (var j = 0; j < IterationsPerTask; j++) + { + var key = (taskId * IterationsPerTask) + j; + var value = new TestValue($"Task{taskId}-Value{j}"); + + // Perform various operations concurrently + cache.TryAdd(key, value); + cache.TryGet(key, out _); + cache.GetOrAdd(key, () => new TestValue("Factory")); + cache.GetOrAdd(key, "arg", arg => new TestValue(arg)); + } + }); + } + + await Task.WhenAll(tasks); + + // No deadlocks or exceptions should occur + // Verify that we can still access the cache + var testKey = 0; + var testValue = new TestValue("test"); + var result = cache.GetOrAdd(testKey, testValue); + Assert.NotNull(result); + } + + [Fact] + public async Task Cache_ThreadSafety_ConcurrentFactoryExecution() + { + const string Key = "shared-key"; + + var cache = new CleanableWeakCache(100); + var taskCount = Environment.ProcessorCount * 2; + var tasks = new Task[taskCount]; + + // Multiple threads trying to create the same value + for (var i = 0; i < taskCount; i++) + { + tasks[i] = Task.Run(() => + { + return cache.GetOrAdd(Key, () => + { + Thread.Sleep(10); // Simulate some work + return new TestValue("shared-value"); + }); + }); + } + + var results = await Task.WhenAll(tasks); + + // All results should be the same instance (the important guarantee) + var firstResult = results[0]; + Assert.NotNull(firstResult); + Assert.Equal("shared-value", firstResult.Value); + + for (var i = 1; i < results.Length; i++) + { + Assert.Same(firstResult, results[i]); + } + + // Verify the value is properly cached + Assert.True(cache.TryGet(Key, out var cachedValue)); + Assert.Same(firstResult, cachedValue); + } + + [Fact] + public void Cache_HandlesNullKeys_ThrowsException() + { + var cache = new CleanableWeakCache(10); + var value = new TestValue("test"); + + Assert.Throws(() => cache.GetOrAdd(null!, value)); + Assert.Throws(() => cache.GetOrAdd(null!, () => value)); + Assert.Throws(() => cache.GetOrAdd(null!, "arg", _ => value)); + Assert.Throws(() => cache.TryAdd(null!, value)); + Assert.Throws(() => cache.TryGet(null!, out _)); + } + + [Fact] + public void Cache_HandlesNullValues() + { + var cache = new CleanableWeakCache(10); + + // These should work without throwing (null values are allowed for reference types) + var result1 = cache.GetOrAdd("key1", (TestValue?)null); + var result2 = cache.GetOrAdd("key2", () => null); + var result3 = cache.GetOrAdd("key3", "arg", _ => null); + var added = cache.TryAdd("key4", null); + + Assert.Null(result1); + Assert.Null(result2); + Assert.Null(result3); + Assert.True(added); + } + + [Fact] + public void Cache_DifferentKeyTypes_WorkCorrectly() + { + // Test with int keys + var intCache = new CleanableWeakCache(10); + var intValue = new TestValue("int-value"); + intCache.TryAdd(42, intValue); + Assert.True(intCache.TryGet(42, out var retrievedIntValue)); + Assert.Same(intValue, retrievedIntValue); + + // Test with custom object keys + var record = new TestKey("test"); + var recordCache = new CleanableWeakCache(10); + var recordValue = new TestValue("record-value"); + recordCache.TryAdd(record, recordValue); + Assert.True(recordCache.TryGet(record, out var retrievedRecordValue)); + Assert.Same(recordValue, retrievedRecordValue); + } + + [Fact] + public void Cache_LargeNumberOfItems_PerformsWell() + { + const int CleanUpThreshold = 1000; + const int ItemCount = 10000; + + var cache = new CleanableWeakCache(CleanUpThreshold); + var values = new TestValue[ItemCount]; + + // Add many items + for (var i = 0; i < ItemCount; i++) + { + values[i] = new TestValue($"Value{i}"); + cache.TryAdd(i, values[i]); + } + + // Verify all items can be retrieved + for (var i = 0; i < ItemCount; i++) + { + Assert.True(cache.TryGet(i, out var value)); + Assert.Same(values[i], value); + } + } + + [Fact] + public void GetOrAdd_Factory_ExceptionInFactory_PropagatesException() + { + const string Key = "key1"; + + var cache = new CleanableWeakCache(10); + var expectedException = new InvalidOperationException("Test exception"); + + var actualException = Assert.Throws(() => + cache.GetOrAdd(Key, () => throw expectedException)); + + Assert.Same(expectedException, actualException); + } + + [Fact] + public void GetOrAdd_FactoryWithArg_ExceptionInFactory_PropagatesException() + { + const string Key = "key1"; + const string Arg = "arg"; + + var cache = new CleanableWeakCache(10); + var expectedException = new InvalidOperationException("Test exception"); + + var actualException = Assert.Throws(() => + cache.GetOrAdd(Key, Arg, _ => throw expectedException)); + + Assert.Same(expectedException, actualException); + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/Threading/LazyValueTests.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/Threading/LazyValueTests.cs new file mode 100644 index 00000000000..3e40e0f1874 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.Test/Threading/LazyValueTests.cs @@ -0,0 +1,494 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor.Threading; +using Xunit; + +namespace Microsoft.AspNetCore.Razor.Utilities.Shared.Test.Threading; + +public class LazyValueTests +{ + [Fact] + public void LazyValue_GetValue_CallsFactoryOnce() + { + // Arrange + var callCount = 0; + var lazy = new LazyValue(() => + { + Interlocked.Increment(ref callCount); + return "test-value"; + }); + + // Act + var result1 = lazy.GetValue(); + var result2 = lazy.GetValue(); + var result3 = lazy.GetValue(); + + // Assert + Assert.Equal("test-value", result1); + Assert.Equal("test-value", result2); + Assert.Equal("test-value", result3); + Assert.Equal(1, callCount); + } + + [Fact] + public void LazyValue_GetValue_ReturnsFactoryResult() + { + // Arrange + var expectedValue = new object(); + var lazy = new LazyValue(() => expectedValue); + + // Act + var result = lazy.GetValue(); + + // Assert + Assert.Same(expectedValue, result); + } + + [Fact] + public void LazyValue_GetValue_WorksWithValueTypes() + { + // Arrange + var lazy = new LazyValue(() => 42); + + // Act + var result = lazy.GetValue(); + + // Assert + Assert.Equal(42, result); + } + + [Fact] + public void LazyValue_GetValue_WorksWithNullValues() + { + // Arrange + var lazy = new LazyValue(() => null); + + // Act + var result = lazy.GetValue(); + + // Assert + Assert.Null(result); + } + + [Fact] + public void LazyValue_GetValue_PropagatesFactoryException() + { + // Arrange + var expectedException = new InvalidOperationException("Test exception"); + var lazy = new LazyValue(() => throw expectedException); + + // Act & Assert + var exception = Assert.Throws(() => lazy.GetValue()); + Assert.Same(expectedException, exception); + } + + [Fact] + public void LazyValue_GetValue_ExceptionDoesNotCacheValue() + { + // Arrange + var callCount = 0; + var lazy = new LazyValue(() => + { + var count = Interlocked.Increment(ref callCount); + if (count == 1) + { + throw new InvalidOperationException("First call fails"); + } + + return "success"; + }); + + // Act & Assert + Assert.Throws(() => lazy.GetValue()); + + // Second call should succeed and call factory again + var result = lazy.GetValue(); + Assert.Equal("success", result); + Assert.Equal(2, callCount); + } + + [Fact] + public async Task LazyValue_ConcurrentAccess_CallsFactoryOnce() + { + // Arrange + var callCount = 0; + using var barrier = new Barrier(10); + var lazy = new LazyValue(() => + { + Interlocked.Increment(ref callCount); + Thread.Sleep(10); // Simulate some work + return "concurrent-value"; + }); + + var results = new ConcurrentBag(); + var tasks = new Task[10]; + + // Act + for (var i = 0; i < 10; i++) + { + tasks[i] = Task.Run(() => + { + barrier.SignalAndWait(); // Ensure all threads start at the same time + var result = lazy.GetValue(); + results.Add(result); + }); + } + + await Task.WhenAll(tasks); + + // Assert + Assert.Equal(1, callCount); + Assert.Equal(10, results.Count); + Assert.All(results, result => Assert.Equal("concurrent-value", result)); + } + + [Fact] + public async Task LazyValue_StressTest_MaintainsConsistency() + { + // Arrange + const int ThreadCount = 100; + const int IterationsPerThread = 100; + var callCount = 0; + var lazy = new LazyValue(() => Interlocked.Increment(ref callCount)); + var allResults = new ConcurrentBag(); + + // Act + var tasks = new Task[ThreadCount]; + for (var i = 0; i < ThreadCount; i++) + { + tasks[i] = Task.Run(() => + { + for (var j = 0; j < IterationsPerThread; j++) + { + allResults.Add(lazy.GetValue()); + } + }); + } + + await Task.WhenAll(tasks); + + // Assert + Assert.Equal(1, callCount); + Assert.Equal(ThreadCount * IterationsPerThread, allResults.Count); + Assert.All(allResults, result => Assert.Equal(1, result)); + } + + [Fact] + public void LazyValueWithArg_GetValue_CallsFactoryOnce() + { + // Arrange + var callCount = 0; + var lazy = new LazyValue(arg => + { + Interlocked.Increment(ref callCount); + return $"processed-{arg}"; + }); + + // Act + var result1 = lazy.GetValue("input"); + var result2 = lazy.GetValue("different-input"); // Should ignore this arg + var result3 = lazy.GetValue("another-input"); // Should ignore this arg too + + // Assert + Assert.Equal("processed-input", result1); + Assert.Equal("processed-input", result2); + Assert.Equal("processed-input", result3); + Assert.Equal(1, callCount); + } + + [Fact] + public void LazyValueWithArg_GetValue_ReturnsFactoryResult() + { + // Arrange + var inputArg = new object(); + var expectedResult = new object(); + var lazy = new LazyValue(arg => + { + Assert.Same(inputArg, arg); + return expectedResult; + }); + + // Act + var result = lazy.GetValue(inputArg); + + // Assert + Assert.Same(expectedResult, result); + } + + [Fact] + public void LazyValueWithArg_GetValue_WorksWithValueTypes() + { + // Arrange + var lazy = new LazyValue(multiplier => $"Value: {multiplier * 10}"); + + // Act + var result = lazy.GetValue(5); + + // Assert + Assert.Equal("Value: 50", result); + } + + [Fact] + public void LazyValueWithArg_GetValue_WorksWithNullArg() + { + // Arrange + var lazy = new LazyValue(arg => $"Input was: {arg ?? "null"}"); + + // Act + var result = lazy.GetValue(null); + + // Assert + Assert.Equal("Input was: null", result); + } + + [Fact] + public void LazyValueWithArg_GetValue_WorksWithNullResult() + { + // Arrange + var lazy = new LazyValue(arg => null); + + // Act + var result = lazy.GetValue("test"); + + // Assert + Assert.Null(result); + } + + [Fact] + public void LazyValueWithArg_GetValue_PropagatesFactoryException() + { + // Arrange + var expectedException = new ArgumentException("Test exception"); + var lazy = new LazyValue(arg => throw expectedException); + + // Act & Assert + var exception = Assert.Throws(() => lazy.GetValue("test")); + Assert.Same(expectedException, exception); + } + + [Fact] + public void LazyValueWithArg_GetValue_ExceptionDoesNotCacheValue() + { + // Arrange + var callCount = 0; + var lazy = new LazyValue(arg => + { + var count = Interlocked.Increment(ref callCount); + if (count == 1) + { + throw new InvalidOperationException("First call fails"); + } + + return $"success-{arg}"; + }); + + // Act & Assert + Assert.Throws(() => lazy.GetValue("test")); + + // Second call should succeed and call factory again + var result = lazy.GetValue("test"); + Assert.Equal("success-test", result); + Assert.Equal(2, callCount); + } + + [Fact] + public async Task LazyValueWithArg_ConcurrentAccess_CallsFactoryOnce() + { + // Arrange + var callCount = 0; + using var barrier = new Barrier(10); + var lazy = new LazyValue(arg => + { + Interlocked.Increment(ref callCount); + Thread.Sleep(10); // Simulate some work + return $"concurrent-{arg}"; + }); + + var results = new ConcurrentBag(); + var tasks = new Task[10]; + + // Act + for (var i = 0; i < 10; i++) + { + var threadIndex = i; + tasks[i] = Task.Run(() => + { + barrier.SignalAndWait(); // Ensure all threads start at the same time + // Each thread passes a different argument, but only the first should be used + var result = lazy.GetValue($"input-{threadIndex}"); + results.Add(result); + }); + } + + await Task.WhenAll(tasks); + + // Assert + Assert.Equal(1, callCount); + Assert.Equal(10, results.Count); + // All results should be the same, using the argument from whichever thread won the race + var expectedPrefix = "concurrent-input-"; + Assert.All(results, result => Assert.StartsWith(expectedPrefix, result)); + + // All results should be identical + var firstResult = results.First(); + Assert.All(results, result => Assert.Equal(firstResult, result)); + } + + [Fact] + public void LazyValueWithArg_ExceptionRecovery() + { + var callCount = 0; + var lazy = new LazyValue(arg => + { + var count = Interlocked.Increment(ref callCount); + if (count == 1) + { + throw new InvalidOperationException($"First call fails with arg: {arg}"); + } + + return $"success-{arg}"; + }); + + // First call fails + Assert.Throws(() => lazy.GetValue(100)); + + // Second call succeeds + var result = lazy.GetValue(200); + Assert.Equal("success-200", result); + Assert.Equal(2, callCount); + } + + [Fact] + public void LazyValueWithArg_SubsequentCallsIgnoreArgument() + { + // Arrange + var receivedArgs = new ConcurrentBag(); + var lazy = new LazyValue(arg => + { + receivedArgs.Add(arg); + return $"result-{arg}"; + }); + + // Act + var result1 = lazy.GetValue("first"); + var result2 = lazy.GetValue("second"); + var result3 = lazy.GetValue("third"); + + // Assert + Assert.Equal("result-first", result1); + Assert.Equal("result-first", result2); // Same result, ignores "second" + Assert.Equal("result-first", result3); // Same result, ignores "third" + Assert.Single(receivedArgs); + Assert.Equal("first", receivedArgs.First()); + } + + [Fact] + public async Task LazyValueWithArg_StressTest_MaintainsConsistency() + { + // Arrange + const int ThreadCount = 50; + const int IterationsPerThread = 50; + var callCount = 0; + var lazy = new LazyValue(multiplier => + { + Interlocked.Increment(ref callCount); + return $"computed-{multiplier * 2}"; + }); + var allResults = new ConcurrentBag(); + + // Act + var tasks = new Task[ThreadCount]; + for (var i = 0; i < ThreadCount; i++) + { + var threadIndex = i; + tasks[i] = Task.Run(() => + { + for (var j = 0; j < IterationsPerThread; j++) + { + // Each thread uses a different argument, but only the first should matter + allResults.Add(lazy.GetValue(threadIndex + j)); + } + }); + } + + await Task.WhenAll(tasks); + + // Assert + Assert.Equal(1, callCount); + Assert.Equal(ThreadCount * IterationsPerThread, allResults.Count); + + // All results should be identical (from the winning thread's argument) + var firstResult = allResults.First(); + Assert.All(allResults, result => Assert.Equal(firstResult, result)); + Assert.StartsWith("computed-", firstResult); + } + + [Fact] + public void LazyValue_FactoryReturningLargeObject_WorksCorrectly() + { + // Arrange + var lazy = new LazyValue(() => new byte[1024 * 1024]); // 1MB array + + // Act + var result1 = lazy.GetValue(); + var result2 = lazy.GetValue(); + + // Assert + Assert.Same(result1, result2); // Should be the exact same instance + Assert.Equal(1024 * 1024, result1.Length); + } + + [Fact] + public void LazyValueWithArg_ComplexArgumentType_WorksCorrectly() + { + // Arrange + var complexArg = new { Name = "Test", Count = 42 }; + var lazy = new LazyValue(arg => $"Processed: {arg}"); + + // Act + var result = lazy.GetValue(complexArg); + + // Assert + Assert.Contains("Test", result); + Assert.Contains("42", result); + Assert.StartsWith("Processed: { Name = Test, Count = 42 }", result); + } + + [Fact] + public void LazyValue_FactoryAccessingClosureVariable_WorksCorrectly() + { + // Arrange + var capturedValue = "captured"; + var lazy = new LazyValue(() => $"Factory with {capturedValue}"); + + // Act + var result = lazy.GetValue(); + + // Assert + Assert.Equal("Factory with captured", result); + } + + [Fact] + public void LazyValueWithArg_StaticMethodFactory_AvoidsClosure() + { + // Arrange - This test demonstrates the closure-avoiding pattern + var lazy = new LazyValue(StaticFactoryMethod); + + // Act + var result = lazy.GetValue(42); + + // Assert + Assert.Equal("Static: 42", result); + + static string StaticFactoryMethod(int value) + { + return $"Static: {value}"; + } + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/EnumExtensions.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/EnumExtensions.cs index 64b082357f6..94079feb233 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/EnumExtensions.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/EnumExtensions.cs @@ -14,26 +14,24 @@ internal static class EnumExtensions public static unsafe void SetFlag(ref this T value, T flag) where T : unmanaged, Enum { - var v = (T*)Unsafe.AsPointer(ref value); - if (sizeof(T) == sizeof(byte)) { - *(byte*)v |= *(byte*)&flag; + Unsafe.As(ref value) |= *(byte*)&flag; return; } else if (sizeof(T) == sizeof(ushort)) { - *(ushort*)v |= *(ushort*)&flag; + Unsafe.As(ref value) |= *(ushort*)&flag; return; } else if (sizeof(T) == sizeof(uint)) { - *(uint*)v |= *(uint*)&flag; + Unsafe.As(ref value) |= *(uint*)&flag; return; } else if (sizeof(T) == sizeof(ulong)) { - *(ulong*)v |= *(ulong*)&flag; + Unsafe.As(ref value) |= *(ulong*)&flag; return; } @@ -45,26 +43,24 @@ public static unsafe void SetFlag(ref this T value, T flag) public static unsafe void ClearFlag(ref this T value, T flag) where T : unmanaged, Enum { - var v = (T*)Unsafe.AsPointer(ref value); - if (sizeof(T) == sizeof(byte)) { - *(byte*)v &= (byte)~*(byte*)&flag; + Unsafe.As(ref value) &= (byte)~*(byte*)&flag; return; } else if (sizeof(T) == sizeof(ushort)) { - *(ushort*)v &= (ushort)~*(ushort*)&flag; + Unsafe.As(ref value) &= (ushort)~*(ushort*)&flag; return; } else if (sizeof(T) == sizeof(uint)) { - *(uint*)v &= ~*(uint*)&flag; + Unsafe.As(ref value) &= ~*(uint*)&flag; return; } else if (sizeof(T) == sizeof(ulong)) { - *(ulong*)v &= ~*(ulong*)&flag; + Unsafe.As(ref value) &= ~*(ulong*)&flag; return; } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/InterlockedOperations.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/InterlockedOperations.cs index 7f5b40b56c0..6a00d045a86 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/InterlockedOperations.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/InterlockedOperations.cs @@ -1,14 +1,232 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.Diagnostics.CodeAnalysis; using System.Threading; namespace Microsoft.AspNetCore.Razor; +/// +/// Provides lock-free atomic operations for thread-safe initialization patterns. +/// +/// +/// This class implements common atomic initialization patterns using operations +/// and volatile memory access to ensure thread safety without locks. These patterns are useful for +/// lazy initialization scenarios where multiple threads might attempt to initialize the same value +/// concurrently. +/// internal static class InterlockedOperations { + // State constants for initialization tracking + private const int NotInitialized = 0; + private const int Initializing = 1; + private const int Initialized = 2; + + /// + /// Atomically initializes a reference type field if it is currently . + /// + /// The reference type of the target field. + /// A reference to the field to initialize. + /// The value to assign to the field if it is currently . + /// + /// The current value of if it was not , + /// or if was and was successfully initialized. + /// + /// + /// + /// This method uses to atomically + /// check if the target field is and assign the value if so. + /// If multiple threads call this method concurrently, only one will successfully set the value, + /// and all threads will receive the same result. + /// + /// + /// This is useful for simple lazy initialization scenarios where the initialization logic + /// is inexpensive and can be safely executed multiple times. + /// + /// + /// + /// + /// private static string? _cachedValue; + /// + /// public static string GetCachedValue() + /// { + /// return InterlockedOperations.Initialize(ref _cachedValue, ComputeExpensiveValue()); + /// } + /// + /// public static T Initialize([NotNull] ref T? target, T value) where T : class => Interlocked.CompareExchange(ref target, value, null) ?? value; + + /// + /// Atomically initializes a field using a factory function with guaranteed single execution. + /// + /// The type of the target field. + /// A reference to the field to initialize. + /// A reference to an integer field used to track initialization state. + /// A function that creates the value to assign to the target field. + /// The initialized value of the target field. + /// + /// + /// This method implements a lock-free lazy initialization pattern that guarantees the factory + /// function will be called exactly once, even when multiple threads attempt initialization + /// concurrently. The method uses a three-state protocol: + /// + /// + /// NotInitialized (0): The field has not been initialized. + /// Initializing (1): A thread is currently executing the factory. + /// Initialized (2): The field has been successfully initialized. + /// + /// + /// When multiple threads call this method: + /// + /// + /// One thread wins the race and executes the factory function. + /// Other threads wait using until initialization completes. + /// All threads receive the same initialized value. + /// + /// + /// This pattern is ideal for expensive initialization operations that should only be performed once. + /// + /// + /// is . + /// + /// + /// private static Dictionary<string, int>? _lookupTable; + /// private static int _lookupTableState; + /// + /// public static Dictionary<string, int> GetLookupTable() + /// { + /// return InterlockedOperations.Initialize( + /// ref _lookupTable, + /// ref _lookupTableState, + /// () => BuildExpensiveLookupTable()); + /// } + /// + /// + public static T Initialize(ref T target, ref int state, Func factory) + { + // Fast path: Are we already initialized? + if (Volatile.Read(ref state) == Initialized) + { + return target; + } + + // Try to claim the right to initialize + if (Interlocked.CompareExchange(ref state, Initializing, NotInitialized) == NotInitialized) + { + try + { + // We won the race, so we get to initialize + var newValue = factory(); + + target = newValue; + + // Mark as initialized + Volatile.Write(ref state, Initialized); + + return newValue; + } + catch + { + // Reset state so other threads (or retry) can attempt initialization + Volatile.Write(ref state, NotInitialized); + throw; + } + } + + // Another thread is or was initializing - wait for it to complete. + var spinWait = new SpinWait(); + + while (Volatile.Read(ref state) != Initialized) + { + spinWait.SpinOnce(); + } + + return target; + } + + /// + /// Atomically initializes a field using a factory function with an argument and guaranteed single execution. + /// + /// The type of the argument passed to the factory function. + /// The type of the target field. + /// A reference to the field to initialize. + /// A reference to an integer field used to track initialization state. + /// The argument to pass to the factory function. + /// A function that creates the value using the provided argument. + /// The initialized value of the target field. + /// + /// + /// This overload extends the basic initialization pattern to support factory functions that + /// require an argument. This is useful for avoiding closure allocations when the factory + /// needs to access external state. + /// + /// + /// The method follows the same three-state initialization protocol as + /// and provides the same thread-safety + /// guarantees with single execution of the factory function. + /// + /// + /// Using this overload with static factory methods can help avoid delegate allocations: + /// + /// + /// is . + /// + /// + /// private static Dictionary<Checksum, int>? _lookupTable; + /// private static int _lookupTableState; + /// + /// public static Dictionary<Checksum, int> GetLookupTable(IEnumerable<Item> items) + /// { + /// return InterlockedOperations.Initialize( + /// ref _lookupTable, + /// ref _lookupTableState, + /// items, + /// static items => BuildLookupTable(items)); // Static method avoids closure + /// } + /// + /// + public static T Initialize(ref T target, ref int state, TArg arg, Func factory) + { + // Fast path: Are we already initialized? + if (Volatile.Read(ref state) == Initialized) + { + return target; + } + + // Try to claim the right to initialize + if (Interlocked.CompareExchange(ref state, Initializing, NotInitialized) == NotInitialized) + { + try + { + // We won the race, so we get to initialize + var newValue = factory(arg); + + target = newValue; + + // Mark as initialized + Volatile.Write(ref state, Initialized); + + return newValue; + } + catch + { + // Reset state so other threads (or retry) can attempt initialization + Volatile.Write(ref state, NotInitialized); + throw; + } + } + + // Another thread is or was initializing - wait for it to complete. + var spinWait = new SpinWait(); + + while (Volatile.Read(ref state) != Initialized) + { + spinWait.SpinOnce(); + } + + return target; + } } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/LanguageSupport/OverloadResolutionPriorityAttribute.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/LanguageSupport/OverloadResolutionPriorityAttribute.cs new file mode 100644 index 00000000000..86831b3f4d5 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/LanguageSupport/OverloadResolutionPriorityAttribute.cs @@ -0,0 +1,36 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Copied from https://github.com/dotnet/runtime + +#if !NET9_0_OR_GREATER + +namespace System.Runtime.CompilerServices; + +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +internal sealed class OverloadResolutionPriorityAttribute : Attribute +{ + /// + /// Initializes a new instance of the class. + /// + /// The priority of the attributed member. Higher numbers are prioritized, lower numbers are deprioritized. 0 is the default if no attribute is present. + public OverloadResolutionPriorityAttribute(int priority) + { + Priority = priority; + } + + /// + /// The priority of the member. + /// + public int Priority { get; } +} + +#else + +using System.Runtime.CompilerServices; + +#pragma warning disable RS0016 // Add public types and members to the declared API (this is a supporting forwarder for an internal polyfill API) +[assembly: TypeForwardedTo(typeof(OverloadResolutionPriorityAttribute))] +#pragma warning restore RS0016 // Add public types and members to the declared API + +#endif diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.csproj b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.csproj index fa697d6eda7..cdfa22ae531 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.csproj +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Microsoft.AspNetCore.Razor.Utilities.Shared.csproj @@ -53,7 +53,6 @@ - @@ -63,7 +62,6 @@ - diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Optional`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Optional`1.cs new file mode 100644 index 00000000000..14a7e7f1ed3 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Optional`1.cs @@ -0,0 +1,20 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Razor; + +public readonly struct Optional(T value) +{ + public bool HasValue { get; } = true; + + public T Value { get; } = value; + + public T GetValueOrDefault(T defaultValue) + => HasValue ? Value : defaultValue; + + public static implicit operator Optional(T value) + => new(value); + + public override string ToString() + => HasValue ? Value?.ToString() ?? "null" : "unspecified"; +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.Policy.cs index 351e44fb014..51fb43f8988 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.Policy.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.Policy.cs @@ -2,31 +2,57 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Immutable; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; -internal static partial class ArrayBuilderPool +internal partial class ArrayBuilderPool { - private class Policy : IPooledObjectPolicy.Builder> + private sealed class Policy : PooledObjectPolicy { - public static readonly Policy Instance = new(); + // This is the default initial capacity for ImmutableArray.Builder. + private const int DefaultInitialCapacity = 8; - private Policy() + public static readonly Policy Default = new(DefaultInitialCapacity, DefaultMaximumObjectSize); + + private readonly int _initialCapacity; + private readonly int _maximumObjectSize; + + private Policy(int initialCapacity, int maximumObjectSize) { + ArgHelper.ThrowIfNegative(initialCapacity); + ArgHelper.ThrowIfNegative(maximumObjectSize); + + _initialCapacity = initialCapacity; + _maximumObjectSize = maximumObjectSize; + } + + public static Policy Create( + Optional initialCapacity = default, + Optional maximumObjectSize = default) + { + if ((!initialCapacity.HasValue || initialCapacity.Value == Default._initialCapacity) && + (!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize)) + { + return Default; + } + + return new( + initialCapacity.GetValueOrDefault(DefaultInitialCapacity), + maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize)); } - public ImmutableArray.Builder Create() => ImmutableArray.CreateBuilder(); + public override ImmutableArray.Builder Create() + => ImmutableArray.CreateBuilder(); - public bool Return(ImmutableArray.Builder builder) + public override bool Return(ImmutableArray.Builder builder) { var count = builder.Count; builder.Clear(); - if (count > DefaultPool.MaximumObjectSize) + if (count > _maximumObjectSize) { - builder.Capacity = DefaultPool.MaximumObjectSize; + builder.Capacity = _maximumObjectSize; } return true; diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.cs index 5c00d70d294..97105fdca2a 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Immutable; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -14,9 +13,23 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// Instances originating from this pool are intended to be short-lived and are suitable /// for temporary work. Do not return them as the results of methods or store them in fields. /// -internal static partial class ArrayBuilderPool +internal sealed partial class ArrayBuilderPool : CustomObjectPool.Builder> { - public static readonly ObjectPool.Builder> Default = DefaultPool.Create(Policy.Instance); + public static readonly ArrayBuilderPool Default = Create(); + + private ArrayBuilderPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + public static ArrayBuilderPool Create( + Optional initialCapacity = default, + Optional maximumObjectSize = default, + Optional poolSize = default) + => new(Policy.Create(initialCapacity, maximumObjectSize), poolSize); + + public static ArrayBuilderPool Create(PooledObjectPolicy policy, Optional poolSize = default) + => new(policy, poolSize); public static PooledObject.Builder> GetPooledObject() => Default.GetPooledObject(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/CustomObjectPool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/CustomObjectPool`1.cs new file mode 100644 index 00000000000..74f576d201e --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/CustomObjectPool`1.cs @@ -0,0 +1,25 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.Extensions.ObjectPool; + +namespace Microsoft.AspNetCore.Razor.PooledObjects; + +internal abstract class CustomObjectPool : DefaultObjectPool + where T : class +{ + protected const int DefaultPoolSize = DefaultPool.DefaultPoolSize; + protected const int DefaultMaximumObjectSize = DefaultPool.DefaultMaximumObjectSize; + + protected CustomObjectPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize.HasValue ? poolSize.Value : DefaultPoolSize) + { + } + + public abstract class PooledObjectPolicy : IPooledObjectPolicy + { + public abstract T Create(); + + public abstract bool Return(T obj); + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DefaultPool.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DefaultPool.cs index a420c84303d..c052b07928b 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DefaultPool.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DefaultPool.cs @@ -1,15 +1,53 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; internal static class DefaultPool { - public const int MaximumObjectSize = 512; + public const int DefaultPoolSize = 20; + public const int DefaultMaximumObjectSize = 512; - public static ObjectPool Create(IPooledObjectPolicy policy, int size = 20) + public static ObjectPool Create(IPooledObjectPolicy policy, Optional poolSize = default) where T : class - => new DefaultObjectPool(policy, size); + => new DefaultObjectPool(policy, poolSize.HasValue ? poolSize.Value : DefaultPoolSize); + + public static ObjectPool Create(Optional poolSize = default) + where T : class, IPoolableObject, new() + => Create(new PoolableObjectPolicy(static () => new()), poolSize); + + public static ObjectPool Create(Func factory, Optional poolSize = default) + where T : class, IPoolableObject + => Create(new PoolableObjectPolicy(factory), poolSize); + + public static ObjectPool Create(TArg arg, Func factory, Optional poolSize = default) + where T : class, IPoolableObject + => Create(new PoolableObjectPolicy(arg, factory), poolSize); + + private sealed class PoolableObjectPolicy(Func factory) : IPooledObjectPolicy + where T : class, IPoolableObject + { + public T Create() => factory(); + + public bool Return(T obj) + { + obj.Reset(); + return true; + } + } + + private sealed class PoolableObjectPolicy(TArg arg, Func factory) : IPooledObjectPolicy + where T : class, IPoolableObject + { + public T Create() => factory(arg); + + public bool Return(T obj) + { + obj.Reset(); + return true; + } + } } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.Policy.cs index 66d0e53d595..63f8e1fb73a 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.Policy.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.Policy.cs @@ -3,21 +3,36 @@ using System.Collections.Generic; using System.Collections.Immutable; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; -internal static partial class DictionaryBuilderPool +internal partial class DictionaryBuilderPool { - private class Policy(IEqualityComparer? keyComparer = null) : IPooledObjectPolicy.Builder> + private sealed class Policy : PooledObjectPolicy { - public static readonly Policy Instance = new(); + public static readonly Policy Default = new(keyComparer: null); - private readonly IEqualityComparer? _keyComparer = keyComparer; + private readonly IEqualityComparer? _keyComparer; - public ImmutableDictionary.Builder Create() => ImmutableDictionary.CreateBuilder(_keyComparer); + private Policy(IEqualityComparer? keyComparer) + { + _keyComparer = keyComparer; + } + + public static Policy Create(Optional?> keyComparer = default) + { + if (!keyComparer.HasValue || keyComparer.Value == Default._keyComparer) + { + return Default; + } + + return new(keyComparer.GetValueOrDefault(null)); + } + + public override ImmutableDictionary.Builder Create() + => ImmutableDictionary.CreateBuilder(_keyComparer); - public bool Return(ImmutableDictionary.Builder builder) + public override bool Return(ImmutableDictionary.Builder builder) { builder.Clear(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.cs index a200c7ac99f..e947fca6e52 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Immutable; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -15,17 +14,28 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// Instances originating from this pool are intended to be short-lived and are suitable /// for temporary work. Do not return them as the results of methods or store them in fields. /// -internal static partial class DictionaryBuilderPool +internal sealed partial class DictionaryBuilderPool : CustomObjectPool.Builder> where TKey : notnull { - public static readonly ObjectPool.Builder> Default = DefaultPool.Create(Policy.Instance); + public static readonly DictionaryBuilderPool Default = Create(); - public static ObjectPool.Builder> Create(IEqualityComparer comparer) - => DefaultPool.Create(new Policy(comparer)); + private DictionaryBuilderPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + public static DictionaryBuilderPool Create( + Optional?> keyComparer = default, + Optional poolSize = default) + => new(Policy.Create(keyComparer), poolSize); + + public static DictionaryBuilderPool Create(PooledObjectPolicy policy, Optional poolSize = default) + => new(policy, poolSize); public static PooledObject.Builder> GetPooledObject() => Default.GetPooledObject(); - public static PooledObject.Builder> GetPooledObject(out ImmutableDictionary.Builder builder) + public static PooledObject.Builder> GetPooledObject( + out ImmutableDictionary.Builder builder) => Default.GetPooledObject(out builder); } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.Policy.cs index 76d2fa5a610..1eee780818c 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.Policy.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.Policy.cs @@ -2,34 +2,52 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; -internal static partial class DictionaryPool +internal partial class DictionaryPool where TKey : notnull { - private class Policy : IPooledObjectPolicy> + private sealed class Policy : PooledObjectPolicy { - public static readonly Policy Instance = new(); + public static readonly Policy Default = new(comparer: null, DefaultMaximumObjectSize); private readonly IEqualityComparer? _comparer; + private readonly int _maximumObjectSize; - public Policy(IEqualityComparer? comparer = null) + private Policy(IEqualityComparer? comparer, int maximumObjectSize) { + ArgHelper.ThrowIfNegative(maximumObjectSize); + _comparer = comparer; + _maximumObjectSize = maximumObjectSize; + } + + public static Policy Create( + Optional?> comparer = default, + Optional maximumObjectSize = default) + { + if ((!comparer.HasValue || comparer.Value == Default._comparer) && + (!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize)) + { + return Default; + } + + return new( + comparer.GetValueOrDefault(null), + maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize)); } - public Dictionary Create() => new(_comparer); + public override Dictionary Create() => new(_comparer); - public bool Return(Dictionary map) + public override bool Return(Dictionary map) { var count = map.Count; map.Clear(); // If the map grew too large, don't return it to the pool. - return count <= DefaultPool.MaximumObjectSize; + return count <= _maximumObjectSize; } } } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.cs index e388a4932e9..d4f5bea63a8 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -14,13 +13,24 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// Instances originating from this pool are intended to be short-lived and are suitable /// for temporary work. Do not return them as the results of methods or store them in fields. /// -internal static partial class DictionaryPool +internal sealed partial class DictionaryPool : CustomObjectPool> where TKey : notnull { - public static readonly ObjectPool> Default = DefaultPool.Create(Policy.Instance); + public static readonly DictionaryPool Default = Create(); - public static ObjectPool> Create(IEqualityComparer comparer) - => DefaultPool.Create(new Policy(comparer)); + private DictionaryPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + public static DictionaryPool Create( + Optional?> comparer = default, + Optional maximumObjectSize = default, + Optional poolSize = default) + => new(Policy.Create(comparer, maximumObjectSize), poolSize); + + public static DictionaryPool Create(PooledObjectPolicy policy, Optional poolSize = default) + => new(policy, poolSize); public static PooledObject> GetPooledObject() => Default.GetPooledObject(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.Policy.cs index 7163d622f10..68813a44f91 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.Policy.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.Policy.cs @@ -2,32 +2,51 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; -internal static partial class HashSetPool +internal partial class HashSetPool { - private class Policy : IPooledObjectPolicy> + private sealed class Policy : PooledObjectPolicy { - public static readonly Policy Instance = new(); + public static readonly Policy Default = new(comparer: EqualityComparer.Default, DefaultMaximumObjectSize); - private readonly IEqualityComparer? _comparer; + public IEqualityComparer Comparer { get; } - public Policy(IEqualityComparer? comparer = null) + private readonly int _maximumObjectSize; + + private Policy(IEqualityComparer? comparer, int maximumObjectSize) + { + ArgHelper.ThrowIfNegative(maximumObjectSize); + + Comparer = comparer ?? EqualityComparer.Default; + _maximumObjectSize = maximumObjectSize; + } + + public static Policy Create( + Optional?> comparer = default, + Optional maximumObjectSize = default) { - _comparer = comparer; + if ((!comparer.HasValue || comparer.Value is null || comparer.Value == Default.Comparer) && + (!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize)) + { + return Default; + } + + return new( + comparer.GetValueOrDefault(EqualityComparer.Default) ?? EqualityComparer.Default, + maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize)); } - public HashSet Create() => new(_comparer); + public override HashSet Create() => new(Comparer); - public bool Return(HashSet set) + public override bool Return(HashSet set) { var count = set.Count; set.Clear(); - if (count > DefaultPool.MaximumObjectSize) + if (count > _maximumObjectSize) { set.TrimExcess(); } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.cs index 58b1de1216a..01b713979d0 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -14,12 +13,25 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// Instances originating from this pool are intended to be short-lived and are suitable /// for temporary work. Do not return them as the results of methods or store them in fields. /// -internal static partial class HashSetPool +internal sealed partial class HashSetPool : CustomObjectPool> { - public static readonly ObjectPool> Default = DefaultPool.Create(Policy.Instance); + public static readonly HashSetPool Default = Create(); - public static ObjectPool> Create(IEqualityComparer comparer) - => DefaultPool.Create(new Policy(comparer)); + private readonly Policy _policy; + + private HashSetPool(Policy policy, Optional poolSize) + : base(policy, poolSize) + { + _policy = policy; + } + + public IEqualityComparer Comparer => _policy.Comparer; + + public static HashSetPool Create( + Optional?> comparer = default, + Optional maximumObjectSize = default, + Optional poolSize = default) + => new(Policy.Create(comparer, maximumObjectSize), poolSize); public static PooledObject> GetPooledObject() => Default.GetPooledObject(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/IPoolableObject.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/IPoolableObject.cs new file mode 100644 index 00000000000..048d73cdebd --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/IPoolableObject.cs @@ -0,0 +1,9 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Razor.PooledObjects; + +internal interface IPoolableObject +{ + void Reset(); +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.Policy.cs index b9190fab670..a0ae4646a91 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.Policy.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.Policy.cs @@ -2,29 +2,41 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; -internal static partial class ListPool +internal partial class ListPool { - private class Policy : IPooledObjectPolicy> + private sealed class Policy : PooledObjectPolicy { - public static readonly Policy Instance = new(); + public static readonly Policy Default = new(DefaultMaximumObjectSize); - private Policy() + private readonly int _maximumObjectSize; + + private Policy(int maximumObjectSize) + { + _maximumObjectSize = maximumObjectSize; + } + + public static Policy Create(Optional maximumObjectSize = default) { + if (!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize) + { + return Default; + } + + return new(maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize)); } - public List Create() => new(); + public override List Create() => []; - public bool Return(List list) + public override bool Return(List list) { var count = list.Count; list.Clear(); - if (count > DefaultPool.MaximumObjectSize) + if (count > _maximumObjectSize) { list.TrimExcess(); } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.cs index 5383253c542..d07b8be3d18 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -14,12 +13,22 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// Instances originating from this pool are intended to be short-lived and are suitable /// for temporary work. Do not return them as the results of methods or store them in fields. /// -internal static partial class ListPool +internal sealed partial class ListPool : CustomObjectPool> { - public static readonly ObjectPool> Default = DefaultPool.Create(Policy.Instance); + public static readonly ListPool Default = Create(); - public static ObjectPool> Create(int size = 20) - => DefaultPool.Create(Policy.Instance, size); + private ListPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + public static ListPool Create( + Optional maximumObjectSize = default, + Optional poolSize = default) + => new(Policy.Create(maximumObjectSize), poolSize); + + public static ListPool Create(PooledObjectPolicy policy, Optional poolSize = default) + => new(policy, poolSize); public static PooledObject> GetPooledObject() => Default.GetPooledObject(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledArrayBuilder`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledArrayBuilder`1.cs index e1871439809..28fa62e2701 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledArrayBuilder`1.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledArrayBuilder`1.cs @@ -9,7 +9,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Microsoft.AspNetCore.Razor.Utilities; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -34,7 +33,7 @@ internal partial struct PooledArrayBuilder : IDisposable /// private const int InlineCapacity = 4; - private ObjectPool.Builder>? _builderPool; + private ArrayBuilderPool? _builderPool; /// /// A builder to be used as storage after the first time that the number @@ -59,7 +58,7 @@ internal partial struct PooledArrayBuilder : IDisposable /// private int _inlineCount; - public PooledArrayBuilder(int? capacity = null, ObjectPool.Builder>? builderPool = null) + public PooledArrayBuilder(int? capacity = null, ArrayBuilderPool? builderPool = null) { _capacity = capacity is > InlineCapacity ? capacity : null; _builderPool = builderPool; diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledDictionaryBuilder`2.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledDictionaryBuilder`2.cs index bb633e25da2..78abd353350 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledDictionaryBuilder`2.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledDictionaryBuilder`2.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -13,10 +12,10 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// it's needed. Note: Dispose this to ensure that the pooled array builder is returned /// to the pool. /// -internal ref struct PooledDictionaryBuilder(ObjectPool.Builder>? pool) +internal ref struct PooledDictionaryBuilder(DictionaryBuilderPool? pool) where TKey : notnull { - private readonly ObjectPool.Builder> _pool = pool ?? DictionaryBuilderPool.Default; + private readonly DictionaryBuilderPool _pool = pool ?? DictionaryBuilderPool.Default; private ImmutableDictionary.Builder? _builder; diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledHashSet`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledHashSet`1.cs index edbe6b26003..08b2d1430f6 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledHashSet`1.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledHashSet`1.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using Microsoft.Extensions.ObjectPool; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -15,80 +17,228 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// internal ref struct PooledHashSet { - private readonly ObjectPool> _pool; -#pragma warning disable IDE0052 // Used in NET only code below. Called API doesn't exist on framework. + private readonly IEqualityComparer _comparer; + + // Used in NET only code below. Called API doesn't exist on framework. +#pragma warning disable IDE0052 private readonly int? _capacity; #pragma warning restore IDE0052 + + private HashSetPool? _pool; + private (bool hasValue, T value) _item; private HashSet? _set; public PooledHashSet() - : this(pool: null, capacity: null) { + _comparer = EqualityComparer.Default; } - public PooledHashSet(ObjectPool> pool) - : this(pool, capacity: null) + public PooledHashSet(int capacity) { + _comparer = EqualityComparer.Default; + _capacity = capacity; } - public PooledHashSet(int capacity) - : this(pool: null, capacity) + public PooledHashSet(IEqualityComparer comparer) { + ValidateComparer(comparer); + _comparer = comparer; } - public PooledHashSet(ObjectPool>? pool, int? capacity) + public PooledHashSet(IEqualityComparer comparer, int capacity) { - _pool = pool ?? HashSetPool.Default; + ValidateComparer(comparer); + _comparer = comparer; _capacity = capacity; } + public PooledHashSet(HashSetPool pool, int capacity) + { + _comparer = pool.Comparer; + _pool = pool; + _capacity = capacity; + } + + public PooledHashSet(HashSetPool pool) + { + _comparer = pool.Comparer; + _pool = pool; + } + + [Conditional("DEBUG")] + private static void ValidateComparer(IEqualityComparer comparer) + { + if (!ReferenceEquals(comparer, EqualityComparer.Default) && + !ReferenceEquals(comparer, StringComparer.Ordinal) && + !ReferenceEquals(comparer, StringComparer.OrdinalIgnoreCase)) + { + ThrowHelper.ThrowArgumentException(nameof(comparer), + "Only EqualityComparer.Default, StringComparer.Ordinal, and StringComparer.OrdinalIgnoreCase are supported. Please provide a pool."); + } + } + + private readonly IEqualityComparer Comparer => _comparer ?? EqualityComparer.Default; + + private readonly bool HasSingleItem => _item.hasValue && _set is null; + + [MemberNotNullWhen(false, nameof(_set))] + private readonly bool SetIsNullOrEmpty => _set is null || _set.Count == 0; + public void Dispose() { ClearAndFree(); } public readonly int Count - => _set?.Count ?? 0; + { + get + { + if (HasSingleItem) + { + return 1; + } + + if (SetIsNullOrEmpty) + { + return 0; + } + + return _set.Count; + } + } public bool Add(T item) { - _set ??= GetHashSet(); + if (_set is null) + { + // Optimized for the single item case. + if (!HasSingleItem) + { + _item.value = item; + _item.hasValue = true; + return true; + } + + if (Comparer.Equals(_item.value, item)) + { + // Duplicate of single item. + return false; + } + + _set = AcquireHashSet(); + } + return _set.Add(item); } public void ClearAndFree() { - if (_set is { } set) + if (_pool is not null && _set is { } set) { _pool.Return(set); - _set = null; } + + _set = null; + _pool = null; + _item = default; } public readonly bool Contains(T item) - => _set?.Contains(item) ?? false; + { + if (_set is null) + { + return _item.hasValue && Comparer.Equals(_item.value, item); + } + + return _set.Contains(item); + } public readonly T[] ToArray() - => _set?.ToArray() ?? []; + { + if (HasSingleItem) + { + return [_item.value]; + } + + if (SetIsNullOrEmpty) + { + return []; + } + + var result = new T[_set.Count]; + _set.CopyTo(result); + + return result; + } public readonly ImmutableArray ToImmutableArray() - => _set?.ToImmutableArray() ?? []; + { + return ImmutableCollectionsMarshal.AsImmutableArray(ToArray()); + } public readonly ImmutableArray OrderByAsArray(Func keySelector) - => _set?.OrderByAsArray(keySelector) ?? []; + { + if (HasSingleItem) + { + return [_item.value]; + } + + if (SetIsNullOrEmpty) + { + return []; + } + + return _set.OrderByAsArray(keySelector); + } + + public void UnionWith(ImmutableArray other) + { + if (other.IsDefaultOrEmpty) + { + return; + } + + if (other.Length == 1) + { + Add(other[0]); + return; + } + + _set ??= AcquireHashSet(); + + // Avoid boxing the ImmutableArray + var array = ImmutableCollectionsMarshal.AsArray(other)!; - public void UnionWith(IList? other) + _set.UnionWith(array); + } + + public void UnionWith(IReadOnlyList? other) { - if (other?.Count > 0) + if (other is null || other.Count == 0) { - _set ??= GetHashSet(); - _set.UnionWith(other); + return; } + + if (other.Count == 1) + { + Add(other[0]); + return; + } + + _set ??= AcquireHashSet(); + + _set.UnionWith(other); } - private readonly HashSet GetHashSet() + private HashSet AcquireHashSet() { - var result = _pool.Get(); + Debug.Assert(_set is null); + + _pool ??= TrySelectPool(Comparer); + + var result = _pool is not null + ? _pool.Get() + : new HashSet(Comparer); #if NET if (_capacity is int capacity) @@ -97,6 +247,35 @@ private readonly HashSet GetHashSet() } #endif + if (HasSingleItem) + { + result.Add(_item.value); + _item = default; + } + return result; + + static HashSetPool? TrySelectPool(IEqualityComparer comparer) + { + if (ReferenceEquals(comparer, EqualityComparer.Default)) + { + return HashSetPool.Default; + } + + if (typeof(T) == typeof(string)) + { + if (ReferenceEquals(comparer, StringComparer.Ordinal)) + { + return (HashSetPool)(object)SpecializedPools.StringHashSet.Ordinal; + } + + if (ReferenceEquals(comparer, StringComparer.OrdinalIgnoreCase)) + { + return (HashSetPool)(object)SpecializedPools.StringHashSet.OrdinalIgnoreCase; + } + } + + return null; + } } } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledList`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledList`1.cs index a3a3a4464c3..0ecab2f0283 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledList`1.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/PooledList`1.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -15,7 +14,7 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// internal ref partial struct PooledList { - private readonly ObjectPool> _pool; + private readonly ListPool _pool; private List? _list; public PooledList() @@ -23,7 +22,7 @@ public PooledList() { } - public PooledList(ObjectPool> pool) + public PooledList(ListPool pool) { _pool = pool; } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool.Policy.cs deleted file mode 100644 index 25de56e1322..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool.Policy.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.AspNetCore.Razor.PooledObjects; - -internal static partial class QueuePool -{ - private class Policy : IPooledObjectPolicy> - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public Queue Create() => new Queue(); - - public bool Return(Queue queue) - { - var count = queue.Count; - - queue.Clear(); - - if (count > DefaultPool.MaximumObjectSize) - { - queue.TrimExcess(); - } - - return true; - } - } -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool.cs deleted file mode 100644 index e4ca195fdc8..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.AspNetCore.Razor.PooledObjects; - -internal static partial class QueuePool -{ - public static readonly ObjectPool> Default = DefaultPool.Create(Policy.Instance); - - public static PooledObject> GetPooledObject() - => Default.GetPooledObject(); - - public static PooledObject> GetPooledObject(out Queue queue) - => Default.GetPooledObject(out queue); -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool`1.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool`1.Policy.cs new file mode 100644 index 00000000000..b927913c457 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool`1.Policy.cs @@ -0,0 +1,47 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.PooledObjects; + +internal partial class QueuePool +{ + private sealed class Policy : PooledObjectPolicy + { + public static readonly Policy Default = new(DefaultMaximumObjectSize); + + private readonly int _maximumObjectSize; + + private Policy(int maximumObjectSize) + { + _maximumObjectSize = maximumObjectSize; + } + + public static Policy Create(Optional maximumObjectSize = default) + { + if (!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize) + { + return Default; + } + + return new(maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize)); + } + + public override Queue Create() => new(); + + public override bool Return(Queue queue) + { + var count = queue.Count; + + queue.Clear(); + + if (count > _maximumObjectSize) + { + queue.TrimExcess(); + } + + return true; + } + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool`1.cs new file mode 100644 index 00000000000..54e11f311f1 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool`1.cs @@ -0,0 +1,30 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.PooledObjects; + +internal sealed partial class QueuePool : CustomObjectPool> +{ + public static readonly QueuePool Default = Create(); + + private QueuePool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + public static QueuePool Create( + Optional maximumObjectSize = default, + Optional poolSize = default) + => new(Policy.Create(maximumObjectSize), poolSize); + + public static QueuePool Create(PooledObjectPolicy policy, Optional poolSize = default) + => new(policy, poolSize); + + public static PooledObject> GetPooledObject() + => Default.GetPooledObject(); + + public static PooledObject> GetPooledObject(out Queue queue) + => Default.GetPooledObject(out queue); +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ReferenceEqualityHashSetPool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ReferenceEqualityHashSetPool`1.cs deleted file mode 100644 index 59a892eeeec..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ReferenceEqualityHashSetPool`1.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using Microsoft.AspNetCore.Razor.Utilities; -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.AspNetCore.Razor.PooledObjects; - -/// -/// A pool of instances that compares items using reference equality. -/// -/// -/// -/// Instances originating from this pool are intended to be short-lived and are suitable -/// for temporary work. Do not return them as the results of methods or store them in fields. -/// -internal static partial class ReferenceEqualityHashSetPool - where T : class -{ - public static readonly ObjectPool> Default = HashSetPool.Create(ReferenceEqualityComparer.Instance); - - public static PooledObject> GetPooledObject() - => Default.GetPooledObject(); - - public static PooledObject> GetPooledObject(out HashSet set) - => Default.GetPooledObject(out set); -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.ReferenceEqualityHashSet`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.ReferenceEqualityHashSet`1.cs new file mode 100644 index 00000000000..13cd869b766 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.ReferenceEqualityHashSet`1.cs @@ -0,0 +1,30 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using Microsoft.AspNetCore.Razor.Utilities; + +namespace Microsoft.AspNetCore.Razor.PooledObjects; + +internal static partial class SpecializedPools +{ + /// + /// A pool of instances that compares items using reference equality. + /// + /// + /// + /// Instances originating from this pool are intended to be short-lived and are suitable + /// for temporary work. Do not return them as the results of methods or store them in fields. + /// + internal static class ReferenceEqualityHashSet + where T : class + { + public static readonly HashSetPool Default = HashSetPool.Create(ReferenceEqualityComparer.Instance); + + public static PooledObject> GetPooledObject() + => Default.GetPooledObject(); + + public static PooledObject> GetPooledObject(out HashSet set) + => Default.GetPooledObject(out set); + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.StringDictionary`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.StringDictionary`1.cs new file mode 100644 index 00000000000..1f3fd6557ca --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.StringDictionary`1.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.PooledObjects; + +internal static partial class SpecializedPools +{ + /// + /// Pooled instances when the key is of type . + /// + /// + /// + /// Instances originating from this pool are intended to be short-lived and are suitable + /// for temporary work. Do not return them as the results of methods or store them in fields. + /// + internal static class StringDictionary + { + public static readonly DictionaryPool Ordinal = DictionaryPool.Create(StringComparer.Ordinal); + public static readonly DictionaryPool OrdinalIgnoreCase = DictionaryPool.Create(StringComparer.OrdinalIgnoreCase); + + public static PooledObject> GetPooledObject() + => Ordinal.GetPooledObject(); + + public static PooledObject> GetPooledObject(out Dictionary map) + => Ordinal.GetPooledObject(out map); + + public static PooledObject> GetPooledObject(bool ignoreCase) + => ignoreCase + ? OrdinalIgnoreCase.GetPooledObject() + : Ordinal.GetPooledObject(); + + public static PooledObject> GetPooledObject(bool ignoreCase, out Dictionary map) + => ignoreCase + ? OrdinalIgnoreCase.GetPooledObject(out map) + : Ordinal.GetPooledObject(out map); + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.StringHashSet.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.StringHashSet.cs new file mode 100644 index 00000000000..e72991eb33b --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.StringHashSet.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.PooledObjects; + +internal static partial class SpecializedPools +{ + /// + /// A pool of instances that compares strings. + /// + /// + /// + /// Instances originating from this pool are intended to be short-lived and are suitable + /// for temporary work. Do not return them as the results of methods or store them in fields. + /// + internal static class StringHashSet + { + public static readonly HashSetPool Ordinal = HashSetPool.Create(StringComparer.Ordinal); + public static readonly HashSetPool OrdinalIgnoreCase = HashSetPool.Create(StringComparer.OrdinalIgnoreCase); + + public static PooledObject> GetPooledObject() + => Ordinal.GetPooledObject(); + + public static PooledObject> GetPooledObject(out HashSet set) + => Ordinal.GetPooledObject(out set); + + public static PooledObject> GetPooledObject(bool ignoreCase) + => ignoreCase + ? OrdinalIgnoreCase.GetPooledObject() + : Ordinal.GetPooledObject(); + + public static PooledObject> GetPooledObject(bool ignoreCase, out HashSet set) + => ignoreCase + ? OrdinalIgnoreCase.GetPooledObject(out set) + : Ordinal.GetPooledObject(out set); + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.cs new file mode 100644 index 00000000000..4a783efae00 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/SpecializedPools.cs @@ -0,0 +1,43 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.PooledObjects; + +internal static partial class SpecializedPools +{ + public static PooledObject> GetPooledReferenceEqualityHashSet() + where T : class + => ReferenceEqualityHashSet.GetPooledObject(); + + public static PooledObject> GetPooledReferenceEqualityHashSet(out HashSet set) + where T : class + => ReferenceEqualityHashSet.GetPooledObject(out set); + + public static PooledObject> GetPooledStringHashSet() + => StringHashSet.GetPooledObject(); + + public static PooledObject> GetPooledStringHashSet(out HashSet set) + => StringHashSet.GetPooledObject(out set); + + public static PooledObject> GetPooledStringHashSet(bool ignoreCase) + => StringHashSet.GetPooledObject(ignoreCase); + + public static PooledObject> GetPooledStringHashSet(bool ignoreCase, out HashSet set) + => StringHashSet.GetPooledObject(ignoreCase, out set); + + public static PooledObject> GetPooledStringDictionary() + => StringDictionary.GetPooledObject(); + + public static PooledObject> GetPooledStringDictionary( + out Dictionary map) + => StringDictionary.GetPooledObject(out map); + + public static PooledObject> GetPooledStringDictionary(bool ignoreCase) + => StringDictionary.GetPooledObject(ignoreCase); + + public static PooledObject> GetPooledStringDictionary( + bool ignoreCase, out Dictionary map) + => StringDictionary.GetPooledObject(ignoreCase, out map); +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.Policy.cs index 966596e7f83..0efc814835e 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.Policy.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.Policy.cs @@ -2,29 +2,41 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; -internal static partial class StackPool +internal partial class StackPool { - private class Policy : IPooledObjectPolicy> + private sealed class Policy : PooledObjectPolicy { - public static readonly Policy Instance = new(); + public static readonly Policy Default = new(DefaultMaximumObjectSize); - private Policy() + private readonly int _maximumObjectSize; + + private Policy(int maximumObjectSize) + { + _maximumObjectSize = maximumObjectSize; + } + + public static Policy Create(Optional maximumObjectSize = default) { + if (!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize) + { + return Default; + } + + return new(maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize)); } - public Stack Create() => new(); + public override Stack Create() => new(); - public bool Return(Stack stack) + public override bool Return(Stack stack) { var count = stack.Count; stack.Clear(); - if (count > DefaultPool.MaximumObjectSize) + if (count > _maximumObjectSize) { stack.TrimExcess(); } diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.cs index ac0e573422b..0626cebb348 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -14,11 +13,25 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// Instances originating from this pool are intended to be short-lived and are suitable /// for temporary work. Do not return them as the results of methods or store them in fields. /// -internal static partial class StackPool +internal sealed partial class StackPool : CustomObjectPool> { - public static readonly ObjectPool> Default = DefaultPool.Create(Policy.Instance); + public static readonly StackPool Default = Create(); - public static PooledObject> GetPooledObject() => Default.GetPooledObject(); + private StackPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + public static StackPool Create( + Optional maximumObjectSize = default, + Optional poolSize = default) + => new(Policy.Create(maximumObjectSize), poolSize); + + public static StackPool Create(PooledObjectPolicy policy, Optional poolSize = default) + => new(policy, poolSize); + + public static PooledObject> GetPooledObject() + => Default.GetPooledObject(); public static PooledObject> GetPooledObject(out Stack stack) => Default.GetPooledObject(out stack); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StopwatchPool.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StopwatchPool.Policy.cs index ead6761a22d..d6b1688b80e 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StopwatchPool.Policy.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StopwatchPool.Policy.cs @@ -2,23 +2,22 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; -internal static partial class StopwatchPool +internal partial class StopwatchPool { - private class Policy : IPooledObjectPolicy + private sealed class Policy : PooledObjectPolicy { - public static readonly Policy Instance = new(); + public static readonly Policy Default = new(); private Policy() { } - public Stopwatch Create() => new(); + public override Stopwatch Create() => new(); - public bool Return(Stopwatch watch) + public override bool Return(Stopwatch watch) { watch.Reset(); return true; diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StopwatchPool.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StopwatchPool.cs index b1352ef06aa..18b8d430315 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StopwatchPool.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StopwatchPool.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -14,9 +13,20 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// Instances originating from this pool are intended to be short-lived and are suitable /// for temporary work. Do not return them as the results of methods or store them in fields. /// -internal static partial class StopwatchPool +internal sealed partial class StopwatchPool : CustomObjectPool { - public static readonly ObjectPool Default = DefaultPool.Create(Policy.Instance); + public static readonly StopwatchPool Default = Create(); + + private StopwatchPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + public static StopwatchPool Create(Optional poolSize = default) + => new(Policy.Default, poolSize); + + public static StopwatchPool Create(PooledObjectPolicy policy, Optional poolSize = default) + => new(policy, poolSize); public static PooledObject GetPooledObject() => Default.GetPooledObject(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.Policy.cs index 294ef60cef7..a6573644588 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.Policy.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.Policy.cs @@ -2,29 +2,41 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Text; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; -internal static partial class StringBuilderPool +internal partial class StringBuilderPool { - private class Policy : IPooledObjectPolicy + private sealed class Policy : PooledObjectPolicy { - public static readonly Policy Instance = new(); + public static readonly Policy Default = new(DefaultMaximumObjectSize); - private Policy() + private readonly int _maximumObjectSize; + + private Policy(int maximumObjectSize) + { + _maximumObjectSize = maximumObjectSize; + } + + public static Policy Create(Optional maximumObjectSize = default) { + if (!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize) + { + return Default; + } + + return new(maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize)); } - public StringBuilder Create() => new(); + public override StringBuilder Create() => new(); - public bool Return(StringBuilder builder) + public override bool Return(StringBuilder builder) { builder.Clear(); - if (builder.Capacity > DefaultPool.MaximumObjectSize) + if (builder.Capacity > _maximumObjectSize) { - builder.Capacity = DefaultPool.MaximumObjectSize; + builder.Capacity = _maximumObjectSize; } return true; diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.cs index 36b269cdd48..14f4ad6ebe6 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Text; -using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Razor.PooledObjects; @@ -14,9 +13,22 @@ namespace Microsoft.AspNetCore.Razor.PooledObjects; /// Instances originating from this pool are intended to be short-lived and are suitable /// for temporary work. Do not return them as the results of methods or store them in fields. /// -internal static partial class StringBuilderPool +internal sealed partial class StringBuilderPool : CustomObjectPool { - public static readonly ObjectPool Default = DefaultPool.Create(Policy.Instance); + public static readonly StringBuilderPool Default = Create(); + + private StringBuilderPool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + public static StringBuilderPool Create( + Optional maximumObjectSize = default, + Optional poolSize = default) + => new(Policy.Create(maximumObjectSize), poolSize); + + public static StringBuilderPool Create(PooledObjectPolicy policy, Optional poolSize = default) + => new(policy, poolSize); public static PooledObject GetPooledObject() => Default.GetPooledObject(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringDictionaryPool`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringDictionaryPool`1.cs deleted file mode 100644 index 42fafb4537e..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringDictionaryPool`1.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.AspNetCore.Razor.PooledObjects; - -/// -/// Pooled instances when the key is of type . -/// -/// -/// -/// Instances originating from this pool are intended to be short-lived and are suitable -/// for temporary work. Do not return them as the results of methods or store them in fields. -/// -internal static partial class StringDictionaryPool -{ - public static readonly ObjectPool> Ordinal = DictionaryPool.Create(StringComparer.Ordinal); - public static readonly ObjectPool> OrdinalIgnoreCase = DictionaryPool.Create(StringComparer.OrdinalIgnoreCase); - - public static PooledObject> GetPooledObject() - => Ordinal.GetPooledObject(); - - public static PooledObject> GetPooledObject(out Dictionary map) - => Ordinal.GetPooledObject(out map); - - public static PooledObject> GetPooledObject(bool ignoreCase) - => ignoreCase - ? OrdinalIgnoreCase.GetPooledObject() - : Ordinal.GetPooledObject(); - - public static PooledObject> GetPooledObject(bool ignoreCase, out Dictionary map) - => ignoreCase - ? OrdinalIgnoreCase.GetPooledObject(out map) - : Ordinal.GetPooledObject(out map); -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringHashSetPool.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringHashSetPool.cs deleted file mode 100644 index 797d89c3488..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringHashSetPool.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.AspNetCore.Razor.PooledObjects; - -/// -/// A pool of instances that compares strings. -/// -/// -/// -/// Instances originating from this pool are intended to be short-lived and are suitable -/// for temporary work. Do not return them as the results of methods or store them in fields. -/// -internal static partial class StringHashSetPool -{ - public static readonly ObjectPool> Ordinal = HashSetPool.Create(StringComparer.Ordinal); - public static readonly ObjectPool> OrdinalIgnoreCase = HashSetPool.Create(StringComparer.OrdinalIgnoreCase); - - public static ObjectPool> Create(IEqualityComparer comparer) - => HashSetPool.Create(comparer); - - public static PooledObject> GetPooledObject() - => Ordinal.GetPooledObject(); - - public static PooledObject> GetPooledObject(out HashSet set) - => Ordinal.GetPooledObject(out set); - - public static PooledObject> GetPooledObject(bool ignoreCase) - => ignoreCase - ? OrdinalIgnoreCase.GetPooledObject() - : Ordinal.GetPooledObject(); - - public static PooledObject> GetPooledObject(bool ignoreCase, out HashSet set) - => ignoreCase - ? OrdinalIgnoreCase.GetPooledObject(out set) - : Ordinal.GetPooledObject(out set); -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PublicAPI/PublicAPI.Unshipped.txt b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PublicAPI/PublicAPI.Unshipped.txt index 91b0e1a43b9..db480634fd1 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PublicAPI/PublicAPI.Unshipped.txt +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PublicAPI/PublicAPI.Unshipped.txt @@ -1 +1,9 @@ -#nullable enable \ No newline at end of file +#nullable enable +Microsoft.AspNetCore.Razor.Optional +Microsoft.AspNetCore.Razor.Optional.GetValueOrDefault(T defaultValue) -> T +Microsoft.AspNetCore.Razor.Optional.HasValue.get -> bool +Microsoft.AspNetCore.Razor.Optional.Optional() -> void +Microsoft.AspNetCore.Razor.Optional.Optional(T value) -> void +Microsoft.AspNetCore.Razor.Optional.Value.get -> T +override Microsoft.AspNetCore.Razor.Optional.ToString() -> string! +static Microsoft.AspNetCore.Razor.Optional.implicit operator Microsoft.AspNetCore.Razor.Optional(T value) -> Microsoft.AspNetCore.Razor.Optional \ No newline at end of file diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Threading/LazyValue`1.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Threading/LazyValue`1.cs new file mode 100644 index 00000000000..b750aaedfdf --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Threading/LazyValue`1.cs @@ -0,0 +1,81 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Runtime.CompilerServices; + +namespace Microsoft.AspNetCore.Razor.Threading; + +/// +/// Provides lock-free lazy initialization for a value using a factory function. +/// +/// The type of the lazily initialized value. +/// +/// +/// implements a thread-safe lazy initialization pattern that guarantees +/// the factory function will be executed exactly once, even when accessed concurrently from multiple threads. +/// The implementation uses atomic operations and does not require locks. +/// +/// +/// This struct is designed to be used as a field in classes where expensive initialization should be +/// deferred until the value is actually needed. Unlike , this implementation +/// does not allocate additional objects and has minimal overhead. +/// +/// +/// +/// +/// private LazyValue<Dictionary<string, int>> _lookup = new(() => BuildExpensiveLookup()); +/// +/// public Dictionary<string, int> GetLookup() +/// { +/// return _lookup.GetValue(); // Thread-safe, initialized exactly once +/// } +/// +/// +internal struct LazyValue +{ + private readonly Func _factory; + private T _value; + private int _state; + + /// + /// Initializes a new instance of the struct with the specified factory function. + /// + /// A function that creates the value when it is first requested. + /// + /// The factory function will be called at most once, when is first called. + /// If multiple threads call concurrently, only one thread will execute + /// the factory function, and all threads will receive the same result. + /// + /// is . + public LazyValue(Func factory) + { + _factory = factory; + Unsafe.SkipInit(out this); + } + + /// + /// Gets the lazily initialized value, creating it if necessary. + /// + /// The initialized value. + /// + /// + /// This method is thread-safe. If multiple threads call this method concurrently before + /// the value has been initialized, the factory function will be executed exactly once, + /// and all threads will receive the same result. + /// + /// + /// After the first call, subsequent calls to this method will return the cached value + /// without executing the factory function again. + /// + /// + /// The implementation uses + /// to provide lock-free thread-safe initialization with guaranteed single execution. + /// + /// + /// + /// The factory function is (which can only happen if the struct was created using default construction). + /// + public T GetValue() + => InterlockedOperations.Initialize(ref _value, ref _state, _factory); +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Threading/LazyValue`2.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Threading/LazyValue`2.cs new file mode 100644 index 00000000000..c915a34bf35 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Threading/LazyValue`2.cs @@ -0,0 +1,104 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Runtime.CompilerServices; + +namespace Microsoft.AspNetCore.Razor.Threading; + +/// +/// Provides lock-free lazy initialization for a value using a factory function that accepts an argument. +/// +/// The type of the argument passed to the factory function. +/// The type of the lazily initialized value. +/// +/// +/// implements a thread-safe lazy initialization pattern that guarantees +/// the factory function will be executed exactly once with the provided argument, even when accessed +/// concurrently from multiple threads. The implementation uses atomic operations and does not require locks. +/// +/// +/// This variant is particularly useful when the factory function needs access to external state +/// but you want to avoid closure allocations. By accepting the required state as an argument, +/// you can use static factory methods that don't capture variables. +/// +/// +/// +/// +/// private LazyValue<MyCollection, Dictionary<string, int>> _lookup = new(BuildLookupTable); +/// +/// public Dictionary<string, int> GetLookup(MyCollection collection) +/// { +/// return _lookup.GetValue(collection); // Thread-safe, initialized exactly once +/// } +/// +/// private static Dictionary<string, int> BuildLookupTable(MyCollection collection) +/// { +/// // Static method avoids closure allocation +/// return collection.Items.ToDictionary(x => x.Key, x => x.Value); +/// } +/// +/// +internal struct LazyValue +{ + private readonly Func _factory; + private T _value; + private int _state; + + /// + /// Initializes a new instance of the struct with the specified factory function. + /// + /// A function that creates the value using the provided argument when it is first requested. + /// + /// + /// The factory function will be called at most once, when is first called. + /// If multiple threads call concurrently, only one thread will execute + /// the factory function, and all threads will receive the same result. + /// + /// + /// Using this overload with static factory methods can help avoid delegate and closure allocations: + /// + /// + /// // Preferred: static method avoids closure + /// var lazy = new LazyValue<MyData, ProcessedData>(ProcessData); + /// + /// // Avoid: lambda creates closure allocation + /// var lazy = new LazyValue<MyData, ProcessedData>(data => ExpensiveOperation(data, someField)); + /// + /// + /// is . + public LazyValue(Func factory) + { + _factory = factory; + Unsafe.SkipInit(out this); + } + + /// + /// Gets the lazily initialized value, creating it if necessary using the provided argument. + /// + /// The argument to pass to the factory function if the value needs to be created. + /// + /// The initialized value. + /// + /// + /// + /// This method is thread-safe. If multiple threads call this method concurrently before + /// the value has been initialized, the factory function will be executed exactly once + /// with the provided argument, and all threads will receive the same result. + /// + /// + /// After the first call, subsequent calls to this method will return the cached value + /// without executing the factory function again. The parameter + /// is ignored on subsequent calls. + /// + /// + /// The implementation uses + /// to provide lock-free thread-safe initialization with guaranteed single execution. + /// + /// + /// + /// The factory function is (which can only happen if the struct was created using default construction). + /// + public T GetValue(TArg arg) + => InterlockedOperations.Initialize(ref _value, ref _state, arg, _factory); +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.Policy.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.Policy.cs deleted file mode 100644 index 3c00d09e57c..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.Policy.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Extensions.ObjectPool; -#if NET5_0_OR_GREATER -using System.Diagnostics; -#endif - -#if NET5_0_OR_GREATER -using HashAlgorithmName = System.Security.Cryptography.HashAlgorithmName; -using HashingType = System.Security.Cryptography.IncrementalHash; -#else -using HashingType = System.Security.Cryptography.SHA256; -#endif - -namespace Microsoft.AspNetCore.Razor.Utilities; - -internal sealed partial record Checksum -{ - internal readonly ref partial struct Builder - { - private sealed class Policy : IPooledObjectPolicy - { - public static readonly Policy Instance = new(); - - private Policy() - { - } - - public HashingType Create() -#if NET5_0_OR_GREATER - => HashingType.CreateHash(HashAlgorithmName.SHA256); -#else - => HashingType.Create(); -#endif - - public bool Return(HashingType hash) - { -#if NET5_0_OR_GREATER - Debug.Assert(hash.AlgorithmName == HashAlgorithmName.SHA256); -#endif - - return true; - } - } - } -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.XxHash128Pool.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.XxHash128Pool.cs new file mode 100644 index 00000000000..42277172183 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.XxHash128Pool.cs @@ -0,0 +1,39 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.AspNetCore.Razor.PooledObjects; +using System.IO.Hashing; + +namespace Microsoft.AspNetCore.Razor.Utilities; + +internal readonly partial record struct Checksum +{ + internal readonly ref partial struct Builder + { + private sealed class XxHash128Pool : CustomObjectPool + { + public static readonly XxHash128Pool Default = new(Policy.Instance, DefaultPoolSize); + + private XxHash128Pool(PooledObjectPolicy policy, Optional poolSize) + : base(policy, poolSize) + { + } + + private sealed class Policy : PooledObjectPolicy + { + public static readonly Policy Instance = new(); + + private Policy() + { + } + + public override XxHash128 Create() => new(); + + public override bool Return(XxHash128 hash) + { + return true; + } + } + } + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.cs index 22d3227e31c..3b060945bcd 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.Builder.cs @@ -2,36 +2,21 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -#if !NET5_0_OR_GREATER -using System.Buffers; -#endif using System.Buffers.Binary; using System.Diagnostics; +using System.IO.Hashing; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using Microsoft.AspNetCore.Razor.PooledObjects; -using Microsoft.Extensions.ObjectPool; - -// PERFORMANCE: Care has been taken to avoid using IncrementalHash on .NET Framework, which can cause -// threadpool starvation. Essentially, on .NET Framework, IncrementalHash ends up using the OS implementation -// of SHA-256, which creates several finalizable objects in the form of safe handles. By creating instances -// of SHA256 for .NET Framework (and netstandard2.0), we get the managed code version of SHA-256, which -// doesn't have the overhead of using the OS implementations. -// -// See https://github.com/dotnet/roslyn/issues/67995 for more detail. - -#if NET5_0_OR_GREATER -using HashingType = System.Security.Cryptography.IncrementalHash; -#else -using HashingType = System.Security.Cryptography.SHA256; -#endif namespace Microsoft.AspNetCore.Razor.Utilities; -internal sealed partial record Checksum +internal readonly partial record struct Checksum { internal readonly ref partial struct Builder { - private static readonly ObjectPool s_hashPool = DefaultPool.Create(Policy.Instance); + private const int XxHash128SizeBytes = 128 / 8; + + private static readonly XxHash128Pool s_hashPool = XxHash128Pool.Default; private enum TypeKind : byte { @@ -45,34 +30,31 @@ private enum TypeKind : byte Char, } - // Small, per-thread array to use as a buffer for appending primitive values to the hash. + // Small (8 byte), per-thread byte array to use as a buffer for appending primitive values to the hash. [ThreadStatic] private static byte[]? s_buffer; - private readonly HashingType _hash; + private readonly XxHash128 _hash; public Builder() { _hash = s_hashPool.Get(); - -#if !NET5_0_OR_GREATER - _hash.Initialize(); -#endif } - static byte[] GetBuffer() - => s_buffer ??= new byte[8]; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + static Span GetBuffer(int length = 8) + { + Debug.Assert(length <= 8, $"length should never be greater than 8."); + + var buffer = s_buffer ??= new byte[8]; + return buffer.AsSpan(0, length); + } public Checksum FreeAndGetChecksum() { -#if NET5_0_OR_GREATER - Span hash = stackalloc byte[HashSize]; + Span hash = stackalloc byte[XxHash128SizeBytes]; _hash.GetHashAndReset(hash); var result = From(hash); -#else - _hash.TransformFinalBlock(inputBuffer: [], inputOffset: 0, inputCount: 0); - var result = From(_hash.Hash); -#endif s_hashPool.Return(_hash); return result; @@ -82,18 +64,12 @@ private void AppendBuffer(int count) { Debug.Assert(s_buffer is not null); -#if NET5_0_OR_GREATER - _hash.AppendData(s_buffer, offset: 0, count); -#else - _hash.TransformBlock(s_buffer, inputOffset: 0, inputCount: count, outputBuffer: null, outputOffset: 0); -#endif + _hash.Append(s_buffer.AsSpan(0, count)); } private void AppendTypeKind(TypeKind kind) { - var buffer = GetBuffer(); - buffer[0] = (byte)kind; - AppendBuffer(count: 1); + AppendByteValue((byte)kind); } private void AppendBoolValue(bool value) @@ -103,68 +79,41 @@ private void AppendBoolValue(bool value) private void AppendByteValue(byte value) { - var buffer = GetBuffer(); + var buffer = GetBuffer(length: sizeof(byte)); buffer[0] = value; - AppendBuffer(count: sizeof(byte)); + _hash.Append(buffer); } private void AppendCharValue(char value) { - var buffer = GetBuffer(); - BinaryPrimitives.WriteUInt16LittleEndian(buffer.AsSpan(0, sizeof(char)), value); - AppendBuffer(count: sizeof(char)); + var buffer = GetBuffer(length: sizeof(char)); + BinaryPrimitives.WriteUInt16LittleEndian(buffer, value); + _hash.Append(buffer); } private void AppendInt32Value(int value) { - var buffer = GetBuffer(); - BinaryPrimitives.WriteInt32LittleEndian(buffer.AsSpan(0, sizeof(int)), value); - AppendBuffer(count: sizeof(int)); + var buffer = GetBuffer(length: sizeof(int)); + BinaryPrimitives.WriteInt32LittleEndian(buffer, value); + _hash.Append(buffer); } private void AppendInt64Value(long value) { - var buffer = GetBuffer(); - BinaryPrimitives.WriteInt64LittleEndian(buffer.AsSpan(0, sizeof(long)), value); - AppendBuffer(count: sizeof(long)); + var buffer = GetBuffer(length: sizeof(long)); + BinaryPrimitives.WriteInt64LittleEndian(buffer, value); + _hash.Append(buffer); } private void AppendStringValue(string value) { -#if NET5_0_OR_GREATER - _hash.AppendData(MemoryMarshal.AsBytes(value.AsSpan())); - _hash.AppendData(MemoryMarshal.AsBytes("\0".AsSpan())); -#else - using var _ = ArrayPool.Shared.GetPooledArray(4 * 1024, out var buffer); - - AppendData(_hash, buffer, value); - AppendData(_hash, buffer, "\0"); - - static void AppendData(HashingType hash, byte[] buffer, string value) - { - var stringBytes = MemoryMarshal.AsBytes(value.AsSpan()); - Debug.Assert(stringBytes.Length == value.Length * 2); - - var index = 0; - while (index < stringBytes.Length) - { - var remaining = stringBytes.Length - index; - var toCopy = Math.Min(remaining, buffer.Length); - - stringBytes.Slice(index, toCopy).CopyTo(buffer); - hash.TransformBlock(buffer, inputOffset: 0, inputCount: toCopy, outputBuffer: null, outputOffset: 0); - - index += toCopy; - } - } -#endif + _hash.Append(MemoryMarshal.AsBytes(value.AsSpan())); + _hash.Append(MemoryMarshal.AsBytes("\0".AsSpan())); } - private void AppendHashDataValue(HashData value) + private void AppendChecksumValue(Checksum value) { AppendInt64Value(value.Data1); AppendInt64Value(value.Data2); - AppendInt64Value(value.Data3); - AppendInt64Value(value.Data4); } public void AppendNull() @@ -172,37 +121,37 @@ public void AppendNull() AppendTypeKind(TypeKind.Null); } - public void AppendData(bool value) + public void Append(bool value) { AppendTypeKind(TypeKind.Bool); AppendBoolValue(value); } - public void AppendData(byte value) + public void Append(byte value) { AppendTypeKind(TypeKind.Byte); AppendByteValue(value); } - public void AppendData(char value) + public void Append(char value) { AppendTypeKind(TypeKind.Char); AppendCharValue(value); } - public void AppendData(int value) + public void Append(int value) { AppendTypeKind(TypeKind.Int32); AppendInt32Value(value); } - public void AppendData(long value) + public void Append(long value) { AppendTypeKind(TypeKind.Int64); AppendInt64Value(value); } - public void AppendData(string? value) + public void Append(string? value) { if (value is null) { @@ -214,13 +163,13 @@ public void AppendData(string? value) AppendStringValue(value); } - public void AppendData(Checksum value) + public void Append(Checksum value) { AppendTypeKind(TypeKind.Checksum); - AppendHashDataValue(value.Data); + AppendChecksumValue(value); } - public void AppendData(object? value) + public void Append(object? value) { switch (value) { @@ -229,31 +178,31 @@ public void AppendData(object? value) break; case string s: - AppendData(s); + Append(s); break; case Checksum c: - AppendData(c); + Append(c); break; case bool b: - AppendData(b); + Append(b); break; case int i: - AppendData(i); + Append(i); break; case long l: - AppendData(l); + Append(l); break; case byte b: - AppendData(b); + Append(b); break; case char c: - AppendData(c); + Append(c); break; default: diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.HashData.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.HashData.cs deleted file mode 100644 index 9ea10a7f8d7..00000000000 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.HashData.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Runtime.InteropServices; - -namespace Microsoft.AspNetCore.Razor.Utilities; - -internal sealed partial record Checksum -{ - [StructLayout(LayoutKind.Explicit, Size = HashSize)] - public readonly record struct HashData - { - [FieldOffset(0)] - public readonly long Data1; - - [FieldOffset(8)] - public readonly long Data2; - - [FieldOffset(16)] - public readonly long Data3; - - [FieldOffset(24)] - public readonly long Data4; - - public HashData(long data1, long data2, long data3, long data4) - { - Data1 = data1; - Data2 = data2; - Data3 = data3; - Data4 = data4; - } - - public override int GetHashCode() - { - // The checksum is already a hash. Just provide a 4-byte value as a well-distributed hash code. - return (int)Data1; - } - } -} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.cs index 01433f21daa..ee87f9261c4 100644 --- a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.cs +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Checksum.cs @@ -2,74 +2,94 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -#if NETCOREAPP && !NET8_0_OR_GREATER +using System.Collections.Immutable; using System.Runtime.CompilerServices; -#endif using System.Runtime.InteropServices; namespace Microsoft.AspNetCore.Razor.Utilities; -internal sealed partial record Checksum +/// +/// Checksum of data can be used later to see whether two data are same or not +/// without actually comparing data itself. +/// +[StructLayout(LayoutKind.Explicit, Size = HashSize)] +internal readonly partial record struct Checksum( + [field: FieldOffset(0)] long Data1, + [field: FieldOffset(8)] long Data2) : IComparable { - // Size of SHA-256 - private const int HashSize = 256 / 8; + /// + /// The intended size of the in bytes. + /// + private const int HashSize = 16; - public static readonly Checksum Null = new(default(HashData)); +#if !NET + // Small (HashSize length), per-thread array to use when converting to base64 on non-.NET. + [ThreadStatic] + private static byte[]? s_bytes; +#endif - public readonly HashData Data; + /// + /// Represents a default/null/invalid Checksum, equivalent to default(Checksum). This value + /// contains all zeroes, which is considered infinitesimally unlikely to ever happen from hashing data + /// (including when hashing null/empty/zero data inputs). + /// + public static readonly Checksum Null = default; - public Checksum(HashData data) - => Data = data; + public static Checksum From(byte[] bytes) + => From(bytes.AsSpan()); - public static Checksum From(ReadOnlySpan source) - { - if (source.Length == 0) - { - return Null; - } + public static Checksum From(ImmutableArray bytes) + => From(bytes.AsSpan()); - if (source.Length != HashSize) - { - throw new ArgumentException($"{nameof(source)} size must be equal to {HashSize}", nameof(source)); - } + public static Checksum From(ReadOnlySpan bytes) + { + ArgHelper.ThrowIfLessThan(bytes.Length, HashSize); - if (!MemoryMarshal.TryRead(source, out HashData hash)) + if (!MemoryMarshal.TryRead(bytes, out Checksum result)) { - throw new InvalidOperationException("Could not read hash data"); + return ThrowHelper.ThrowInvalidOperationException("Could not read hash data"); } - return new Checksum(hash); + return result; } public string ToBase64String() { -#if NETCOREAPP +#if NET Span bytes = stackalloc byte[HashSize]; -#if NET8_0_OR_GREATER - MemoryMarshal.TryWrite(bytes, in Data); -#else - MemoryMarshal.TryWrite(bytes, ref Unsafe.AsRef(in Data)); -#endif - + WriteTo(bytes); return Convert.ToBase64String(bytes); #else - unsafe - { - var data = new byte[HashSize]; - fixed (byte* dataPtr = data) - { - *(HashData*)dataPtr = Data; - } - - return Convert.ToBase64String(data, offset: 0, length: HashSize); - } + var bytes = s_bytes ??= new byte[HashSize]; + WriteTo(bytes.AsSpan()); + return Convert.ToBase64String(bytes); #endif } public static Checksum FromBase64String(string value) - => value is null - ? Null - : From(Convert.FromBase64String(value)); + => From(Convert.FromBase64String(value)); + + public void WriteTo(Span destination) + { + ArgHelper.ThrowIfDestinationTooShort(destination, HashSize); + Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(destination), this); + } + + public bool Equals(Checksum other) + => Data1 == other.Data1 && + Data2 == other.Data2; + + public override int GetHashCode() + { + // The checksum is already a hash. Just read a 4-byte value to get a well-distributed hash code. + return (int)Data1; + } + + public int CompareTo(Checksum other) + { + var result = Data1.CompareTo(other.Data1); + return result != 0 ? result : Data2.CompareTo(other.Data2); + } public override string ToString() => ToBase64String(); diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/CleanableWeakCache`2.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/CleanableWeakCache`2.cs new file mode 100644 index 00000000000..ce0c5167551 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/CleanableWeakCache`2.cs @@ -0,0 +1,285 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace Microsoft.AspNetCore.Razor.Utilities; + +/// +/// A thread-safe cache implementation that uses weak references to store values, allowing them to be garbage collected +/// when no longer referenced elsewhere. The cache periodically cleans up dead weak references to prevent unbounded growth. +/// +/// The type of keys used to identify cached values. Must be non-null. +/// The type of values stored in the cache. Must be a reference type. +/// +/// This cache is designed for scenarios where you want to cache expensive-to-create objects but allow them to be +/// garbage collected when memory pressure occurs. The cache will automatically clean up dead references when the +/// number of add operations reaches the specified cleanup threshold. +/// +internal class CleanableWeakCache + where TKey : notnull + where TValue : class? +{ + /// + /// The underlying dictionary that maps keys to weak references containing the cached values. + /// + private readonly Dictionary> _cacheMap = []; + + /// + /// Synchronization object to ensure thread-safe access to the cache. + /// +#if NET9_0_OR_GREATER + private readonly System.Threading.Lock _lock = new(); +#else + private readonly object _lock = new(); +#endif + + /// + /// The number of add operations that must occur before triggering a cleanup of dead weak references. + /// + private readonly int _cleanUpThreshold; + + /// + /// Counter tracking the number of add operations since the last cleanup was performed. + /// + private int _addsSinceLastCleanUp; + + /// + /// Initializes a new instance of the class. + /// + /// + /// The number of add operations that must occur before triggering automatic cleanup of dead weak references. + /// Must be positive. + /// + /// + /// Thrown when is zero or negative. + /// + public CleanableWeakCache(int cleanUpThreshold) + { + ArgHelper.ThrowIfNegativeOrZero(cleanUpThreshold); + + _cleanUpThreshold = cleanUpThreshold; + } + + /// + /// Gets the value associated with the specified key, or adds the provided value if the key is not found + /// or the previously cached value has been garbage collected. + /// + /// The key of the value to get or add. + /// The value to add if the key is not found or the cached value is no longer available. + /// + /// The existing value if found and still alive, otherwise the provided . + /// + public TValue GetOrAdd(TKey key, TValue value) + { + lock (_lock) + { + // Try to get the existing value or add the new one. + return GetOrAdd_NoLock(key, value); + } + } + + /// + /// Gets the value associated with the specified key, or adds a new value created by the factory function + /// if the key is not found or the previously cached value has been garbage collected. + /// + /// The key of the value to get or add. + /// A factory function to create the value if it needs to be added to the cache. + /// + /// The existing value if found and still alive, otherwise a new value created by . + /// + public TValue GetOrAdd(TKey key, Func valueFactory) + { + // First check without creating the value. + if (TryGet(key, out var value)) + { + return value; + } + + // Create the value outside the lock to avoid holding the lock + // while creating a potentially expensive object. + var newValue = valueFactory(); + + lock (_lock) + { + // Try to add the newly-created value or get the existing one. + return GetOrAdd_NoLock(key, newValue); + } + } + + /// + /// Gets the value associated with the specified key, or adds a new value created by the factory function + /// using the provided argument if the key is not found or the previously cached value has been garbage collected. + /// + /// The type of the argument passed to the value factory function. + /// The key of the value to get or add. + /// The argument to pass to the value factory function. + /// A factory function to create the value using the provided argument. + /// + /// The existing value if found and still alive, otherwise a new value created by . + /// + public TValue GetOrAdd(TKey key, TArg arg, Func valueFactory) + { + // First check without creating the value. + if (TryGet(key, out var value)) + { + return value; + } + + // Create the value outside the lock to avoid holding the lock + // while creating a potentially expensive object. + var newValue = valueFactory(arg); + + lock (_lock) + { + // Try to add the newly-created value or get the existing one. + return GetOrAdd_NoLock(key, newValue); + } + } + + /// + /// Attempts to add the specified key-value pair to the cache. + /// + /// The key of the value to add. + /// The value to add to the cache. + /// + /// if the key-value pair was successfully added; + /// if a live value already exists for the specified key. + /// + public bool TryAdd(TKey key, TValue value) + { + lock (_lock) + { + // Check if the key exists and the weak reference still has a live target + if (!_cacheMap.TryGetValue(key, out var weakRef)) + { + // The key is not in the map. Add a new weak reference. + _cacheMap.Add(key, new(value)); + } + else + { + // We have a weak reference, check if it is still alive + if (weakRef.TryGetTarget(out var existingValue)) + { + // Yup, we have a live value for this key. + // However, we aren't returning it to the caller, so we should keep it alive + // until after we return to ensure the existence check remains valid. + GC.KeepAlive(existingValue); + return false; + } + + // Set the weak ref's target to the new value. + weakRef.SetTarget(value); + } + + // We added an item to the cache. + // Increment the add counter and trigger cleanup if needed. + CleanUpIfNeeded_NoLock(); + return true; + } + } + + /// + /// Attempts to get the value associated with the specified key. + /// + /// The key of the value to retrieve. + /// + /// When this method returns, contains the value associated with the specified key if found and still alive; + /// otherwise, . + /// + /// + /// if a live value was found for the specified key; otherwise, . + /// + public bool TryGet(TKey key, [NotNullWhen(true)] out TValue? value) + { + lock (_lock) + { + // Check if the key exists and the weak reference still has a live target + if (_cacheMap.TryGetValue(key, out var weakRef) && + weakRef.TryGetTarget(out value)) + { + return true; + } + + // Key not found or target was garbage collected + value = null; + return false; + } + } + + /// + /// Internal method that attempts to retrieve an existing value from the cache or add a new value if none exists. + /// This method assumes the caller already holds the lock. + /// + /// The key of the value to get or add. + /// The value to add if no existing live value is found. + /// + /// The existing live value if one was found; otherwise, the provided after adding it to the cache. + /// + /// + /// This method increments the add counter and triggers cleanup if the threshold is reached when adding a value. + /// + private TValue GetOrAdd_NoLock(TKey key, TValue value) + { + if (_cacheMap.TryGetValue(key, out var weakRef)) + { + if (weakRef.TryGetTarget(out var existingValue)) + { + // There was already a value in the map. Return it! + return existingValue; + } + + // The key was in the map, but the weak reference was collected. + // Set its target to the new value. + weakRef.SetTarget(value); + } + else + { + // The key is not in the map. Add a new weak reference. + _cacheMap.Add(key, new(value)); + } + + // We added an item to the cache. + // Increment the add counter and trigger cleanup if needed. + CleanUpIfNeeded_NoLock(); + return value; + } + + /// + /// Increments the add counter and removes all cache entries whose weak references no longer have live targets + /// if the cleanup threshold has been reached. This method assumes the caller already holds the lock. + /// + /// + /// This method resets the add counter to zero after cleanup is performed. + /// + private void CleanUpIfNeeded_NoLock() + { + if (++_addsSinceLastCleanUp < _cleanUpThreshold) + { + return; + } + + // Use a memory builder to collect keys of dead weak references + using var deadKeys = new MemoryBuilder(initialCapacity: _cacheMap.Count, clearArray: true); + + // Identify all keys with dead weak references + foreach (var (key, weakRef) in _cacheMap) + { + if (!weakRef.TryGetTarget(out _)) + { + deadKeys.Append(key); + } + } + + // Remove all dead entries from the cache + foreach (var key in deadKeys.AsMemory().Span) + { + _cacheMap.Remove(key); + } + + // Reset the add counter since we just performed cleanup + _addsSinceLastCleanUp = 0; + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/BitOperations.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/BitOperations.cs new file mode 100644 index 00000000000..1474fda6de2 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/BitOperations.cs @@ -0,0 +1,20 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Copied from https://github.com/dotnet/runtime/blob/f1d463f46268382a8287d71aea929dadaa5dfef5/src/libraries/System.IO.Hashing/src/System/IO/Hashing/BitOperations.cs#L1C1-L18C2 +// Remove once we can actually add a reference to System.IO.Hashing v8.0.0 + +using System.Runtime.CompilerServices; + +namespace System.Numerics; + +internal static class RuntimeBitOperations +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint RotateLeft(uint value, int offset) + => (value << offset) | (value >> (32 - offset)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong RotateLeft(ulong value, int offset) + => (value << offset) | (value >> (64 - offset)); +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/NonCryptographicHashAlgorithm.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/NonCryptographicHashAlgorithm.cs new file mode 100644 index 00000000000..e176a3ddcc1 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/NonCryptographicHashAlgorithm.cs @@ -0,0 +1,353 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Copied from https://github.com/dotnet/runtime/blob/f1d463f46268382a8287d71aea929dadaa5dfef5/src/libraries/System.IO.Hashing/src/System/IO/Hashing/NonCryptographicHashAlgorithm.cs#L1 +// Remove once we can actually add a reference to System.IO.Hashing v8.0.0 +// + +using System.Buffers; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using System.Threading.Tasks; + +namespace System.IO.Hashing; + +/// +/// Represents a non-cryptographic hash algorithm. +/// +internal abstract class NonCryptographicHashAlgorithm +{ + /// + /// Gets the number of bytes produced from this hash algorithm. + /// + /// The number of bytes produced from this hash algorithm. + public int HashLengthInBytes { get; } + + /// + /// Called from constructors in derived classes to initialize the + /// class. + /// + /// + /// The number of bytes produced from this hash algorithm. + /// + /// + /// is less than 1. + /// + protected NonCryptographicHashAlgorithm(int hashLengthInBytes) + { + if (hashLengthInBytes < 1) + throw new ArgumentOutOfRangeException(nameof(hashLengthInBytes)); + + HashLengthInBytes = hashLengthInBytes; + } + + /// + /// When overridden in a derived class, + /// appends the contents of to the data already + /// processed for the current hash computation. + /// + /// The data to process. + public abstract void Append(ReadOnlySpan source); + + /// + /// When overridden in a derived class, + /// resets the hash computation to the initial state. + /// + public abstract void Reset(); + + /// + /// When overridden in a derived class, + /// writes the computed hash value to + /// without modifying accumulated state. + /// + /// The buffer that receives the computed hash value. + /// + /// + /// Implementations of this method must write exactly + /// bytes to . + /// Do not assume that the buffer was zero-initialized. + /// + /// + /// The class validates the + /// size of the buffer before calling this method, and slices the span + /// down to be exactly in length. + /// + /// + protected abstract void GetCurrentHashCore(Span destination); + + /// + /// Appends the contents of to the data already + /// processed for the current hash computation. + /// + /// The data to process. + /// + /// is . + /// + public void Append(byte[] source) + { + if (source is null) + { + throw new ArgumentNullException(nameof(source)); + } + + Append(new ReadOnlySpan(source)); + } + + /// + /// Appends the contents of to the data already + /// processed for the current hash computation. + /// + /// The data to process. + /// + /// is . + /// + /// + public void Append(Stream stream) + { + if (stream is null) + { + throw new ArgumentNullException(nameof(stream)); + } + + byte[] buffer = ArrayPool.Shared.Rent(4096); + + while (true) + { + int read = stream.Read(buffer, 0, buffer.Length); + + if (read == 0) + { + break; + } + + Append(new ReadOnlySpan(buffer, 0, read)); + } + + ArrayPool.Shared.Return(buffer); + } + + /// + /// Asychronously reads the contents of + /// and appends them to the data already + /// processed for the current hash computation. + /// + /// The data to process. + /// + /// The token to monitor for cancellation requests. + /// The default value is . + /// + /// + /// A task that represents the asynchronous append operation. + /// + /// + /// is . + /// + public Task AppendAsync(Stream stream, CancellationToken cancellationToken = default) + { + if (stream is null) + { + throw new ArgumentNullException(nameof(stream)); + } + + return AppendAsyncCore(stream, cancellationToken); + } + + private async Task AppendAsyncCore(Stream stream, CancellationToken cancellationToken) + { + byte[] buffer = ArrayPool.Shared.Rent(4096); + + while (true) + { +#if NET + int read = await stream.ReadAsync(buffer.AsMemory(), cancellationToken).ConfigureAwait(false); +#else + int read = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false); +#endif + + if (read == 0) + { + break; + } + + Append(new ReadOnlySpan(buffer, 0, read)); + } + + ArrayPool.Shared.Return(buffer); + } + + /// + /// Gets the current computed hash value without modifying accumulated state. + /// + /// + /// The hash value for the data already provided. + /// + public byte[] GetCurrentHash() + { + byte[] ret = new byte[HashLengthInBytes]; + GetCurrentHashCore(ret); + return ret; + } + + /// + /// Attempts to write the computed hash value to + /// without modifying accumulated state. + /// + /// The buffer that receives the computed hash value. + /// + /// On success, receives the number of bytes written to . + /// + /// + /// if is long enough to receive + /// the computed hash value; otherwise, . + /// + public bool TryGetCurrentHash(Span destination, out int bytesWritten) + { + if (destination.Length < HashLengthInBytes) + { + bytesWritten = 0; + return false; + } + + GetCurrentHashCore(destination.Slice(0, HashLengthInBytes)); + bytesWritten = HashLengthInBytes; + return true; + } + + /// + /// Writes the computed hash value to + /// without modifying accumulated state. + /// + /// The buffer that receives the computed hash value. + /// + /// The number of bytes written to , + /// which is always . + /// + /// + /// is shorter than . + /// + public int GetCurrentHash(Span destination) + { + if (destination.Length < HashLengthInBytes) + { + ThrowDestinationTooShort(); + } + + GetCurrentHashCore(destination.Slice(0, HashLengthInBytes)); + return HashLengthInBytes; + } + + /// + /// Gets the current computed hash value and clears the accumulated state. + /// + /// + /// The hash value for the data already provided. + /// + public byte[] GetHashAndReset() + { + byte[] ret = new byte[HashLengthInBytes]; + GetHashAndResetCore(ret); + return ret; + } + + /// + /// Attempts to write the computed hash value to . + /// If successful, clears the accumulated state. + /// + /// The buffer that receives the computed hash value. + /// + /// On success, receives the number of bytes written to . + /// + /// + /// and clears the accumulated state + /// if is long enough to receive + /// the computed hash value; otherwise, . + /// + public bool TryGetHashAndReset(Span destination, out int bytesWritten) + { + if (destination.Length < HashLengthInBytes) + { + bytesWritten = 0; + return false; + } + + GetHashAndResetCore(destination.Slice(0, HashLengthInBytes)); + bytesWritten = HashLengthInBytes; + return true; + } + + /// + /// Writes the computed hash value to + /// then clears the accumulated state. + /// + /// The buffer that receives the computed hash value. + /// + /// The number of bytes written to , + /// which is always . + /// + /// + /// is shorter than . + /// + public int GetHashAndReset(Span destination) + { + if (destination.Length < HashLengthInBytes) + { + ThrowDestinationTooShort(); + } + + GetHashAndResetCore(destination.Slice(0, HashLengthInBytes)); + return HashLengthInBytes; + } + + /// + /// Writes the computed hash value to + /// then clears the accumulated state. + /// + /// The buffer that receives the computed hash value. + /// + /// + /// Implementations of this method must write exactly + /// bytes to . + /// Do not assume that the buffer was zero-initialized. + /// + /// + /// The class validates the + /// size of the buffer before calling this method, and slices the span + /// down to be exactly in length. + /// + /// + /// The default implementation of this method calls + /// followed by . + /// Overrides of this method do not need to call either of those methods, + /// but must ensure that the caller cannot observe a difference in behavior. + /// + /// + protected virtual void GetHashAndResetCore(Span destination) + { + Debug.Assert(destination.Length == HashLengthInBytes); + + GetCurrentHashCore(destination); + Reset(); + } + + /// + /// This method is not supported and should not be called. + /// Call or + /// instead. + /// + /// This method will always throw a . + /// In all cases. + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete("Use GetCurrentHash() to retrieve the computed hash code.", true)] +#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member + public override int GetHashCode() +#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member + { + throw new NotSupportedException("GetHashCode not supported"); + } + + [DoesNotReturn] + private protected static void ThrowDestinationTooShort() => + throw new ArgumentException("Destination is too short", "destination"); +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHash128.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHash128.cs new file mode 100644 index 00000000000..7a0c5e53ca7 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHash128.cs @@ -0,0 +1,449 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Copied from https://github.com/dotnet/runtime/blob/f1d463f46268382a8287d71aea929dadaa5dfef5/src/libraries/System.IO.Hashing/src/System/IO/Hashing/XxHash128.cs#L1. +// Remove once we can actually add a reference to System.IO.Hashing v8.0.0 +// + +// Based on the XXH128 implementation from https://github.com/Cyan4973/xxHash. + +using System.Buffers.Binary; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Numerics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using static System.IO.Hashing.XxHashShared; + +namespace System.IO.Hashing; + +/// Provides an implementation of the XXH128 hash algorithm for generating a 128-bit hash. +/// +/// For methods that persist the computed numerical hash value as bytes, +/// the value is written in the Big Endian byte order. +/// +#if NET5_0_OR_GREATER +[SkipLocalsInit] +#endif +internal sealed unsafe class XxHash128 : NonCryptographicHashAlgorithm +{ + /// XXH128 produces 16-byte hashes. + private new const int HashLengthInBytes = 16; + + private State _state; + + /// Initializes a new instance of the class using the default seed value 0. + public XxHash128() : this(0) + { + } + + /// Initializes a new instance of the class using the specified seed. + public XxHash128(long seed) : base(HashLengthInBytes) + { + Initialize(ref _state, (ulong)seed); + } + + /// Computes the XXH128 hash of the provided data. + /// The data to hash. + /// The XXH128 128-bit hash code of the provided data. + /// is null. + public static byte[] Hash(byte[] source) => Hash(source, seed: 0); + + /// Computes the XXH128 hash of the provided data using the provided seed. + /// The data to hash. + /// The seed value for this hash computation. + /// The XXH128 128-bit hash code of the provided data. + /// is null. + public static byte[] Hash(byte[] source, long seed) + { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(source); +#else + if (source is null) + { + throw new ArgumentNullException(nameof(source)); + } +#endif + + return Hash(new ReadOnlySpan(source), seed); + } + + /// Computes the XXH128 hash of the provided data using the optionally provided . + /// The data to hash. + /// The seed value for this hash computation. The default is zero. + /// The XXH128 128-bit hash code of the provided data. + public static byte[] Hash(ReadOnlySpan source, long seed = 0) + { + byte[] result = new byte[HashLengthInBytes]; + Hash(source, result, seed); + return result; + } + + /// Computes the XXH128 hash of the provided data into the provided using the optionally provided . + /// The data to hash. + /// The buffer that receives the computed 128-bit hash code. + /// The seed value for this hash computation. The default is zero. + /// The number of bytes written to . + /// is shorter than (16 bytes). + public static int Hash(ReadOnlySpan source, Span destination, long seed = 0) + { + if (!TryHash(source, destination, out int bytesWritten, seed)) + { + ThrowDestinationTooShort(); + } + + return bytesWritten; + } + + /// Attempts to compute the XXH128 hash of the provided data into the provided using the optionally provided . + /// The data to hash. + /// The buffer that receives the computed 128-bit hash code. + /// When this method returns, contains the number of bytes written to . + /// The seed value for this hash computation. The default is zero. + /// if is long enough to receive the computed hash value (16 bytes); otherwise, . + public static bool TryHash(ReadOnlySpan source, Span destination, out int bytesWritten, long seed = 0) + { + if (destination.Length >= sizeof(ulong) * 2) + { + Hash128 hash = HashToHash128(source, seed); + WriteBigEndian128(hash, destination); + bytesWritten = HashLengthInBytes; + return true; + } + + bytesWritten = 0; + return false; + } + +#if NET8_0_OR_GREATER + /// Computes the XXH128 hash of the provided data. + /// The data to hash. + /// The seed value for this hash computation. The default is zero. + /// The computed XXH128 hash. + // [CLSCompliant(false)] + public static UInt128 HashToUInt128(ReadOnlySpan source, long seed = 0) + { + Hash128 hash = HashToHash128(source, seed); + return new UInt128(hash.High64, hash.Low64); + } +#endif + + private static Hash128 HashToHash128(ReadOnlySpan source, long seed = 0) + { + uint length = (uint)source.Length; + fixed (byte* sourcePtr = &MemoryMarshal.GetReference(source)) + { + if (length <= 16) + { + return HashLength0To16(sourcePtr, length, (ulong)seed); + } + + if (length <= 128) + { + return HashLength17To128(sourcePtr, length, (ulong)seed); + } + + if (length <= MidSizeMaxBytes) + { + return HashLength129To240(sourcePtr, length, (ulong)seed); + } + + return HashLengthOver240(sourcePtr, length, (ulong)seed); + } + } + + /// Resets the hash computation to the initial state. + public override void Reset() + { + XxHashShared.Reset(ref _state); + } + + /// Appends the contents of to the data already processed for the current hash computation. + /// The data to process. + public override void Append(ReadOnlySpan source) + { + XxHashShared.Append(ref _state, source); + } + + /// Writes the computed 128-bit hash value to without modifying accumulated state. + /// The buffer that receives the computed hash value. + protected override void GetCurrentHashCore(Span destination) + { + Hash128 current = GetCurrentHashAsHash128(); + WriteBigEndian128(current, destination); + } + + private Hash128 GetCurrentHashAsHash128() + { + Hash128 current; + + if (_state.TotalLength > MidSizeMaxBytes) + { + // Digest on a local copy to ensure the accumulators remain unaltered. + ulong* accumulators = stackalloc ulong[AccumulatorCount]; + CopyAccumulators(ref _state, accumulators); + + fixed (byte* secret = _state.Secret) + { + DigestLong(ref _state, accumulators, secret); + current = new Hash128( + low64: MergeAccumulators(accumulators, secret + SecretMergeAccsStartBytes, _state.TotalLength * Prime64_1), + high64: MergeAccumulators(accumulators, secret + SecretLengthBytes - AccumulatorCount * sizeof(ulong) - SecretMergeAccsStartBytes, ~(_state.TotalLength * Prime64_2))); + } + } + else + { + fixed (byte* buffer = _state.Buffer) + { + current = HashToHash128(new ReadOnlySpan(buffer, (int)_state.TotalLength), (long)_state.Seed); + } + } + + return current; + } + +#if NET8_0_OR_GREATER + /// Gets the current computed hash value without modifying accumulated state. + /// The hash value for the data already provided. + // [CLSCompliant(false)] + public UInt128 GetCurrentHashAsUInt128() + { + Hash128 current = GetCurrentHashAsHash128(); + return new UInt128(current.High64, current.Low64); + } +#endif + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void WriteBigEndian128(in Hash128 hash, Span destination) + { + ulong low = hash.Low64; + ulong high = hash.High64; + if (BitConverter.IsLittleEndian) + { + low = BinaryPrimitives.ReverseEndianness(low); + high = BinaryPrimitives.ReverseEndianness(high); + } + + ref byte dest0 = ref MemoryMarshal.GetReference(destination); + Unsafe.WriteUnaligned(ref dest0, high); + Unsafe.WriteUnaligned(ref Unsafe.AddByteOffset(ref dest0, new IntPtr(sizeof(ulong))), low); + } + + private static Hash128 HashLength0To16(byte* source, uint length, ulong seed) + { + if (length > 8) + { + return HashLength9To16(source, length, seed); + } + + if (length >= 4) + { + return HashLength4To8(source, length, seed); + } + + if (length != 0) + { + return HashLength1To3(source, length, seed); + } + + const ulong BitFlipL = DefaultSecretUInt64_8 ^ DefaultSecretUInt64_9; + const ulong BitFlipH = DefaultSecretUInt64_10 ^ DefaultSecretUInt64_11; + return new Hash128(XxHash64.Avalanche(seed ^ BitFlipL), XxHash64.Avalanche(seed ^ BitFlipH)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Hash128 HashLength1To3(byte* source, uint length, ulong seed) + { + Debug.Assert(length >= 1 && length <= 3); + + // When source.Length == 1, c1 == source[0], c2 == source[0], c3 == source[0] + // When source.Length == 2, c1 == source[0], c2 == source[1], c3 == source[1] + // When source.Length == 3, c1 == source[0], c2 == source[1], c3 == source[2] + byte c1 = *source; + byte c2 = source[length >> 1]; + byte c3 = source[length - 1]; + + uint combinedl = ((uint)c1 << 16) | ((uint)c2 << 24) | c3 | (length << 8); + + uint combinedh = RuntimeBitOperations.RotateLeft(BinaryPrimitives.ReverseEndianness(combinedl), 13); + const uint SecretXorL = (unchecked((uint)DefaultSecretUInt64_0) ^ (uint)(DefaultSecretUInt64_0 >> 32)); + const uint SecretXorH = (unchecked((uint)DefaultSecretUInt64_1) ^ (uint)(DefaultSecretUInt64_1 >> 32)); + ulong bitflipl = SecretXorL + seed; + ulong bitfliph = SecretXorH - seed; + ulong keyedLo = combinedl ^ bitflipl; + ulong keyedHi = combinedh ^ bitfliph; + + return new Hash128(XxHash64.Avalanche(keyedLo), XxHash64.Avalanche(keyedHi)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Hash128 HashLength4To8(byte* source, uint length, ulong seed) + { + Debug.Assert(length >= 4 && length <= 8); + + seed ^= (ulong)BinaryPrimitives.ReverseEndianness((uint)seed) << 32; + + uint inputLo = ReadUInt32LE(source); + uint inputHi = ReadUInt32LE(source + length - 4); + ulong input64 = inputLo + ((ulong)inputHi << 32); + ulong bitflip = (DefaultSecretUInt64_2 ^ DefaultSecretUInt64_3) + seed; + ulong keyed = input64 ^ bitflip; + + ulong m128High = Multiply64To128(keyed, Prime64_1 + (length << 2), out ulong m128Low); + + m128High += (m128Low << 1); + m128Low ^= (m128High >> 3); + + m128Low = XorShift(m128Low, 35); + m128Low *= 0x9FB21C651E98DF25UL; + m128Low = XorShift(m128Low, 28); + m128High = Avalanche(m128High); + + return new Hash128(m128Low, m128High); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Hash128 HashLength9To16(byte* source, uint length, ulong seed) + { + Debug.Assert(length >= 9 && length <= 16); + ulong bitflipl = (DefaultSecretUInt64_4 ^ DefaultSecretUInt64_5) - seed; + ulong bitfliph = (DefaultSecretUInt64_6 ^ DefaultSecretUInt64_7) + seed; + ulong inputLo = ReadUInt64LE(source); + ulong inputHi = ReadUInt64LE(source + length - 8); + ulong m128High = Multiply64To128(inputLo ^ inputHi ^ bitflipl, Prime64_1, out ulong m128Low); + + m128Low += (ulong)(length - 1) << 54; + inputHi ^= bitfliph; + + m128High += sizeof(void*) < sizeof(ulong) ? + (inputHi & 0xFFFFFFFF00000000UL) + Multiply32To64((uint)inputHi, Prime32_2) : + inputHi + Multiply32To64((uint)inputHi, Prime32_2 - 1); + + m128Low ^= BinaryPrimitives.ReverseEndianness(m128High); + + ulong h128High = Multiply64To128(m128Low, Prime64_2, out ulong h128Low); + h128High += m128High * (ulong)Prime64_2; + + h128Low = Avalanche(h128Low); + h128High = Avalanche(h128High); + return new Hash128(h128Low, h128High); + } + + private static Hash128 HashLength17To128(byte* source, uint length, ulong seed) + { + Debug.Assert(length >= 17 && length <= 128); + + ulong accLow = length * Prime64_1; + ulong accHigh = 0; + + switch ((length - 1) / 32) + { + default: // case 3 + Mix32Bytes(ref accLow, ref accHigh, source + 48, source + length - 64, DefaultSecretUInt64_12, DefaultSecretUInt64_13, DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed); + goto case 2; + case 2: + Mix32Bytes(ref accLow, ref accHigh, source + 32, source + length - 48, DefaultSecretUInt64_8, DefaultSecretUInt64_9, DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed); + goto case 1; + case 1: + Mix32Bytes(ref accLow, ref accHigh, source + 16, source + length - 32, DefaultSecretUInt64_4, DefaultSecretUInt64_5, DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed); + goto case 0; + case 0: + Mix32Bytes(ref accLow, ref accHigh, source, source + length - 16, DefaultSecretUInt64_0, DefaultSecretUInt64_1, DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed); + break; + } + + return AvalancheHash(accLow, accHigh, length, seed); + } + + private static Hash128 HashLength129To240(byte* source, uint length, ulong seed) + { + Debug.Assert(length >= 129 && length <= 240); + + ulong accLow = length * Prime64_1; + ulong accHigh = 0; + + Mix32Bytes(ref accLow, ref accHigh, source + (32 * 0), source + (32 * 0) + 16, DefaultSecretUInt64_0, DefaultSecretUInt64_1, DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed); + Mix32Bytes(ref accLow, ref accHigh, source + (32 * 1), source + (32 * 1) + 16, DefaultSecretUInt64_4, DefaultSecretUInt64_5, DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed); + Mix32Bytes(ref accLow, ref accHigh, source + (32 * 2), source + (32 * 2) + 16, DefaultSecretUInt64_8, DefaultSecretUInt64_9, DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed); + Mix32Bytes(ref accLow, ref accHigh, source + (32 * 3), source + (32 * 3) + 16, DefaultSecretUInt64_12, DefaultSecretUInt64_13, DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed); + + accLow = Avalanche(accLow); + accHigh = Avalanche(accHigh); + + uint bound = ((length - (32 * 4)) / 32); + if (bound != 0) + { + Mix32Bytes(ref accLow, ref accHigh, source + (32 * 4), source + (32 * 4) + 16, DefaultSecret3UInt64_0, DefaultSecret3UInt64_1, DefaultSecret3UInt64_2, DefaultSecret3UInt64_3, seed); + if (bound >= 2) + { + Mix32Bytes(ref accLow, ref accHigh, source + (32 * 5), source + (32 * 5) + 16, DefaultSecret3UInt64_4, DefaultSecret3UInt64_5, DefaultSecret3UInt64_6, DefaultSecret3UInt64_7, seed); + if (bound == 3) + { + Mix32Bytes(ref accLow, ref accHigh, source + (32 * 6), source + (32 * 6) + 16, DefaultSecret3UInt64_8, DefaultSecret3UInt64_9, DefaultSecret3UInt64_10, DefaultSecret3UInt64_11, seed); + } + } + } + Mix32Bytes(ref accLow, ref accHigh, source + length - 16, source + length - 32, 0x4F0BC7C7BBDCF93F, 0x59B4CD4BE0518A1D, 0x7378D9C97E9FC831, 0xEBD33483ACC5EA64, 0 - seed); + + return AvalancheHash(accLow, accHigh, length, seed); + } + + private static Hash128 HashLengthOver240(byte* source, uint length, ulong seed) + { + Debug.Assert(length > 240); + + fixed (byte* defaultSecret = &MemoryMarshal.GetReference(DefaultSecret)) + { + byte* secret = defaultSecret; + if (seed != 0) + { + byte* customSecret = stackalloc byte[SecretLengthBytes]; + DeriveSecretFromSeed(customSecret, seed); + secret = customSecret; + } + + ulong* accumulators = stackalloc ulong[AccumulatorCount]; + InitializeAccumulators(accumulators); + + HashInternalLoop(accumulators, source, length, secret); + + return new Hash128( + low64: MergeAccumulators(accumulators, secret + SecretMergeAccsStartBytes, length * Prime64_1), + high64: MergeAccumulators(accumulators, secret + SecretLengthBytes - AccumulatorCount * sizeof(ulong) - SecretMergeAccsStartBytes, ~(length * Prime64_2))); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Hash128 AvalancheHash(ulong accLow, ulong accHigh, uint length, ulong seed) + { + ulong h128Low = accLow + accHigh; + ulong h128High = (accLow * Prime64_1) + + (accHigh * Prime64_4) + + ((length - seed) * Prime64_2); + h128Low = Avalanche(h128Low); + h128High = 0ul - Avalanche(h128High); + return new Hash128(h128Low, h128High); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void Mix32Bytes(ref ulong accLow, ref ulong accHigh, byte* input1, byte* input2, ulong secret1, ulong secret2, ulong secret3, ulong secret4, ulong seed) + { + accLow += Mix16Bytes(input1, secret1, secret2, seed); + accLow ^= ReadUInt64LE(input2) + ReadUInt64LE(input2 + 8); + accHigh += Mix16Bytes(input2, secret3, secret4, seed); + accHigh ^= ReadUInt64LE(input1) + ReadUInt64LE(input1 + 8); + } + + [DebuggerDisplay("Low64 = {" + nameof(Low64) + "}, High64 = {" + nameof(High64) + "}")] + private readonly struct Hash128 + { + public readonly ulong Low64; + public readonly ulong High64; + + public Hash128(ulong low64, ulong high64) + { + Low64 = low64; + High64 = high64; + } + } +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHash64.State.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHash64.State.cs new file mode 100644 index 00000000000..197428de8d0 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHash64.State.cs @@ -0,0 +1,146 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Copied from https://github.com/dotnet/runtime/blob/f1d463f46268382a8287d71aea929dadaa5dfef5/src/libraries/System.IO.Hashing/src/System/IO/Hashing/XxHash64.State.cs#L1C13-L1C13 +// Remove once we can actually add a reference to System.IO.Hashing v8.0.0 + +// Implemented from the specification at +// https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md + +using System.Runtime.CompilerServices; +using static System.IO.Hashing.XxHashShared; + +namespace System.IO.Hashing; + +internal sealed partial class XxHash64 +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static ulong Avalanche(ulong hash) + { + hash ^= hash >> 33; + hash *= Prime64_2; + hash ^= hash >> 29; + hash *= Prime64_3; + hash ^= hash >> 32; + return hash; + } + +#if false + private struct State + { + private ulong _acc1; + private ulong _acc2; + private ulong _acc3; + private ulong _acc4; + private readonly ulong _smallAcc; + private bool _hadFullStripe; + + internal State(ulong seed) + { + _acc1 = seed + unchecked(Prime64_1 + Prime64_2); + _acc2 = seed + Prime64_2; + _acc3 = seed; + _acc4 = seed - Prime64_1; + + _smallAcc = seed + Prime64_5; + _hadFullStripe = false; + } + + internal void ProcessStripe(ReadOnlySpan source) + { + Debug.Assert(source.Length >= StripeSize); + source = source.Slice(0, StripeSize); + + _acc1 = ApplyRound(_acc1, source); + _acc2 = ApplyRound(_acc2, source.Slice(sizeof(ulong))); + _acc3 = ApplyRound(_acc3, source.Slice(2 * sizeof(ulong))); + _acc4 = ApplyRound(_acc4, source.Slice(3 * sizeof(ulong))); + + _hadFullStripe = true; + } + + private static ulong MergeAccumulator(ulong acc, ulong accN) + { + acc ^= ApplyRound(0, accN); + acc *= Prime64_1; + acc += Prime64_4; + + return acc; + } + + private readonly ulong Converge() + { + ulong acc = + BitOperations.RotateLeft(_acc1, 1) + + BitOperations.RotateLeft(_acc2, 7) + + BitOperations.RotateLeft(_acc3, 12) + + BitOperations.RotateLeft(_acc4, 18); + + acc = MergeAccumulator(acc, _acc1); + acc = MergeAccumulator(acc, _acc2); + acc = MergeAccumulator(acc, _acc3); + acc = MergeAccumulator(acc, _acc4); + + return acc; + } + + private static ulong ApplyRound(ulong acc, ReadOnlySpan lane) + { + return ApplyRound(acc, BinaryPrimitives.ReadUInt64LittleEndian(lane)); + } + + private static ulong ApplyRound(ulong acc, ulong lane) + { + acc += lane * Prime64_2; + acc = BitOperations.RotateLeft(acc, 31); + acc *= Prime64_1; + + return acc; + } + + // Inliner may decide to inline this method into HashToUInt64() with help of PGO and + // can run out of "time budget" producing non-inlined simple calls such as Span.Slice. + // TODO: Remove NoInlining when https://github.com/dotnet/runtime/issues/85531 is fixed. + [MethodImpl(MethodImplOptions.NoInlining)] + internal readonly ulong Complete(long length, ReadOnlySpan remaining) + { + ulong acc = _hadFullStripe ? Converge() : _smallAcc; + + acc += (ulong)length; + + while (remaining.Length >= sizeof(ulong)) + { + ulong lane = BinaryPrimitives.ReadUInt64LittleEndian(remaining); + acc ^= ApplyRound(0, lane); + acc = BitOperations.RotateLeft(acc, 27); + acc *= Prime64_1; + acc += Prime64_4; + + remaining = remaining.Slice(sizeof(ulong)); + } + + // Doesn't need to be a while since it can occur at most once. + if (remaining.Length >= sizeof(uint)) + { + ulong lane = BinaryPrimitives.ReadUInt32LittleEndian(remaining); + acc ^= lane * Prime64_1; + acc = BitOperations.RotateLeft(acc, 23); + acc *= Prime64_2; + acc += Prime64_3; + + remaining = remaining.Slice(sizeof(uint)); + } + + for (int i = 0; i < remaining.Length; i++) + { + ulong lane = remaining[i]; + acc ^= lane * Prime64_5; + acc = BitOperations.RotateLeft(acc, 11); + acc *= Prime64_1; + } + + return Avalanche(acc); + } + } +#endif +} diff --git a/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHashShared.cs b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHashShared.cs new file mode 100644 index 00000000000..3d49359bc65 --- /dev/null +++ b/src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Utilities/Hashing/XxHashShared.cs @@ -0,0 +1,836 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Copied from: https://github.com/dotnet/runtime/blob/f1d463f46268382a8287d71aea929dadaa5dfef5/src/libraries/System.IO.Hashing/src/System/IO/Hashing/XxHashShared.cs#L1 +// Remove once we can actually add a reference to System.IO.Hashing v8.0.0 +// + +using System.Buffers.Binary; +using System.Diagnostics; +using System.Numerics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +#if NET8_0_OR_GREATER +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; +using System.Runtime.Intrinsics.X86; +#endif + +namespace System.IO.Hashing; + +// /// Shared implementation of the XXH3 hash algorithm for 64-bit in and version. +#if NET5_0_OR_GREATER +[SkipLocalsInit] +#endif +internal static unsafe class XxHashShared +{ + public const int StripeLengthBytes = 64; + public const int SecretLengthBytes = 192; + public const int SecretSizeMin = 136; + public const int SecretLastAccStartBytes = 7; + public const int SecretConsumeRateBytes = 8; + public const int SecretMergeAccsStartBytes = 11; + public const int NumStripesPerBlock = (SecretLengthBytes - StripeLengthBytes) / SecretConsumeRateBytes; + public const int AccumulatorCount = StripeLengthBytes / sizeof(ulong); + public const int MidSizeMaxBytes = 240; + public const int InternalBufferStripes = InternalBufferLengthBytes / StripeLengthBytes; + public const int InternalBufferLengthBytes = 256; + + /// The default secret for when no seed is provided. + /// This is the same as a custom secret derived from a seed of 0. + public static ReadOnlySpan DefaultSecret => + [ + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, // DefaultSecretUInt64_0 + 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, // DefaultSecretUInt64_1 + 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, // DefaultSecretUInt64_2 + 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, // DefaultSecretUInt64_3 + 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, // DefaultSecretUInt64_4 + 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, // DefaultSecretUInt64_5 + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, // DefaultSecretUInt64_6 + 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, // DefaultSecretUInt64_7 + 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, // DefaultSecretUInt64_8 + 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, // DefaultSecretUInt64_9 + 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, // DefaultSecretUInt64_10 + 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, // DefaultSecretUInt64_11 + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, // DefaultSecretUInt64_12 + 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, // DefaultSecretUInt64_13 + 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, // DefaultSecretUInt64_14 + 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, // DefaultSecretUInt64_15 + 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, // DefaultSecretUInt64_16 + 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, // DefaultSecretUInt64_17 + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, // DefaultSecretUInt64_18 + 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, // DefaultSecretUInt64_19 + 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, // DefaultSecretUInt64_20 + 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, // DefaultSecretUInt64_21 + 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, // DefaultSecretUInt64_22 + 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, // DefaultSecretUInt64_23 + ]; + + // Cast of DefaultSecret byte[] => ulong[] (See above for the correspondence) + public const ulong DefaultSecretUInt64_0 = 0xBE4BA423396CFEB8; + public const ulong DefaultSecretUInt64_1 = 0x1CAD21F72C81017C; + public const ulong DefaultSecretUInt64_2 = 0xDB979083E96DD4DE; + public const ulong DefaultSecretUInt64_3 = 0x1F67B3B7A4A44072; + public const ulong DefaultSecretUInt64_4 = 0x78E5C0CC4EE679CB; + public const ulong DefaultSecretUInt64_5 = 0x2172FFCC7DD05A82; + public const ulong DefaultSecretUInt64_6 = 0x8E2443F7744608B8; + public const ulong DefaultSecretUInt64_7 = 0x4C263A81E69035E0; + public const ulong DefaultSecretUInt64_8 = 0xCB00C391BB52283C; + public const ulong DefaultSecretUInt64_9 = 0xA32E531B8B65D088; + public const ulong DefaultSecretUInt64_10 = 0x4EF90DA297486471; + public const ulong DefaultSecretUInt64_11 = 0xD8ACDEA946EF1938; + public const ulong DefaultSecretUInt64_12 = 0x3F349CE33F76FAA8; + public const ulong DefaultSecretUInt64_13 = 0x1D4F0BC7C7BBDCF9; + public const ulong DefaultSecretUInt64_14 = 0x3159B4CD4BE0518A; + public const ulong DefaultSecretUInt64_15 = 0x647378D9C97E9FC8; + + // Cast of DefaultSecret offset by 3 bytes, byte[] => ulong[] + public const ulong DefaultSecret3UInt64_0 = 0x81017CBE4BA42339; + public const ulong DefaultSecret3UInt64_1 = 0x6DD4DE1CAD21F72C; + public const ulong DefaultSecret3UInt64_2 = 0xA44072DB979083E9; + public const ulong DefaultSecret3UInt64_3 = 0xE679CB1F67B3B7A4; + public const ulong DefaultSecret3UInt64_4 = 0xD05A8278E5C0CC4E; + public const ulong DefaultSecret3UInt64_5 = 0x4608B82172FFCC7D; + public const ulong DefaultSecret3UInt64_6 = 0x9035E08E2443F774; + public const ulong DefaultSecret3UInt64_7 = 0x52283C4C263A81E6; + public const ulong DefaultSecret3UInt64_8 = 0x65D088CB00C391BB; + public const ulong DefaultSecret3UInt64_9 = 0x486471A32E531B8B; + public const ulong DefaultSecret3UInt64_10 = 0xEF19384EF90DA297; + public const ulong DefaultSecret3UInt64_11 = 0x76FAA8D8ACDEA946; + public const ulong DefaultSecret3UInt64_12 = 0xBBDCF93F349CE33F; + public const ulong DefaultSecret3UInt64_13 = 0xE0518A1D4F0BC7C7; + + public const ulong Prime64_1 = 0x9E3779B185EBCA87UL; + public const ulong Prime64_2 = 0xC2B2AE3D27D4EB4FUL; + public const ulong Prime64_3 = 0x165667B19E3779F9UL; + public const ulong Prime64_4 = 0x85EBCA77C2B2AE63UL; + public const ulong Prime64_5 = 0x27D4EB2F165667C5UL; + + public const uint Prime32_1 = 0x9E3779B1U; + public const uint Prime32_2 = 0x85EBCA77U; + public const uint Prime32_3 = 0xC2B2AE3DU; + public const uint Prime32_4 = 0x27D4EB2FU; + public const uint Prime32_5 = 0x165667B1U; + +#if DEBUG + static XxHashShared() + { + // Make sure DefaultSecret is the custom secret derived from a seed of 0. + byte* secret = stackalloc byte[SecretLengthBytes]; + DeriveSecretFromSeed(secret, 0); + Debug.Assert(new Span(secret, SecretLengthBytes).SequenceEqual(DefaultSecret)); + + // Validate some relationships. + Debug.Assert(InternalBufferLengthBytes % StripeLengthBytes == 0); + + ReadOnlySpan defaultSecretUInt64 = MemoryMarshal.Cast(DefaultSecret); + Debug.Assert(ReadLE64(defaultSecretUInt64[0]) == DefaultSecretUInt64_0); + Debug.Assert(ReadLE64(defaultSecretUInt64[1]) == DefaultSecretUInt64_1); + Debug.Assert(ReadLE64(defaultSecretUInt64[2]) == DefaultSecretUInt64_2); + Debug.Assert(ReadLE64(defaultSecretUInt64[3]) == DefaultSecretUInt64_3); + Debug.Assert(ReadLE64(defaultSecretUInt64[4]) == DefaultSecretUInt64_4); + Debug.Assert(ReadLE64(defaultSecretUInt64[5]) == DefaultSecretUInt64_5); + Debug.Assert(ReadLE64(defaultSecretUInt64[6]) == DefaultSecretUInt64_6); + Debug.Assert(ReadLE64(defaultSecretUInt64[7]) == DefaultSecretUInt64_7); + Debug.Assert(ReadLE64(defaultSecretUInt64[8]) == DefaultSecretUInt64_8); + Debug.Assert(ReadLE64(defaultSecretUInt64[9]) == DefaultSecretUInt64_9); + Debug.Assert(ReadLE64(defaultSecretUInt64[10]) == DefaultSecretUInt64_10); + Debug.Assert(ReadLE64(defaultSecretUInt64[11]) == DefaultSecretUInt64_11); + Debug.Assert(ReadLE64(defaultSecretUInt64[12]) == DefaultSecretUInt64_12); + Debug.Assert(ReadLE64(defaultSecretUInt64[13]) == DefaultSecretUInt64_13); + Debug.Assert(ReadLE64(defaultSecretUInt64[14]) == DefaultSecretUInt64_14); + Debug.Assert(ReadLE64(defaultSecretUInt64[15]) == DefaultSecretUInt64_15); + + ReadOnlySpan defaultSecret3UInt64 = MemoryMarshal.Cast(DefaultSecret.Slice(3)); + Debug.Assert(ReadLE64(defaultSecret3UInt64[0]) == DefaultSecret3UInt64_0); + Debug.Assert(ReadLE64(defaultSecret3UInt64[1]) == DefaultSecret3UInt64_1); + Debug.Assert(ReadLE64(defaultSecret3UInt64[2]) == DefaultSecret3UInt64_2); + Debug.Assert(ReadLE64(defaultSecret3UInt64[3]) == DefaultSecret3UInt64_3); + Debug.Assert(ReadLE64(defaultSecret3UInt64[4]) == DefaultSecret3UInt64_4); + Debug.Assert(ReadLE64(defaultSecret3UInt64[5]) == DefaultSecret3UInt64_5); + Debug.Assert(ReadLE64(defaultSecret3UInt64[6]) == DefaultSecret3UInt64_6); + Debug.Assert(ReadLE64(defaultSecret3UInt64[7]) == DefaultSecret3UInt64_7); + Debug.Assert(ReadLE64(defaultSecret3UInt64[8]) == DefaultSecret3UInt64_8); + Debug.Assert(ReadLE64(defaultSecret3UInt64[9]) == DefaultSecret3UInt64_9); + Debug.Assert(ReadLE64(defaultSecret3UInt64[10]) == DefaultSecret3UInt64_10); + Debug.Assert(ReadLE64(defaultSecret3UInt64[11]) == DefaultSecret3UInt64_11); + Debug.Assert(ReadLE64(defaultSecret3UInt64[12]) == DefaultSecret3UInt64_12); + Debug.Assert(ReadLE64(defaultSecret3UInt64[13]) == DefaultSecret3UInt64_13); + + static ulong ReadLE64(ulong data) => BitConverter.IsLittleEndian ? data : BinaryPrimitives.ReverseEndianness(data); + } +#endif + + public static void Initialize(ref State state, ulong seed) + { + state.Seed = (ulong)seed; + + fixed (byte* secret = state.Secret) + { + if (seed == 0) + { + DefaultSecret.CopyTo(new Span(secret, SecretLengthBytes)); + } + else + { + DeriveSecretFromSeed(secret, (ulong)seed); + } + } + + Reset(ref state); + } + + public static void Reset(ref State state) + { + state.BufferedCount = 0; + state.StripesProcessedInCurrentBlock = 0; + state.TotalLength = 0; + + fixed (ulong* accumulators = state.Accumulators) + { + InitializeAccumulators(accumulators); + } + } + +#if false + + /// "This is a stronger avalanche, preferable when input has not been previously mixed." + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong Rrmxmx(ulong hash, uint length) + { + hash ^= BitOperations.RotateLeft(hash, 49) ^ BitOperations.RotateLeft(hash, 24); + hash *= 0x9FB21C651E98DF25; + hash ^= (hash >> 35) + length; + hash *= 0x9FB21C651E98DF25; + return XorShift(hash, 28); + } + +#endif + + public static void HashInternalLoop(ulong* accumulators, byte* source, uint length, byte* secret) + { + Debug.Assert(length > 240); + + const int StripesPerBlock = (SecretLengthBytes - StripeLengthBytes) / SecretConsumeRateBytes; + const int BlockLen = StripeLengthBytes * StripesPerBlock; + int blocksNum = (int)((length - 1) / BlockLen); + + Accumulate(accumulators, source, secret, StripesPerBlock, true, blocksNum); + int offset = BlockLen * blocksNum; + + int stripesNumber = (int)((length - 1 - offset) / StripeLengthBytes); + Accumulate(accumulators, source + offset, secret, stripesNumber); + Accumulate512(accumulators, source + length - StripeLengthBytes, secret + (SecretLengthBytes - StripeLengthBytes - SecretLastAccStartBytes)); + } + + public static void ConsumeStripes(ulong* accumulators, ref ulong stripesSoFar, ulong stripesPerBlock, byte* source, ulong stripes, byte* secret) + { + Debug.Assert(stripes <= stripesPerBlock); // can handle max 1 scramble per invocation + Debug.Assert(stripesSoFar < stripesPerBlock); + + ulong stripesToEndOfBlock = stripesPerBlock - stripesSoFar; + if (stripesToEndOfBlock <= stripes) + { + // need a scrambling operation + ulong stripesAfterBlock = stripes - stripesToEndOfBlock; + Accumulate(accumulators, source, secret + ((int)stripesSoFar * SecretConsumeRateBytes), (int)stripesToEndOfBlock); + ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes)); + Accumulate(accumulators, source + ((int)stripesToEndOfBlock * StripeLengthBytes), secret, (int)stripesAfterBlock); + stripesSoFar = stripesAfterBlock; + } + else + { + Accumulate(accumulators, source, secret + ((int)stripesSoFar * SecretConsumeRateBytes), (int)stripes); + stripesSoFar += stripes; + } + } + + public static void Append(ref State state, ReadOnlySpan source) + { + Debug.Assert(state.BufferedCount <= InternalBufferLengthBytes); + + state.TotalLength += (uint)source.Length; + + fixed (byte* buffer = state.Buffer) + { + // Small input: just copy the data to the buffer. + if (source.Length <= InternalBufferLengthBytes - state.BufferedCount) + { + source.CopyTo(new Span(buffer + state.BufferedCount, source.Length)); + state.BufferedCount += (uint)source.Length; + return; + } + + fixed (byte* secret = state.Secret) + fixed (ulong* accumulators = state.Accumulators) + fixed (byte* sourcePtr = &MemoryMarshal.GetReference(source)) + { + // Internal buffer is partially filled (always, except at beginning). Complete it, then consume it. + int sourceIndex = 0; + if (state.BufferedCount != 0) + { + int loadSize = InternalBufferLengthBytes - (int)state.BufferedCount; + + source.Slice(0, loadSize).CopyTo(new Span(buffer + state.BufferedCount, loadSize)); + sourceIndex = loadSize; + + ConsumeStripes(accumulators, ref state.StripesProcessedInCurrentBlock, NumStripesPerBlock, buffer, InternalBufferStripes, secret); + state.BufferedCount = 0; + } + Debug.Assert(sourceIndex < source.Length); + + // Large input to consume: ingest per full block. + if (source.Length - sourceIndex > NumStripesPerBlock * StripeLengthBytes) + { + ulong stripes = (ulong)(source.Length - sourceIndex - 1) / StripeLengthBytes; + Debug.Assert(NumStripesPerBlock >= state.StripesProcessedInCurrentBlock); + + // Join to current block's end. + ulong stripesToEnd = NumStripesPerBlock - state.StripesProcessedInCurrentBlock; + Debug.Assert(stripesToEnd <= stripes); + Accumulate(accumulators, sourcePtr + sourceIndex, secret + ((int)state.StripesProcessedInCurrentBlock * SecretConsumeRateBytes), (int)stripesToEnd); + ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes)); + state.StripesProcessedInCurrentBlock = 0; + sourceIndex += (int)stripesToEnd * StripeLengthBytes; + stripes -= stripesToEnd; + + // Consume entire blocks. + while (stripes >= NumStripesPerBlock) + { + Accumulate(accumulators, sourcePtr + sourceIndex, secret, NumStripesPerBlock); + ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes)); + sourceIndex += NumStripesPerBlock * StripeLengthBytes; + stripes -= NumStripesPerBlock; + } + + // Consume complete stripes in the last partial block. + Accumulate(accumulators, sourcePtr + sourceIndex, secret, (int)stripes); + sourceIndex += (int)stripes * StripeLengthBytes; + Debug.Assert(sourceIndex < source.Length); // at least some bytes left + state.StripesProcessedInCurrentBlock = stripes; + + // Copy the last stripe into the end of the buffer so it is available to GetCurrentHashCore when processing the "stripe from the end". + source.Slice(sourceIndex - StripeLengthBytes, StripeLengthBytes).CopyTo(new Span(buffer + InternalBufferLengthBytes - StripeLengthBytes, StripeLengthBytes)); + } + else if (source.Length - sourceIndex > InternalBufferLengthBytes) + { + // Content to consume <= block size. Consume source by a multiple of internal buffer size. + do + { + ConsumeStripes(accumulators, ref state.StripesProcessedInCurrentBlock, NumStripesPerBlock, sourcePtr + sourceIndex, InternalBufferStripes, secret); + sourceIndex += InternalBufferLengthBytes; + } + while (source.Length - sourceIndex > InternalBufferLengthBytes); + + // Copy the last stripe into the end of the buffer so it is available to GetCurrentHashCore when processing the "stripe from the end". + source.Slice(sourceIndex - StripeLengthBytes, StripeLengthBytes).CopyTo(new Span(buffer + InternalBufferLengthBytes - StripeLengthBytes, StripeLengthBytes)); + } + + // Buffer the remaining input. + Span remaining = new Span(buffer, source.Length - sourceIndex); + Debug.Assert(sourceIndex < source.Length); + Debug.Assert(remaining.Length <= InternalBufferLengthBytes); + Debug.Assert(state.BufferedCount == 0); + source.Slice(sourceIndex).CopyTo(remaining); + state.BufferedCount = (uint)remaining.Length; + } + } + } + + public static void CopyAccumulators(ref State state, ulong* accumulators) + { + fixed (ulong* stateAccumulators = state.Accumulators) + { +#if NET8_0_OR_GREATER + if (Vector256.IsHardwareAccelerated) + { + Vector256.Store(Vector256.Load(stateAccumulators), accumulators); + Vector256.Store(Vector256.Load(stateAccumulators + 4), accumulators + 4); + } + else if (Vector128.IsHardwareAccelerated) + { + Vector128.Store(Vector128.Load(stateAccumulators), accumulators); + Vector128.Store(Vector128.Load(stateAccumulators + 2), accumulators + 2); + Vector128.Store(Vector128.Load(stateAccumulators + 4), accumulators + 4); + Vector128.Store(Vector128.Load(stateAccumulators + 6), accumulators + 6); + } + else +#endif + { + for (int i = 0; i < 8; i++) + { + accumulators[i] = stateAccumulators[i]; + } + } + } + } + + public static void DigestLong(ref State state, ulong* accumulators, byte* secret) + { + Debug.Assert(state.BufferedCount > 0); + + fixed (byte* buffer = state.Buffer) + { + byte* accumulateData; + if (state.BufferedCount >= StripeLengthBytes) + { + uint stripes = (state.BufferedCount - 1) / StripeLengthBytes; + ulong stripesSoFar = state.StripesProcessedInCurrentBlock; + + ConsumeStripes(accumulators, ref stripesSoFar, NumStripesPerBlock, buffer, stripes, secret); + + accumulateData = buffer + state.BufferedCount - StripeLengthBytes; + } + else + { + byte* lastStripe = stackalloc byte[StripeLengthBytes]; + int catchupSize = StripeLengthBytes - (int)state.BufferedCount; + + new ReadOnlySpan(buffer + InternalBufferLengthBytes - catchupSize, catchupSize).CopyTo(new Span(lastStripe, StripeLengthBytes)); + new ReadOnlySpan(buffer, (int)state.BufferedCount).CopyTo(new Span(lastStripe + catchupSize, (int)state.BufferedCount)); + accumulateData = lastStripe; + } + + Accumulate512(accumulators, accumulateData, secret + (SecretLengthBytes - StripeLengthBytes - SecretLastAccStartBytes)); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void InitializeAccumulators(ulong* accumulators) + { +#if NET8_0_OR_GREATER + if (Vector256.IsHardwareAccelerated) + { + Vector256.Store(Vector256.Create(Prime32_3, Prime64_1, Prime64_2, Prime64_3), accumulators); + Vector256.Store(Vector256.Create(Prime64_4, Prime32_2, Prime64_5, Prime32_1), accumulators + 4); + } + else if (Vector128.IsHardwareAccelerated) + { + Vector128.Store(Vector128.Create(Prime32_3, Prime64_1), accumulators); + Vector128.Store(Vector128.Create(Prime64_2, Prime64_3), accumulators + 2); + Vector128.Store(Vector128.Create(Prime64_4, Prime32_2), accumulators + 4); + Vector128.Store(Vector128.Create(Prime64_5, Prime32_1), accumulators + 6); + } + else +#endif + { + accumulators[0] = Prime32_3; + accumulators[1] = Prime64_1; + accumulators[2] = Prime64_2; + accumulators[3] = Prime64_3; + accumulators[4] = Prime64_4; + accumulators[5] = Prime32_2; + accumulators[6] = Prime64_5; + accumulators[7] = Prime32_1; + } + } + + public static ulong MergeAccumulators(ulong* accumulators, byte* secret, ulong start) + { + ulong result64 = start; + + result64 += Multiply64To128ThenFold(accumulators[0] ^ ReadUInt64LE(secret), accumulators[1] ^ ReadUInt64LE(secret + 8)); + result64 += Multiply64To128ThenFold(accumulators[2] ^ ReadUInt64LE(secret + 16), accumulators[3] ^ ReadUInt64LE(secret + 24)); + result64 += Multiply64To128ThenFold(accumulators[4] ^ ReadUInt64LE(secret + 32), accumulators[5] ^ ReadUInt64LE(secret + 40)); + result64 += Multiply64To128ThenFold(accumulators[6] ^ ReadUInt64LE(secret + 48), accumulators[7] ^ ReadUInt64LE(secret + 56)); + + return Avalanche(result64); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong Mix16Bytes(byte* source, ulong secretLow, ulong secretHigh, ulong seed) => + Multiply64To128ThenFold( + ReadUInt64LE(source) ^ (secretLow + seed), + ReadUInt64LE(source + sizeof(ulong)) ^ (secretHigh - seed)); + + /// Calculates a 32-bit to 64-bit long multiply. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong Multiply32To64(uint v1, uint v2) => (ulong)v1 * v2; + + /// "This is a fast avalanche stage, suitable when input bits are already partially mixed." + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong Avalanche(ulong hash) + { + hash = XorShift(hash, 37); + hash *= 0x165667919E3779F9; + hash = XorShift(hash, 32); + return hash; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong Multiply64To128(ulong left, ulong right, out ulong lower) + { +#if NET5_0_OR_GREATER + return Math.BigMul(left, right, out lower); +#else + ulong lowerLow = Multiply32To64((uint)left, (uint)right); + ulong higherLow = Multiply32To64((uint)(left >> 32), (uint)right); + ulong lowerHigh = Multiply32To64((uint)left, (uint)(right >> 32)); + ulong higherHigh = Multiply32To64((uint)(left >> 32), (uint)(right >> 32)); + + ulong cross = (lowerLow >> 32) + (higherLow & 0xFFFFFFFF) + lowerHigh; + ulong upper = (higherLow >> 32) + (cross >> 32) + higherHigh; + lower = (cross << 32) | (lowerLow & 0xFFFFFFFF); + return upper; +#endif + } + + /// Calculates a 64-bit to 128-bit multiply, then XOR folds it. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong Multiply64To128ThenFold(ulong left, ulong right) + { + ulong upper = Multiply64To128(left, right, out ulong lower); + return lower ^ upper; + } + + public static void DeriveSecretFromSeed(byte* destinationSecret, ulong seed) + { + fixed (byte* defaultSecret = &MemoryMarshal.GetReference(DefaultSecret)) + { +#if NET8_0_OR_GREATER + if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian) + { + Vector256 seedVec = Vector256.Create(seed, 0u - seed, seed, 0u - seed); + for (int i = 0; i < SecretLengthBytes; i += Vector256.Count) + { + Vector256.Store(Vector256.Load((ulong*)(defaultSecret + i)) + seedVec, (ulong*)(destinationSecret + i)); + } + } + else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian) + { + Vector128 seedVec = Vector128.Create(seed, 0u - seed); + for (int i = 0; i < SecretLengthBytes; i += Vector128.Count) + { + Vector128.Store(Vector128.Load((ulong*)(defaultSecret + i)) + seedVec, (ulong*)(destinationSecret + i)); + } + } + else +#endif + { + for (int i = 0; i < SecretLengthBytes; i += sizeof(ulong) * 2) + { + WriteUInt64LE(destinationSecret + i, ReadUInt64LE(defaultSecret + i) + seed); + WriteUInt64LE(destinationSecret + i + 8, ReadUInt64LE(defaultSecret + i + 8) - seed); + } + } + } + } + + /// Optimized version of looping over . + [MethodImpl(MethodImplOptions.NoInlining)] + private static void Accumulate(ulong* accumulators, byte* source, byte* secret, int stripesToProcess, bool scramble = false, int blockCount = 1) + { + byte* secretForAccumulate = secret; + byte* secretForScramble = secret + (SecretLengthBytes - StripeLengthBytes); + +#if NET8_0_OR_GREATER + if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian) + { + Vector256 acc1 = Vector256.Load(accumulators); + Vector256 acc2 = Vector256.Load(accumulators + Vector256.Count); + + for (int j = 0; j < blockCount; j++) + { + secret = secretForAccumulate; + for (int i = 0; i < stripesToProcess; i++) + { + Vector256 secretVal = Vector256.Load((uint*)secret); + acc1 = Accumulate256(acc1, source, secretVal); + source += Vector256.Count; + + secretVal = Vector256.Load((uint*)secret + Vector256.Count); + acc2 = Accumulate256(acc2, source, secretVal); + source += Vector256.Count; + + secret += SecretConsumeRateBytes; + } + + if (scramble) + { + acc1 = ScrambleAccumulator256(acc1, Vector256.Load((ulong*)secretForScramble)); + acc2 = ScrambleAccumulator256(acc2, Vector256.Load((ulong*)secretForScramble + Vector256.Count)); + } + } + + Vector256.Store(acc1, accumulators); + Vector256.Store(acc2, accumulators + Vector256.Count); + } + else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian) + { + Vector128 acc1 = Vector128.Load(accumulators); + Vector128 acc2 = Vector128.Load(accumulators + Vector128.Count); + Vector128 acc3 = Vector128.Load(accumulators + Vector128.Count * 2); + Vector128 acc4 = Vector128.Load(accumulators + Vector128.Count * 3); + + for (int j = 0; j < blockCount; j++) + { + secret = secretForAccumulate; + for (int i = 0; i < stripesToProcess; i++) + { + Vector128 secretVal = Vector128.Load((uint*)secret); + acc1 = Accumulate128(acc1, source, secretVal); + source += Vector128.Count; + + secretVal = Vector128.Load((uint*)secret + Vector128.Count); + acc2 = Accumulate128(acc2, source, secretVal); + source += Vector128.Count; + + secretVal = Vector128.Load((uint*)secret + Vector128.Count * 2); + acc3 = Accumulate128(acc3, source, secretVal); + source += Vector128.Count; + + secretVal = Vector128.Load((uint*)secret + Vector128.Count * 3); + acc4 = Accumulate128(acc4, source, secretVal); + source += Vector128.Count; + + secret += SecretConsumeRateBytes; + } + + if (scramble) + { + acc1 = ScrambleAccumulator128(acc1, Vector128.Load((ulong*)secretForScramble)); + acc2 = ScrambleAccumulator128(acc2, Vector128.Load((ulong*)secretForScramble + Vector128.Count)); + acc3 = ScrambleAccumulator128(acc3, Vector128.Load((ulong*)secretForScramble + Vector128.Count * 2)); + acc4 = ScrambleAccumulator128(acc4, Vector128.Load((ulong*)secretForScramble + Vector128.Count * 3)); + } + } + + Vector128.Store(acc1, accumulators); + Vector128.Store(acc2, accumulators + Vector128.Count); + Vector128.Store(acc3, accumulators + Vector128.Count * 2); + Vector128.Store(acc4, accumulators + Vector128.Count * 3); + } + else +#endif + { + for (int j = 0; j < blockCount; j++) + { + for (int i = 0; i < stripesToProcess; i++) + { + Accumulate512Inlined(accumulators, source, secret + (i * SecretConsumeRateBytes)); + source += StripeLengthBytes; + } + + if (scramble) + { + ScrambleAccumulators(accumulators, secretForScramble); + } + } + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static void Accumulate512(ulong* accumulators, byte* source, byte* secret) + { + Accumulate512Inlined(accumulators, source, secret); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void Accumulate512Inlined(ulong* accumulators, byte* source, byte* secret) + { +#if NET8_0_OR_GREATER + if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian) + { + for (int i = 0; i < AccumulatorCount / Vector256.Count; i++) + { + Vector256 accVec = Accumulate256(Vector256.Load(accumulators), source, Vector256.Load((uint*)secret)); + Vector256.Store(accVec, accumulators); + + accumulators += Vector256.Count; + secret += Vector256.Count; + source += Vector256.Count; + } + } + else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian) + { + for (int i = 0; i < AccumulatorCount / Vector128.Count; i++) + { + Vector128 accVec = Accumulate128(Vector128.Load(accumulators), source, Vector128.Load((uint*)secret)); + Vector128.Store(accVec, accumulators); + + accumulators += Vector128.Count; + secret += Vector128.Count; + source += Vector128.Count; + } + } + else +#endif + { + for (int i = 0; i < AccumulatorCount; i++) + { + ulong sourceVal = ReadUInt64LE(source + (8 * i)); + ulong sourceKey = sourceVal ^ ReadUInt64LE(secret + (i * 8)); + + accumulators[i ^ 1] += sourceVal; // swap adjacent lanes + accumulators[i] += Multiply32To64((uint)sourceKey, (uint)(sourceKey >> 32)); + } + } + } + +#if NET8_0_OR_GREATER + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Vector256 Accumulate256(Vector256 accVec, byte* source, Vector256 secret) + { + Vector256 sourceVec = Vector256.Load((uint*)source); + Vector256 sourceKey = sourceVec ^ secret; + + // TODO: Figure out how to unwind this shuffle and just use Vector256.Multiply + Vector256 sourceKeyLow = Vector256.Shuffle(sourceKey, Vector256.Create(1u, 0, 3, 0, 5, 0, 7, 0)); + Vector256 sourceSwap = Vector256.Shuffle(sourceVec, Vector256.Create(2u, 3, 0, 1, 6, 7, 4, 5)); + Vector256 sum = accVec + sourceSwap.AsUInt64(); + Vector256 product = Avx2.IsSupported ? + Avx2.Multiply(sourceKey, sourceKeyLow) : + (sourceKey & Vector256.Create(~0u, 0u, ~0u, 0u, ~0u, 0u, ~0u, 0u)).AsUInt64() * (sourceKeyLow & Vector256.Create(~0u, 0u, ~0u, 0u, ~0u, 0u, ~0u, 0u)).AsUInt64(); + + accVec = product + sum; + return accVec; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Vector128 Accumulate128(Vector128 accVec, byte* source, Vector128 secret) + { + Vector128 sourceVec = Vector128.Load((uint*)source); + Vector128 sourceKey = sourceVec ^ secret; + + // TODO: Figure out how to unwind this shuffle and just use Vector128.Multiply + Vector128 sourceSwap = Vector128.Shuffle(sourceVec, Vector128.Create(2u, 3, 0, 1)); + Vector128 sum = accVec + sourceSwap.AsUInt64(); + + Vector128 product = MultiplyWideningLower(sourceKey); + accVec = product + sum; + return accVec; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Vector128 MultiplyWideningLower(Vector128 source) + { + if (AdvSimd.IsSupported) + { + Vector64 sourceLow = Vector128.Shuffle(source, Vector128.Create(0u, 2, 0, 0)).GetLower(); + Vector64 sourceHigh = Vector128.Shuffle(source, Vector128.Create(1u, 3, 0, 0)).GetLower(); + return AdvSimd.MultiplyWideningLower(sourceLow, sourceHigh); + } + else + { + Vector128 sourceLow = Vector128.Shuffle(source, Vector128.Create(1u, 0, 3, 0)); + return Sse2.IsSupported ? + Sse2.Multiply(source, sourceLow) : + (source & Vector128.Create(~0u, 0u, ~0u, 0u)).AsUInt64() * (sourceLow & Vector128.Create(~0u, 0u, ~0u, 0u)).AsUInt64(); + } + } +#endif + + private static void ScrambleAccumulators(ulong* accumulators, byte* secret) + { +#if NET8_0_OR_GREATER + if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian) + { + for (int i = 0; i < AccumulatorCount / Vector256.Count; i++) + { + Vector256 accVec = ScrambleAccumulator256(Vector256.Load(accumulators), Vector256.Load((ulong*)secret)); + Vector256.Store(accVec, accumulators); + + accumulators += Vector256.Count; + secret += Vector256.Count; + } + } + else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian) + { + for (int i = 0; i < AccumulatorCount / Vector128.Count; i++) + { + Vector128 accVec = ScrambleAccumulator128(Vector128.Load(accumulators), Vector128.Load((ulong*)secret)); + Vector128.Store(accVec, accumulators); + + accumulators += Vector128.Count; + secret += Vector128.Count; + } + } + else +#endif + { + for (int i = 0; i < AccumulatorCount; i++) + { + ulong xorShift = XorShift(*accumulators, 47); + ulong xorWithKey = xorShift ^ ReadUInt64LE(secret); + *accumulators = xorWithKey * Prime32_1; + + accumulators++; + secret += sizeof(ulong); + } + } + } + +#if NET8_0_OR_GREATER + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Vector256 ScrambleAccumulator256(Vector256 accVec, Vector256 secret) + { + Vector256 xorShift = accVec ^ Vector256.ShiftRightLogical(accVec, 47); + Vector256 xorWithKey = xorShift ^ secret; + accVec = xorWithKey * Vector256.Create((ulong)Prime32_1); + return accVec; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Vector128 ScrambleAccumulator128(Vector128 accVec, Vector128 secret) + { + Vector128 xorShift = accVec ^ Vector128.ShiftRightLogical(accVec, 47); + Vector128 xorWithKey = xorShift ^ secret; + accVec = xorWithKey * Vector128.Create((ulong)Prime32_1); + return accVec; + } +#endif + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong XorShift(ulong value, int shift) + { + Debug.Assert(shift >= 0 && shift < 64); + return value ^ (value >> shift); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint ReadUInt32LE(byte* data) => + BitConverter.IsLittleEndian ? + Unsafe.ReadUnaligned(data) : + BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned(data)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ulong ReadUInt64LE(byte* data) => + BitConverter.IsLittleEndian ? + Unsafe.ReadUnaligned(data) : + BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned(data)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void WriteUInt64LE(byte* data, ulong value) + { + if (!BitConverter.IsLittleEndian) + { + value = BinaryPrimitives.ReverseEndianness(value); + } + Unsafe.WriteUnaligned(data, value); + } + + [StructLayout(LayoutKind.Auto)] + public struct State + { + /// The accumulators. Length is . + internal fixed ulong Accumulators[AccumulatorCount]; + + /// Used to store a custom secret generated from a seed. Length is . + internal fixed byte Secret[SecretLengthBytes]; + + /// The internal buffer. Length is . + internal fixed byte Buffer[InternalBufferLengthBytes]; + + /// The amount of memory in . + internal uint BufferedCount; + + /// Number of stripes processed in the current block. + internal ulong StripesProcessedInCurrentBlock; + + /// Total length hashed. + internal ulong TotalLength; + + /// The seed employed (possibly 0). + internal ulong Seed; + }; +} diff --git a/src/Shared/files/Compiler/taghelpers.json b/src/Shared/files/Compiler/taghelpers.json index 405ee33a0c6..f15f45d4a98 100644 --- a/src/Shared/files/Compiler/taghelpers.json +++ b/src/Shared/files/Compiler/taghelpers.json @@ -1,10 +1,8 @@ [ { "__Checksum": { - "Data1": -5564685929706409081, - "Data2": 8876790735392128961, - "Data3": -4077866060211749996, - "Data4": 2569438470704701377 + "Data1": 2891416656378827550, + "Data2": 2549094571245199401 }, "Flags": 1, "Name": "BlazorServer_31.Pages.FetchData", @@ -20,10 +18,8 @@ }, { "__Checksum": { - "Data1": -5864996033339045605, - "Data2": -6002317805172749144, - "Data3": 3998549101666882276, - "Data4": -5697345875119419857 + "Data1": -1893178950565148724, + "Data2": 4149320985040835000 }, "Flags": 3, "Name": "BlazorServer_31.Pages.FetchData", @@ -39,10 +35,8 @@ }, { "__Checksum": { - "Data1": 5804368021304099338, - "Data2": 2902479151480806511, - "Data3": 874286156200711944, - "Data4": 8848227911834609594 + "Data1": 7357233569972864134, + "Data2": -6857899268286105396 }, "Flags": 1, "Name": "BlazorServer_31.Pages.Component1", @@ -58,10 +52,8 @@ }, { "__Checksum": { - "Data1": 8039799094981038783, - "Data2": -6343433774219890005, - "Data3": 7612570912702488023, - "Data4": 3352893669864822008 + "Data1": -6872467891184891176, + "Data2": 9204597765133563950 }, "Flags": 3, "Name": "BlazorServer_31.Pages.Component1", @@ -77,10 +69,8 @@ }, { "__Checksum": { - "Data1": 9033466541483515532, - "Data2": -7838748941695441002, - "Data3": -742697712133183092, - "Data4": -1364444927109981586 + "Data1": -5430554774116890894, + "Data2": -258622102892642723 }, "Flags": 1, "Name": "BlazorServer_31.Pages.Index", @@ -96,10 +86,8 @@ }, { "__Checksum": { - "Data1": -2333290845141552606, - "Data2": 4960088249582683501, - "Data3": -1091287587323976670, - "Data4": -3002877912105444317 + "Data1": -6176505202258663731, + "Data2": -4882787868981622803 }, "Flags": 3, "Name": "BlazorServer_31.Pages.Index", @@ -115,10 +103,8 @@ }, { "__Checksum": { - "Data1": 6144897256482130041, - "Data2": 5123602851479191310, - "Data3": 7880227648148328570, - "Data4": 8608311947335961110 + "Data1": 6251684318765421044, + "Data2": 7364794899839039906 }, "Flags": 1, "Name": "BlazorServer_31.Pages.Component", @@ -134,10 +120,8 @@ }, { "__Checksum": { - "Data1": -6949947144892349148, - "Data2": 2799940696134646161, - "Data3": 4890164851281532972, - "Data4": -6550865003666377076 + "Data1": -4982453559725975299, + "Data2": -3137239611844003225 }, "Flags": 3, "Name": "BlazorServer_31.Pages.Component", @@ -153,10 +137,8 @@ }, { "__Checksum": { - "Data1": 8542552089685074889, - "Data2": 7466432504416879995, - "Data3": -9183954297236116241, - "Data4": 1082197138433037585 + "Data1": -8467880895623591212, + "Data2": -5360524538382007946 }, "Flags": 1, "Name": "BlazorServer_31.Pages.Counter", @@ -202,10 +184,8 @@ }, { "__Checksum": { - "Data1": -4782182052167119050, - "Data2": -6756106764439008017, - "Data3": -420010767646781671, - "Data4": 1261579192610366773 + "Data1": -4032371197546407809, + "Data2": -664892971332735673 }, "Flags": 3, "Name": "BlazorServer_31.Pages.Counter", @@ -251,10 +231,8 @@ }, { "__Checksum": { - "Data1": -4113911244315384398, - "Data2": 7902167184074933714, - "Data3": 2903852335601386278, - "Data4": -740446268048087232 + "Data1": 2013466311461637649, + "Data2": -824900318167812691 }, "Flags": 1, "Name": "BlazorServer_31.Pages.Error", @@ -270,10 +248,8 @@ }, { "__Checksum": { - "Data1": -1540158409517728757, - "Data2": -360009362789559710, - "Data3": 837720080204042364, - "Data4": 6133830881880139900 + "Data1": 8791538695320587229, + "Data2": -8667614220773507339 }, "Flags": 3, "Name": "BlazorServer_31.Pages.Error", @@ -289,10 +265,8 @@ }, { "__Checksum": { - "Data1": -6273970203075498048, - "Data2": -4063013325856132857, - "Data3": -5888164795527818779, - "Data4": -2273601488867337838 + "Data1": 560579070047018134, + "Data2": 9168009811122942310 }, "Flags": 1, "Name": "BlazorServer_31.Pages.Component2", @@ -308,10 +282,8 @@ }, { "__Checksum": { - "Data1": 3598583415311838196, - "Data2": 5835030482394788929, - "Data3": 9084515485791347825, - "Data4": 678503864028859401 + "Data1": 5366712220210620950, + "Data2": 920419876750137822 }, "Flags": 3, "Name": "BlazorServer_31.Pages.Component2", @@ -327,10 +299,8 @@ }, { "__Checksum": { - "Data1": -5070065651326202666, - "Data2": 5592612897676119208, - "Data3": 3775144913669961863, - "Data4": 4302024456414976700 + "Data1": 4938952090463558822, + "Data2": 4140212622177718516 }, "Flags": 1, "Name": "BlazorServer_31.Shared.NavMenu", @@ -346,10 +316,8 @@ }, { "__Checksum": { - "Data1": 6582572222458512545, - "Data2": -7634341900890879301, - "Data3": 208334659095033466, - "Data4": -9111413752494444253 + "Data1": -4333659794401713136, + "Data2": 4619913392789287219 }, "Flags": 3, "Name": "BlazorServer_31.Shared.NavMenu", @@ -365,10 +333,8 @@ }, { "__Checksum": { - "Data1": 9193474086027526592, - "Data2": -3843927802129583758, - "Data3": -9131368008142825423, - "Data4": -9100217392868744031 + "Data1": -447385546646807157, + "Data2": 6555750974857960835 }, "Flags": 1, "Name": "BlazorServer_31.Shared.MainLayout", @@ -398,10 +364,8 @@ }, { "__Checksum": { - "Data1": -5565778166239682867, - "Data2": 66453951104878084, - "Data3": -7716398172736686049, - "Data4": 2185197514295738519 + "Data1": -4015007936638918386, + "Data2": 4185304718049198191 }, "Flags": 3, "Name": "BlazorServer_31.Shared.MainLayout", @@ -431,10 +395,8 @@ }, { "__Checksum": { - "Data1": 7280608457947770362, - "Data2": 8973507254625861861, - "Data3": -1652789303287123756, - "Data4": 385250324717195466 + "Data1": 4944199239992337619, + "Data2": -1472551844624024395 }, "Flags": 1, "Kind": 3, @@ -453,10 +415,8 @@ }, { "__Checksum": { - "Data1": -4229007733151945275, - "Data2": -5727716811024808324, - "Data3": -3534966039270247860, - "Data4": -8645021851681543965 + "Data1": -4238774450226104128, + "Data2": -5618153994822432718 }, "Flags": 3, "Kind": 3, @@ -475,10 +435,8 @@ }, { "__Checksum": { - "Data1": 6604869938195484706, - "Data2": -815423067738411806, - "Data3": -5686900684602333569, - "Data4": 2100175183983260991 + "Data1": 6508425483478745774, + "Data2": 3261434865113221182 }, "Flags": 1, "Name": "BlazorServer_31.App", @@ -494,10 +452,8 @@ }, { "__Checksum": { - "Data1": 7930369838487228766, - "Data2": -7943572767104230314, - "Data3": 3431298165653251649, - "Data4": -6388310514454813715 + "Data1": -8155848059585105818, + "Data2": -5919099035939480223 }, "Flags": 3, "Name": "BlazorServer_31.App", @@ -513,10 +469,8 @@ }, { "__Checksum": { - "Data1": -7337570528870454558, - "Data2": 8381989094471393237, - "Data3": -7066592116149214064, - "Data4": 8809848506255007891 + "Data1": -3353884773822779011, + "Data2": -7612544129979019636 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -587,10 +541,8 @@ }, { "__Checksum": { - "Data1": 4524123431578730048, - "Data2": 4955516329897235618, - "Data3": -3949210973264345786, - "Data4": -5665944484771812244 + "Data1": -8437363235324475359, + "Data2": -777532025900564290 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -661,10 +613,8 @@ }, { "__Checksum": { - "Data1": -4242953774371301143, - "Data2": 2442292568253594667, - "Data3": 9032024878256947451, - "Data4": -10446313520517352 + "Data1": -9072771633281882686, + "Data2": -872604328827005247 }, "Flags": 1, "Kind": 3, @@ -683,10 +633,8 @@ }, { "__Checksum": { - "Data1": -3054044070220001468, - "Data2": 3059647205883380215, - "Data3": 4469299243890899965, - "Data4": 7278695884131957667 + "Data1": -2194105637835042316, + "Data2": 8134468899512776703 }, "Flags": 3, "Kind": 3, @@ -705,10 +653,8 @@ }, { "__Checksum": { - "Data1": -3417403824890257571, - "Data2": -4048242327381410898, - "Data3": 8034179396392028277, - "Data4": 1024394887385008130 + "Data1": -774783905234024093, + "Data2": 7189302081397623216 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -747,10 +693,8 @@ }, { "__Checksum": { - "Data1": 3540115718779541269, - "Data2": -1755712602345091009, - "Data3": 167380406728142743, - "Data4": 7301930765979580693 + "Data1": -7305954906732851073, + "Data2": -2303660917011063431 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -789,10 +733,8 @@ }, { "__Checksum": { - "Data1": -3694563395209223227, - "Data2": 2685924213850058042, - "Data3": 6711243033197114863, - "Data4": -7266234621791183038 + "Data1": 7484896396317673045, + "Data2": -9211311719025902734 }, "Flags": 1, "Kind": 3, @@ -811,10 +753,8 @@ }, { "__Checksum": { - "Data1": -5824949731886442089, - "Data2": -76396924308276663, - "Data3": -1362413863283210297, - "Data4": -5832467172669512276 + "Data1": -5806851882591501130, + "Data2": -8005286817761731772 }, "Flags": 3, "Kind": 3, @@ -833,10 +773,8 @@ }, { "__Checksum": { - "Data1": 2128063675958159366, - "Data2": -7371271529970964988, - "Data3": -7520335846178149442, - "Data4": 7807876841495785157 + "Data1": -2719079560236520947, + "Data2": -8592932180223461289 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -871,10 +809,8 @@ }, { "__Checksum": { - "Data1": 2315109150213354937, - "Data2": 3467648648362872809, - "Data3": 90489983291254812, - "Data4": 3810914646706993812 + "Data1": -6569644587371104482, + "Data2": 7419849385904698106 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -909,10 +845,8 @@ }, { "__Checksum": { - "Data1": 7121502168415093989, - "Data2": 485694724696346076, - "Data3": -1345597159313357109, - "Data4": -2893814885332413080 + "Data1": 1775575736763156986, + "Data2": -7402870295787599140 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -980,10 +914,8 @@ }, { "__Checksum": { - "Data1": -7717759038303307919, - "Data2": -5795654003208324529, - "Data3": -5596604180334106598, - "Data4": -2131402652669951199 + "Data1": 7563251790342808795, + "Data2": 8717377348279592183 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -1051,10 +983,8 @@ }, { "__Checksum": { - "Data1": -2573342795082588597, - "Data2": -4269310309661986686, - "Data3": -7633256439839931388, - "Data4": -6673015278030627244 + "Data1": -2449932741151179649, + "Data2": -9100129425491877926 }, "Flags": 1, "Kind": 3, @@ -1084,10 +1014,8 @@ }, { "__Checksum": { - "Data1": 3642209045936131358, - "Data2": -5537954367197613710, - "Data3": -7472399493572795951, - "Data4": 778817494135370148 + "Data1": 3681833351515204374, + "Data2": -2359179439644603299 }, "Flags": 3, "Kind": 3, @@ -1117,10 +1045,8 @@ }, { "__Checksum": { - "Data1": 2455738920587519018, - "Data2": -5583604156885480436, - "Data3": -1867001394272824103, - "Data4": -5353514221280958913 + "Data1": 6861503034974277911, + "Data2": -7561967856904825521 }, "Flags": 1, "Kind": 3, @@ -1139,10 +1065,8 @@ }, { "__Checksum": { - "Data1": 8799248991135267302, - "Data2": 8545859154143562588, - "Data3": -7116486572391429763, - "Data4": -3012193722237699779 + "Data1": -66827346233897920, + "Data2": 1818151018702475024 }, "Flags": 3, "Kind": 3, @@ -1161,10 +1085,8 @@ }, { "__Checksum": { - "Data1": -4867693650653429252, - "Data2": -2698023094792738614, - "Data3": 4432680961390647041, - "Data4": -7790513193685711865 + "Data1": 1701588677090682699, + "Data2": 3589240776357621231 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -1181,10 +1103,8 @@ }, { "__Checksum": { - "Data1": -4906934009223325823, - "Data2": 7399302386236534430, - "Data3": 1274335753928031642, - "Data4": 1724080435614141455 + "Data1": -7357674198735438381, + "Data2": 6571978664802641209 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -1201,10 +1121,8 @@ }, { "__Checksum": { - "Data1": 1454084922998430387, - "Data2": -2324839232629732296, - "Data3": -2391857043661388612, - "Data4": 7861142998269334494 + "Data1": -4501432649942926615, + "Data2": 4389245689012609585 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -1272,10 +1190,8 @@ }, { "__Checksum": { - "Data1": 6904825701384303777, - "Data2": 4368594541846576831, - "Data3": -723241632695118122, - "Data4": -3139389897672911927 + "Data1": -2008569781959958267, + "Data2": 5788917120811811390 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -1343,10 +1259,8 @@ }, { "__Checksum": { - "Data1": -4943842782849950136, - "Data2": -1105201962604767678, - "Data3": 9130993078998588740, - "Data4": -1025186151021819304 + "Data1": -5351695502483390286, + "Data2": -1178826004116884548 }, "Flags": 1, "Kind": 3, @@ -1365,10 +1279,8 @@ }, { "__Checksum": { - "Data1": 6586965008416629564, - "Data2": -4143512132698234949, - "Data3": 9115141341655464477, - "Data4": 6735774766810778544 + "Data1": -8400521298171020511, + "Data2": -1581078531674500495 }, "Flags": 3, "Kind": 3, @@ -1387,10 +1299,8 @@ }, { "__Checksum": { - "Data1": 3750400373904852699, - "Data2": -6347893323856418409, - "Data3": 5087515741534881075, - "Data4": 2539833489579845195 + "Data1": -3827702977126464926, + "Data2": -4071865062116962084 }, "Flags": 1, "Kind": 3, @@ -1420,10 +1330,8 @@ }, { "__Checksum": { - "Data1": 661570855778320145, - "Data2": -3781626905203355800, - "Data3": -8912490044543656071, - "Data4": 4261176795787378420 + "Data1": 8963748880221271706, + "Data2": 8781627181127290294 }, "Flags": 3, "Kind": 3, @@ -1453,10 +1361,8 @@ }, { "__Checksum": { - "Data1": -3862880689771800302, - "Data2": -1152936872005509, - "Data3": 3512404127949123705, - "Data4": 3183506785192767310 + "Data1": -2706642759425946064, + "Data2": 1258014953569521925 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -1556,10 +1462,8 @@ }, { "__Checksum": { - "Data1": 462111362892913470, - "Data2": 4627423984033575517, - "Data3": 6455231861769151275, - "Data4": -7843103196920724087 + "Data1": -6863925580738794542, + "Data2": -7163749061593430073 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -1659,10 +1563,8 @@ }, { "__Checksum": { - "Data1": -2276078982883492421, - "Data2": -3334318495468800454, - "Data3": 2958408612835474835, - "Data4": -689707981085904753 + "Data1": -8625481131167572705, + "Data2": -7329854581702226017 }, "Flags": 1, "Kind": 3, @@ -1692,10 +1594,8 @@ }, { "__Checksum": { - "Data1": -1045384533256841053, - "Data2": -146202473217987553, - "Data3": 933536470952428726, - "Data4": 201800115002019953 + "Data1": 7261462291807592943, + "Data2": 3215786643734869308 }, "Flags": 3, "Kind": 3, @@ -1725,10 +1625,8 @@ }, { "__Checksum": { - "Data1": 1814088394929163979, - "Data2": -6646761278331709463, - "Data3": -7663104814400133573, - "Data4": -1107344847105982388 + "Data1": -7576620142748472860, + "Data2": 7808569353579599698 }, "Flags": 1, "Kind": 3, @@ -1747,10 +1645,8 @@ }, { "__Checksum": { - "Data1": -2378198046629525566, - "Data2": -1131303844821329236, - "Data3": 475677133366393293, - "Data4": -6967515066572368697 + "Data1": -6595872787800347159, + "Data2": 6617000305998141447 }, "Flags": 3, "Kind": 3, @@ -1769,10 +1665,8 @@ }, { "__Checksum": { - "Data1": 647413955507098016, - "Data2": -8778854182960018642, - "Data3": 1436540021836326836, - "Data4": -5650790134999164029 + "Data1": -1098765935226332375, + "Data2": 9151250397011064063 }, "Flags": 1, "Kind": 3, @@ -1802,10 +1696,8 @@ }, { "__Checksum": { - "Data1": -1731617193185327097, - "Data2": 7325321567054339515, - "Data3": 5641544705089955048, - "Data4": -5342572955301018522 + "Data1": -8551104037373337739, + "Data2": -7849388985341954423 }, "Flags": 3, "Kind": 3, @@ -1835,10 +1727,8 @@ }, { "__Checksum": { - "Data1": 4419842733786622443, - "Data2": -6159379292196207646, - "Data3": -6488351743077106122, - "Data4": -3003769388923842280 + "Data1": -7695114148139913538, + "Data2": 4007806563306645040 }, "Flags": 1, "Kind": 3, @@ -1868,10 +1758,8 @@ }, { "__Checksum": { - "Data1": -4360712776327083977, - "Data2": -4654767502481769178, - "Data3": -1472988611690871500, - "Data4": 5817472228783472878 + "Data1": 7601262471438180825, + "Data2": -2965012156716463311 }, "Flags": 3, "Kind": 3, @@ -1901,10 +1789,8 @@ }, { "__Checksum": { - "Data1": 8109645431380502189, - "Data2": 5032775250140086622, - "Data3": -1636016285141747118, - "Data4": -6840476977232940422 + "Data1": -6392559795621846472, + "Data2": 5389148790673368907 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -1934,10 +1820,8 @@ }, { "__Checksum": { - "Data1": 6135741920857584738, - "Data2": 6571192655363276963, - "Data3": -8697930197241234405, - "Data4": 4968396799496806151 + "Data1": 6640081091394942084, + "Data2": -5736482858258126963 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -1967,10 +1851,8 @@ }, { "__Checksum": { - "Data1": -4997653575673202123, - "Data2": 1246542043565825569, - "Data3": 8387692399165380924, - "Data4": -9112402045649467388 + "Data1": -8677111311896170377, + "Data2": -3211038453328388279 }, "Flags": 1, "Kind": 3, @@ -1989,10 +1871,8 @@ }, { "__Checksum": { - "Data1": 3488278038534438660, - "Data2": 7600461511427637458, - "Data3": 4757745717709907994, - "Data4": 3821582980614178279 + "Data1": -7131614057948517348, + "Data2": 635580870947622265 }, "Flags": 3, "Kind": 3, @@ -2011,10 +1891,8 @@ }, { "__Checksum": { - "Data1": -415164762659619887, - "Data2": -6824016807908080778, - "Data3": -2248173915301879578, - "Data4": 7644894721695536395 + "Data1": -190058374465661214, + "Data2": 5750517741445280307 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -2114,10 +1992,8 @@ }, { "__Checksum": { - "Data1": -8727818289836161616, - "Data2": -1983579213546006955, - "Data3": 7282853951676616872, - "Data4": -5361102009598435917 + "Data1": -2609618258217451570, + "Data2": 3594065027236049404 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -2217,10 +2093,8 @@ }, { "__Checksum": { - "Data1": 3210660678604277403, - "Data2": -3592280048343654040, - "Data3": -3409524501306117226, - "Data4": 4517153709984330548 + "Data1": 3191308662968217769, + "Data2": 7989734047380521437 }, "Flags": 1, "Kind": 3, @@ -2250,10 +2124,8 @@ }, { "__Checksum": { - "Data1": 7889016503366415639, - "Data2": 8795172389488046882, - "Data3": -1518651222707625124, - "Data4": -7675822482446199021 + "Data1": -1548355717417647493, + "Data2": 7357265277774916782 }, "Flags": 3, "Kind": 3, @@ -2283,10 +2155,8 @@ }, { "__Checksum": { - "Data1": 2750100192054604242, - "Data2": 4133876367893641951, - "Data3": 727541562745595917, - "Data4": -3082770989136561069 + "Data1": 466135854108303847, + "Data2": -4012684911464994316 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -2341,10 +2211,8 @@ }, { "__Checksum": { - "Data1": 8470620744864940422, - "Data2": 3407436287982278922, - "Data3": 8121592189541378619, - "Data4": 8833001713130998649 + "Data1": 5474516458379519598, + "Data2": 8612652720247676704 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -2399,10 +2267,8 @@ }, { "__Checksum": { - "Data1": 7852463782509991998, - "Data2": -4595128067386966839, - "Data3": 678935138031149616, - "Data4": -5274806800758056956 + "Data1": 7200753423627755796, + "Data2": 2040315799566393452 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -2486,10 +2352,8 @@ }, { "__Checksum": { - "Data1": 8628872207621222489, - "Data2": -1957864417768703481, - "Data3": -4630792049467272034, - "Data4": 3798707314794792427 + "Data1": 5715916261214637412, + "Data2": -169143695106396735 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -2573,10 +2437,8 @@ }, { "__Checksum": { - "Data1": 7273786023751484101, - "Data2": 7701299155162412395, - "Data3": 5852315831670071175, - "Data4": 617321357137385461 + "Data1": -1968347971592629341, + "Data2": 5141710239444601228 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -2660,10 +2522,8 @@ }, { "__Checksum": { - "Data1": -835241519002109052, - "Data2": 5309892341112684991, - "Data3": -2300991986484214461, - "Data4": -394669479097607407 + "Data1": 5526093209656367674, + "Data2": 5346578927153980415 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -2747,10 +2607,8 @@ }, { "__Checksum": { - "Data1": 6830683586693314834, - "Data2": -844138087755423412, - "Data3": -8207795443234560665, - "Data4": -6725443298871675218 + "Data1": -9028229205043317936, + "Data2": 5025081819577788979 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -2838,10 +2696,8 @@ }, { "__Checksum": { - "Data1": 4136936223145310117, - "Data2": -4631427833504453585, - "Data3": 5772672410715113615, - "Data4": 7844967979399881544 + "Data1": -9056941717554973497, + "Data2": 8457598936320174535 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -2929,10 +2785,8 @@ }, { "__Checksum": { - "Data1": 3495863336972062099, - "Data2": -8995021667758881436, - "Data3": -6027123475029372260, - "Data4": -23568376906042071 + "Data1": 5516931022607696993, + "Data2": 8450292733267677741 }, "Flags": 1, "Kind": 3, @@ -2951,10 +2805,8 @@ }, { "__Checksum": { - "Data1": -1406559205596116151, - "Data2": 2347721765347299006, - "Data3": 8095143632806953396, - "Data4": 2633905044626425303 + "Data1": -6187166907370547721, + "Data2": 6662925765862819 }, "Flags": 3, "Kind": 3, @@ -2973,10 +2825,8 @@ }, { "__Checksum": { - "Data1": 4833591665422595920, - "Data2": -8955765310432113468, - "Data3": 1030126030174471391, - "Data4": -3695091502072474253 + "Data1": -852312013812375456, + "Data2": 5502968497664844454 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -3031,10 +2881,8 @@ }, { "__Checksum": { - "Data1": -4986057058499189598, - "Data2": 5419893977970060385, - "Data3": 3102126442462890359, - "Data4": -3561926764036548364 + "Data1": -885728258671824118, + "Data2": 5844756370119573472 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -3089,10 +2937,8 @@ }, { "__Checksum": { - "Data1": 89437745828018526, - "Data2": 8634535924619466899, - "Data3": 1141643580486745517, - "Data4": 3938583976196421597 + "Data1": 9108501366804534647, + "Data2": 8638271353683233494 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -3147,10 +2993,8 @@ }, { "__Checksum": { - "Data1": -5153071131990178900, - "Data2": -8496340799492934967, - "Data3": -8024875552401644406, - "Data4": -4815443830497803886 + "Data1": 1114151984309027378, + "Data2": -1720685921409938796 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -3205,10 +3049,8 @@ }, { "__Checksum": { - "Data1": 2097399500127221876, - "Data2": 8450963110372371872, - "Data3": -9139922390793377688, - "Data4": 7309701625808478949 + "Data1": -5790671952968278714, + "Data2": 5240122915638464558 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -3259,10 +3101,8 @@ }, { "__Checksum": { - "Data1": 7760946631147136800, - "Data2": 7201989109906094772, - "Data3": 4169001786951299931, - "Data4": -6119601772951086932 + "Data1": -7255313684463616159, + "Data2": -5830428935926714104 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -3313,10 +3153,8 @@ }, { "__Checksum": { - "Data1": -7154611659016303990, - "Data2": -5064025788142970422, - "Data3": -2727361423155932966, - "Data4": 1649948131962699258 + "Data1": 4017322350622089689, + "Data2": 4277119971026320428 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -3351,10 +3189,8 @@ }, { "__Checksum": { - "Data1": 7113613532114460633, - "Data2": 632510522582572370, - "Data3": -7607666847706941689, - "Data4": -5174435395793054419 + "Data1": -5601935935519409244, + "Data2": -648551799465211543 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -3389,10 +3225,8 @@ }, { "__Checksum": { - "Data1": 5401611238611883074, - "Data2": -7449764158554568432, - "Data3": -7718788779749823503, - "Data4": 696994082938985306 + "Data1": -549484873053194070, + "Data2": -1602701848605720135 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -3447,10 +3281,8 @@ }, { "__Checksum": { - "Data1": 746941012468573216, - "Data2": 1232344179869135931, - "Data3": 8738133501738997821, - "Data4": 473228319963715879 + "Data1": -5722494614762574717, + "Data2": -3113804973824353979 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -3505,10 +3337,8 @@ }, { "__Checksum": { - "Data1": -5444288586770056574, - "Data2": 169997535508407934, - "Data3": 992342171960606673, - "Data4": 5540419406925247691 + "Data1": 2645346105637979373, + "Data2": -7178519843324818068 }, "Flags": 1, "Kind": 3, @@ -3527,10 +3357,8 @@ }, { "__Checksum": { - "Data1": -6742649563438092601, - "Data2": 6687979634245470336, - "Data3": -3470236226963134561, - "Data4": -5153681974655923159 + "Data1": 7761261965686255321, + "Data2": 6229536706348435238 }, "Flags": 3, "Kind": 3, @@ -3549,10 +3377,8 @@ }, { "__Checksum": { - "Data1": 7302884877946595064, - "Data2": 4174993656057184866, - "Data3": 6938383271667606367, - "Data4": -5923387197151899600 + "Data1": -2371156328472255980, + "Data2": 7211808874265916186 }, "Flags": 1, "Kind": 4, diff --git a/src/Shared/files/Tooling/BlazorServerApp.TagHelpers.json b/src/Shared/files/Tooling/BlazorServerApp.TagHelpers.json index d5f95ea9024..8ce987f266c 100644 --- a/src/Shared/files/Tooling/BlazorServerApp.TagHelpers.json +++ b/src/Shared/files/Tooling/BlazorServerApp.TagHelpers.json @@ -1,10 +1,8 @@ [ { "__Checksum": { - "Data1": -6977324323675758882, - "Data2": -6798831128095888926, - "Data3": -2281119279436052314, - "Data4": 3842959914072334759 + "Data1": 6421024762476386762, + "Data2": 5468661896844305992 }, "Flags": 1, "Name": "BlazorApp1.Shared.SurveyPrompt", @@ -38,10 +36,8 @@ }, { "__Checksum": { - "Data1": -3822945768262479787, - "Data2": -8283031724519891672, - "Data3": 7611299333977411928, - "Data4": 3891186597167731328 + "Data1": -3427313897319899396, + "Data2": 9028120372387197406 }, "Flags": 3, "Name": "BlazorApp1.Shared.SurveyPrompt", @@ -75,10 +71,8 @@ }, { "__Checksum": { - "Data1": -6627856792917077632, - "Data2": -628149038263635794, - "Data3": 1599931013260578913, - "Data4": -7881607659118807449 + "Data1": 5000768903004487003, + "Data2": -2207641752968716641 }, "Flags": 1, "Name": "BlazorApp1.Shared.MainLayout", @@ -114,10 +108,8 @@ }, { "__Checksum": { - "Data1": 2379743987026001027, - "Data2": -2155992012530428915, - "Data3": 2042497932009766262, - "Data4": 7669584301427024581 + "Data1": -7944547139726021501, + "Data2": -6398012753117986163 }, "Flags": 3, "Name": "BlazorApp1.Shared.MainLayout", @@ -153,10 +145,8 @@ }, { "__Checksum": { - "Data1": 411603802675774571, - "Data2": 723042873095473928, - "Data3": 1794476223294995765, - "Data4": -8254386043254659250 + "Data1": 6358920639458819313, + "Data2": 6243233042204818186 }, "Flags": 1, "Kind": 3, @@ -179,10 +169,8 @@ }, { "__Checksum": { - "Data1": -597185540299980588, - "Data2": -8258747342900827039, - "Data3": -1536501372756298016, - "Data4": -8984181134634574653 + "Data1": 7750172071709609294, + "Data2": 5770022115611171303 }, "Flags": 3, "Kind": 3, @@ -205,10 +193,8 @@ }, { "__Checksum": { - "Data1": 4412997269157320712, - "Data2": 3364708474782346903, - "Data3": 2234094994687741697, - "Data4": -1071727655321159266 + "Data1": -2349176645015710171, + "Data2": 6610611637526519048 }, "Flags": 1, "Name": "BlazorApp1.Shared.NavMenu", @@ -228,10 +214,8 @@ }, { "__Checksum": { - "Data1": -2617762444311322086, - "Data2": -2450468450079184649, - "Data3": 2157456926431355737, - "Data4": -528378769801010795 + "Data1": -2848613379819780249, + "Data2": -8510929237414624058 }, "Flags": 3, "Name": "BlazorApp1.Shared.NavMenu", @@ -251,10 +235,8 @@ }, { "__Checksum": { - "Data1": 5062408229879076833, - "Data2": -6653194657813431644, - "Data3": -3743411453181183251, - "Data4": -65500980335555166 + "Data1": 205710820257503181, + "Data2": -2234527315167379890 }, "Flags": 1, "Name": "BlazorApp1.App", @@ -274,10 +256,8 @@ }, { "__Checksum": { - "Data1": -3354192662533745717, - "Data2": 6634739041720985206, - "Data3": 379250192417128637, - "Data4": -2619593217751105352 + "Data1": -733948724509884318, + "Data2": -4185170794481793260 }, "Flags": 3, "Name": "BlazorApp1.App", @@ -297,10 +277,8 @@ }, { "__Checksum": { - "Data1": -4081414246429705828, - "Data2": 9161032614479635655, - "Data3": 2214214775153187721, - "Data4": 1227369094008671224 + "Data1": 1975288964336999943, + "Data2": 6007105053677638120 }, "Flags": 1, "Name": "BlazorApp1.Pages.Counter", @@ -320,10 +298,8 @@ }, { "__Checksum": { - "Data1": -8640509892455246226, - "Data2": 4349554089322183232, - "Data3": 9046942078957977700, - "Data4": 5153900411281327199 + "Data1": 7998125665077991606, + "Data2": 2336892873925292584 }, "Flags": 3, "Name": "BlazorApp1.Pages.Counter", @@ -343,10 +319,8 @@ }, { "__Checksum": { - "Data1": 8368758971085481325, - "Data2": 6009186367119655561, - "Data3": -5277377162085187220, - "Data4": 1873663986548860945 + "Data1": -8456870854193151114, + "Data2": -5733206858291708155 }, "Flags": 1, "Name": "BlazorApp1.Pages.Index", @@ -366,10 +340,8 @@ }, { "__Checksum": { - "Data1": 1970838848965151972, - "Data2": 1640198562589456149, - "Data3": -3382739492000343367, - "Data4": -6136380062946408443 + "Data1": 4329742994169466051, + "Data2": -24495790909097912 }, "Flags": 3, "Name": "BlazorApp1.Pages.Index", @@ -389,10 +361,8 @@ }, { "__Checksum": { - "Data1": 1111205123666230715, - "Data2": -7506251473555551768, - "Data3": 2030267235189815848, - "Data4": 8783369008875711810 + "Data1": 5827093370818057643, + "Data2": 4475647171669376419 }, "Flags": 1, "Name": "BlazorApp1.Pages.FetchData", @@ -412,10 +382,8 @@ }, { "__Checksum": { - "Data1": 1502806975974362943, - "Data2": 4188319584193533220, - "Data3": 2039741616935335948, - "Data4": -1081074989198317129 + "Data1": 2627412952832162294, + "Data2": -1064106678408778525 }, "Flags": 3, "Name": "BlazorApp1.Pages.FetchData", @@ -435,10 +403,8 @@ }, { "__Checksum": { - "Data1": 3990021261864166822, - "Data2": -7318556482060017935, - "Data3": 8063186354363749416, - "Data4": -549253387327692418 + "Data1": -8051944393198551925, + "Data2": 4984178313108256454 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -539,10 +505,8 @@ }, { "__Checksum": { - "Data1": 3131828748592299241, - "Data2": -471872291817775878, - "Data3": -8602721366320104934, - "Data4": 6006578869112507496 + "Data1": 3323744455032667092, + "Data2": -5584236300648740711 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -643,10 +607,8 @@ }, { "__Checksum": { - "Data1": 2188901910688390414, - "Data2": 6884673014327662775, - "Data3": -7096224504061143323, - "Data4": -2323139772025175613 + "Data1": 4249293474108654557, + "Data2": 7927337075061500098 }, "Flags": 1, "Kind": 3, @@ -685,10 +647,8 @@ }, { "__Checksum": { - "Data1": 3443215458852083161, - "Data2": 1072718626599703761, - "Data3": 5625672211535764899, - "Data4": -3625234729705164805 + "Data1": 1019418233348142286, + "Data2": 30157772217057325 }, "Flags": 3, "Kind": 3, @@ -727,10 +687,8 @@ }, { "__Checksum": { - "Data1": 8505177104787030733, - "Data2": -284985845404668852, - "Data3": -4958805730255777912, - "Data4": 8338996988626093747 + "Data1": 1485724636681179776, + "Data2": 4457694576996447331 }, "Flags": 1, "Kind": 3, @@ -753,10 +711,8 @@ }, { "__Checksum": { - "Data1": -4289854432041895832, - "Data2": 2152645570849032885, - "Data3": 7054280334332964819, - "Data4": 3423643953430331425 + "Data1": -7108528587728066839, + "Data2": 325751887706851842 }, "Flags": 3, "Kind": 3, @@ -779,10 +735,8 @@ }, { "__Checksum": { - "Data1": -2641948764136881132, - "Data2": -6566491036738470730, - "Data3": -6933683306752205531, - "Data4": -8448450186649071166 + "Data1": -921798342785155116, + "Data2": 4278371148705334233 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -911,10 +865,8 @@ }, { "__Checksum": { - "Data1": -5607357217323508869, - "Data2": 5438904154328367218, - "Data3": 7057859531019221816, - "Data4": -2261169351651022837 + "Data1": 4948051841098903879, + "Data2": 3561023814535551143 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -1043,10 +995,8 @@ }, { "__Checksum": { - "Data1": 8490801761574272933, - "Data2": 3498837035258135085, - "Data3": 7428168123098388997, - "Data4": 3122828716864351182 + "Data1": -444751539640361166, + "Data2": 7162254116136121118 }, "Flags": 1, "Kind": 3, @@ -1085,10 +1035,8 @@ }, { "__Checksum": { - "Data1": 7229527538795996431, - "Data2": 8350941236965163949, - "Data3": -7705953234580997795, - "Data4": -1139179002121693113 + "Data1": -8558634538992008589, + "Data2": -2795023381479820241 }, "Flags": 3, "Kind": 3, @@ -1127,10 +1075,8 @@ }, { "__Checksum": { - "Data1": -8499763890250085212, - "Data2": 2945530525738318488, - "Data3": 9093854037857791652, - "Data4": -1383978141168632761 + "Data1": -6633182988498497391, + "Data2": 4026235229652435247 }, "Flags": 1, "Kind": 3, @@ -1169,10 +1115,8 @@ }, { "__Checksum": { - "Data1": 8703408560622294222, - "Data2": -5508699321059308814, - "Data3": 1439243812971637145, - "Data4": 8790383108618899355 + "Data1": 8400832178115335861, + "Data2": -1341757037619519770 }, "Flags": 3, "Kind": 3, @@ -1211,10 +1155,8 @@ }, { "__Checksum": { - "Data1": 171824192401047935, - "Data2": 6824762700912384980, - "Data3": -5598900078590184957, - "Data4": 4961653414382290589 + "Data1": -2879992524433581175, + "Data2": -1361311499988735384 }, "Flags": 1, "Kind": 3, @@ -1253,10 +1195,8 @@ }, { "__Checksum": { - "Data1": -2156265202159817987, - "Data2": -8711768664510616892, - "Data3": 8459817817740484742, - "Data4": -7906353660771740303 + "Data1": -1527138801002479527, + "Data2": 7987359388540179179 }, "Flags": 3, "Kind": 3, @@ -1295,10 +1235,8 @@ }, { "__Checksum": { - "Data1": 752710759961871956, - "Data2": -4618206618809477114, - "Data3": 855140587917687688, - "Data4": -5986813842976185002 + "Data1": -6968539277833652683, + "Data2": 5832967399512376451 }, "Flags": 1, "Kind": 3, @@ -1321,10 +1259,8 @@ }, { "__Checksum": { - "Data1": 663373971323738936, - "Data2": -2067570348009246156, - "Data3": 563906863450806484, - "Data4": 4264391830596629321 + "Data1": -171823818384442361, + "Data2": -3806509227642408634 }, "Flags": 3, "Kind": 3, @@ -1347,10 +1283,8 @@ }, { "__Checksum": { - "Data1": -3124288546568604103, - "Data2": 2396424856406637792, - "Data3": -8769358489757777531, - "Data4": 6361606018788187169 + "Data1": -3243671228288418997, + "Data2": 7888597148658367833 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -1386,10 +1320,8 @@ }, { "__Checksum": { - "Data1": 4784806785712378533, - "Data2": -4860374435741651712, - "Data3": 1000978584197654531, - "Data4": 9170409226792324290 + "Data1": 7283137529867970135, + "Data2": -104875631151025084 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -1425,10 +1357,8 @@ }, { "__Checksum": { - "Data1": 738648772295242988, - "Data2": 5145516115432919439, - "Data3": 7336962712105705753, - "Data4": 7899720636442920152 + "Data1": 6488046190713595732, + "Data2": 307626256560635888 }, "Flags": 1, "Kind": 3, @@ -1451,10 +1381,8 @@ }, { "__Checksum": { - "Data1": 2519435554266668390, - "Data2": -8280828652630706396, - "Data3": -7690087104705682085, - "Data4": -282139168271897244 + "Data1": -5985383523299739255, + "Data2": -1993649736422733038 }, "Flags": 3, "Kind": 3, @@ -1477,10 +1405,8 @@ }, { "__Checksum": { - "Data1": 5262305932927899680, - "Data2": 8814451013537123081, - "Data3": 3709445884633210483, - "Data4": 4991566278470971238 + "Data1": 8854743301634265295, + "Data2": -7481279343336923900 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -1575,10 +1501,8 @@ }, { "__Checksum": { - "Data1": 1780060787443634284, - "Data2": -164285177608787253, - "Data3": -6444092895571103320, - "Data4": 652510477293777540 + "Data1": 708545834950332755, + "Data2": 1684976847603081962 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -1673,10 +1597,8 @@ }, { "__Checksum": { - "Data1": 4849886575369874874, - "Data2": 4889916424629579556, - "Data3": -4136180796273259582, - "Data4": 6549205639564303725 + "Data1": 5397896856852084391, + "Data2": -5739275324003106423 }, "Flags": 1, "Kind": 3, @@ -1699,10 +1621,8 @@ }, { "__Checksum": { - "Data1": 8505458575644988328, - "Data2": 4537325872604122958, - "Data3": 3140667787881970683, - "Data4": -3916641521546367542 + "Data1": -5297088290257981628, + "Data2": 8012603118799319838 }, "Flags": 3, "Kind": 3, @@ -1725,10 +1645,8 @@ }, { "__Checksum": { - "Data1": -7100489616893423404, - "Data2": 2486825183165169457, - "Data3": -4321242622054191512, - "Data4": 1411601542198565951 + "Data1": 6975241257169974705, + "Data2": -3981998407102536942 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.DynamicComponent", @@ -1777,10 +1695,8 @@ }, { "__Checksum": { - "Data1": 7800132039255095777, - "Data2": -1575357127735792812, - "Data3": 6654720839388232406, - "Data4": 4749805544013414852 + "Data1": 1330310664713362058, + "Data2": -7636441762982810792 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.DynamicComponent", @@ -1829,10 +1745,8 @@ }, { "__Checksum": { - "Data1": -6460570529385564492, - "Data2": -5199233512655388010, - "Data3": -1790743472034117925, - "Data4": 3837579400528210413 + "Data1": -193175898202992812, + "Data2": -6881329509101501431 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -1882,10 +1796,8 @@ }, { "__Checksum": { - "Data1": -6737637442454268209, - "Data2": 2407290510916232852, - "Data3": 3702228761119447071, - "Data4": 3230993760934505760 + "Data1": 7680862499633560263, + "Data2": -238528444532267880 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -1935,10 +1847,8 @@ }, { "__Checksum": { - "Data1": 6747256102099010090, - "Data2": -7061820148962748950, - "Data3": 2694081397575314532, - "Data4": -6994995620605775222 + "Data1": 4302935512397455954, + "Data2": 5185911745023879289 }, "Flags": 1, "Kind": 3, @@ -1961,10 +1871,8 @@ }, { "__Checksum": { - "Data1": 111643164421853596, - "Data2": -1689433293473952521, - "Data3": -5480543476110081918, - "Data4": -6203237545167305374 + "Data1": -4493212034722291803, + "Data2": 4737697892338068057 }, "Flags": 3, "Kind": 3, @@ -1987,10 +1895,8 @@ }, { "__Checksum": { - "Data1": 1596062902814960852, - "Data2": 839909898329303828, - "Data3": 3881549996933531995, - "Data4": -8211637103310294341 + "Data1": -878546076281050761, + "Data2": -5463370786841308528 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -2039,10 +1945,8 @@ }, { "__Checksum": { - "Data1": 6898719608240985448, - "Data2": -7367055827700622694, - "Data3": 4152492775839500597, - "Data4": 8134944971659029822 + "Data1": -642506904131290562, + "Data2": -5248735010471709096 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -2091,10 +1995,8 @@ }, { "__Checksum": { - "Data1": -6126380186028670246, - "Data2": 469601768993771266, - "Data3": 6571566632963797453, - "Data4": -5943182454590319075 + "Data1": 2453116146854940416, + "Data2": 7176462699664299908 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -2223,10 +2125,8 @@ }, { "__Checksum": { - "Data1": -5270337482917973618, - "Data2": -1705308791928033622, - "Data3": 6765777512798191573, - "Data4": 252018096840129711 + "Data1": 868302713557309958, + "Data2": -1591411916599470989 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -2355,10 +2255,8 @@ }, { "__Checksum": { - "Data1": 8583775132861681989, - "Data2": 5439463580495863089, - "Data3": 3547304272288097361, - "Data4": 9195593298753975651 + "Data1": -7692669234801883104, + "Data2": -7119662165073117894 }, "Flags": 1, "Kind": 3, @@ -2381,10 +2279,8 @@ }, { "__Checksum": { - "Data1": -1904660506772394100, - "Data2": -6248150288593258690, - "Data3": -6767607126822914026, - "Data4": 4150770401416903999 + "Data1": 5564972683372825552, + "Data2": -5091664131990937047 }, "Flags": 3, "Kind": 3, @@ -2407,10 +2303,8 @@ }, { "__Checksum": { - "Data1": -2053506242583780644, - "Data2": 3225947100668965706, - "Data3": -8659700125208873321, - "Data4": -1422259033482532142 + "Data1": 3846667103199545396, + "Data2": 8550162162785087792 }, "Flags": 1, "Kind": 3, @@ -2449,10 +2343,8 @@ }, { "__Checksum": { - "Data1": -2781846608804004347, - "Data2": 3469383294378837703, - "Data3": 5966335479318249943, - "Data4": -5033610169146709399 + "Data1": 8208473519396989675, + "Data2": -8630263553191979876 }, "Flags": 3, "Kind": 3, @@ -2491,10 +2383,8 @@ }, { "__Checksum": { - "Data1": -6036234111528561375, - "Data2": -2143730386637616308, - "Data3": -1650963123900260366, - "Data4": -5155546115533706319 + "Data1": 1555348321007130422, + "Data2": -1732921891145813821 }, "Flags": 1, "Kind": 3, @@ -2517,10 +2407,8 @@ }, { "__Checksum": { - "Data1": -7452048426478299168, - "Data2": -4530716866676664776, - "Data3": -7331212533770056081, - "Data4": -8329436836337726873 + "Data1": -2509164420084162936, + "Data2": 5082062649460048734 }, "Flags": 3, "Kind": 3, @@ -2543,10 +2431,8 @@ }, { "__Checksum": { - "Data1": -4502133541957289518, - "Data2": -141924887804636254, - "Data3": 8954310344258983376, - "Data4": -6273816439689790208 + "Data1": 5911477696753502951, + "Data2": -4873975666000185935 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -2675,10 +2561,8 @@ }, { "__Checksum": { - "Data1": 1907702515287536960, - "Data2": 4645270341584277003, - "Data3": 6024549940247842056, - "Data4": -3666377075903557610 + "Data1": 1993348438977448984, + "Data2": 2246203038387761574 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -2807,10 +2691,8 @@ }, { "__Checksum": { - "Data1": 740465157256539540, - "Data2": 1661867749784975720, - "Data3": -9062716035891500517, - "Data4": 6878328834880249661 + "Data1": 4897561638843651745, + "Data2": -5794654455900905477 }, "Flags": 1, "Kind": 3, @@ -2849,10 +2731,8 @@ }, { "__Checksum": { - "Data1": 6525657188650598469, - "Data2": -3267736928498408420, - "Data3": -3570543848954028427, - "Data4": 4113549105054768631 + "Data1": 6344691414156257146, + "Data2": -3987298353671089806 }, "Flags": 3, "Kind": 3, @@ -2891,10 +2771,8 @@ }, { "__Checksum": { - "Data1": 3492686668366649678, - "Data2": 1805330395935862473, - "Data3": -9163584889248968683, - "Data4": 8238837701037071477 + "Data1": 4340593019394878132, + "Data2": 8828900857345254366 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -2983,10 +2861,8 @@ }, { "__Checksum": { - "Data1": -992208802317340152, - "Data2": -2972300275760244176, - "Data3": -6611683233433331370, - "Data4": 8582564726685366112 + "Data1": -133895412058943265, + "Data2": 1024759217521239892 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -3075,10 +2951,8 @@ }, { "__Checksum": { - "Data1": 6390870777244690654, - "Data2": 407041494257108759, - "Data3": -3685599670593059892, - "Data4": 6432135255611680683 + "Data1": -1288470336932087886, + "Data2": 4115884738931523044 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -3217,10 +3091,8 @@ }, { "__Checksum": { - "Data1": -7281020691672670992, - "Data2": -1418345199086222268, - "Data3": -6408355071795007063, - "Data4": 3749960131839853960 + "Data1": -3974398727919349307, + "Data2": 6395183169367619180 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -3359,10 +3231,8 @@ }, { "__Checksum": { - "Data1": 8839791029184317410, - "Data2": -7331686667758917006, - "Data3": -6946886637359426110, - "Data4": 7207623250337636981 + "Data1": -7044842051158990892, + "Data2": -4715665749994551044 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", @@ -3412,10 +3282,8 @@ }, { "__Checksum": { - "Data1": -2500240456768204646, - "Data2": 3244416248173612454, - "Data3": 8792958210859663844, - "Data4": -4940132404274641416 + "Data1": 2350952064492299959, + "Data2": 5119303808643815905 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", @@ -3465,10 +3333,8 @@ }, { "__Checksum": { - "Data1": -3135690928129843528, - "Data2": -775125741512030836, - "Data3": -8191738461536373905, - "Data4": 292408726577051106 + "Data1": -4233996787991245804, + "Data2": -8107834683123365628 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -3594,10 +3460,8 @@ }, { "__Checksum": { - "Data1": -8324756693896610094, - "Data2": -6878771232881275333, - "Data3": -6428666123488019467, - "Data4": -7604476579858697781 + "Data1": -8316827231812808017, + "Data2": 3944451394160215123 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -3723,10 +3587,8 @@ }, { "__Checksum": { - "Data1": 2563063923975516421, - "Data2": 5526923971895044879, - "Data3": 3986615419284040594, - "Data4": -6384415150496333416 + "Data1": 6323007460947599586, + "Data2": 40486205724884849 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", @@ -3810,10 +3672,8 @@ }, { "__Checksum": { - "Data1": -7793531733925455357, - "Data2": -4231810216288506302, - "Data3": 898427779100176311, - "Data4": 4906725054366934187 + "Data1": -191792289531249082, + "Data2": 7000368281475374989 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", @@ -3897,10 +3757,8 @@ }, { "__Checksum": { - "Data1": 4250941694390290410, - "Data2": 5691835922178180552, - "Data3": 3998004989203316329, - "Data4": -5498416517822500748 + "Data1": 6220825467282539964, + "Data2": -5311249306259856354 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", @@ -4040,10 +3898,8 @@ }, { "__Checksum": { - "Data1": -4440472223074085630, - "Data2": -5094910872670101488, - "Data3": -1142060560369546795, - "Data4": 6094541325691845650 + "Data1": 7751847756095706474, + "Data2": -2266917335476871032 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", @@ -4183,10 +4039,8 @@ }, { "__Checksum": { - "Data1": -4781284810406737761, - "Data2": -7591991474954936731, - "Data3": 994592369531403456, - "Data4": 1761428867147444400 + "Data1": -8841980750978813076, + "Data2": 6444455319670145289 }, "Flags": 1, "Kind": 3, @@ -4209,10 +4063,8 @@ }, { "__Checksum": { - "Data1": -1372956736404853202, - "Data2": 5348055934600143823, - "Data3": -7852017170635964781, - "Data4": 3500813823803174865 + "Data1": -8640507686543268351, + "Data2": 7467977046836679830 }, "Flags": 3, "Kind": 3, @@ -4235,10 +4087,8 @@ }, { "__Checksum": { - "Data1": -802188531056644971, - "Data2": 395102293820068350, - "Data3": -3198678298587571459, - "Data4": -319137614935702417 + "Data1": 7138159926499134291, + "Data2": 1679312429821884835 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -4365,10 +4215,8 @@ }, { "__Checksum": { - "Data1": -8908905064120794365, - "Data2": -8155792619887318010, - "Data3": 3023517114392177488, - "Data4": 8645718526804869527 + "Data1": 1052285152688413188, + "Data2": -6584611447801684987 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -4495,10 +4343,8 @@ }, { "__Checksum": { - "Data1": -4064941096794280062, - "Data2": 2137091070084871354, - "Data3": 110230551014444529, - "Data4": -2579942202369914131 + "Data1": -7770383423146008629, + "Data2": -913483525602206477 }, "Flags": 1, "Kind": 3, @@ -4521,10 +4367,8 @@ }, { "__Checksum": { - "Data1": -2052791935872294990, - "Data2": 5385183117308296917, - "Data3": 2252573235543933229, - "Data4": -4965422803951440602 + "Data1": 2081905570157670380, + "Data2": -2663920933113778601 }, "Flags": 3, "Kind": 3, @@ -4547,10 +4391,8 @@ }, { "__Checksum": { - "Data1": -3685235046408130451, - "Data2": 3988668396642479788, - "Data3": -9177172846014689786, - "Data4": 7508408340642426127 + "Data1": -6698458338004729467, + "Data2": -2128766899595587634 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -4639,10 +4481,8 @@ }, { "__Checksum": { - "Data1": -3861903306912093455, - "Data2": -7231050068623770587, - "Data3": 9005733426271272126, - "Data4": -6522817677563018371 + "Data1": 5865891343816688765, + "Data2": 2968925285246599123 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -4731,10 +4571,8 @@ }, { "__Checksum": { - "Data1": -8863584525863232451, - "Data2": 669047440952052150, - "Data3": 4134251327418709610, - "Data4": 2088126709389876956 + "Data1": -6837801782477458443, + "Data2": -1274352937792038820 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -4823,10 +4661,8 @@ }, { "__Checksum": { - "Data1": 7699360896640729428, - "Data2": -3899996430412936232, - "Data3": 8703260910955698821, - "Data4": 214215200581671776 + "Data1": -3688191762115908748, + "Data2": -7755848822085929598 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -4915,10 +4751,8 @@ }, { "__Checksum": { - "Data1": 5306643932622237552, - "Data2": 1673019051892281800, - "Data3": -8628010806166348737, - "Data4": -2019299049979167834 + "Data1": 683384297498303224, + "Data2": 8438997588380141913 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -4986,10 +4820,8 @@ }, { "__Checksum": { - "Data1": -3904050118119389828, - "Data2": 8324136498460681553, - "Data3": 4451516529047972603, - "Data4": -9091248047027413730 + "Data1": -3901938059464232596, + "Data2": 2854250821171226932 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -5057,10 +4889,8 @@ }, { "__Checksum": { - "Data1": 6580912195518028349, - "Data2": -8521294559868970063, - "Data3": 726836129463889459, - "Data4": 4186430485877237591 + "Data1": 2682960913854455764, + "Data2": -2143815315801870406 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -5109,10 +4939,8 @@ }, { "__Checksum": { - "Data1": -2020408118342038231, - "Data2": -3209852855577760986, - "Data3": -5544908644089418631, - "Data4": -4631080657184095568 + "Data1": 2612896952431728939, + "Data2": -1998960347689427383 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -5161,10 +4989,8 @@ }, { "__Checksum": { - "Data1": 312963531821689332, - "Data2": -5668712267476715934, - "Data3": -7734573746875035326, - "Data4": 8676535359796811612 + "Data1": 8153965838470919099, + "Data2": -6765180658033557051 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", @@ -5213,10 +5039,8 @@ }, { "__Checksum": { - "Data1": -7548585699373043253, - "Data2": 1307712087634220508, - "Data3": -8942748772092761868, - "Data4": -1247360098029164080 + "Data1": 6485731865289721685, + "Data2": -2632429973562927949 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", @@ -5265,10 +5089,8 @@ }, { "__Checksum": { - "Data1": 743212993592458492, - "Data2": 7643153509924844113, - "Data3": 8693692395469773034, - "Data4": -1542737528413417352 + "Data1": -5606848038394930105, + "Data2": -3724793680595370818 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -5344,10 +5166,8 @@ }, { "__Checksum": { - "Data1": 7163748578667164282, - "Data2": -6325371764121648767, - "Data3": 3974405877956521279, - "Data4": 1045968846205332975 + "Data1": -5651202576216774365, + "Data2": -719637633098236437 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -5423,10 +5243,8 @@ }, { "__Checksum": { - "Data1": 7007823598322637618, - "Data2": -6573966562404276772, - "Data3": -7676631747611533459, - "Data4": -3625297780408061014 + "Data1": -501306229863032872, + "Data2": 3169050851630732767 }, "Flags": 1, "Kind": 3, @@ -5449,10 +5267,8 @@ }, { "__Checksum": { - "Data1": 6960001036176066391, - "Data2": 6743346627927609994, - "Data3": 13750227206502613, - "Data4": -4941409341996862401 + "Data1": -1101479853709910721, + "Data2": -774774707787052977 }, "Flags": 3, "Kind": 3, @@ -5475,10 +5291,8 @@ }, { "__Checksum": { - "Data1": -6325184621953844739, - "Data2": -5687646072902992196, - "Data3": 8196555265967421483, - "Data4": 1445307895204651137 + "Data1": -3022895382651194911, + "Data2": -5917255541494962403 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", @@ -5515,10 +5329,8 @@ }, { "__Checksum": { - "Data1": 6918232201070672087, - "Data2": 6024634637835197815, - "Data3": 2162838357962694967, - "Data4": 8614319026400713826 + "Data1": 7952572033152112821, + "Data2": 8250598603122453690 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", @@ -5555,10 +5367,8 @@ }, { "__Checksum": { - "Data1": -8968560598506729284, - "Data2": 1578578508930914496, - "Data3": 8380508763847733455, - "Data4": 8740543911091400816 + "Data1": -6812019841187022576, + "Data2": 5163489924420492193 }, "Flags": 1, "Kind": 3, @@ -5581,10 +5391,8 @@ }, { "__Checksum": { - "Data1": 125924534683576601, - "Data2": -4092189392523004262, - "Data3": -7011819113043057908, - "Data4": -7678261985285546728 + "Data1": 5022896133232646319, + "Data2": 1457338516441246800 }, "Flags": 3, "Kind": 3, @@ -5607,10 +5415,8 @@ }, { "__Checksum": { - "Data1": 6738521298204921345, - "Data2": -3282049337033980809, - "Data3": 3506885591753711350, - "Data4": 782486452289768014 + "Data1": -8523614908629580236, + "Data2": 2156222640223886211 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", @@ -5631,10 +5437,8 @@ }, { "__Checksum": { - "Data1": -2510985758199002361, - "Data2": -5540644847017751974, - "Data3": -3319073043595439711, - "Data4": 4585602083954494087 + "Data1": 5152850430566646256, + "Data2": 258178677394725563 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", @@ -5655,10 +5459,8 @@ }, { "__Checksum": { - "Data1": -2559343193178403740, - "Data2": 6752177939851752284, - "Data3": 6563427870404760126, - "Data4": 2760468039156880967 + "Data1": 6190929853727868104, + "Data2": 3641825373549972960 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", @@ -5695,10 +5497,8 @@ }, { "__Checksum": { - "Data1": -631346255222732893, - "Data2": 8831005142011629544, - "Data3": -2361400783891812380, - "Data4": -7445734525164582782 + "Data1": 8746250377415402480, + "Data2": -745888632282902683 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", @@ -5735,10 +5535,8 @@ }, { "__Checksum": { - "Data1": 6665276223581251727, - "Data2": 5083508174034868114, - "Data3": 4641152077771228412, - "Data4": 2644324858909347510 + "Data1": 212454570086082950, + "Data2": -1280063084362070722 }, "Flags": 1, "Kind": 3, @@ -5761,10 +5559,8 @@ }, { "__Checksum": { - "Data1": -5660628593859323350, - "Data2": -6045768099369040825, - "Data3": -3689333212292646483, - "Data4": 2596005245494486339 + "Data1": -931689916486355979, + "Data2": 7052605733296554679 }, "Flags": 3, "Kind": 3, @@ -5787,10 +5583,8 @@ }, { "__Checksum": { - "Data1": -7954773986227575523, - "Data2": -7163476767596437612, - "Data3": 2124860427692557557, - "Data4": -2935212080612733507 + "Data1": -5930873361879603325, + "Data2": 4417591864030258742 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", @@ -5865,10 +5659,8 @@ }, { "__Checksum": { - "Data1": 1529328413663227313, - "Data2": 9204689374712994575, - "Data3": 7555096351821192350, - "Data4": -8664569548277209390 + "Data1": 4529331487081589639, + "Data2": 2875781954292227082 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", @@ -5943,10 +5735,8 @@ }, { "__Checksum": { - "Data1": -4251685196901957127, - "Data2": -4123723115561447708, - "Data3": -1266058646955163157, - "Data4": -8191670329070908451 + "Data1": 4893608393684151368, + "Data2": 7247255103991087448 }, "Flags": 1, "Kind": 3, @@ -5969,10 +5759,8 @@ }, { "__Checksum": { - "Data1": 134709720164553489, - "Data2": -743560574020591932, - "Data3": -6195057519060912100, - "Data4": -81279624416649508 + "Data1": -5095043554270818909, + "Data2": -6113196799272469165 }, "Flags": 3, "Kind": 3, @@ -5995,10 +5783,8 @@ }, { "__Checksum": { - "Data1": 1033630525862140378, - "Data2": -3973031435055465125, - "Data3": 5682012923178122518, - "Data4": -2842888876063427297 + "Data1": 7615614596192359437, + "Data2": -2858127115240252692 }, "Flags": 1, "Kind": 3, @@ -6037,10 +5823,8 @@ }, { "__Checksum": { - "Data1": 4092016607842476242, - "Data2": -7529541338980922747, - "Data3": -7268434253506050699, - "Data4": 3097996772360301019 + "Data1": -6703081749718524441, + "Data2": 2483448947999284305 }, "Flags": 3, "Kind": 3, @@ -6079,10 +5863,8 @@ }, { "__Checksum": { - "Data1": -487358482294470236, - "Data2": 111911536856373116, - "Data3": -3567440091447707896, - "Data4": -4206815132687708935 + "Data1": 497239990064092969, + "Data2": 4665457192157435759 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", @@ -6234,10 +6016,8 @@ }, { "__Checksum": { - "Data1": -6507495368311249043, - "Data2": -5661330083377221141, - "Data3": -4037540297186202981, - "Data4": 5957797693830169286 + "Data1": -5092380987738122896, + "Data2": 1733576474400859934 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", @@ -6389,10 +6169,8 @@ }, { "__Checksum": { - "Data1": 1080734929720861397, - "Data2": 8844281042696242064, - "Data3": -2021780398698581313, - "Data4": -3244363499258871971 + "Data1": 7386564475630616978, + "Data2": 6891645082435974113 }, "Flags": 1, "Kind": 3, @@ -6431,10 +6209,8 @@ }, { "__Checksum": { - "Data1": 8272026015515047335, - "Data2": 1808007764447557628, - "Data3": 6859441384827655292, - "Data4": 967904600524779227 + "Data1": -4381634071311849086, + "Data2": 5519134683265548119 }, "Flags": 3, "Kind": 3, @@ -6473,10 +6249,8 @@ }, { "__Checksum": { - "Data1": -1196973668873119648, - "Data2": 8600016071239282710, - "Data3": -1973699518880474135, - "Data4": -5935975474581553058 + "Data1": -5826174391537728952, + "Data2": -5943784685626789984 }, "Flags": 1, "Kind": 3, @@ -6515,10 +6289,8 @@ }, { "__Checksum": { - "Data1": -3173230321866590638, - "Data2": 1060729664782038190, - "Data3": -1683726512521022348, - "Data4": -8271722857605990990 + "Data1": 1867416583275088063, + "Data2": -8721170851169028461 }, "Flags": 3, "Kind": 3, @@ -6557,10 +6329,8 @@ }, { "__Checksum": { - "Data1": -2180275720642839785, - "Data2": -8600511778874544932, - "Data3": -4389105802960816818, - "Data4": 768086901220349003 + "Data1": -4856740964899606527, + "Data2": 4220648196023598129 }, "Flags": 1, "Kind": 3, @@ -6599,10 +6369,8 @@ }, { "__Checksum": { - "Data1": -1842870034151384255, - "Data2": 7996538802036286499, - "Data3": -5182004155519883559, - "Data4": -951979770419955907 + "Data1": -7561017824483348477, + "Data2": -6168889869964402159 }, "Flags": 3, "Kind": 3, @@ -6641,10 +6409,8 @@ }, { "__Checksum": { - "Data1": -1123307733518896018, - "Data2": -5456308174768297222, - "Data3": -417451908816469804, - "Data4": -8729332223776598725 + "Data1": -3255220863960548148, + "Data2": 3106106120644040224 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -6665,10 +6431,8 @@ }, { "__Checksum": { - "Data1": -5165292238782982638, - "Data2": 4177278560009837783, - "Data3": -5475970862606909811, - "Data4": 131463940935458465 + "Data1": 6298925819166215449, + "Data2": -7139660982829572944 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -6689,10 +6453,8 @@ }, { "__Checksum": { - "Data1": 1694034803591098662, - "Data2": 1332586492269042257, - "Data3": 8810210647893180991, - "Data4": -4769408656161586831 + "Data1": 8194780046775182136, + "Data2": 4529643710014735513 }, "Flags": 5, "Kind": 4, @@ -6790,10 +6552,8 @@ }, { "__Checksum": { - "Data1": 2622378171300439045, - "Data2": -6462224900106913618, - "Data3": 7988348396636235302, - "Data4": -8514423581212944467 + "Data1": -6967361293058721518, + "Data2": 5719490254906283195 }, "Flags": 5, "Kind": 4, @@ -6891,10 +6651,8 @@ }, { "__Checksum": { - "Data1": -6623471412008095062, - "Data2": 6373261064046563430, - "Data3": 5244266686097506911, - "Data4": 6619219622981745328 + "Data1": -4764154449942926158, + "Data2": 1420071563830754844 }, "Flags": 5, "Kind": 4, @@ -6992,10 +6750,8 @@ }, { "__Checksum": { - "Data1": 8176253535252952638, - "Data2": 8025887845261865536, - "Data3": -1847849815852704386, - "Data4": -5289361347540065978 + "Data1": 802057952958254852, + "Data2": -6882711068766164627 }, "Flags": 5, "Kind": 4, @@ -7093,10 +6849,8 @@ }, { "__Checksum": { - "Data1": 290456076827207651, - "Data2": 21339651932587882, - "Data3": 78045002719438798, - "Data4": -8603233584507306037 + "Data1": 4979256453663170010, + "Data2": 8545812454391946184 }, "Flags": 5, "Kind": 4, @@ -7194,10 +6948,8 @@ }, { "__Checksum": { - "Data1": -1716805193804929271, - "Data2": -418070951828620069, - "Data3": -3909283496559068841, - "Data4": 3784673249940206313 + "Data1": -4685052815398989117, + "Data2": 6532971845605761558 }, "Flags": 5, "Kind": 4, @@ -7295,10 +7047,8 @@ }, { "__Checksum": { - "Data1": 5972636542644055493, - "Data2": 1010242494681990983, - "Data3": 2992204647710301715, - "Data4": -253249900713324612 + "Data1": 547487891653555647, + "Data2": -1969056106342387451 }, "Flags": 5, "Kind": 4, @@ -7396,10 +7146,8 @@ }, { "__Checksum": { - "Data1": 8608839482454549415, - "Data2": -2236862967244682511, - "Data3": -9215218903192326856, - "Data4": 5442333672894836962 + "Data1": 3718606109182321539, + "Data2": 1421856895490807079 }, "Flags": 5, "Kind": 4, @@ -7497,10 +7245,8 @@ }, { "__Checksum": { - "Data1": 9055121202581199781, - "Data2": 2451911072552176929, - "Data3": -8869378573003065301, - "Data4": -3020572964963323339 + "Data1": 4638262109839863424, + "Data2": 4522584612871186401 }, "Flags": 5, "Kind": 4, @@ -7598,10 +7344,8 @@ }, { "__Checksum": { - "Data1": -5148716501713569502, - "Data2": -2349477298732465014, - "Data3": -3858225473311469637, - "Data4": 353180956543318379 + "Data1": -5909605859660189701, + "Data2": -3303046592827774276 }, "Flags": 5, "Kind": 4, @@ -7699,10 +7443,8 @@ }, { "__Checksum": { - "Data1": -6240210571818269040, - "Data2": -1827502480177986716, - "Data3": 5699446315757527377, - "Data4": -6256525549172060388 + "Data1": 8776607941251155930, + "Data2": -416482726283397451 }, "Flags": 5, "Kind": 4, @@ -7800,10 +7542,8 @@ }, { "__Checksum": { - "Data1": 1846247672697930700, - "Data2": -8238288819693708132, - "Data3": -8072513650285540954, - "Data4": -7260651095376069773 + "Data1": 2002467327144435658, + "Data2": 6215748766686116515 }, "Flags": 5, "Kind": 4, @@ -7901,10 +7641,8 @@ }, { "__Checksum": { - "Data1": 1638007877449832843, - "Data2": 8850069895676561545, - "Data3": -4821699644289953531, - "Data4": 7880222878271422032 + "Data1": -2407099552605775530, + "Data2": -8140915566550906762 }, "Flags": 5, "Kind": 4, @@ -8002,10 +7740,8 @@ }, { "__Checksum": { - "Data1": -5058215859407771000, - "Data2": -1505185244066822022, - "Data3": -7955029833467358294, - "Data4": 1887469709124285002 + "Data1": -3964066219832313088, + "Data2": 1152061267827651573 }, "Flags": 5, "Kind": 4, @@ -8103,10 +7839,8 @@ }, { "__Checksum": { - "Data1": -3125398484828273781, - "Data2": 6050997391995208745, - "Data3": 5452932617128761631, - "Data4": 3279127381732805269 + "Data1": 125309809383477480, + "Data2": -6800124100248016517 }, "Flags": 5, "Kind": 4, @@ -8204,10 +7938,8 @@ }, { "__Checksum": { - "Data1": 2093283853890725652, - "Data2": 5842275948000733965, - "Data3": -3136491296032342952, - "Data4": -5783496004307550608 + "Data1": 929160161265490110, + "Data2": -7296862707345143003 }, "Flags": 5, "Kind": 4, @@ -8305,10 +8037,8 @@ }, { "__Checksum": { - "Data1": 6423168656412395382, - "Data2": -1963340662520113138, - "Data3": -7292891152092184802, - "Data4": 6999630311294699162 + "Data1": -3651651496697941998, + "Data2": -1018432933922031880 }, "Flags": 5, "Kind": 4, @@ -8406,10 +8136,8 @@ }, { "__Checksum": { - "Data1": 4509972562479767629, - "Data2": 1534202852151339250, - "Data3": -8269345677994854978, - "Data4": 3427093775385208834 + "Data1": -589391908266033506, + "Data2": -438850760982194722 }, "Flags": 5, "Kind": 4, @@ -8507,10 +8235,8 @@ }, { "__Checksum": { - "Data1": 1973584507153827800, - "Data2": -7742044682862358499, - "Data3": -3715563994449310676, - "Data4": 7140493982989215193 + "Data1": -1122013485782732462, + "Data2": -8895685580631808284 }, "Flags": 5, "Kind": 4, @@ -8608,10 +8334,8 @@ }, { "__Checksum": { - "Data1": -750567245526482400, - "Data2": 554786708002376880, - "Data3": 3295761983050338006, - "Data4": -6925086129041357915 + "Data1": 6435528817477230131, + "Data2": -2614865126832347942 }, "Flags": 5, "Kind": 4, @@ -8709,10 +8433,8 @@ }, { "__Checksum": { - "Data1": 176846274296679538, - "Data2": 6177217968178114176, - "Data3": -6523963821651070968, - "Data4": -1974515973670268231 + "Data1": 996283541624336138, + "Data2": -1950249469361656454 }, "Flags": 5, "Kind": 4, @@ -8810,10 +8532,8 @@ }, { "__Checksum": { - "Data1": 836393515716076796, - "Data2": -3404290624116066158, - "Data3": -2809680071131259733, - "Data4": -2971201101859061679 + "Data1": 3562635675203878945, + "Data2": 8052521229940218951 }, "Flags": 5, "Kind": 4, @@ -8911,10 +8631,8 @@ }, { "__Checksum": { - "Data1": 7606404605569225389, - "Data2": 5305157227574852885, - "Data3": -3957160627409585495, - "Data4": -5733608451892420668 + "Data1": -6071648259938460512, + "Data2": 8602496016706344026 }, "Flags": 5, "Kind": 4, @@ -9012,10 +8730,8 @@ }, { "__Checksum": { - "Data1": -31436016665548086, - "Data2": -6741047185788360325, - "Data3": 9156353478957421075, - "Data4": 3012320036823063586 + "Data1": 7587576226049121642, + "Data2": 4366086890069274856 }, "Flags": 5, "Kind": 4, @@ -9113,10 +8829,8 @@ }, { "__Checksum": { - "Data1": -1783531375461362628, - "Data2": -5579917236787138173, - "Data3": 8508103447115490185, - "Data4": 4710787717476540175 + "Data1": -1450341893196779300, + "Data2": 7879063065542601868 }, "Flags": 5, "Kind": 4, @@ -9214,10 +8928,8 @@ }, { "__Checksum": { - "Data1": -7392742015292098901, - "Data2": 7098233694565194846, - "Data3": 4495788592664020971, - "Data4": -235726322170640174 + "Data1": -7026273987608413658, + "Data2": -839122646885584549 }, "Flags": 5, "Kind": 4, @@ -9315,10 +9027,8 @@ }, { "__Checksum": { - "Data1": -7695327854867389674, - "Data2": 6897943661164507642, - "Data3": 8416966638131645372, - "Data4": -3134868865631533974 + "Data1": 7957282210883586420, + "Data2": 7227690682642311259 }, "Flags": 5, "Kind": 4, @@ -9416,10 +9126,8 @@ }, { "__Checksum": { - "Data1": 5645247800864937214, - "Data2": -826983487692536867, - "Data3": -6778230936517714513, - "Data4": 8109953029407821031 + "Data1": 7837518795959987384, + "Data2": -4185177003876239354 }, "Flags": 5, "Kind": 4, @@ -9517,10 +9225,8 @@ }, { "__Checksum": { - "Data1": 3009065739623399520, - "Data2": -6483725746584807936, - "Data3": -6689163589225312918, - "Data4": 8954136619021233818 + "Data1": 8392834201627384256, + "Data2": 5873676348670538008 }, "Flags": 5, "Kind": 4, @@ -9618,10 +9324,8 @@ }, { "__Checksum": { - "Data1": 7997644587232701488, - "Data2": -1081195803564622896, - "Data3": 4469828995252332143, - "Data4": -5086750129432922005 + "Data1": 4744074551206873557, + "Data2": -612624101778931258 }, "Flags": 5, "Kind": 4, @@ -9719,10 +9423,8 @@ }, { "__Checksum": { - "Data1": 3477872078641456492, - "Data2": 8566320775471126297, - "Data3": -2451463039298543209, - "Data4": -8344915251158697395 + "Data1": 5390089694794889674, + "Data2": 3921736247694685962 }, "Flags": 5, "Kind": 4, @@ -9820,10 +9522,8 @@ }, { "__Checksum": { - "Data1": -8887136800546998943, - "Data2": 5953389610913938089, - "Data3": 6204697685211247982, - "Data4": 2352554605790071297 + "Data1": 7122456993685891569, + "Data2": -6613548983517192771 }, "Flags": 5, "Kind": 4, @@ -9921,10 +9621,8 @@ }, { "__Checksum": { - "Data1": -7260959037908837184, - "Data2": -5934162598127312649, - "Data3": 1268345605001684288, - "Data4": 2638770039674686463 + "Data1": -7416088339292691647, + "Data2": -6703888341612524579 }, "Flags": 5, "Kind": 4, @@ -10022,10 +9720,8 @@ }, { "__Checksum": { - "Data1": 8015839447093273568, - "Data2": -5116486599365105499, - "Data3": -5704615261698169743, - "Data4": -3666868656473894296 + "Data1": -1512014085938328314, + "Data2": 5264769583956900750 }, "Flags": 5, "Kind": 4, @@ -10123,10 +9819,8 @@ }, { "__Checksum": { - "Data1": 24973518964513293, - "Data2": -2560422597395119727, - "Data3": -5142832354565292280, - "Data4": -1098590109133022862 + "Data1": -2611051890484018709, + "Data2": -645819459118882028 }, "Flags": 5, "Kind": 4, @@ -10224,10 +9918,8 @@ }, { "__Checksum": { - "Data1": -361217447683865728, - "Data2": -6687434503354731860, - "Data3": -2954424303701888378, - "Data4": 172644652207730912 + "Data1": 7343856688544438391, + "Data2": -2289698238493098272 }, "Flags": 5, "Kind": 4, @@ -10325,10 +10017,8 @@ }, { "__Checksum": { - "Data1": -116665018580021745, - "Data2": 4633851824318117064, - "Data3": -2862568624474109095, - "Data4": 1586714765151409772 + "Data1": -3929578159477931310, + "Data2": -7903179814615058132 }, "Flags": 5, "Kind": 4, @@ -10426,10 +10116,8 @@ }, { "__Checksum": { - "Data1": 6738844934122063994, - "Data2": -572436889399226092, - "Data3": -5802630752914706924, - "Data4": 598984570224011216 + "Data1": -6676193142726395562, + "Data2": -7134717553236094563 }, "Flags": 5, "Kind": 4, @@ -10527,10 +10215,8 @@ }, { "__Checksum": { - "Data1": 985939449245619735, - "Data2": 471645628380739265, - "Data3": 1803144980320318106, - "Data4": -3479966784282867245 + "Data1": 5758085484450736434, + "Data2": 5806050304455818345 }, "Flags": 5, "Kind": 4, @@ -10628,10 +10314,8 @@ }, { "__Checksum": { - "Data1": -448311647713965699, - "Data2": 6931357794031441606, - "Data3": -3542164241332737542, - "Data4": 559396716902126101 + "Data1": 2334266096980668561, + "Data2": -2441390764439527526 }, "Flags": 5, "Kind": 4, @@ -10729,10 +10413,8 @@ }, { "__Checksum": { - "Data1": 1553419693702224393, - "Data2": 7556294389577449787, - "Data3": 3270572252757718057, - "Data4": -6713356927531711208 + "Data1": -7128145052588821119, + "Data2": -2850631732714890631 }, "Flags": 5, "Kind": 4, @@ -10830,10 +10512,8 @@ }, { "__Checksum": { - "Data1": -7814461989643667993, - "Data2": 1631536228001191133, - "Data3": -8280819299866547086, - "Data4": 5037591293345227816 + "Data1": 5027130450993449199, + "Data2": 6217141994087318292 }, "Flags": 5, "Kind": 4, @@ -10931,10 +10611,8 @@ }, { "__Checksum": { - "Data1": 638873514651889017, - "Data2": -2252170516342623954, - "Data3": 7914348418032270400, - "Data4": 7507893546754279615 + "Data1": -6414324963988362474, + "Data2": 921849606002481303 }, "Flags": 5, "Kind": 4, @@ -11032,10 +10710,8 @@ }, { "__Checksum": { - "Data1": 7829315375144034059, - "Data2": -2525715539192189940, - "Data3": -778971175243445355, - "Data4": 7506598969170302707 + "Data1": -2727707839318352143, + "Data2": -251712648331076065 }, "Flags": 5, "Kind": 4, @@ -11133,10 +10809,8 @@ }, { "__Checksum": { - "Data1": -4048605651623871584, - "Data2": 5509441443583026210, - "Data3": 5669673021483013924, - "Data4": -8981409961476177960 + "Data1": 6314967685383080425, + "Data2": -5400620659048838245 }, "Flags": 5, "Kind": 4, @@ -11234,10 +10908,8 @@ }, { "__Checksum": { - "Data1": 2226937182943554958, - "Data2": 9033006047400975381, - "Data3": 772754474432254196, - "Data4": 1229869314606548603 + "Data1": -4118609437913999869, + "Data2": 3033877546043047603 }, "Flags": 5, "Kind": 4, @@ -11335,10 +11007,8 @@ }, { "__Checksum": { - "Data1": 7524889976613654140, - "Data2": -5855418286649433571, - "Data3": 3087602151760515982, - "Data4": -8067236557118716242 + "Data1": -4240076357798542355, + "Data2": 8653940671119761256 }, "Flags": 5, "Kind": 4, @@ -11436,10 +11106,8 @@ }, { "__Checksum": { - "Data1": -5648875991155012135, - "Data2": 2985422104673323940, - "Data3": 8329414742274494060, - "Data4": 7338591538559706366 + "Data1": 5128186903548216028, + "Data2": 4168008376005980361 }, "Flags": 5, "Kind": 4, @@ -11537,10 +11205,8 @@ }, { "__Checksum": { - "Data1": 214368116713183367, - "Data2": 1392791616154517869, - "Data3": 5401903136301797043, - "Data4": -7433432486092298009 + "Data1": -7929491099249784727, + "Data2": 4315617168682726690 }, "Flags": 5, "Kind": 4, @@ -11638,10 +11304,8 @@ }, { "__Checksum": { - "Data1": -6709781341480251073, - "Data2": 2672676941330540903, - "Data3": -735003855555126358, - "Data4": -3465143631589037529 + "Data1": -5194958510910692332, + "Data2": -2091939818911810802 }, "Flags": 5, "Kind": 4, @@ -11739,10 +11403,8 @@ }, { "__Checksum": { - "Data1": -2733093963739431895, - "Data2": 6166481735091960769, - "Data3": -6612557254178813304, - "Data4": -3975712435366674907 + "Data1": -8753410873756518892, + "Data2": -6185798171235548510 }, "Flags": 5, "Kind": 4, @@ -11840,10 +11502,8 @@ }, { "__Checksum": { - "Data1": 7774685233665100326, - "Data2": -3645162857458222097, - "Data3": 7073190092647882854, - "Data4": 4729564896802443979 + "Data1": -1849703976246581042, + "Data2": -5217812974362382074 }, "Flags": 5, "Kind": 4, @@ -11941,10 +11601,8 @@ }, { "__Checksum": { - "Data1": 7462341088377620632, - "Data2": 7347275126470743120, - "Data3": -2103456273692338124, - "Data4": -4364584547644059674 + "Data1": -4810060647065222506, + "Data2": -5887978605334051418 }, "Flags": 5, "Kind": 4, @@ -12042,10 +11700,8 @@ }, { "__Checksum": { - "Data1": 7324649425589506352, - "Data2": -6705143222071969908, - "Data3": -6966239356589651756, - "Data4": 1166517460799403089 + "Data1": 2223128186596951061, + "Data2": -114253279042129038 }, "Flags": 5, "Kind": 4, @@ -12143,10 +11799,8 @@ }, { "__Checksum": { - "Data1": -6649219922579482818, - "Data2": 2130420416714610231, - "Data3": -8884460652317049085, - "Data4": -5269471149408439147 + "Data1": 6335139597136565046, + "Data2": 5598324870164737415 }, "Flags": 5, "Kind": 4, @@ -12244,10 +11898,8 @@ }, { "__Checksum": { - "Data1": 8471187889756692016, - "Data2": 2062419878506363454, - "Data3": -2410760100606572379, - "Data4": -7080602496140142304 + "Data1": -3744676404707163629, + "Data2": 8370176997692200283 }, "Flags": 5, "Kind": 4, @@ -12345,10 +11997,8 @@ }, { "__Checksum": { - "Data1": -8337738298512683862, - "Data2": -6806433311325103343, - "Data3": -6117681109629651870, - "Data4": -8949918383258719546 + "Data1": 8524933252216189613, + "Data2": -7263243035209662481 }, "Flags": 5, "Kind": 4, @@ -12446,10 +12096,8 @@ }, { "__Checksum": { - "Data1": -8905274421878985248, - "Data2": 5498404934266919158, - "Data3": -7421789359770042727, - "Data4": -3939330813913318043 + "Data1": -3798815253799863700, + "Data2": -6255233860205209862 }, "Flags": 5, "Kind": 4, @@ -12547,10 +12195,8 @@ }, { "__Checksum": { - "Data1": 4710560343382359898, - "Data2": -1510430801334211571, - "Data3": -8213762237224538885, - "Data4": -2021655297454340637 + "Data1": 3732625460158868145, + "Data2": 4505247283976351311 }, "Flags": 5, "Kind": 4, @@ -12648,10 +12294,8 @@ }, { "__Checksum": { - "Data1": 2727961084329201622, - "Data2": -7090683991437897718, - "Data3": 8075989816668346419, - "Data4": 2361267904305880855 + "Data1": 3909217272860454986, + "Data2": 3598692526705804674 }, "Flags": 5, "Kind": 4, @@ -12749,10 +12393,8 @@ }, { "__Checksum": { - "Data1": 7562498570684069260, - "Data2": -6507572755467191395, - "Data3": -4947109862358638183, - "Data4": 2577050498992740580 + "Data1": -1095374812270089535, + "Data2": 7991079547248805318 }, "Flags": 5, "Kind": 4, @@ -12850,10 +12492,8 @@ }, { "__Checksum": { - "Data1": -400817671751416321, - "Data2": 5485229114831819872, - "Data3": -323646726335447554, - "Data4": 2076079498319385707 + "Data1": -6677458066876301261, + "Data2": -6135492861226865516 }, "Flags": 5, "Kind": 4, @@ -12951,10 +12591,8 @@ }, { "__Checksum": { - "Data1": 8040044571722060949, - "Data2": -8133582495823631189, - "Data3": -1137651402693027202, - "Data4": 4211981532062156267 + "Data1": -6132660713918514432, + "Data2": 5549755159985436849 }, "Flags": 5, "Kind": 4, @@ -13052,10 +12690,8 @@ }, { "__Checksum": { - "Data1": 4937911673999498336, - "Data2": 1004511187978298421, - "Data3": -292424073722533602, - "Data4": 8821116162021076246 + "Data1": -7421024857073715613, + "Data2": -6144652321578621449 }, "Flags": 5, "Kind": 4, @@ -13153,10 +12789,8 @@ }, { "__Checksum": { - "Data1": -7589077128582769507, - "Data2": -2144040188441814101, - "Data3": 6506348409036999391, - "Data4": 1120331487931177586 + "Data1": -1980156746354126966, + "Data2": 1860914853224735364 }, "Flags": 5, "Kind": 4, @@ -13254,10 +12888,8 @@ }, { "__Checksum": { - "Data1": -1121775530262580392, - "Data2": 6414216507395130805, - "Data3": 2823120460171870842, - "Data4": 2696180965760761816 + "Data1": 4356997867918765557, + "Data2": 332245287784925620 }, "Flags": 5, "Kind": 4, @@ -13355,10 +12987,8 @@ }, { "__Checksum": { - "Data1": 5491385745106361744, - "Data2": -7562907407406743952, - "Data3": 7110026288866421479, - "Data4": 1473376560574390826 + "Data1": -7772452922270602055, + "Data2": 7148123151077966302 }, "Flags": 5, "Kind": 4, @@ -13456,10 +13086,8 @@ }, { "__Checksum": { - "Data1": 2582459086478054833, - "Data2": -6264029966212002012, - "Data3": -1997958711514472739, - "Data4": -4787873879351324570 + "Data1": 3782758391114829298, + "Data2": -3106672811707825525 }, "Flags": 5, "Kind": 4, @@ -13557,10 +13185,8 @@ }, { "__Checksum": { - "Data1": -3613312161474303598, - "Data2": 1192986565313022813, - "Data3": -6914043929174170474, - "Data4": 6590224842929083615 + "Data1": 947042154625222093, + "Data2": 5005683650252977791 }, "Flags": 5, "Kind": 4, @@ -13658,10 +13284,8 @@ }, { "__Checksum": { - "Data1": 6339256221003318593, - "Data2": -3424581837039542993, - "Data3": -5606264628559552109, - "Data4": -6048672980739319787 + "Data1": 178564406266616841, + "Data2": -8619315484977713293 }, "Flags": 5, "Kind": 4, @@ -13759,10 +13383,8 @@ }, { "__Checksum": { - "Data1": -4912895747960276012, - "Data2": 5207608791653885629, - "Data3": 297642136851889043, - "Data4": -7833865715247302203 + "Data1": 373681509888047210, + "Data2": -3181274026815849612 }, "Flags": 5, "Kind": 4, @@ -13860,10 +13482,8 @@ }, { "__Checksum": { - "Data1": 5100292266959916996, - "Data2": 7890152969683467930, - "Data3": 7383283556885800320, - "Data4": 2848286731754530328 + "Data1": 7396968562591531106, + "Data2": 7788112238069152888 }, "Flags": 5, "Kind": 4, @@ -13961,10 +13581,8 @@ }, { "__Checksum": { - "Data1": 7069044388305455116, - "Data2": 5700093746686787692, - "Data3": 4626385559637278076, - "Data4": 9169009988636231482 + "Data1": -5476647659046839813, + "Data2": -7966645516469729670 }, "Flags": 5, "Kind": 4, @@ -14062,10 +13680,8 @@ }, { "__Checksum": { - "Data1": -1170441576822076222, - "Data2": -169979312749827053, - "Data3": 8015648096599126031, - "Data4": 7110648981321520260 + "Data1": 2028282531980860320, + "Data2": -3036051897649494355 }, "Flags": 5, "Kind": 4, @@ -14163,10 +13779,8 @@ }, { "__Checksum": { - "Data1": -2879451771023286428, - "Data2": 5657862222604413375, - "Data3": 7847225693129796842, - "Data4": 6801853449772983964 + "Data1": -8677606684968914237, + "Data2": -4566022121124047957 }, "Flags": 5, "Kind": 4, @@ -14264,10 +13878,8 @@ }, { "__Checksum": { - "Data1": 5648633320492000682, - "Data2": -4027476232091709656, - "Data3": 3304406218409818759, - "Data4": -8254216392822181645 + "Data1": 8169499552743153014, + "Data2": 4100228798496350381 }, "Flags": 5, "Kind": 4, @@ -14365,10 +13977,8 @@ }, { "__Checksum": { - "Data1": 7945968447584621728, - "Data2": 8906631915904547808, - "Data3": 387242100734865097, - "Data4": -2855482236940152674 + "Data1": 710701836003774726, + "Data2": -5666326416554822728 }, "Flags": 5, "Kind": 4, @@ -14466,10 +14076,8 @@ }, { "__Checksum": { - "Data1": -2175753502631224289, - "Data2": 816037920974046719, - "Data3": 5618106281275524851, - "Data4": 675701195373973542 + "Data1": -5296674364533313063, + "Data2": -764798536137419248 }, "Flags": 5, "Kind": 4, @@ -14567,10 +14175,8 @@ }, { "__Checksum": { - "Data1": -41660566747372767, - "Data2": 6620524187014466862, - "Data3": -4842486884415831379, - "Data4": 2349078782962629812 + "Data1": 7225183706309600277, + "Data2": -6558646019315864663 }, "Flags": 5, "Kind": 4, @@ -14668,10 +14274,8 @@ }, { "__Checksum": { - "Data1": -4939085550863210627, - "Data2": -426929266855898674, - "Data3": 2592654273096514793, - "Data4": 5307236829259863900 + "Data1": 2584479271892186719, + "Data2": -2626088516860826711 }, "Flags": 5, "Kind": 4, @@ -14769,10 +14373,8 @@ }, { "__Checksum": { - "Data1": 512839375890791024, - "Data2": 4828342149307963850, - "Data3": 1316546734213369878, - "Data4": -2618129132208703739 + "Data1": 640461590319377657, + "Data2": 517868260661609782 }, "Flags": 5, "Kind": 4, @@ -14870,10 +14472,8 @@ }, { "__Checksum": { - "Data1": -7729700024454826183, - "Data2": -5890258233865908766, - "Data3": 8878308086506250202, - "Data4": 3474966859918370934 + "Data1": -7822856950366124417, + "Data2": 4253828662705169789 }, "Flags": 5, "Kind": 4, @@ -14971,10 +14571,8 @@ }, { "__Checksum": { - "Data1": -8898755697842671814, - "Data2": -2137653510153216743, - "Data3": 1319965615767176197, - "Data4": -697517689285571027 + "Data1": -1453596750074621358, + "Data2": 7773384455676981037 }, "Flags": 5, "Kind": 4, @@ -15072,10 +14670,8 @@ }, { "__Checksum": { - "Data1": -1304736636185564179, - "Data2": 2725314848348793254, - "Data3": 2412406947900541422, - "Data4": -8237851764924300101 + "Data1": 8422720340787941935, + "Data2": 5609061132236432197 }, "Flags": 5, "Kind": 4, @@ -15173,10 +14769,8 @@ }, { "__Checksum": { - "Data1": -9023767620727062022, - "Data2": 5587314437419598645, - "Data3": -3208707330044600681, - "Data4": 4140706313539019303 + "Data1": -2759473451089459853, + "Data2": 4536263376063559574 }, "Flags": 5, "Kind": 4, @@ -15274,10 +14868,8 @@ }, { "__Checksum": { - "Data1": -3097284957738735105, - "Data2": 396112215262159126, - "Data3": -33767132537713950, - "Data4": 5606971563721619213 + "Data1": -1213294709563683212, + "Data2": 4207782242645108639 }, "Flags": 5, "Kind": 4, @@ -15375,10 +14967,8 @@ }, { "__Checksum": { - "Data1": 3554166331049638064, - "Data2": -950384414966363414, - "Data3": -8626514292629237820, - "Data4": -6762057149529394064 + "Data1": 2388354367602190139, + "Data2": -8590649965249317255 }, "Flags": 5, "Kind": 4, @@ -15476,10 +15066,8 @@ }, { "__Checksum": { - "Data1": -6882252006579786010, - "Data2": 7992884714463260352, - "Data3": -7886837560330928891, - "Data4": -3218629608524908632 + "Data1": 8101908210469876777, + "Data2": 2933057579620639803 }, "Flags": 5, "Kind": 4, @@ -15577,10 +15165,8 @@ }, { "__Checksum": { - "Data1": -618467118492530794, - "Data2": 7498944075670545565, - "Data3": 3382264487270715047, - "Data4": -6396207724238576267 + "Data1": 560970088823185574, + "Data2": 968087537974472282 }, "Flags": 5, "Kind": 4, @@ -15678,10 +15264,8 @@ }, { "__Checksum": { - "Data1": -2292549573900316092, - "Data2": -7295649519129020907, - "Data3": -5231946859850864996, - "Data4": 6002111058672172500 + "Data1": -4085995526437406582, + "Data2": 6436557664525364295 }, "Flags": 5, "Kind": 4, @@ -15779,10 +15363,8 @@ }, { "__Checksum": { - "Data1": 4559752858562820430, - "Data2": -6662011096420896181, - "Data3": 2268673218184362604, - "Data4": -1129157468278655425 + "Data1": -3818076650878955427, + "Data2": -6777385192446150897 }, "Flags": 5, "Kind": 4, @@ -15880,10 +15462,8 @@ }, { "__Checksum": { - "Data1": -4183323374289636416, - "Data2": 1028388854219980745, - "Data3": -3411258991580944403, - "Data4": -602670970562625169 + "Data1": -8915148714276264065, + "Data2": -2136688117853338261 }, "Flags": 5, "Kind": 4, @@ -15981,10 +15561,8 @@ }, { "__Checksum": { - "Data1": 1448361772734806632, - "Data2": -5790067831811749772, - "Data3": -7491706042214867965, - "Data4": -8222477819235794 + "Data1": 8060661852956931921, + "Data2": 7820748861684347395 }, "Flags": 5, "Kind": 8, @@ -16026,10 +15604,8 @@ }, { "__Checksum": { - "Data1": 8320071705980551447, - "Data2": -7621089228921924262, - "Data3": -7700818432625085674, - "Data4": -3414160519774345262 + "Data1": -1871924007324541164, + "Data2": -1058408952784275229 }, "Flags": 0, "Kind": 0, @@ -16243,10 +15819,8 @@ }, { "__Checksum": { - "Data1": 7722441086628972197, - "Data2": -5198533887374622813, - "Data3": -1943087658807053691, - "Data4": 5730006104632739246 + "Data1": -1451538971183231217, + "Data2": 6124826854861157010 }, "Flags": 0, "Kind": 0, @@ -16367,10 +15941,8 @@ }, { "__Checksum": { - "Data1": 5849421804075993773, - "Data2": -8183795674294729798, - "Data3": 1848242679840987201, - "Data4": 2663817720859527035 + "Data1": 7181767607730492214, + "Data2": -3088411739039462736 }, "Flags": 0, "Kind": 0, @@ -16428,10 +16000,8 @@ }, { "__Checksum": { - "Data1": 6382833008399476322, - "Data2": -8864929838010984255, - "Data3": 896442390122040549, - "Data4": 6814683429554919848 + "Data1": -5497580604680870128, + "Data2": -1909961576670929017 }, "Flags": 0, "Kind": 0, @@ -16558,10 +16128,8 @@ }, { "__Checksum": { - "Data1": -659093531722590187, - "Data2": 571484743044840002, - "Data3": 6293539017400838968, - "Data4": -637889721123008118 + "Data1": -3067056154658687826, + "Data2": 1721562915420270291 }, "Flags": 0, "Kind": 0, @@ -16610,10 +16178,8 @@ }, { "__Checksum": { - "Data1": 7657536613150264983, - "Data2": 1722152589363101495, - "Data3": 1704810975300284583, - "Data4": -4200602275821037557 + "Data1": 2891336507616117781, + "Data2": 3479209432438949737 }, "Flags": 0, "Kind": 0, @@ -17099,10 +16665,8 @@ }, { "__Checksum": { - "Data1": -5973867561462067939, - "Data2": -3117031851406302616, - "Data3": -341758834662112457, - "Data4": -6428390271876756620 + "Data1": 9169364826070594807, + "Data2": 889963421963101145 }, "Flags": 0, "Kind": 0, @@ -17201,10 +16765,8 @@ }, { "__Checksum": { - "Data1": -1991820770455400224, - "Data2": 1693373578302751869, - "Data3": -360825897901459990, - "Data4": -5149907753256862086 + "Data1": 4202298415526745367, + "Data2": 1477804035336377432 }, "Flags": 0, "Kind": 0, @@ -17256,10 +16818,8 @@ }, { "__Checksum": { - "Data1": -2753771203205316097, - "Data2": -4902360860196789678, - "Data3": 2913368486593794424, - "Data4": 6255228282638289663 + "Data1": 7303106336691811624, + "Data2": 6434001634798177299 }, "Flags": 0, "Kind": 0, @@ -17331,10 +16891,8 @@ }, { "__Checksum": { - "Data1": -2503889042138534596, - "Data2": 5944672697998675577, - "Data3": -5953846837666489517, - "Data4": 967772668312038300 + "Data1": -923404022241533958, + "Data2": 4050550153902639182 }, "Flags": 0, "Kind": 0, @@ -17373,10 +16931,8 @@ }, { "__Checksum": { - "Data1": 6090551099408577597, - "Data2": 3891428188037487008, - "Data3": -5935797078672788554, - "Data4": 6668626974297504927 + "Data1": -3178774400958581986, + "Data2": 484145839025009376 }, "Flags": 0, "Kind": 0, @@ -17584,10 +17140,8 @@ }, { "__Checksum": { - "Data1": 986217379012934747, - "Data2": 4934076972075350013, - "Data3": -7927241970112712210, - "Data4": 828025559258905323 + "Data1": 6590126873475903708, + "Data2": 5920759079050954143 }, "Flags": 0, "Kind": 0, @@ -17620,10 +17174,8 @@ }, { "__Checksum": { - "Data1": 6647718174025966504, - "Data2": -6858173052259829391, - "Data3": 5191654462711583706, - "Data4": -5507238455884311850 + "Data1": 4927999799334504861, + "Data2": 2014498193810702946 }, "Flags": 0, "Kind": 0, @@ -17705,10 +17257,8 @@ }, { "__Checksum": { - "Data1": -4778680818360411598, - "Data2": 7583490790619290561, - "Data3": -1256793052882205749, - "Data4": 6563475770423382561 + "Data1": -1957651689492920886, + "Data2": 6564484724898317732 }, "Flags": 0, "Kind": 0, @@ -17742,10 +17292,8 @@ }, { "__Checksum": { - "Data1": -4944959893693472243, - "Data2": 8606253676449854177, - "Data3": 7027768814830126563, - "Data4": -2974676248973212066 + "Data1": 2907695594486775183, + "Data2": 7663470950256857599 }, "Flags": 0, "Kind": 0, @@ -17908,10 +17456,8 @@ }, { "__Checksum": { - "Data1": -1941626977083685035, - "Data2": -3966489185182592270, - "Data3": 7334571819713464294, - "Data4": 3603053544690182891 + "Data1": -7654089768008283733, + "Data2": -5985713407099371580 }, "Flags": 0, "Kind": 0, @@ -17976,10 +17522,8 @@ }, { "__Checksum": { - "Data1": 6005745375154449827, - "Data2": 3912718425664221739, - "Data3": -3179418185571089274, - "Data4": -2530797752364063199 + "Data1": -3106187743852661898, + "Data2": -1650092648248609538 }, "Flags": 0, "Kind": 0, @@ -18026,10 +17570,8 @@ }, { "__Checksum": { - "Data1": 525919373611745134, - "Data2": 2570870106687064583, - "Data3": -70329411796643411, - "Data4": 974073049878858269 + "Data1": 2965799670765488966, + "Data2": -3121358626247262196 }, "Flags": 0, "Kind": 0, @@ -18068,10 +17610,8 @@ }, { "__Checksum": { - "Data1": -1841187464556117518, - "Data2": 4064203487530938593, - "Data3": -69088997189265799, - "Data4": 7027451419955023129 + "Data1": -4222333357259271403, + "Data2": 1154581422269512988 }, "Flags": 0, "Kind": 0, @@ -18110,10 +17650,8 @@ }, { "__Checksum": { - "Data1": -3336685128183816073, - "Data2": 5177296417080891816, - "Data3": 2529517154045766195, - "Data4": -4889761765920485026 + "Data1": 2589487112133034240, + "Data2": -3267973929636399844 }, "Flags": 0, "Kind": 0, @@ -18491,10 +18029,8 @@ }, { "__Checksum": { - "Data1": -6141870168230321996, - "Data2": 7920421560184856766, - "Data3": -3323965260889587177, - "Data4": 4002461365462691418 + "Data1": 4982539814306729389, + "Data2": 8624726390056624418 }, "Flags": 5, "Kind": 5, @@ -18602,10 +18138,8 @@ }, { "__Checksum": { - "Data1": -1762413082818498626, - "Data2": -2049914225082978404, - "Data3": 889530911636822545, - "Data4": -8898947020096703803 + "Data1": -4989035964895609084, + "Data2": 4419489833939015616 }, "Flags": 1, "Kind": 5, @@ -18704,10 +18238,8 @@ }, { "__Checksum": { - "Data1": -3346013416292845056, - "Data2": 8731253467995870693, - "Data3": -2701332057405818144, - "Data4": 3405890788370932800 + "Data1": -832877148186448112, + "Data2": 949847052411009504 }, "Flags": 3, "Kind": 5, @@ -18806,10 +18338,8 @@ }, { "__Checksum": { - "Data1": -6369422355463041306, - "Data2": 5600482567174793482, - "Data3": -1367408717223123819, - "Data4": -6302013062007868794 + "Data1": -173558552387885, + "Data2": -6727971717662620919 }, "Flags": 1, "Kind": 5, @@ -18908,10 +18438,8 @@ }, { "__Checksum": { - "Data1": -897877347948703489, - "Data2": -3374424279420336483, - "Data3": 4473598549240640055, - "Data4": 5098490851986677682 + "Data1": -84918047298574321, + "Data2": -2464256450191206416 }, "Flags": 3, "Kind": 5, @@ -19010,10 +18538,8 @@ }, { "__Checksum": { - "Data1": 3180584367744871281, - "Data2": 7017150119476061591, - "Data3": 6777588133850876682, - "Data4": -2425193127219845575 + "Data1": 7841342000128476626, + "Data2": 5183220870920164420 }, "Flags": 1, "Kind": 5, @@ -19112,10 +18638,8 @@ }, { "__Checksum": { - "Data1": 8129462401430636182, - "Data2": -1793785639577501462, - "Data3": 1215233985018462034, - "Data4": 1576680573820506381 + "Data1": -1257815151626286542, + "Data2": -2920144863749053875 }, "Flags": 3, "Kind": 5, @@ -19214,10 +18738,8 @@ }, { "__Checksum": { - "Data1": -6803203753879049604, - "Data2": 8444003319455189816, - "Data3": -1957813780065239181, - "Data4": -8516176146876172132 + "Data1": 8090730634815337449, + "Data2": -2791088608485570050 }, "Flags": 1, "Kind": 5, @@ -19316,10 +18838,8 @@ }, { "__Checksum": { - "Data1": 6650170264697026757, - "Data2": -5039551662691926654, - "Data3": 8643709675977280864, - "Data4": -5164935040297931650 + "Data1": 8887744201546013624, + "Data2": 6237594223912315635 }, "Flags": 3, "Kind": 5, @@ -19418,10 +18938,8 @@ }, { "__Checksum": { - "Data1": 6418735765754890917, - "Data2": -5567461558139833145, - "Data3": -1762799941577386453, - "Data4": 6509987045516856998 + "Data1": -5664205240869339409, + "Data2": -652804686234043731 }, "Flags": 1, "Kind": 5, @@ -19520,10 +19038,8 @@ }, { "__Checksum": { - "Data1": -7617362407479911154, - "Data2": 4171646238662796508, - "Data3": 3007515374912391188, - "Data4": -8735181867759701448 + "Data1": 1554279140721399316, + "Data2": 5123477630468342313 }, "Flags": 3, "Kind": 5, @@ -19622,10 +19138,8 @@ }, { "__Checksum": { - "Data1": 3153066130153204372, - "Data2": 2345007724718919998, - "Data3": 1024989939275372858, - "Data4": -5167372865763465521 + "Data1": 1743868541549814331, + "Data2": -3061258311903820243 }, "Flags": 1, "Kind": 5, @@ -19724,10 +19238,8 @@ }, { "__Checksum": { - "Data1": 483199207963495367, - "Data2": 211022636624634758, - "Data3": -7394843366879809158, - "Data4": 3167294342011097848 + "Data1": -6423598697065782467, + "Data2": -6380308478993065150 }, "Flags": 3, "Kind": 5, @@ -19826,10 +19338,8 @@ }, { "__Checksum": { - "Data1": -5866493729117299344, - "Data2": 4827463078307110573, - "Data3": 2100931330173633021, - "Data4": 5002990860562629095 + "Data1": 368187633383375896, + "Data2": -5569787150533547216 }, "Flags": 1, "Kind": 5, @@ -19928,10 +19438,8 @@ }, { "__Checksum": { - "Data1": -8696688711845290941, - "Data2": -498281044359848204, - "Data3": 2700681038865504114, - "Data4": -3052036901290056276 + "Data1": 8930103763133142238, + "Data2": -6526993836497977183 }, "Flags": 3, "Kind": 5, @@ -20030,10 +19538,8 @@ }, { "__Checksum": { - "Data1": -3596206287557756963, - "Data2": 1988277756414507190, - "Data3": -8854944499013061350, - "Data4": 2024057712944910423 + "Data1": 7062891418694428677, + "Data2": -3163717297950692407 }, "Flags": 5, "Kind": 5, @@ -20176,10 +19682,8 @@ }, { "__Checksum": { - "Data1": -3757154270473241832, - "Data2": 7530515718157720705, - "Data3": -5075566572288605051, - "Data4": -6762253229790507658 + "Data1": -8102977218018221691, + "Data2": 3457765441236860100 }, "Flags": 5, "Kind": 5, @@ -20322,10 +19826,8 @@ }, { "__Checksum": { - "Data1": -2498575715909381864, - "Data2": -4048557638435545966, - "Data3": 5814205226309744573, - "Data4": 4004234915553911033 + "Data1": -5700836057787919641, + "Data2": -120429084645376682 }, "Flags": 5, "Kind": 5, @@ -20481,10 +19983,8 @@ }, { "__Checksum": { - "Data1": 8517809643342354248, - "Data2": -1615827273921558920, - "Data3": 3845496981449203454, - "Data4": 3060486270244226338 + "Data1": -4694254523673562864, + "Data2": 2750604393150025440 }, "Flags": 5, "Kind": 5, @@ -20640,10 +20140,8 @@ }, { "__Checksum": { - "Data1": -3054673979750358536, - "Data2": 3096891528618335903, - "Data3": -8969119998626444792, - "Data4": 2714313373167431773 + "Data1": -6296301493465714212, + "Data2": 1921340946258040020 }, "Flags": 5, "Kind": 5, @@ -20800,10 +20298,8 @@ }, { "__Checksum": { - "Data1": -3210933480062927410, - "Data2": -8676140700334623880, - "Data3": -2997469455199492418, - "Data4": 3490342890857289849 + "Data1": -4744674786706626150, + "Data2": 5052691678407054834 }, "Flags": 5, "Kind": 5, @@ -20960,10 +20456,8 @@ }, { "__Checksum": { - "Data1": 8913330663499154191, - "Data2": -7871570744579310634, - "Data3": -4413084407658804506, - "Data4": 630044981688257560 + "Data1": 5103627679272379451, + "Data2": 4097482576052909460 }, "Flags": 5, "Kind": 5, @@ -21121,10 +20615,8 @@ }, { "__Checksum": { - "Data1": -8134389928914751097, - "Data2": -6966275743547443080, - "Data3": 56675293393511108, - "Data4": -8084222468762417804 + "Data1": -1194150127829176341, + "Data2": -4770822501714601586 }, "Flags": 5, "Kind": 5, @@ -21282,10 +20774,8 @@ }, { "__Checksum": { - "Data1": -6036083539737161021, - "Data2": -7186033490490506853, - "Data3": -6059529407745402200, - "Data4": 2881683119642330602 + "Data1": 1258738188789116522, + "Data2": 9066588944491324573 }, "Flags": 5, "Kind": 5, @@ -21443,10 +20933,8 @@ }, { "__Checksum": { - "Data1": 7624164366774348424, - "Data2": 1010725622122707422, - "Data3": -9151495553085075142, - "Data4": 8241718017976315478 + "Data1": -4989266230812830758, + "Data2": -7788314474174820428 }, "Flags": 5, "Kind": 5, @@ -21604,10 +21092,8 @@ }, { "__Checksum": { - "Data1": -1589773093513761865, - "Data2": 1297778509302337733, - "Data3": -2516404007469938841, - "Data4": 770729184874332837 + "Data1": -7345071173386455339, + "Data2": -4525877595086833927 }, "Flags": 5, "Kind": 5, @@ -21765,10 +21251,8 @@ }, { "__Checksum": { - "Data1": 8819784972376587383, - "Data2": 4314497430224993707, - "Data3": -3372419940144688815, - "Data4": 820578643532742012 + "Data1": 5841752710736644234, + "Data2": -1169179359699605861 }, "Flags": 5, "Kind": 5, @@ -21926,10 +21410,8 @@ }, { "__Checksum": { - "Data1": -2620536712101354043, - "Data2": -1148473503005360237, - "Data3": -8180804067740137673, - "Data4": -7537081818905407301 + "Data1": -8987146155258892384, + "Data2": -7501479192400179079 }, "Flags": 5, "Kind": 5, @@ -22087,10 +21569,8 @@ }, { "__Checksum": { - "Data1": -8252459242328131218, - "Data2": 9156597490755137511, - "Data3": 7996133696639287383, - "Data4": -5915880890590639336 + "Data1": -935364534785926157, + "Data2": 3232141828355257541 }, "Flags": 5, "Kind": 5, @@ -22248,10 +21728,8 @@ }, { "__Checksum": { - "Data1": -818880943383347277, - "Data2": 6288713091333845763, - "Data3": -9004031896881855761, - "Data4": 9044755490001692807 + "Data1": 3950899315975550144, + "Data2": 8422445606492153138 }, "Flags": 5, "Kind": 5, @@ -22394,10 +21872,8 @@ }, { "__Checksum": { - "Data1": 6916653785587514253, - "Data2": 5843066858227568358, - "Data3": 5446709975369351868, - "Data4": 2237182619802965739 + "Data1": 540975113479142764, + "Data2": -8722967388799935207 }, "Flags": 5, "Kind": 5, @@ -22540,10 +22016,8 @@ }, { "__Checksum": { - "Data1": -1126470415853518185, - "Data2": -2068527852798034338, - "Data3": -1784181927895900276, - "Data4": 5530413316844057758 + "Data1": -8947675599090921291, + "Data2": -4818349403507162827 }, "Flags": 5, "Kind": 7, @@ -22585,10 +22059,8 @@ }, { "__Checksum": { - "Data1": -8395202375595883215, - "Data2": 5196502085737569851, - "Data3": 5127869453150953619, - "Data4": 710586953770000298 + "Data1": 4035305027845089335, + "Data2": 3885200982551404936 }, "Flags": 5, "Kind": 6, diff --git a/src/Shared/files/Tooling/Telerik/Kendo.Mvc.Examples.project.razor.json b/src/Shared/files/Tooling/Telerik/Kendo.Mvc.Examples.project.razor.json index 5547998c499..c6f0bf87ffb 100644 --- a/src/Shared/files/Tooling/Telerik/Kendo.Mvc.Examples.project.razor.json +++ b/src/Shared/files/Tooling/Telerik/Kendo.Mvc.Examples.project.razor.json @@ -1,5 +1,5 @@ { - "__Version": 14, + "__Version": 16, "ProjectKey": "C:/Users/admin/location/Kendo.Mvc.Examples/obj/Debug/net7.0/", "FilePath": "C:\\Users\\admin\\location\\Kendo.Mvc.Examples\\Kendo.Mvc.Examples.csproj", "Configuration": { @@ -14,10 +14,8 @@ "TagHelpers": [ { "__Checksum": { - "Data1": -3206630733188996242, - "Data2": 8357460917934969767, - "Data3": -4252591313314899428, - "Data4": 7206917258543938185 + "Data1": 7797026082698329757, + "Data2": 3690201877388609652 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -113,10 +111,8 @@ }, { "__Checksum": { - "Data1": -5566581092860309171, - "Data2": 8778169394430788402, - "Data3": -742159610968472449, - "Data4": 2521833885339232453 + "Data1": 4926667238362123395, + "Data2": 4234913057389196271 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -212,10 +208,8 @@ }, { "__Checksum": { - "Data1": 4930041651603740922, - "Data2": -1131435785158517922, - "Data3": -3086759804211547301, - "Data4": 8039745058838873433 + "Data1": -6170869053616268768, + "Data2": -8167038815822842516 }, "Flags": 1, "Kind": 3, @@ -254,10 +248,8 @@ }, { "__Checksum": { - "Data1": -3841540589375924122, - "Data2": 5707193656339180370, - "Data3": -5603733563700533148, - "Data4": -8564212220425136679 + "Data1": -5254430524587877655, + "Data2": -8158472740492044958 }, "Flags": 3, "Kind": 3, @@ -296,10 +288,8 @@ }, { "__Checksum": { - "Data1": 8505177104787030733, - "Data2": -284985845404668852, - "Data3": -4958805730255777912, - "Data4": 8338996988626093747 + "Data1": 1485724636681179776, + "Data2": 4457694576996447331 }, "Flags": 1, "Kind": 3, @@ -322,10 +312,8 @@ }, { "__Checksum": { - "Data1": -4289854432041895832, - "Data2": 2152645570849032885, - "Data3": 7054280334332964819, - "Data4": 3423643953430331425 + "Data1": -7108528587728066839, + "Data2": 325751887706851842 }, "Flags": 3, "Kind": 3, @@ -348,10 +336,8 @@ }, { "__Checksum": { - "Data1": 2145233970298667666, - "Data2": 322529678187344706, - "Data3": 457920824386375491, - "Data4": 5218404900558243367 + "Data1": -3270503164572345556, + "Data2": -5234319517993826978 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -473,10 +459,8 @@ }, { "__Checksum": { - "Data1": 8267711055252645201, - "Data2": 5030691127684715765, - "Data3": -2193379745506423464, - "Data4": 5473929663185401584 + "Data1": 5836704759973159924, + "Data2": 2042743095548668492 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -598,10 +582,8 @@ }, { "__Checksum": { - "Data1": -407575911507465286, - "Data2": 3793148429565617541, - "Data3": 6580689837178914583, - "Data4": 818213719812458618 + "Data1": 6698719116033855183, + "Data2": -441041995610521826 }, "Flags": 1, "Kind": 3, @@ -640,10 +622,8 @@ }, { "__Checksum": { - "Data1": -6929637574097414973, - "Data2": 7360089145593565334, - "Data3": -2261106012346266610, - "Data4": 488138844106542431 + "Data1": -2911843784829325436, + "Data2": -6319786036245506996 }, "Flags": 3, "Kind": 3, @@ -682,10 +662,8 @@ }, { "__Checksum": { - "Data1": -941568207605026252, - "Data2": 6644785968447255023, - "Data3": -11101360015202990, - "Data4": 5142231969231976079 + "Data1": 8469227219072337679, + "Data2": 2013997054376952751 }, "Flags": 1, "Kind": 3, @@ -724,10 +702,8 @@ }, { "__Checksum": { - "Data1": -4740772574032195288, - "Data2": -4489649865303299107, - "Data3": 669241300029607986, - "Data4": -5535595758299121168 + "Data1": 518877941855456580, + "Data2": -5871294866789008204 }, "Flags": 3, "Kind": 3, @@ -766,10 +742,8 @@ }, { "__Checksum": { - "Data1": -8942807039917611375, - "Data2": -2951669729003543986, - "Data3": 9074844031729657942, - "Data4": 6723866676321658250 + "Data1": -6036001828814458330, + "Data2": 5302504473525684148 }, "Flags": 1, "Kind": 3, @@ -808,10 +782,8 @@ }, { "__Checksum": { - "Data1": 934220185637193349, - "Data2": -292742512178808877, - "Data3": 4451946791480677404, - "Data4": -5438762718606928608 + "Data1": -7662471422811394851, + "Data2": -2180176246042572463 }, "Flags": 3, "Kind": 3, @@ -850,10 +822,8 @@ }, { "__Checksum": { - "Data1": 752710759961871956, - "Data2": -4618206618809477114, - "Data3": 855140587917687688, - "Data4": -5986813842976185002 + "Data1": -6968539277833652683, + "Data2": 5832967399512376451 }, "Flags": 1, "Kind": 3, @@ -876,10 +846,8 @@ }, { "__Checksum": { - "Data1": 663373971323738936, - "Data2": -2067570348009246156, - "Data3": 563906863450806484, - "Data4": 4264391830596629321 + "Data1": -171823818384442361, + "Data2": -3806509227642408634 }, "Flags": 3, "Kind": 3, @@ -902,10 +870,8 @@ }, { "__Checksum": { - "Data1": -8772896747709157474, - "Data2": -9068071353245128965, - "Data3": -5383436085625490440, - "Data4": 3980681423356524699 + "Data1": -8570439114810334067, + "Data2": -712698792369100491 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -940,10 +906,8 @@ }, { "__Checksum": { - "Data1": 3143669605929054240, - "Data2": 6185313568827516694, - "Data3": -8449311990909094491, - "Data4": 2417732563197934256 + "Data1": 4880950719331803254, + "Data2": -1736382581417551436 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -978,10 +942,8 @@ }, { "__Checksum": { - "Data1": 738648772295242988, - "Data2": 5145516115432919439, - "Data3": 7336962712105705753, - "Data4": 7899720636442920152 + "Data1": 6488046190713595732, + "Data2": 307626256560635888 }, "Flags": 1, "Kind": 3, @@ -1004,10 +966,8 @@ }, { "__Checksum": { - "Data1": 2519435554266668390, - "Data2": -8280828652630706396, - "Data3": -7690087104705682085, - "Data4": -282139168271897244 + "Data1": -5985383523299739255, + "Data2": -1993649736422733038 }, "Flags": 3, "Kind": 3, @@ -1030,10 +990,8 @@ }, { "__Checksum": { - "Data1": 6761997121030723474, - "Data2": -5679143177423553846, - "Data3": 4695628758466062569, - "Data4": 3399430491766322036 + "Data1": 2187045305938273776, + "Data2": -2570501246693306390 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -1124,10 +1082,8 @@ }, { "__Checksum": { - "Data1": 1411860109198361766, - "Data2": 2728788834011003213, - "Data3": -3855925001332350458, - "Data4": -4756260148028826019 + "Data1": 2433905641730083649, + "Data2": -6949336250008025111 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -1218,10 +1174,8 @@ }, { "__Checksum": { - "Data1": 4849886575369874874, - "Data2": 4889916424629579556, - "Data3": -4136180796273259582, - "Data4": 6549205639564303725 + "Data1": 5397896856852084391, + "Data2": -5739275324003106423 }, "Flags": 1, "Kind": 3, @@ -1244,10 +1198,8 @@ }, { "__Checksum": { - "Data1": 8505458575644988328, - "Data2": 4537325872604122958, - "Data3": 3140667787881970683, - "Data4": -3916641521546367542 + "Data1": -5297088290257981628, + "Data2": 8012603118799319838 }, "Flags": 3, "Kind": 3, @@ -1270,10 +1222,8 @@ }, { "__Checksum": { - "Data1": -6131256332102995710, - "Data2": -3069043794292942177, - "Data3": -4307749538882593018, - "Data4": -8591979749668941378 + "Data1": 1788793903094130664, + "Data2": 3744315316245942211 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.DynamicComponent", @@ -1320,10 +1270,8 @@ }, { "__Checksum": { - "Data1": -2578972863684358618, - "Data2": 6763022731297441616, - "Data3": -674004338877933061, - "Data4": 5602770616024980948 + "Data1": -5362506210041258261, + "Data2": 5348261415394195923 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.DynamicComponent", @@ -1370,10 +1318,8 @@ }, { "__Checksum": { - "Data1": -6125076534827203771, - "Data2": -4251888664095035202, - "Data3": -3678417462630865437, - "Data4": 5286376558756151725 + "Data1": -5777460138682365483, + "Data2": 1952483347864270418 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -1421,10 +1367,8 @@ }, { "__Checksum": { - "Data1": 8943434850085049290, - "Data2": -4552342351326901576, - "Data3": -8111878333720766210, - "Data4": -3127495789568786019 + "Data1": -7852628131581236611, + "Data2": -4717378496137316230 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -1472,10 +1416,8 @@ }, { "__Checksum": { - "Data1": 6747256102099010090, - "Data2": -7061820148962748950, - "Data3": 2694081397575314532, - "Data4": -6994995620605775222 + "Data1": 4302935512397455954, + "Data2": 5185911745023879289 }, "Flags": 1, "Kind": 3, @@ -1498,10 +1440,8 @@ }, { "__Checksum": { - "Data1": 111643164421853596, - "Data2": -1689433293473952521, - "Data3": -5480543476110081918, - "Data4": -6203237545167305374 + "Data1": -4493212034722291803, + "Data2": 4737697892338068057 }, "Flags": 3, "Kind": 3, @@ -1524,10 +1464,8 @@ }, { "__Checksum": { - "Data1": -7566045065921141540, - "Data2": -1149438145018316058, - "Data3": 6828138461945914220, - "Data4": -7609590661007018040 + "Data1": 6705497867820935977, + "Data2": -8208476660512327593 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -1574,10 +1512,8 @@ }, { "__Checksum": { - "Data1": 2713833175152956351, - "Data2": 4988891089601089866, - "Data3": -6203797350287043894, - "Data4": 5805111489945366089 + "Data1": 4086042310747817088, + "Data2": 2192004873198815636 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -1624,10 +1560,8 @@ }, { "__Checksum": { - "Data1": 3545495332943592409, - "Data2": -2865238208649140541, - "Data3": -2081487446913417982, - "Data4": -1872426113897896738 + "Data1": -3037846143497359872, + "Data2": -9073982560453033198 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -1749,10 +1683,8 @@ }, { "__Checksum": { - "Data1": 9052035631031367822, - "Data2": 1835614808570947343, - "Data3": 550046152296424981, - "Data4": -5044085326903649402 + "Data1": -6889831476703473769, + "Data2": 7166817355276495619 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -1874,10 +1806,8 @@ }, { "__Checksum": { - "Data1": 8583775132861681989, - "Data2": 5439463580495863089, - "Data3": 3547304272288097361, - "Data4": 9195593298753975651 + "Data1": -7692669234801883104, + "Data2": -7119662165073117894 }, "Flags": 1, "Kind": 3, @@ -1900,10 +1830,8 @@ }, { "__Checksum": { - "Data1": -1904660506772394100, - "Data2": -6248150288593258690, - "Data3": -6767607126822914026, - "Data4": 4150770401416903999 + "Data1": 5564972683372825552, + "Data2": -5091664131990937047 }, "Flags": 3, "Kind": 3, @@ -1926,10 +1854,8 @@ }, { "__Checksum": { - "Data1": 7840483017144318047, - "Data2": 6742944780045466347, - "Data3": -1906439148982061283, - "Data4": 4215763046944315136 + "Data1": -8233269186047007973, + "Data2": 5976719934745352206 }, "Flags": 1, "Kind": 3, @@ -1968,10 +1894,8 @@ }, { "__Checksum": { - "Data1": 6777877481433542986, - "Data2": 5967345423297792015, - "Data3": -517505527294662920, - "Data4": -6926589346969475326 + "Data1": 7114827079399109699, + "Data2": 4084339282821650644 }, "Flags": 3, "Kind": 3, @@ -2010,10 +1934,8 @@ }, { "__Checksum": { - "Data1": -6036234111528561375, - "Data2": -2143730386637616308, - "Data3": -1650963123900260366, - "Data4": -5155546115533706319 + "Data1": 1555348321007130422, + "Data2": -1732921891145813821 }, "Flags": 1, "Kind": 3, @@ -2036,10 +1958,8 @@ }, { "__Checksum": { - "Data1": -7452048426478299168, - "Data2": -4530716866676664776, - "Data3": -7331212533770056081, - "Data4": -8329436836337726873 + "Data1": -2509164420084162936, + "Data2": 5082062649460048734 }, "Flags": 3, "Kind": 3, @@ -2062,10 +1982,8 @@ }, { "__Checksum": { - "Data1": -1123307733518896018, - "Data2": -5456308174768297222, - "Data3": -417451908816469804, - "Data4": -8729332223776598725 + "Data1": -3255220863960548148, + "Data2": 3106106120644040224 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -2086,10 +2004,8 @@ }, { "__Checksum": { - "Data1": -5165292238782982638, - "Data2": 4177278560009837783, - "Data3": -5475970862606909811, - "Data4": 131463940935458465 + "Data1": 6298925819166215449, + "Data2": -7139660982829572944 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -2110,10 +2026,8 @@ }, { "__Checksum": { - "Data1": -2310847341529886441, - "Data2": 6863543708223593969, - "Data3": 1978495174215711021, - "Data4": 6006357468116003447 + "Data1": -3189652441237983124, + "Data2": -6703237589590121206 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -2235,10 +2149,8 @@ }, { "__Checksum": { - "Data1": 6302258179207961261, - "Data2": -5541580875653111315, - "Data3": 829454100962720164, - "Data4": 1748501664498929011 + "Data1": 3786349607998375841, + "Data2": 754934040197895508 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -2360,10 +2272,8 @@ }, { "__Checksum": { - "Data1": 2611077318490395801, - "Data2": -3196589382572038172, - "Data3": -3920239710080856654, - "Data4": 1967251448787226790 + "Data1": 4655928664758658212, + "Data2": 7062885489576443957 }, "Flags": 1, "Kind": 3, @@ -2402,10 +2312,8 @@ }, { "__Checksum": { - "Data1": -5713847307469012383, - "Data2": -7633688427483062557, - "Data3": 2778258375588096682, - "Data4": -6737193802265358511 + "Data1": 8701126525115212609, + "Data2": -2455922085345217282 }, "Flags": 3, "Kind": 3, @@ -2444,10 +2352,8 @@ }, { "__Checksum": { - "Data1": 7216177543310595179, - "Data2": -2578433538285688095, - "Data3": 7985579475460371061, - "Data4": -5735929841817483599 + "Data1": 8845440994095538742, + "Data2": -7307021473322603872 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -2531,10 +2437,8 @@ }, { "__Checksum": { - "Data1": 5642893276402099907, - "Data2": 2922514397278029305, - "Data3": -5639831424261485131, - "Data4": 3765267422528979485 + "Data1": -5194248249653633974, + "Data2": 7927403111783914182 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -2618,10 +2522,8 @@ }, { "__Checksum": { - "Data1": 3486803452858140432, - "Data2": -5860314831143379205, - "Data3": 4505168284610036217, - "Data4": -8149015023532229435 + "Data1": -4424174965456880514, + "Data2": -4933624773774214613 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -2750,10 +2652,8 @@ }, { "__Checksum": { - "Data1": -5587988205258577083, - "Data2": -306427709182554944, - "Data3": 2701851069607281168, - "Data4": -5007884644248028187 + "Data1": -9108542244962694970, + "Data2": -1096781107982128575 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -2882,10 +2782,8 @@ }, { "__Checksum": { - "Data1": -3909307678130414290, - "Data2": -6772512692010547741, - "Data3": -2917616355291112522, - "Data4": -3702458998650436060 + "Data1": -751659190080684045, + "Data2": 9162226254179085517 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", @@ -2933,10 +2831,8 @@ }, { "__Checksum": { - "Data1": -1696611427785082114, - "Data2": 5334639298087308727, - "Data3": -8976838480079893436, - "Data4": -5024603100248776858 + "Data1": -5487950774596902971, + "Data2": -3901392736725918889 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", @@ -2984,10 +2880,8 @@ }, { "__Checksum": { - "Data1": -514006375458848613, - "Data2": -5335193242652658200, - "Data3": 889516890153922553, - "Data4": -2651739197325621193 + "Data1": -5612517424848971816, + "Data2": -3030575879944635485 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -3104,10 +2998,8 @@ }, { "__Checksum": { - "Data1": 6574937049293430459, - "Data2": 3740609988862490391, - "Data3": 3198359905897237012, - "Data4": -2063885276769551731 + "Data1": 1396828519166927951, + "Data2": 2634843222654959070 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -3224,10 +3116,8 @@ }, { "__Checksum": { - "Data1": -6542253735773717140, - "Data2": -4586315779635184745, - "Data3": 8384973787877704864, - "Data4": -7083567861681540411 + "Data1": 5622431187222023846, + "Data2": -5471692655746244651 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", @@ -3305,10 +3195,8 @@ }, { "__Checksum": { - "Data1": 7003849187030022778, - "Data2": -3711668298310819247, - "Data3": -1328921588537032958, - "Data4": 6270100307648216899 + "Data1": 4064166792066507817, + "Data2": -5719931316532595980 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", @@ -3386,10 +3274,8 @@ }, { "__Checksum": { - "Data1": 8667332372128554682, - "Data2": 3992576111695036455, - "Data3": -315046125608686322, - "Data4": 4796760478048840724 + "Data1": 255729113326055280, + "Data2": -7520697551848893142 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", @@ -3519,10 +3405,8 @@ }, { "__Checksum": { - "Data1": -5072897040128506155, - "Data2": -7166987644272463642, - "Data3": 4678581004686283725, - "Data4": 11583159769846217 + "Data1": 4063368498199389020, + "Data2": 4280957149931095369 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", @@ -3652,10 +3536,8 @@ }, { "__Checksum": { - "Data1": -4781284810406737761, - "Data2": -7591991474954936731, - "Data3": 994592369531403456, - "Data4": 1761428867147444400 + "Data1": -8841980750978813076, + "Data2": 6444455319670145289 }, "Flags": 1, "Kind": 3, @@ -3678,10 +3560,8 @@ }, { "__Checksum": { - "Data1": -1372956736404853202, - "Data2": 5348055934600143823, - "Data3": -7852017170635964781, - "Data4": 3500813823803174865 + "Data1": -8640507686543268351, + "Data2": 7467977046836679830 }, "Flags": 3, "Kind": 3, @@ -3704,10 +3584,8 @@ }, { "__Checksum": { - "Data1": -8636229947299522184, - "Data2": -8881559371815326954, - "Data3": -5549012838690168473, - "Data4": 17824152099409014 + "Data1": 1489261044726692613, + "Data2": -3992953055238405339 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -3825,10 +3703,8 @@ }, { "__Checksum": { - "Data1": 1005531732039773040, - "Data2": 1153210776274766402, - "Data3": -7462410836512263166, - "Data4": -7388350346678040011 + "Data1": -4421292422253239793, + "Data2": 7500566405165723364 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -3946,10 +3822,8 @@ }, { "__Checksum": { - "Data1": -4064941096794280062, - "Data2": 2137091070084871354, - "Data3": 110230551014444529, - "Data4": -2579942202369914131 + "Data1": -7770383423146008629, + "Data2": -913483525602206477 }, "Flags": 1, "Kind": 3, @@ -3972,10 +3846,8 @@ }, { "__Checksum": { - "Data1": -2052791935872294990, - "Data2": 5385183117308296917, - "Data3": 2252573235543933229, - "Data4": -4965422803951440602 + "Data1": 2081905570157670380, + "Data2": -2663920933113778601 }, "Flags": 3, "Kind": 3, @@ -3998,10 +3870,8 @@ }, { "__Checksum": { - "Data1": 4808397981156302305, - "Data2": 5094427473332376264, - "Data3": -6595776324775958439, - "Data4": 8831061924218662422 + "Data1": -6889801753478084228, + "Data2": 6491354219329640131 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -4085,10 +3955,8 @@ }, { "__Checksum": { - "Data1": 6850858188121458131, - "Data2": 4008324321100753243, - "Data3": 6198364315278746162, - "Data4": 2039840070916656396 + "Data1": 3205832943330367599, + "Data2": 9135688030954228968 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -4172,10 +4040,8 @@ }, { "__Checksum": { - "Data1": -4143766228824851612, - "Data2": 2711081044747266130, - "Data3": -8521304118634583631, - "Data4": 606477692892967153 + "Data1": -2988936362147671988, + "Data2": 1508497263552382497 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -4259,10 +4125,8 @@ }, { "__Checksum": { - "Data1": 4332756002050726764, - "Data2": -4685821472245174582, - "Data3": -8767944829384093583, - "Data4": 2672322889655707559 + "Data1": 4773673735621715435, + "Data2": -5415193873778515843 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -4346,10 +4210,8 @@ }, { "__Checksum": { - "Data1": -7772683331127480392, - "Data2": 8581423998163796332, - "Data3": -663886333442863846, - "Data4": -8477677897083375970 + "Data1": -7663559305837638307, + "Data2": 387942152080416865 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -4415,10 +4277,8 @@ }, { "__Checksum": { - "Data1": 765864723033255859, - "Data2": -6872611534740150459, - "Data3": 8432730024953112715, - "Data4": -4080166756659577821 + "Data1": -4736616839916153820, + "Data2": -4765098070595376979 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -4484,10 +4344,8 @@ }, { "__Checksum": { - "Data1": 6738898566712768803, - "Data2": 6384441364283431785, - "Data3": 746520592373070502, - "Data4": -3295394932361551848 + "Data1": -8753650447919604408, + "Data2": 4425582878120944050 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -4534,10 +4392,8 @@ }, { "__Checksum": { - "Data1": -3978601925595006203, - "Data2": -3139313593325549090, - "Data3": 353357918071702897, - "Data4": 5568586844489636405 + "Data1": -5459476267859235335, + "Data2": -514509262654303737 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -4584,10 +4440,8 @@ }, { "__Checksum": { - "Data1": 2571001050911667580, - "Data2": 4952371933228710471, - "Data3": -1977017388038189979, - "Data4": -3329432456167621142 + "Data1": 352330126814374125, + "Data2": -2521833504300792416 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", @@ -4634,10 +4488,8 @@ }, { "__Checksum": { - "Data1": 1151366026373653655, - "Data2": -4176601818622381310, - "Data3": -4342050954290947632, - "Data4": 3529954911832915197 + "Data1": -4143786666164395650, + "Data2": -5786416472151336325 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", @@ -4684,10 +4536,8 @@ }, { "__Checksum": { - "Data1": -1032746361547875465, - "Data2": -6595946586728192853, - "Data3": 8046454569091987588, - "Data4": -5066172967311223243 + "Data1": 8177284002573331653, + "Data2": -194789921200134303 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.NavigationLock", @@ -4735,10 +4585,8 @@ }, { "__Checksum": { - "Data1": 5346278316869859465, - "Data2": 5552485671978551858, - "Data3": -540701767061042918, - "Data4": 4957304761647425837 + "Data1": 1446630921979530084, + "Data2": 8995786770410672093 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.NavigationLock", @@ -4786,10 +4634,8 @@ }, { "__Checksum": { - "Data1": 1406389429900053801, - "Data2": -7003270362588110942, - "Data3": -3627251281975762765, - "Data4": -5169275720232364387 + "Data1": 5734382158522380841, + "Data2": 5150747061494260181 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -4861,10 +4707,8 @@ }, { "__Checksum": { - "Data1": -8367849044821322345, - "Data2": -7202494523821086186, - "Data3": 3242299275059751766, - "Data4": 8012702420283693704 + "Data1": 5746279174262600374, + "Data2": 1598960394464893436 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -4936,10 +4780,8 @@ }, { "__Checksum": { - "Data1": 7007823598322637618, - "Data2": -6573966562404276772, - "Data3": -7676631747611533459, - "Data4": -3625297780408061014 + "Data1": -501306229863032872, + "Data2": 3169050851630732767 }, "Flags": 1, "Kind": 3, @@ -4962,10 +4804,8 @@ }, { "__Checksum": { - "Data1": 6960001036176066391, - "Data2": 6743346627927609994, - "Data3": 13750227206502613, - "Data4": -4941409341996862401 + "Data1": -1101479853709910721, + "Data2": -774774707787052977 }, "Flags": 3, "Kind": 3, @@ -4988,10 +4828,8 @@ }, { "__Checksum": { - "Data1": -7487935317284963687, - "Data2": -611132187535896357, - "Data3": 5690863865031973471, - "Data4": 1940032901750163072 + "Data1": -2761674384481804437, + "Data2": -5435226596879227918 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", @@ -5027,10 +4865,8 @@ }, { "__Checksum": { - "Data1": 6961902166023597294, - "Data2": -2332984844533148618, - "Data3": 5457932977014102175, - "Data4": -7793128925127225427 + "Data1": 1871499095546031324, + "Data2": 5229180298100412661 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", @@ -5066,10 +4902,8 @@ }, { "__Checksum": { - "Data1": -8968560598506729284, - "Data2": 1578578508930914496, - "Data3": 8380508763847733455, - "Data4": 8740543911091400816 + "Data1": -6812019841187022576, + "Data2": 5163489924420492193 }, "Flags": 1, "Kind": 3, @@ -5092,10 +4926,8 @@ }, { "__Checksum": { - "Data1": 125924534683576601, - "Data2": -4092189392523004262, - "Data3": -7011819113043057908, - "Data4": -7678261985285546728 + "Data1": 5022896133232646319, + "Data2": 1457338516441246800 }, "Flags": 3, "Kind": 3, @@ -5118,10 +4950,8 @@ }, { "__Checksum": { - "Data1": 6738521298204921345, - "Data2": -3282049337033980809, - "Data3": 3506885591753711350, - "Data4": 782486452289768014 + "Data1": -8523614908629580236, + "Data2": 2156222640223886211 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", @@ -5142,10 +4972,8 @@ }, { "__Checksum": { - "Data1": -2510985758199002361, - "Data2": -5540644847017751974, - "Data3": -3319073043595439711, - "Data4": 4585602083954494087 + "Data1": 5152850430566646256, + "Data2": 258178677394725563 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", @@ -5166,10 +4994,8 @@ }, { "__Checksum": { - "Data1": -8830623684136587817, - "Data2": 7597384519783604187, - "Data3": -3663123865665823257, - "Data4": -5189880941756688316 + "Data1": -7289042576373224621, + "Data2": -8243959067472407917 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", @@ -5205,10 +5031,8 @@ }, { "__Checksum": { - "Data1": -1657043457718608470, - "Data2": 3817949504195820598, - "Data3": -5181876522600621025, - "Data4": -4749856528046161704 + "Data1": 8299082185897128040, + "Data2": 5781265086357945165 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", @@ -5244,10 +5068,8 @@ }, { "__Checksum": { - "Data1": 6665276223581251727, - "Data2": 5083508174034868114, - "Data3": 4641152077771228412, - "Data4": 2644324858909347510 + "Data1": 212454570086082950, + "Data2": -1280063084362070722 }, "Flags": 1, "Kind": 3, @@ -5270,10 +5092,8 @@ }, { "__Checksum": { - "Data1": -5660628593859323350, - "Data2": -6045768099369040825, - "Data3": -3689333212292646483, - "Data4": 2596005245494486339 + "Data1": -931689916486355979, + "Data2": 7052605733296554679 }, "Flags": 3, "Kind": 3, @@ -5296,10 +5116,8 @@ }, { "__Checksum": { - "Data1": -2312170607471079453, - "Data2": -1247924497700889607, - "Data3": 1185257195722234189, - "Data4": 4256808502715447703 + "Data1": 2508016513126333572, + "Data2": -4412426481065466728 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", @@ -5371,10 +5189,8 @@ }, { "__Checksum": { - "Data1": -8794796849312803632, - "Data2": -1163658095354856824, - "Data3": -307725195598382271, - "Data4": -6507884536742653853 + "Data1": 4401060932625923012, + "Data2": -3115664537867122066 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", @@ -5446,10 +5262,8 @@ }, { "__Checksum": { - "Data1": -4251685196901957127, - "Data2": -4123723115561447708, - "Data3": -1266058646955163157, - "Data4": -8191670329070908451 + "Data1": 4893608393684151368, + "Data2": 7247255103991087448 }, "Flags": 1, "Kind": 3, @@ -5472,10 +5286,8 @@ }, { "__Checksum": { - "Data1": 134709720164553489, - "Data2": -743560574020591932, - "Data3": -6195057519060912100, - "Data4": -81279624416649508 + "Data1": -5095043554270818909, + "Data2": -6113196799272469165 }, "Flags": 3, "Kind": 3, @@ -5498,10 +5310,8 @@ }, { "__Checksum": { - "Data1": -1749845923197916195, - "Data2": 508501511275690630, - "Data3": 3069970790180019694, - "Data4": 526456237997457669 + "Data1": 35326966433526912, + "Data2": 2456709477038557644 }, "Flags": 1, "Kind": 3, @@ -5540,10 +5350,8 @@ }, { "__Checksum": { - "Data1": 3555027092893349100, - "Data2": -8383322619674485755, - "Data3": -4822569674973831835, - "Data4": -632289520155282236 + "Data1": -6174702157399237511, + "Data2": 2154901292037686240 }, "Flags": 3, "Kind": 3, @@ -5582,10 +5390,8 @@ }, { "__Checksum": { - "Data1": 6897623579647992910, - "Data2": -3349493767528185140, - "Data3": -3442056731585750691, - "Data4": -3755315571009971182 + "Data1": -569838190382263201, + "Data2": -1130082640348689864 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", @@ -5742,10 +5548,8 @@ }, { "__Checksum": { - "Data1": 965148913458899846, - "Data2": 1783205232657012981, - "Data3": 334027341929712985, - "Data4": 8417496202572730098 + "Data1": -2409530692647299771, + "Data2": 2969336969960466013 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", @@ -5902,10 +5706,8 @@ }, { "__Checksum": { - "Data1": 4123139698346296553, - "Data2": -7346832158935654368, - "Data3": -5385567570855385916, - "Data4": 2510382193103946371 + "Data1": 8971518869784650973, + "Data2": 2758781384795083852 }, "Flags": 1, "Kind": 3, @@ -5944,10 +5746,8 @@ }, { "__Checksum": { - "Data1": -5300260007351452923, - "Data2": 2822842080574861089, - "Data3": 4077833142492363556, - "Data4": -724536696686197775 + "Data1": -9131022541668067060, + "Data2": 1404967748286691265 }, "Flags": 3, "Kind": 3, @@ -5986,10 +5786,8 @@ }, { "__Checksum": { - "Data1": 2750588074491037665, - "Data2": -4914913301748818664, - "Data3": 974773806481982846, - "Data4": -6142925231906394593 + "Data1": -4694049844594204378, + "Data2": -3517981146822377360 }, "Flags": 1, "Kind": 3, @@ -6028,10 +5826,8 @@ }, { "__Checksum": { - "Data1": 8369808075639429763, - "Data2": -5982530866819406650, - "Data3": -6555540140645078096, - "Data4": -7390140071660987877 + "Data1": -3477324260192132402, + "Data2": -4765405911869084686 }, "Flags": 3, "Kind": 3, @@ -6070,10 +5866,8 @@ }, { "__Checksum": { - "Data1": -4951710079166950206, - "Data2": 5822756182912359800, - "Data3": 6479738311328994151, - "Data4": 4743627570543507883 + "Data1": 3643583309377446796, + "Data2": -3815614980401766121 }, "Flags": 1, "Kind": 3, @@ -6112,10 +5906,8 @@ }, { "__Checksum": { - "Data1": 4456363850341656494, - "Data2": -8970759199492517543, - "Data3": -6514648254996980474, - "Data4": -5283854966093993036 + "Data1": 5137151342473710173, + "Data2": -6277109623848591195 }, "Flags": 3, "Kind": 3, @@ -6154,10 +5946,8 @@ }, { "__Checksum": { - "Data1": 6442596985623295615, - "Data2": -8758155732033467580, - "Data3": -1799116800173656963, - "Data4": 8358220090684188399 + "Data1": -4901795600343411526, + "Data2": 7833375506880185639 }, "Flags": 5, "Kind": 4, @@ -6255,10 +6045,8 @@ }, { "__Checksum": { - "Data1": 7357713610560366769, - "Data2": -2541076200177569426, - "Data3": -6259379755475019571, - "Data4": -2361496819793211110 + "Data1": 3228229827059843529, + "Data2": -5451110826238297291 }, "Flags": 5, "Kind": 4, @@ -6356,10 +6144,8 @@ }, { "__Checksum": { - "Data1": 4348682985664795635, - "Data2": 7454292815286163554, - "Data3": 915066830333812995, - "Data4": -14211680434964443 + "Data1": -4746661947067743744, + "Data2": 2832125953733708097 }, "Flags": 5, "Kind": 4, @@ -6457,10 +6243,8 @@ }, { "__Checksum": { - "Data1": 4565701286530876402, - "Data2": 8434470850653723189, - "Data3": -7906166322783008212, - "Data4": 3853962445382395440 + "Data1": 5860257438878601974, + "Data2": -7113979754600473816 }, "Flags": 5, "Kind": 4, @@ -6558,10 +6342,8 @@ }, { "__Checksum": { - "Data1": -7047854059270496120, - "Data2": 4440799891250646664, - "Data3": 2700719288329807470, - "Data4": -4201531673428371183 + "Data1": -4016285788661823572, + "Data2": -6362211464971703684 }, "Flags": 5, "Kind": 4, @@ -6659,10 +6441,8 @@ }, { "__Checksum": { - "Data1": 2671921859741262580, - "Data2": 78205006404842252, - "Data3": -8001642903914956828, - "Data4": -3484726797421117152 + "Data1": 5329396975995397948, + "Data2": 7215261105583698488 }, "Flags": 5, "Kind": 4, @@ -6760,10 +6540,8 @@ }, { "__Checksum": { - "Data1": -5925823988267930528, - "Data2": -4671098150387069029, - "Data3": 6016001733919481364, - "Data4": -621226201008185121 + "Data1": -1439527826414570225, + "Data2": -1460681506742658806 }, "Flags": 5, "Kind": 4, @@ -6861,10 +6639,8 @@ }, { "__Checksum": { - "Data1": 8093840550599337013, - "Data2": -8120100906893499094, - "Data3": -8857791865593458126, - "Data4": 7402457867965475040 + "Data1": 2282716087208774597, + "Data2": -4018091295292311664 }, "Flags": 5, "Kind": 4, @@ -6962,10 +6738,8 @@ }, { "__Checksum": { - "Data1": 8068426635599973556, - "Data2": 7575112244665947050, - "Data3": 274172997920110370, - "Data4": 6191299558665531711 + "Data1": -7230310292480493495, + "Data2": 2311160843507083431 }, "Flags": 5, "Kind": 4, @@ -7063,10 +6837,8 @@ }, { "__Checksum": { - "Data1": 7976161858806967545, - "Data2": -4358352868262883845, - "Data3": -6706235780465603701, - "Data4": 5468236797802138746 + "Data1": 7102071247401581390, + "Data2": 7302405453812267664 }, "Flags": 5, "Kind": 4, @@ -7164,10 +6936,8 @@ }, { "__Checksum": { - "Data1": 8344101087535981889, - "Data2": 6734664541979892418, - "Data3": 798555191014190233, - "Data4": 1268925305393105157 + "Data1": -7812909839331251106, + "Data2": -4376430170203276808 }, "Flags": 5, "Kind": 4, @@ -7265,10 +7035,8 @@ }, { "__Checksum": { - "Data1": 4226667840194940641, - "Data2": -7337499199013057869, - "Data3": -649439597310222364, - "Data4": -6737161111924751636 + "Data1": -2779630523264752808, + "Data2": -5459904189395512136 }, "Flags": 5, "Kind": 4, @@ -7366,10 +7134,8 @@ }, { "__Checksum": { - "Data1": 579803141054022746, - "Data2": 8075160135927879971, - "Data3": 4921355309732204143, - "Data4": 645562632838187505 + "Data1": 6729302036576874124, + "Data2": -8746776444323031295 }, "Flags": 5, "Kind": 4, @@ -7467,10 +7233,8 @@ }, { "__Checksum": { - "Data1": -6066664588443682712, - "Data2": -8867623960858612369, - "Data3": -1889368991223165760, - "Data4": 2920107278767561890 + "Data1": 8425397499121976690, + "Data2": 5634942009578915712 }, "Flags": 5, "Kind": 4, @@ -7568,10 +7332,8 @@ }, { "__Checksum": { - "Data1": 8139034440661483139, - "Data2": 8640225834827265153, - "Data3": 1108071153596841396, - "Data4": -2623463857158809622 + "Data1": 5633534749089118000, + "Data2": -1681187186149086381 }, "Flags": 5, "Kind": 4, @@ -7669,10 +7431,8 @@ }, { "__Checksum": { - "Data1": -4185994438010798203, - "Data2": -2339861670574575809, - "Data3": 9180859484269109158, - "Data4": 1663733722132074718 + "Data1": -1819030401047021200, + "Data2": -8043982831269089875 }, "Flags": 5, "Kind": 4, @@ -7770,10 +7530,8 @@ }, { "__Checksum": { - "Data1": -5343794843892554413, - "Data2": -8560379697433173443, - "Data3": -6559080555327611132, - "Data4": 7078108971999181490 + "Data1": 6666584595203201462, + "Data2": -533183852743860633 }, "Flags": 5, "Kind": 4, @@ -7871,10 +7629,8 @@ }, { "__Checksum": { - "Data1": -8938006281885297322, - "Data2": -7110964047785652501, - "Data3": -3129917814464184900, - "Data4": 3552543887332866475 + "Data1": 5018208241751799302, + "Data2": 6891858176526403389 }, "Flags": 5, "Kind": 4, @@ -7972,10 +7728,8 @@ }, { "__Checksum": { - "Data1": -7370909931528702155, - "Data2": -6533091605138259344, - "Data3": -6131909135983462149, - "Data4": -8366474410336038576 + "Data1": -4466209808196092543, + "Data2": -8517390699600572972 }, "Flags": 5, "Kind": 4, @@ -8073,10 +7827,8 @@ }, { "__Checksum": { - "Data1": 4366908351976944892, - "Data2": 7228530192837514965, - "Data3": 1334750702403640381, - "Data4": 7465972912409996749 + "Data1": -2533299238850707768, + "Data2": -6478287320877149588 }, "Flags": 5, "Kind": 4, @@ -8174,10 +7926,8 @@ }, { "__Checksum": { - "Data1": 6454068438614268589, - "Data2": -1932233423544723923, - "Data3": 730332999004070697, - "Data4": 3873463094522618293 + "Data1": 7910860184462870715, + "Data2": -749307425230839947 }, "Flags": 5, "Kind": 4, @@ -8275,10 +8025,8 @@ }, { "__Checksum": { - "Data1": 6617346144073252542, - "Data2": -3914213721834893589, - "Data3": 2954643589261777021, - "Data4": -5622391109201465617 + "Data1": -2045005354608378461, + "Data2": 1828001783924508721 }, "Flags": 5, "Kind": 4, @@ -8376,10 +8124,8 @@ }, { "__Checksum": { - "Data1": 5481761552618462603, - "Data2": -1660555888033264556, - "Data3": -8556140100057615493, - "Data4": 6855587221768659914 + "Data1": -702392753995870505, + "Data2": -2264262331664083538 }, "Flags": 5, "Kind": 4, @@ -8477,10 +8223,8 @@ }, { "__Checksum": { - "Data1": 30462123676731693, - "Data2": -7270902022667079013, - "Data3": 2794160027404390388, - "Data4": 7943431654365522856 + "Data1": 2757702048089695897, + "Data2": -7286884601878251255 }, "Flags": 5, "Kind": 4, @@ -8578,10 +8322,8 @@ }, { "__Checksum": { - "Data1": 3822225259754079052, - "Data2": 6600979083722208484, - "Data3": 2811867230002921696, - "Data4": -5977281891564676648 + "Data1": -2055819855381693015, + "Data2": -9005040171877836570 }, "Flags": 5, "Kind": 4, @@ -8679,10 +8421,8 @@ }, { "__Checksum": { - "Data1": 5341328065396407838, - "Data2": 7194448710348225459, - "Data3": 4485947891463728347, - "Data4": 9222927179548940741 + "Data1": -5582370035884330348, + "Data2": 5049660495452454095 }, "Flags": 5, "Kind": 4, @@ -8780,10 +8520,8 @@ }, { "__Checksum": { - "Data1": -1021071440094572203, - "Data2": 4692442239366044412, - "Data3": -3400241796688667207, - "Data4": 5730676513316371661 + "Data1": 6734579907795411394, + "Data2": -375691458832699251 }, "Flags": 5, "Kind": 4, @@ -8881,10 +8619,8 @@ }, { "__Checksum": { - "Data1": -1329278909085463011, - "Data2": -6285876867414352245, - "Data3": 1982168048898939756, - "Data4": -7947181385185546357 + "Data1": -1870674962003193690, + "Data2": -1211652329794247828 }, "Flags": 5, "Kind": 4, @@ -8982,10 +8718,8 @@ }, { "__Checksum": { - "Data1": 1358739260833818788, - "Data2": -4035700658384597410, - "Data3": -5139481840556563374, - "Data4": -8982296339924886442 + "Data1": -4206289927154628991, + "Data2": -2464077634093630134 }, "Flags": 5, "Kind": 4, @@ -9083,10 +8817,8 @@ }, { "__Checksum": { - "Data1": 720918172334986003, - "Data2": 1519615983698175760, - "Data3": -3518239596312361255, - "Data4": 3058363334485451289 + "Data1": 4035491724217289851, + "Data2": 3584770819956913357 }, "Flags": 5, "Kind": 4, @@ -9184,10 +8916,8 @@ }, { "__Checksum": { - "Data1": -1089608892609067463, - "Data2": 722228895904579192, - "Data3": 1806948199816803797, - "Data4": -780036581070809315 + "Data1": 2187002113964670846, + "Data2": -6737715288174239157 }, "Flags": 5, "Kind": 4, @@ -9285,10 +9015,8 @@ }, { "__Checksum": { - "Data1": -8353791768217611826, - "Data2": -3268910213806358488, - "Data3": -4556468829597852218, - "Data4": -70795082699606162 + "Data1": 2113442187417146352, + "Data2": 4614263358490471815 }, "Flags": 5, "Kind": 4, @@ -9386,10 +9114,8 @@ }, { "__Checksum": { - "Data1": 4629675740800963204, - "Data2": -8284607395432541287, - "Data3": -1223910061187788495, - "Data4": -5053990601876919964 + "Data1": -6746063881581183891, + "Data2": 3643842464326423559 }, "Flags": 5, "Kind": 4, @@ -9487,10 +9213,8 @@ }, { "__Checksum": { - "Data1": -3653211084274535451, - "Data2": 6447440550756373374, - "Data3": 4013484855738062386, - "Data4": 7776277374563554337 + "Data1": -9156481817802002624, + "Data2": 7853988747118500197 }, "Flags": 5, "Kind": 4, @@ -9588,10 +9312,8 @@ }, { "__Checksum": { - "Data1": 5779628562798383668, - "Data2": 4684382324708592349, - "Data3": 592048645904159870, - "Data4": 7026609108778355431 + "Data1": -7809508892447688228, + "Data2": 7736762784216852350 }, "Flags": 5, "Kind": 4, @@ -9689,10 +9411,8 @@ }, { "__Checksum": { - "Data1": 3863348798030072724, - "Data2": 5321812776408565170, - "Data3": 5963765359214704441, - "Data4": -7221642578155297654 + "Data1": 6421203457685063180, + "Data2": 5153103010564342429 }, "Flags": 5, "Kind": 4, @@ -9790,10 +9510,8 @@ }, { "__Checksum": { - "Data1": 2054267770945785122, - "Data2": -4211153835300702364, - "Data3": 3971013967397053421, - "Data4": 7265573801164562336 + "Data1": 4023375897286424800, + "Data2": 4059590905268112434 }, "Flags": 5, "Kind": 4, @@ -9891,10 +9609,8 @@ }, { "__Checksum": { - "Data1": 7780868389644421752, - "Data2": 8440957482832809377, - "Data3": 2104347768341200896, - "Data4": 855144259116775763 + "Data1": 2811658188094753831, + "Data2": 9210041680120133663 }, "Flags": 5, "Kind": 4, @@ -9992,10 +9708,8 @@ }, { "__Checksum": { - "Data1": -8789661627828909884, - "Data2": 7540738373833062207, - "Data3": 725384944564871593, - "Data4": -5155598588948275548 + "Data1": -56302601481808418, + "Data2": 5884909531684199580 }, "Flags": 5, "Kind": 4, @@ -10093,10 +9807,8 @@ }, { "__Checksum": { - "Data1": 3962550855224612806, - "Data2": 7748411800165110594, - "Data3": 2849728876275009930, - "Data4": -4754191254041248776 + "Data1": 8463534974547648194, + "Data2": 3904293997364822361 }, "Flags": 5, "Kind": 4, @@ -10194,10 +9906,8 @@ }, { "__Checksum": { - "Data1": -8580711467466116115, - "Data2": -6578157534913103182, - "Data3": 1538007285222953567, - "Data4": 3351007117975270655 + "Data1": 8539864678896303039, + "Data2": -1529749420030311477 }, "Flags": 5, "Kind": 4, @@ -10295,10 +10005,8 @@ }, { "__Checksum": { - "Data1": -1746468424594889597, - "Data2": 1349980794556158085, - "Data3": -7409408126103331437, - "Data4": 2863375884064563813 + "Data1": 988611414133406401, + "Data2": 2240525536934543160 }, "Flags": 5, "Kind": 4, @@ -10396,10 +10104,8 @@ }, { "__Checksum": { - "Data1": 2139423826763604204, - "Data2": -4607667456705569636, - "Data3": 5335068056236896463, - "Data4": 6105203112933064906 + "Data1": -1411946501348142281, + "Data2": 4597340183593052206 }, "Flags": 5, "Kind": 4, @@ -10497,10 +10203,8 @@ }, { "__Checksum": { - "Data1": -5703666014157534600, - "Data2": 3628125978420718532, - "Data3": -4567513449331530735, - "Data4": 302793633031341824 + "Data1": 6450435270449183886, + "Data2": 3005881458330076301 }, "Flags": 5, "Kind": 4, @@ -10598,10 +10302,8 @@ }, { "__Checksum": { - "Data1": 1744051083797696685, - "Data2": 2007019530463223247, - "Data3": -5143124544057932022, - "Data4": -5537455830128031076 + "Data1": -3334346261402251954, + "Data2": 4519604714279441493 }, "Flags": 5, "Kind": 4, @@ -10699,10 +10401,8 @@ }, { "__Checksum": { - "Data1": 4766149430428447012, - "Data2": 6232105082782460345, - "Data3": 968499277886257178, - "Data4": -549289692114900400 + "Data1": -64629481884934504, + "Data2": 8520631876677443438 }, "Flags": 5, "Kind": 4, @@ -10800,10 +10500,8 @@ }, { "__Checksum": { - "Data1": -3369976433174161798, - "Data2": 2246084962122221781, - "Data3": 84647650191043130, - "Data4": -436070590192598356 + "Data1": 7286268472346450045, + "Data2": -2441844866477765735 }, "Flags": 5, "Kind": 4, @@ -10901,10 +10599,8 @@ }, { "__Checksum": { - "Data1": -3609106657972416148, - "Data2": -2836977041674635221, - "Data3": 2379532596739396461, - "Data4": 366244263682976671 + "Data1": 1864328502047062529, + "Data2": 8105270061648131265 }, "Flags": 5, "Kind": 4, @@ -11002,10 +10698,8 @@ }, { "__Checksum": { - "Data1": -3430509634844208188, - "Data2": -1453429586116177226, - "Data3": -1451519009793529183, - "Data4": 5139074362423295786 + "Data1": -6272413156862106805, + "Data2": 3227971818586227359 }, "Flags": 5, "Kind": 4, @@ -11103,10 +10797,8 @@ }, { "__Checksum": { - "Data1": -7424229497794634145, - "Data2": 9194348720783026846, - "Data3": -8126771500528132617, - "Data4": -4906637585128413921 + "Data1": 3315832444216705179, + "Data2": 3724370212366058568 }, "Flags": 5, "Kind": 4, @@ -11204,10 +10896,8 @@ }, { "__Checksum": { - "Data1": -2452361875971853921, - "Data2": 1158437626976135113, - "Data3": -5521859850580262391, - "Data4": 230731955134506799 + "Data1": 2518791231304910311, + "Data2": 7105158076379682199 }, "Flags": 5, "Kind": 4, @@ -11305,10 +10995,8 @@ }, { "__Checksum": { - "Data1": 7703858523607768311, - "Data2": -9096483495310701687, - "Data3": 1488134476170654421, - "Data4": 2036324809990247995 + "Data1": 2508361083765992682, + "Data2": -4565982926563238338 }, "Flags": 5, "Kind": 4, @@ -11406,10 +11094,8 @@ }, { "__Checksum": { - "Data1": -7550336887997977840, - "Data2": -3881402460043660008, - "Data3": -3315045093367678314, - "Data4": 7894604137923486793 + "Data1": 3606365890850459076, + "Data2": 4494205998638774013 }, "Flags": 5, "Kind": 4, @@ -11507,10 +11193,8 @@ }, { "__Checksum": { - "Data1": -5058964306243853584, - "Data2": 6933092591744244510, - "Data3": -3139296352905935550, - "Data4": -3032736429063214355 + "Data1": -5461748835941697212, + "Data2": -5988168764195769571 }, "Flags": 5, "Kind": 4, @@ -11608,10 +11292,8 @@ }, { "__Checksum": { - "Data1": -3129364064576830115, - "Data2": 2104511400991904298, - "Data3": 1488282595125852563, - "Data4": -8782229450786916225 + "Data1": 3175507590079145101, + "Data2": 982435079821607325 }, "Flags": 5, "Kind": 4, @@ -11709,10 +11391,8 @@ }, { "__Checksum": { - "Data1": 8514767228735950986, - "Data2": 48524432140885671, - "Data3": -3144235257540162096, - "Data4": 3677266619412530375 + "Data1": -1664073311958579160, + "Data2": -2845913207904786538 }, "Flags": 5, "Kind": 4, @@ -11810,10 +11490,8 @@ }, { "__Checksum": { - "Data1": 4094477761572464737, - "Data2": -6382718740404396778, - "Data3": -1963450817555852422, - "Data4": -8568384580801099934 + "Data1": -7279306295188827229, + "Data2": -8108201258463575855 }, "Flags": 5, "Kind": 4, @@ -11911,10 +11589,8 @@ }, { "__Checksum": { - "Data1": -4066620052608546381, - "Data2": 3314054997768015706, - "Data3": -2548416033384416225, - "Data4": 5432449595615205949 + "Data1": -5066023834612009949, + "Data2": -3136424341288518598 }, "Flags": 5, "Kind": 4, @@ -12012,10 +11688,8 @@ }, { "__Checksum": { - "Data1": 5295482654870022528, - "Data2": -3650566035311225628, - "Data3": 5607066195946123339, - "Data4": -4462463665785036847 + "Data1": -5877769434453459995, + "Data2": -7787298244067751298 }, "Flags": 5, "Kind": 4, @@ -12113,10 +11787,8 @@ }, { "__Checksum": { - "Data1": 7423399680568052692, - "Data2": 5297352485603892672, - "Data3": -542338961600919594, - "Data4": -8479056169427304132 + "Data1": 1141899914344112620, + "Data2": 2338054354294405123 }, "Flags": 5, "Kind": 4, @@ -12214,10 +11886,8 @@ }, { "__Checksum": { - "Data1": -2040864249560837896, - "Data2": -7134686391348297590, - "Data3": 7050280374567222666, - "Data4": 5174834065771900271 + "Data1": 5280044030228095501, + "Data2": 7443953975959055360 }, "Flags": 5, "Kind": 4, @@ -12315,10 +11985,8 @@ }, { "__Checksum": { - "Data1": 511475388554011291, - "Data2": -668421176054711968, - "Data3": 842004359130922105, - "Data4": -5376726946319068681 + "Data1": -8743591976428431816, + "Data2": -6220275094625959259 }, "Flags": 5, "Kind": 4, @@ -12416,10 +12084,8 @@ }, { "__Checksum": { - "Data1": 5044378892066112672, - "Data2": 1729676385378958233, - "Data3": 7238943626946691819, - "Data4": 5111286766339779678 + "Data1": -1281723622838257220, + "Data2": -6022345013312785647 }, "Flags": 5, "Kind": 4, @@ -12517,10 +12183,8 @@ }, { "__Checksum": { - "Data1": -9006957563405114687, - "Data2": 1877874376899603019, - "Data3": -7195640247851173431, - "Data4": 5350095556257650260 + "Data1": 8952482313679459850, + "Data2": -8397859043508880339 }, "Flags": 5, "Kind": 4, @@ -12618,10 +12282,8 @@ }, { "__Checksum": { - "Data1": 8714713055182366883, - "Data2": 3918353297568394685, - "Data3": -5884554283081161354, - "Data4": -7294809679891941470 + "Data1": 1925601974224695689, + "Data2": -3711610617007021320 }, "Flags": 5, "Kind": 4, @@ -12719,10 +12381,8 @@ }, { "__Checksum": { - "Data1": -2566376084502795704, - "Data2": 5929343355189381831, - "Data3": -4599107905192022557, - "Data4": 164879100742615383 + "Data1": -8787948240307889369, + "Data2": 4693754772985155446 }, "Flags": 5, "Kind": 4, @@ -12820,10 +12480,8 @@ }, { "__Checksum": { - "Data1": -2396694587537260781, - "Data2": 8531111065956137769, - "Data3": -6131164549983283492, - "Data4": -7668038010154095748 + "Data1": -6387404133288944312, + "Data2": -1419393820064887449 }, "Flags": 5, "Kind": 4, @@ -12921,10 +12579,8 @@ }, { "__Checksum": { - "Data1": 59547025245104515, - "Data2": 8815148451919017776, - "Data3": 8438341047439695458, - "Data4": 5966440587717502913 + "Data1": -2480641417358472540, + "Data2": 2585322252315469989 }, "Flags": 5, "Kind": 4, @@ -13022,10 +12678,8 @@ }, { "__Checksum": { - "Data1": -4315976109508793632, - "Data2": -7288591629823562242, - "Data3": -7326816754560727461, - "Data4": 8988956521685040708 + "Data1": 6315505078895481899, + "Data2": 7117004558964915310 }, "Flags": 5, "Kind": 4, @@ -13123,10 +12777,8 @@ }, { "__Checksum": { - "Data1": -2069695296566471063, - "Data2": 4234549822948706195, - "Data3": 4447140006853761857, - "Data4": -1679092435805393782 + "Data1": -6685346108550908976, + "Data2": -1321788107507403576 }, "Flags": 5, "Kind": 4, @@ -13224,10 +12876,8 @@ }, { "__Checksum": { - "Data1": 7915073505832433950, - "Data2": 3536623701585597510, - "Data3": 4026429836787089705, - "Data4": -9103626333025540657 + "Data1": 5358460964165483005, + "Data2": 8299152887137595586 }, "Flags": 5, "Kind": 4, @@ -13325,10 +12975,8 @@ }, { "__Checksum": { - "Data1": 1224467651208650393, - "Data2": 8622877678971671711, - "Data3": -4089642782292467571, - "Data4": 8482479219713050062 + "Data1": 7775643746932725589, + "Data2": 1392883185336064728 }, "Flags": 5, "Kind": 4, @@ -13426,10 +13074,8 @@ }, { "__Checksum": { - "Data1": -4598303873192171532, - "Data2": -7838101605085008382, - "Data3": -5075450097138815829, - "Data4": -2954598859591783513 + "Data1": 768334052538123035, + "Data2": 320769454992901535 }, "Flags": 5, "Kind": 4, @@ -13527,10 +13173,8 @@ }, { "__Checksum": { - "Data1": -1540261735980052978, - "Data2": -9147956405661129836, - "Data3": -3616753714336438880, - "Data4": -630636648070150035 + "Data1": -3336760423546984242, + "Data2": -9194394427987756266 }, "Flags": 5, "Kind": 4, @@ -13628,10 +13272,8 @@ }, { "__Checksum": { - "Data1": -1782457299723888950, - "Data2": -7911177165840435108, - "Data3": -4340620100575106125, - "Data4": -4569229334554808420 + "Data1": -6807445774947076238, + "Data2": 3572748691312902886 }, "Flags": 5, "Kind": 4, @@ -13729,10 +13371,8 @@ }, { "__Checksum": { - "Data1": 6935887840393238911, - "Data2": 7013660388232414584, - "Data3": -1840901162040040911, - "Data4": -9127487483550433196 + "Data1": 2630845707094734711, + "Data2": -6452227201219639221 }, "Flags": 5, "Kind": 4, @@ -13830,10 +13470,8 @@ }, { "__Checksum": { - "Data1": 7034106118771929932, - "Data2": 3416667845952526735, - "Data3": 2980703467543628968, - "Data4": 8669330822860437413 + "Data1": -3082530260472701123, + "Data2": 8110662920478504505 }, "Flags": 5, "Kind": 4, @@ -13931,10 +13569,8 @@ }, { "__Checksum": { - "Data1": 600136993399585236, - "Data2": 1210877284947336046, - "Data3": -6449401044271821484, - "Data4": 1191511072431749116 + "Data1": 76549488304141629, + "Data2": 5933742443864533003 }, "Flags": 5, "Kind": 4, @@ -14032,10 +13668,8 @@ }, { "__Checksum": { - "Data1": -5573498153060579347, - "Data2": 8135370288187279748, - "Data3": -7113249105414572028, - "Data4": 2999421975961564546 + "Data1": 1230321638138191175, + "Data2": -8547618842017047312 }, "Flags": 5, "Kind": 4, @@ -14133,10 +13767,8 @@ }, { "__Checksum": { - "Data1": -4329051355715303605, - "Data2": 3955623575332919892, - "Data3": 6259774984846526464, - "Data4": -6800312027906067779 + "Data1": 8758288142973023616, + "Data2": -6353163368202708457 }, "Flags": 5, "Kind": 4, @@ -14234,10 +13866,8 @@ }, { "__Checksum": { - "Data1": 3992765514368773227, - "Data2": 712641669578973168, - "Data3": -3329211757490121545, - "Data4": 5962150082167093768 + "Data1": 126534683665358926, + "Data2": 201123528824816726 }, "Flags": 5, "Kind": 4, @@ -14335,10 +13965,8 @@ }, { "__Checksum": { - "Data1": 6714896013107681460, - "Data2": 7349248810078908157, - "Data3": 6259978925659348456, - "Data4": 8452156780865621248 + "Data1": -8762410813253593460, + "Data2": -3752370453060490260 }, "Flags": 5, "Kind": 4, @@ -14436,10 +14064,8 @@ }, { "__Checksum": { - "Data1": -8129753027300106065, - "Data2": 6803101048313929096, - "Data3": 2064429817254476022, - "Data4": -4031117533659337171 + "Data1": -982680018511413294, + "Data2": 2878983291702196905 }, "Flags": 5, "Kind": 4, @@ -14537,10 +14163,8 @@ }, { "__Checksum": { - "Data1": 1705196438689950506, - "Data2": 6582715361547788785, - "Data3": -4267350945778366115, - "Data4": 290601703112511537 + "Data1": 3590610975909435635, + "Data2": 4923743178350068476 }, "Flags": 5, "Kind": 4, @@ -14638,10 +14262,8 @@ }, { "__Checksum": { - "Data1": 6281433957991871957, - "Data2": -3213098429910391320, - "Data3": -7596133238842809641, - "Data4": 3463158101645518394 + "Data1": 5895572044455372317, + "Data2": -655559570194815600 }, "Flags": 5, "Kind": 4, @@ -14739,10 +14361,8 @@ }, { "__Checksum": { - "Data1": 2953345159606607792, - "Data2": -9105905134951745728, - "Data3": 4913029939639537940, - "Data4": 651176735460662163 + "Data1": 5735646289499511577, + "Data2": -4751846977832473690 }, "Flags": 5, "Kind": 4, @@ -14840,10 +14460,8 @@ }, { "__Checksum": { - "Data1": 2808495366912459532, - "Data2": 831933088497009102, - "Data3": 2210262347409378146, - "Data4": -7982165846050342605 + "Data1": -497823139067436785, + "Data2": 2338085920219026941 }, "Flags": 5, "Kind": 4, @@ -14941,10 +14559,8 @@ }, { "__Checksum": { - "Data1": -3238977062072772602, - "Data2": -8011372546635066226, - "Data3": -6206629709863800231, - "Data4": 3746054792319783403 + "Data1": -3930994529060056906, + "Data2": -5365271980323109943 }, "Flags": 5, "Kind": 4, @@ -15042,10 +14658,8 @@ }, { "__Checksum": { - "Data1": 8969920576165328943, - "Data2": -1112478264648760277, - "Data3": -2964159706602096502, - "Data4": 3277746102478860778 + "Data1": 325267014829487523, + "Data2": 2399850168392193179 }, "Flags": 5, "Kind": 4, @@ -15143,10 +14757,8 @@ }, { "__Checksum": { - "Data1": 7144937928133876024, - "Data2": -1967630456896294674, - "Data3": 7319663861393549842, - "Data4": 3635841637750737264 + "Data1": 1318869102094899459, + "Data2": -3793938845246552046 }, "Flags": 5, "Kind": 4, @@ -15244,10 +14856,8 @@ }, { "__Checksum": { - "Data1": -4511640894374702585, - "Data2": -202618793419057199, - "Data3": 8576468811585038931, - "Data4": 1204929980706507397 + "Data1": -3903046262960765723, + "Data2": -8437830507529713506 }, "Flags": 5, "Kind": 4, @@ -15345,10 +14955,8 @@ }, { "__Checksum": { - "Data1": 4660596162376775820, - "Data2": 4716473584448363268, - "Data3": 275952968705596907, - "Data4": -8623223615071202054 + "Data1": 1183786382875382798, + "Data2": 7848296092779037948 }, "Flags": 5, "Kind": 4, @@ -15446,10 +15054,8 @@ }, { "__Checksum": { - "Data1": -2490655987380912642, - "Data2": -4228065942301793822, - "Data3": -6055975435523410928, - "Data4": 406281525535892535 + "Data1": -1857232882165059864, + "Data2": -7063420490778249664 }, "Flags": 5, "Kind": 4, @@ -15547,10 +15153,8 @@ }, { "__Checksum": { - "Data1": -6176134446642694781, - "Data2": -8311691887658401280, - "Data3": 6293411010203555615, - "Data4": -8198125727126654490 + "Data1": 3883439516944597872, + "Data2": -2377805633189949861 }, "Flags": 5, "Kind": 4, @@ -15648,10 +15252,8 @@ }, { "__Checksum": { - "Data1": -1215862770330822117, - "Data2": 643018294232852998, - "Data3": -5652820682740396707, - "Data4": 3978619022053042851 + "Data1": -2118173896714999838, + "Data2": -3937578255655661675 }, "Flags": 5, "Kind": 8, @@ -15685,10 +15287,8 @@ }, { "__Checksum": { - "Data1": 7111257143471345004, - "Data2": -7368005426060992817, - "Data3": 8561403286818612234, - "Data4": 1155203437705440457 + "Data1": 6270467077199519879, + "Data2": 5436433919870108061 }, "Flags": 0, "Kind": 0, @@ -15770,10 +15370,8 @@ }, { "__Checksum": { - "Data1": -5202317581874141306, - "Data2": 7153719770723570118, - "Data3": -192280685818111630, - "Data4": -2871866187828849306 + "Data1": -5333220865028037292, + "Data2": 4187095657921170928 }, "Flags": 0, "Kind": 0, @@ -15803,10 +15401,8 @@ }, { "__Checksum": { - "Data1": 800145779148602690, - "Data2": -5519044733477542678, - "Data3": 3396797777611803766, - "Data4": 8155749636680384167 + "Data1": -195535995045211750, + "Data2": 4286730414041409569 }, "Flags": 0, "Kind": 0, @@ -15886,10 +15482,8 @@ }, { "__Checksum": { - "Data1": 8802937607804745674, - "Data2": 3510748622487356340, - "Data3": 8910466736838084068, - "Data4": -9214632590428027095 + "Data1": 5520854580336914339, + "Data2": -5487605090297695415 }, "Flags": 0, "Kind": 0, @@ -15964,10 +15558,8 @@ }, { "__Checksum": { - "Data1": -321430033406151831, - "Data2": 3854704093735503243, - "Data3": -7244292898294173765, - "Data4": 6426755274474175780 + "Data1": 7756696850093331139, + "Data2": -2428860665210870998 }, "Flags": 0, "Kind": 0, @@ -15997,10 +15589,8 @@ }, { "__Checksum": { - "Data1": 6222689879552679472, - "Data2": -6609422787227356830, - "Data3": -6067222566413183790, - "Data4": -7368323585199767494 + "Data1": 2629346708968669875, + "Data2": -2823582289670200573 }, "Flags": 0, "Kind": 0, @@ -16087,10 +15677,8 @@ }, { "__Checksum": { - "Data1": 13404850317431428, - "Data2": -3147748115280410806, - "Data3": -7566569171144864365, - "Data4": -8195840533837672018 + "Data1": -3242788691228023760, + "Data2": -1635270236015363021 }, "Flags": 0, "Kind": 0, @@ -16137,10 +15725,8 @@ }, { "__Checksum": { - "Data1": -2811856340009938182, - "Data2": 6384557261860365945, - "Data3": -5532977556231447595, - "Data4": 3549094012977503992 + "Data1": -6852729901914527739, + "Data2": 3270872555568006050 }, "Flags": 0, "Kind": 0, @@ -16170,10 +15756,8 @@ }, { "__Checksum": { - "Data1": 1933358610641671538, - "Data2": 5156401549053863096, - "Data3": 1918600565505302852, - "Data4": -787127714608661327 + "Data1": 2553559218468959463, + "Data2": 1503382618557205338 }, "Flags": 0, "Kind": 0, @@ -16227,10 +15811,8 @@ }, { "__Checksum": { - "Data1": 6186204511038121772, - "Data2": 5436037003485061458, - "Data3": -7325583263495126408, - "Data4": -3879585461794459330 + "Data1": 5910033445404538263, + "Data2": -2646730301798744319 }, "Flags": 0, "Kind": 0, @@ -16284,10 +15866,8 @@ }, { "__Checksum": { - "Data1": -6881181760690369304, - "Data2": -6723546205903919585, - "Data3": -2871668405074924365, - "Data4": -6595201330771037701 + "Data1": 10789589190507960, + "Data2": 7998225417953104157 }, "Flags": 0, "Kind": 0, @@ -16346,10 +15926,8 @@ }, { "__Checksum": { - "Data1": 268770953137608595, - "Data2": -7425651345797325116, - "Data3": -1258262681205172023, - "Data4": -2027082796881988317 + "Data1": 4275755887006437688, + "Data2": 3087965641086496630 }, "Flags": 0, "Kind": 0, @@ -16403,10 +15981,8 @@ }, { "__Checksum": { - "Data1": -8559160646337436616, - "Data2": 6328308714299132131, - "Data3": -3404551828655607631, - "Data4": 7772661860957787963 + "Data1": -7578671169645125385, + "Data2": 7742435022418562012 }, "Flags": 0, "Kind": 0, @@ -16460,10 +16036,8 @@ }, { "__Checksum": { - "Data1": 218100508814205090, - "Data2": 4707395721846489908, - "Data3": -1687092962580828916, - "Data4": 6992027604292993043 + "Data1": 5395770361097373511, + "Data2": 8865803058132394620 }, "Flags": 0, "Kind": 0, @@ -16517,10 +16091,8 @@ }, { "__Checksum": { - "Data1": -3887391553969973481, - "Data2": 5875438449707953287, - "Data3": 8715626038667973161, - "Data4": -2473201514447975534 + "Data1": 2336288128016282517, + "Data2": -1099123486509055069 }, "Flags": 0, "Kind": 0, @@ -16633,10 +16205,8 @@ }, { "__Checksum": { - "Data1": 1223075032570478283, - "Data2": 7985785809181034943, - "Data3": -725278812362600683, - "Data4": 909636113806676442 + "Data1": 3788663177289060764, + "Data2": 5832533073800337166 }, "Flags": 0, "Kind": 0, @@ -16690,10 +16260,8 @@ }, { "__Checksum": { - "Data1": -4457980582830921680, - "Data2": 4605128451757153176, - "Data3": 6323727449796091399, - "Data4": -110328916864396903 + "Data1": 5233493467131027895, + "Data2": 3653153209739206505 }, "Flags": 0, "Kind": 0, @@ -16747,10 +16315,8 @@ }, { "__Checksum": { - "Data1": -6522390343000837926, - "Data2": 7243153741614358032, - "Data3": -6316480788470983115, - "Data4": -6294935332895219954 + "Data1": -3620356997498272707, + "Data2": -4366927537049222448 }, "Flags": 0, "Kind": 0, @@ -16870,10 +16436,8 @@ }, { "__Checksum": { - "Data1": -7898139362512157618, - "Data2": 8244124631498224310, - "Data3": -333293058558666410, - "Data4": -3885524811232885873 + "Data1": -5783904617173450666, + "Data2": -9042329930025954222 }, "Flags": 0, "Kind": 0, @@ -17012,10 +16576,8 @@ }, { "__Checksum": { - "Data1": -5320367338475888969, - "Data2": -1627200452751741625, - "Data3": 4350905429646023472, - "Data4": -702129066726913504 + "Data1": 7364554597664108736, + "Data2": -5271379892142990168 }, "Flags": 0, "Kind": 0, @@ -17066,10 +16628,8 @@ }, { "__Checksum": { - "Data1": -7225731527971490381, - "Data2": -8525934964373994166, - "Data3": 2396527598494756308, - "Data4": 5239696375364710759 + "Data1": 4043158308720128035, + "Data2": 6234755872259425917 }, "Flags": 0, "Kind": 0, @@ -17116,10 +16676,8 @@ }, { "__Checksum": { - "Data1": 9157070855638627739, - "Data2": 2608206762232255482, - "Data3": 8939926568152312749, - "Data4": -3696547507422135350 + "Data1": -3233888748415756697, + "Data2": -2713850309973974875 }, "Flags": 0, "Kind": 0, @@ -17165,10 +16723,8 @@ }, { "__Checksum": { - "Data1": -3034588467567658249, - "Data2": -2764781644304958455, - "Data3": -1822273843097190371, - "Data4": -7353036640693475975 + "Data1": 7382754467299210202, + "Data2": 5903754543506572040 }, "Flags": 0, "Kind": 0, @@ -17263,10 +16819,8 @@ }, { "__Checksum": { - "Data1": -6212444251185450303, - "Data2": 6968614902014737847, - "Data3": 7792465343350850062, - "Data4": -1285414274430335056 + "Data1": 3593764775405513595, + "Data2": 8546138191138881112 }, "Flags": 0, "Kind": 0, @@ -17720,10 +17274,8 @@ }, { "__Checksum": { - "Data1": 6273444526279011736, - "Data2": -4548218127565157028, - "Data3": 7251088026410311986, - "Data4": 8904793659947262666 + "Data1": 3744304902684769131, + "Data2": 371537428611130071 }, "Flags": 0, "Kind": 0, @@ -17783,10 +17335,8 @@ }, { "__Checksum": { - "Data1": 5924604446885100544, - "Data2": 1716144632390678480, - "Data3": 5308111035918994922, - "Data4": 3998629358820207942 + "Data1": -3485935424555942306, + "Data2": 8796210904389244069 }, "Flags": 0, "Kind": 0, @@ -17924,10 +17474,8 @@ }, { "__Checksum": { - "Data1": -4853465430742037137, - "Data2": 6275749454847279743, - "Data3": 6434541506454993817, - "Data4": -1786946992905682432 + "Data1": -1332838943410657516, + "Data2": 5114908613674645966 }, "Flags": 0, "Kind": 0, @@ -18084,10 +17632,8 @@ }, { "__Checksum": { - "Data1": 4870467189018129497, - "Data2": 4781129063476417760, - "Data3": 2479356082350666956, - "Data4": 8711737039434484411 + "Data1": -5089267758009700289, + "Data2": 2442389771089049457 }, "Flags": 0, "Kind": 0, @@ -18134,10 +17680,8 @@ }, { "__Checksum": { - "Data1": 5581238020677498050, - "Data2": 6994084782641780089, - "Data3": 9048925667853730768, - "Data4": 3055241233733542122 + "Data1": -8369865712850384346, + "Data2": -3895122275825236596 }, "Flags": 0, "Kind": 0, @@ -18191,10 +17735,8 @@ }, { "__Checksum": { - "Data1": 8621211613522046809, - "Data2": -2779130344706104544, - "Data3": -8000885105050412337, - "Data4": 5790582114498891408 + "Data1": -7449216875981970817, + "Data2": -2296789638976302848 }, "Flags": 0, "Kind": 0, @@ -18319,10 +17861,8 @@ }, { "__Checksum": { - "Data1": 711901316677234202, - "Data2": 638459636323503151, - "Data3": 4537801910510622667, - "Data4": 7067183938978855876 + "Data1": 4283915737581180713, + "Data2": 8133129207726611322 }, "Flags": 0, "Kind": 0, @@ -18376,10 +17916,8 @@ }, { "__Checksum": { - "Data1": -1633022390707593310, - "Data2": 7185697464429773083, - "Data3": -4761408131528371400, - "Data4": 821091753501252125 + "Data1": 3881040700292602473, + "Data2": 6672623084129762296 }, "Flags": 0, "Kind": 0, @@ -18433,10 +17971,8 @@ }, { "__Checksum": { - "Data1": 6219014754306899515, - "Data2": -5103008498276210763, - "Data3": -5092158933856892653, - "Data4": 3529070139671510282 + "Data1": 8085138338635262988, + "Data2": -4981801590797023291 }, "Flags": 0, "Kind": 0, @@ -18560,10 +18096,8 @@ }, { "__Checksum": { - "Data1": 3673530515098912541, - "Data2": -448772150118781098, - "Data3": -1561076410203969649, - "Data4": 2390562608299979211 + "Data1": -8742932095581510073, + "Data2": 6572810591982313833 }, "Flags": 0, "Kind": 0, @@ -18593,10 +18127,8 @@ }, { "__Checksum": { - "Data1": -4626122554884254615, - "Data2": 3225481705702236422, - "Data3": 2034415947687817435, - "Data4": 1293921963591524464 + "Data1": 5003705107002649602, + "Data2": -3639117663262742864 }, "Flags": 0, "Kind": 0, @@ -18732,10 +18264,8 @@ }, { "__Checksum": { - "Data1": 152629735917237927, - "Data2": 2344514189352337112, - "Data3": 8052418113521476256, - "Data4": 935127514295283178 + "Data1": 2832263097256609185, + "Data2": -7158399789813840947 }, "Flags": 0, "Kind": 0, @@ -18824,10 +18354,8 @@ }, { "__Checksum": { - "Data1": 2181236722705079762, - "Data2": 7040012114089229151, - "Data3": -5711251196166596533, - "Data4": -7852793728535162170 + "Data1": -4457808114110304066, + "Data2": 6072963520292266150 }, "Flags": 0, "Kind": 0, @@ -18857,10 +18385,8 @@ }, { "__Checksum": { - "Data1": 1267757490609121516, - "Data2": -6634705929177991217, - "Data3": 9030824630870977144, - "Data4": 7891935294136308133 + "Data1": 7846512540775151055, + "Data2": -1720249495523466737 }, "Flags": 0, "Kind": 0, @@ -18893,10 +18419,8 @@ }, { "__Checksum": { - "Data1": 5274745441488702153, - "Data2": -147650005996684419, - "Data3": -7684094553803921069, - "Data4": 1570456728090188405 + "Data1": -7303945012410171566, + "Data2": -4566587783305935057 }, "Flags": 0, "Kind": 0, @@ -19030,10 +18554,8 @@ }, { "__Checksum": { - "Data1": -5364899641504460655, - "Data2": 4764317890266507149, - "Data3": 6721203681913965720, - "Data4": -1531886761392823782 + "Data1": -2066586671456843125, + "Data2": 2028049228600157861 }, "Flags": 0, "Kind": 0, @@ -19171,10 +18693,8 @@ }, { "__Checksum": { - "Data1": 5577165608097679256, - "Data2": 6911845832102902686, - "Data3": -4417131476212384460, - "Data4": 2374988073933342349 + "Data1": -5979020171185944874, + "Data2": 8499565838180598747 }, "Flags": 0, "Kind": 0, @@ -19304,10 +18824,8 @@ }, { "__Checksum": { - "Data1": 5646450225209122364, - "Data2": -2795351989738218313, - "Data3": 3641129799102725501, - "Data4": 7417278630720646392 + "Data1": -5161560935417216372, + "Data2": 4787839166437078461 }, "Flags": 0, "Kind": 0, @@ -19445,10 +18963,8 @@ }, { "__Checksum": { - "Data1": -9140565232962298136, - "Data2": -3448334486613222290, - "Data3": 1602707603562462806, - "Data4": 2125730322623527492 + "Data1": -2578102511954748589, + "Data2": 290978375392882188 }, "Flags": 0, "Kind": 0, @@ -19532,10 +19048,8 @@ }, { "__Checksum": { - "Data1": -4952844906423203115, - "Data2": -4807637235587121384, - "Data3": 227720720305710389, - "Data4": 2607638774025325035 + "Data1": 5540887050848239871, + "Data2": 6891669521697531361 }, "Flags": 0, "Kind": 0, @@ -19565,10 +19079,8 @@ }, { "__Checksum": { - "Data1": 6024546322894904447, - "Data2": -8481740356688878725, - "Data3": -6620809497539773118, - "Data4": 8845605702165764449 + "Data1": -1444900290438270250, + "Data2": -2936043647167618020 }, "Flags": 0, "Kind": 0, @@ -19656,10 +19168,8 @@ }, { "__Checksum": { - "Data1": -7646814193378765886, - "Data2": -9191192861078758120, - "Data3": -4920497920516093865, - "Data4": 1804423561022950619 + "Data1": -2085353458980109880, + "Data2": -3338947499350416525 }, "Flags": 0, "Kind": 0, @@ -19718,10 +19228,8 @@ }, { "__Checksum": { - "Data1": -7566264095730061905, - "Data2": -6990254044301208120, - "Data3": 2836315077509033568, - "Data4": 612545240091128016 + "Data1": 7304896722013752440, + "Data2": -4299361158739693835 }, "Flags": 0, "Kind": 0, @@ -19768,10 +19276,8 @@ }, { "__Checksum": { - "Data1": 647459563645317206, - "Data2": 3254465148168218438, - "Data3": 5320322154250841306, - "Data4": 8951496602957750052 + "Data1": -628126597364668328, + "Data2": -1854819843195063813 }, "Flags": 0, "Kind": 0, @@ -19825,10 +19331,8 @@ }, { "__Checksum": { - "Data1": -9119629949993490240, - "Data2": -3659335129706878281, - "Data3": 6538803913390179205, - "Data4": 1090861479121084014 + "Data1": 8931709779894519918, + "Data2": 7527916603367299649 }, "Flags": 0, "Kind": 0, @@ -19875,10 +19379,8 @@ }, { "__Checksum": { - "Data1": -6500020958537915302, - "Data2": 3606692933451190253, - "Data3": -6020637620918481362, - "Data4": 7946980568323211729 + "Data1": 8839085297513637177, + "Data2": 5054888731807304886 }, "Flags": 0, "Kind": 0, @@ -20068,10 +19570,8 @@ }, { "__Checksum": { - "Data1": 4224542196797236940, - "Data2": -3919879895378786400, - "Data3": 7193629402584298102, - "Data4": -4727790656753752554 + "Data1": 3345811476273544479, + "Data2": 8477379610652048586 }, "Flags": 0, "Kind": 0, @@ -20161,10 +19661,8 @@ }, { "__Checksum": { - "Data1": -1758408328236062316, - "Data2": -486419675528812468, - "Data3": -7737697237251570400, - "Data4": 8597540217923103759 + "Data1": 4869643752850211590, + "Data2": -7917642543766378222 }, "Flags": 0, "Kind": 0, @@ -20246,10 +19744,8 @@ }, { "__Checksum": { - "Data1": -6617037737461879868, - "Data2": -2113560975375483172, - "Data3": 182965841994589040, - "Data4": 125827646827015139 + "Data1": -2191028018933342168, + "Data2": -2080839777781124650 }, "Flags": 0, "Kind": 0, @@ -20339,10 +19835,8 @@ }, { "__Checksum": { - "Data1": 2567730962270646348, - "Data2": 1873271305104352480, - "Data3": 8443357163461968591, - "Data4": 274236633296277471 + "Data1": -2142748436251947606, + "Data2": 1931609551015828781 }, "Flags": 0, "Kind": 0, @@ -20402,10 +19896,8 @@ }, { "__Checksum": { - "Data1": 3583906527340670918, - "Data2": -3445540743772801673, - "Data3": 6066152997169569978, - "Data4": 3897638805687321712 + "Data1": 3946657269476064980, + "Data2": 5921145626574895991 }, "Flags": 0, "Kind": 0, @@ -20577,10 +20069,8 @@ }, { "__Checksum": { - "Data1": 5221451861912447169, - "Data2": -2307824317306885128, - "Data3": 719172212331335420, - "Data4": -3661112911984540248 + "Data1": -2705140262457152302, + "Data2": 4230081617762312206 }, "Flags": 0, "Kind": 0, @@ -20670,10 +20160,8 @@ }, { "__Checksum": { - "Data1": -6012834211247805114, - "Data2": -2043117952686556527, - "Data3": 8853337808203135672, - "Data4": 8136855089324400882 + "Data1": -2836200231587536645, + "Data2": -607861160301887923 }, "Flags": 0, "Kind": 0, @@ -20741,10 +20229,8 @@ }, { "__Checksum": { - "Data1": 7956960486775568274, - "Data2": 4509427542212899330, - "Data3": -3293799242357917053, - "Data4": 7043232219153152452 + "Data1": -1549800219388398783, + "Data2": 8563960884527529873 }, "Flags": 0, "Kind": 0, @@ -20791,10 +20277,8 @@ }, { "__Checksum": { - "Data1": -7820507385360378495, - "Data2": 419282184943790058, - "Data3": -2482702957871598666, - "Data4": 7356083036356565654 + "Data1": -1908914557278440764, + "Data2": 1496194287162382518 }, "Flags": 0, "Kind": 0, @@ -20848,10 +20332,8 @@ }, { "__Checksum": { - "Data1": -5393913606346998838, - "Data2": -8749609558442066766, - "Data3": -541031120579221193, - "Data4": 7650234405197915992 + "Data1": -3241721563858366604, + "Data2": 1195961167459520763 }, "Flags": 0, "Kind": 0, @@ -20952,10 +20434,8 @@ }, { "__Checksum": { - "Data1": -4950891619711705813, - "Data2": 7855355811649607973, - "Data3": -8921758193315373074, - "Data4": -5472128593607818124 + "Data1": 8137964464184652589, + "Data2": -6789174441139211840 }, "Flags": 0, "Kind": 0, @@ -21009,10 +20489,8 @@ }, { "__Checksum": { - "Data1": 2692338158620160172, - "Data2": -1348123350798656263, - "Data3": 5118503610952405832, - "Data4": 6574936741978069171 + "Data1": 5751076891200700454, + "Data2": -7494874043898873875 }, "Flags": 0, "Kind": 0, @@ -21066,10 +20544,8 @@ }, { "__Checksum": { - "Data1": -539227078256878706, - "Data2": -5321852144518444900, - "Data3": 5350477644049988204, - "Data4": 1295097721448027110 + "Data1": 7793535077027501198, + "Data2": 7715745682278892240 }, "Flags": 0, "Kind": 0, @@ -21109,10 +20585,8 @@ }, { "__Checksum": { - "Data1": 922703027896659803, - "Data2": 3242940863139758587, - "Data3": -8940119893972862088, - "Data4": 7456468120908654053 + "Data1": -5568995535444791142, + "Data2": -1938578509631998974 }, "Flags": 0, "Kind": 0, @@ -21232,10 +20706,8 @@ }, { "__Checksum": { - "Data1": -2675061525329669468, - "Data2": 2790641418296272062, - "Data3": 6554556571989676379, - "Data4": 7515889216067946354 + "Data1": -5765867837169970218, + "Data2": 8190955905591479230 }, "Flags": 0, "Kind": 0, @@ -21289,10 +20761,8 @@ }, { "__Checksum": { - "Data1": -4890129648930629378, - "Data2": -6058696747040440057, - "Data3": 1330103245247828882, - "Data4": -8296800928495089870 + "Data1": -7789899685532939821, + "Data2": -9150143776627439155 }, "Flags": 0, "Kind": 0, @@ -21360,10 +20830,8 @@ }, { "__Checksum": { - "Data1": -2908283684343467191, - "Data2": 394606266063567240, - "Data3": -4675688660018681247, - "Data4": 5139664994184714985 + "Data1": -3227278563013033598, + "Data2": -4050531391041309142 }, "Flags": 0, "Kind": 0, @@ -21431,10 +20899,8 @@ }, { "__Checksum": { - "Data1": -7638007670644146151, - "Data2": -2590011861875146972, - "Data3": 1784877029133290880, - "Data4": 453254262866308860 + "Data1": 1732856291218628692, + "Data2": 8732208959271662791 }, "Flags": 0, "Kind": 0, @@ -21502,10 +20968,8 @@ }, { "__Checksum": { - "Data1": -2679388009181869695, - "Data2": -6363387446118189349, - "Data3": 4877214905492412717, - "Data4": 6389893385271039456 + "Data1": 328355629168624087, + "Data2": -5738595934011070540 }, "Flags": 0, "Kind": 0, @@ -21573,10 +21037,8 @@ }, { "__Checksum": { - "Data1": 503465486749511880, - "Data2": 2857303332232817891, - "Data3": -4904297874512603529, - "Data4": -6734266265999033732 + "Data1": 7939571107657263454, + "Data2": 4531520989503940604 }, "Flags": 0, "Kind": 0, @@ -21630,10 +21092,8 @@ }, { "__Checksum": { - "Data1": -148600020117555950, - "Data2": 6683379577064265863, - "Data3": 333553543077637388, - "Data4": 1315034141000254629 + "Data1": 3570508515253993102, + "Data2": -7902130786345688479 }, "Flags": 0, "Kind": 0, @@ -21663,10 +21123,8 @@ }, { "__Checksum": { - "Data1": 8112707653413001509, - "Data2": -4144662807058606519, - "Data3": 8809367713835930987, - "Data4": -2636239948069751185 + "Data1": -3491029122743833126, + "Data2": 1782445722874792545 }, "Flags": 0, "Kind": 0, @@ -21800,10 +21258,8 @@ }, { "__Checksum": { - "Data1": -212895588000082511, - "Data2": 1568550122789994024, - "Data3": 4310981824933063485, - "Data4": 6059171796747893907 + "Data1": -8523636118137331815, + "Data2": 3760828651798964703 }, "Flags": 0, "Kind": 0, @@ -21850,10 +21306,8 @@ }, { "__Checksum": { - "Data1": 21341986506808760, - "Data2": 4165220743721674530, - "Data3": 6665431404240269683, - "Data4": -4094910219417202338 + "Data1": 6668261520660651051, + "Data2": -4364812401260865499 }, "Flags": 0, "Kind": 0, @@ -21907,10 +21361,8 @@ }, { "__Checksum": { - "Data1": -733971507602138394, - "Data2": -5083492806073039352, - "Data3": 9113590430602713198, - "Data4": 629203983695302833 + "Data1": 8155664887767679957, + "Data2": 628715943876994832 }, "Flags": 0, "Kind": 0, @@ -21964,10 +21416,8 @@ }, { "__Checksum": { - "Data1": 129659066695135267, - "Data2": -5746851557391599598, - "Data3": 4974184500604239182, - "Data4": -7785137943325446851 + "Data1": 838409875990041930, + "Data2": -5942969893369468306 }, "Flags": 0, "Kind": 0, @@ -22066,10 +21516,8 @@ }, { "__Checksum": { - "Data1": -3550528503114758869, - "Data2": -5409663076086348609, - "Data3": 1140759024322115675, - "Data4": -5875785240572455121 + "Data1": 3923405130981421545, + "Data2": -4442324143077394421 }, "Flags": 0, "Kind": 0, @@ -22151,10 +21599,8 @@ }, { "__Checksum": { - "Data1": 3769091630941643800, - "Data2": 7514662703697143206, - "Data3": -2330732602753918759, - "Data4": -8614058866396342268 + "Data1": -9109128975718529941, + "Data2": -2882339780628456741 }, "Flags": 0, "Kind": 0, @@ -22222,10 +21668,8 @@ }, { "__Checksum": { - "Data1": -2334823182612200259, - "Data2": -5095410215783015465, - "Data3": -9012777489083006520, - "Data4": -6742196409237774648 + "Data1": 1649359202384631792, + "Data2": 5155304842618096395 }, "Flags": 0, "Kind": 0, @@ -22272,10 +21716,8 @@ }, { "__Checksum": { - "Data1": 5801284980309305246, - "Data2": -7812998668956376044, - "Data3": -4302337669237539682, - "Data4": -5789055127352309184 + "Data1": -6758410325789919384, + "Data2": -1564733056821571784 }, "Flags": 0, "Kind": 0, @@ -22329,10 +21771,8 @@ }, { "__Checksum": { - "Data1": 5428479185097338395, - "Data2": -5319709618699634230, - "Data3": -1396394894894962268, - "Data4": 4567982593267231934 + "Data1": 8480450600277813852, + "Data2": -6994732145858868682 }, "Flags": 0, "Kind": 0, @@ -22440,10 +21880,8 @@ }, { "__Checksum": { - "Data1": -4683917506230294981, - "Data2": 4077345862486246434, - "Data3": 344679666126044994, - "Data4": -8963326723511055659 + "Data1": -7058426979796575236, + "Data2": -3379620549149760016 }, "Flags": 0, "Kind": 0, @@ -22490,10 +21928,8 @@ }, { "__Checksum": { - "Data1": -6239298320665730037, - "Data2": 8462458805835875395, - "Data3": 2905216255680571514, - "Data4": 8729471159814365929 + "Data1": 11428509622817066, + "Data2": 6711649738511788265 }, "Flags": 0, "Kind": 0, @@ -22554,10 +21990,8 @@ }, { "__Checksum": { - "Data1": -1842730227692955398, - "Data2": -1881029171174544624, - "Data3": -6222825632411300524, - "Data4": -3900889435719734656 + "Data1": 2090707678803055059, + "Data2": -8554805487421730400 }, "Flags": 0, "Kind": 0, @@ -22611,10 +22045,8 @@ }, { "__Checksum": { - "Data1": -898518556851495624, - "Data2": 8659035244040608259, - "Data3": -7607728576226741390, - "Data4": 4872146073819664070 + "Data1": 2735071528695877553, + "Data2": -1912742583628955659 }, "Flags": 0, "Kind": 0, @@ -22668,10 +22100,8 @@ }, { "__Checksum": { - "Data1": -4081675664913442053, - "Data2": -6483750596892050344, - "Data3": 855703670902756472, - "Data4": 430233660366198000 + "Data1": -1636819140904511674, + "Data2": -6010140653681879527 }, "Flags": 0, "Kind": 0, @@ -22711,10 +22141,8 @@ }, { "__Checksum": { - "Data1": 3788734173633262293, - "Data2": -7761009312992281291, - "Data3": -8214282998233156420, - "Data4": -6238525455048048595 + "Data1": 4962255652967885183, + "Data2": -8317899957155715157 }, "Flags": 0, "Kind": 0, @@ -22872,10 +22300,8 @@ }, { "__Checksum": { - "Data1": 4206516486436858815, - "Data2": -500747383373963380, - "Data3": -5546988346415529369, - "Data4": -8883225636681527536 + "Data1": 598381016640660714, + "Data2": -6374483675003564389 }, "Flags": 0, "Kind": 0, @@ -22929,10 +22355,8 @@ }, { "__Checksum": { - "Data1": -1376134513813947421, - "Data2": -6016175081454046510, - "Data3": 3423420151308410511, - "Data4": 2601889312210464257 + "Data1": 6464284380765557546, + "Data2": 1333899765964517176 }, "Flags": 0, "Kind": 0, @@ -23000,10 +22424,8 @@ }, { "__Checksum": { - "Data1": 907434740005201053, - "Data2": 1302660898969365403, - "Data3": 5970933478601699150, - "Data4": -8326015467289642764 + "Data1": -6795821764898958436, + "Data2": -4959599594946469576 }, "Flags": 0, "Kind": 0, @@ -23071,10 +22493,8 @@ }, { "__Checksum": { - "Data1": 2355752401813817633, - "Data2": 8846612964601587961, - "Data3": -1018031592959758267, - "Data4": -5031982490417487310 + "Data1": 6516664656447713944, + "Data2": -7210506029771670749 }, "Flags": 0, "Kind": 0, @@ -23142,10 +22562,8 @@ }, { "__Checksum": { - "Data1": -4315166097499438634, - "Data2": 4425878760891446854, - "Data3": 5101188090390939852, - "Data4": 4996257560796067407 + "Data1": 6206891246062890933, + "Data2": 2098749940260859026 }, "Flags": 0, "Kind": 0, @@ -23213,10 +22631,8 @@ }, { "__Checksum": { - "Data1": -7331879345855936511, - "Data2": -24928701010319323, - "Data3": -6087882146768813174, - "Data4": -7125163396360514758 + "Data1": -5701264311532602028, + "Data2": 3026598112884793279 }, "Flags": 0, "Kind": 0, @@ -23256,10 +22672,8 @@ }, { "__Checksum": { - "Data1": -4217145231061429363, - "Data2": -244160752848791528, - "Data3": -5436075718045375487, - "Data4": 2534369513075980274 + "Data1": 6921185629130607737, + "Data2": -3356897430858395275 }, "Flags": 0, "Kind": 0, @@ -23320,10 +22734,8 @@ }, { "__Checksum": { - "Data1": -3565336707331453467, - "Data2": 6292233393664840211, - "Data3": 4053558514680341006, - "Data4": 7294354308700647441 + "Data1": 8688181754092007507, + "Data2": -7624754959445062766 }, "Flags": 0, "Kind": 0, @@ -23370,10 +22782,8 @@ }, { "__Checksum": { - "Data1": -252634679889644581, - "Data2": -5140039610637144602, - "Data3": -812627308678368672, - "Data4": 7140431907555559485 + "Data1": 3890772348577636397, + "Data2": 1314839844551661852 }, "Flags": 0, "Kind": 0, @@ -23483,10 +22893,8 @@ }, { "__Checksum": { - "Data1": 179558927095162863, - "Data2": 1638231826300941133, - "Data3": 6564221080252839264, - "Data4": 6783765470698586082 + "Data1": -6755975591243787041, + "Data2": 6837277432411825158 }, "Flags": 0, "Kind": 0, @@ -23540,10 +22948,8 @@ }, { "__Checksum": { - "Data1": 5865904033907987087, - "Data2": 5718111124623041956, - "Data3": -5498970288784076772, - "Data4": -2755182810169141426 + "Data1": -8588462169791611918, + "Data2": -586225233406632303 }, "Flags": 0, "Kind": 0, @@ -23600,10 +23006,8 @@ }, { "__Checksum": { - "Data1": 6829606367911851775, - "Data2": -6412692058644028988, - "Data3": -6337842364311159159, - "Data4": -5098281728905215642 + "Data1": 4062460950586105320, + "Data2": -2267432369643045931 }, "Flags": 0, "Kind": 0, @@ -23650,10 +23054,8 @@ }, { "__Checksum": { - "Data1": 9144993265249748365, - "Data2": 5844644219793707550, - "Data3": 7242460564411645112, - "Data4": 1131085486131944732 + "Data1": 8145416297874858012, + "Data2": 1479296447059581917 }, "Flags": 0, "Kind": 0, @@ -23707,10 +23109,8 @@ }, { "__Checksum": { - "Data1": -1722806720188213967, - "Data2": 3435729784246929235, - "Data3": -4559328596491597837, - "Data4": 7960959974104258130 + "Data1": 5877134744296493502, + "Data2": 1089703037509561602 }, "Flags": 0, "Kind": 0, @@ -23764,10 +23164,8 @@ }, { "__Checksum": { - "Data1": -8022016458920572751, - "Data2": -7723364668364130997, - "Data3": -424172396492512141, - "Data4": 8199854292264045267 + "Data1": 5983390123940670765, + "Data2": -8499417091519245413 }, "Flags": 0, "Kind": 0, @@ -23873,10 +23271,8 @@ }, { "__Checksum": { - "Data1": -7117015032454682940, - "Data2": -5077643410061167990, - "Data3": -5979653079444799152, - "Data4": 2704021550052661151 + "Data1": 1857878582440225076, + "Data2": 6070894625445307042 }, "Flags": 0, "Kind": 0, @@ -23930,10 +23326,8 @@ }, { "__Checksum": { - "Data1": 2670907571168949205, - "Data2": -8965215716369637417, - "Data3": -6517024852455433769, - "Data4": -7691112360049864173 + "Data1": -3898488850182459723, + "Data2": -3265083790302408398 }, "Flags": 0, "Kind": 0, @@ -23963,10 +23357,8 @@ }, { "__Checksum": { - "Data1": 2919329276518686048, - "Data2": 4437195890710458938, - "Data3": -8784065578637792246, - "Data4": 5053393759435553038 + "Data1": 1349563168944534464, + "Data2": 631938934953564083 }, "Flags": 0, "Kind": 0, @@ -24013,10 +23405,8 @@ }, { "__Checksum": { - "Data1": -6556499570799349866, - "Data2": 6431984795065801483, - "Data3": -2074092163552581085, - "Data4": 5374794313096326979 + "Data1": 2652413487192029063, + "Data2": -1550307960906412096 }, "Flags": 0, "Kind": 0, @@ -24077,10 +23467,8 @@ }, { "__Checksum": { - "Data1": 8480892463330340453, - "Data2": 7539361439309001355, - "Data3": -1889736784295136073, - "Data4": -8996442795027141115 + "Data1": 4271676120578140089, + "Data2": -8608559732970679457 }, "Flags": 0, "Kind": 0, @@ -24134,10 +23522,8 @@ }, { "__Checksum": { - "Data1": -8135941702896074014, - "Data2": 8999969380573657113, - "Data3": 2045907905618934053, - "Data4": 6717843034411558419 + "Data1": -3174368567128229264, + "Data2": 692748738433010783 }, "Flags": 0, "Kind": 0, @@ -24191,10 +23577,8 @@ }, { "__Checksum": { - "Data1": -2621694615755267530, - "Data2": 341705381421966861, - "Data3": -422699105300404787, - "Data4": 8731868291470982014 + "Data1": -2266634554708951010, + "Data2": 6916966457398968999 }, "Flags": 0, "Kind": 0, @@ -24234,10 +23618,8 @@ }, { "__Checksum": { - "Data1": -6162728996201676664, - "Data2": 3801472848869971570, - "Data3": -4182369123932616468, - "Data4": 286091503915023568 + "Data1": -1275925811737366167, + "Data2": 2947522225051108373 }, "Flags": 0, "Kind": 0, @@ -24374,10 +23756,8 @@ }, { "__Checksum": { - "Data1": -8837202848120890584, - "Data2": 8875858793012002259, - "Data3": -8515919615408918898, - "Data4": 8286505710836760312 + "Data1": -4290309207973598313, + "Data2": -7557304027596081305 }, "Flags": 0, "Kind": 0, @@ -24417,10 +23797,8 @@ }, { "__Checksum": { - "Data1": -4344273393617992639, - "Data2": -4365259642870392699, - "Data3": -4184226916291414968, - "Data4": 5798967620710761720 + "Data1": 2879946300519954266, + "Data2": 5121566011148040724 }, "Flags": 0, "Kind": 0, @@ -24481,10 +23859,8 @@ }, { "__Checksum": { - "Data1": 1836519771424790389, - "Data2": -4872950344816983265, - "Data3": 6669436038991732510, - "Data4": -1468082979508555523 + "Data1": -4433437062292512153, + "Data2": 2160897615840510613 }, "Flags": 0, "Kind": 0, @@ -24717,10 +24093,8 @@ }, { "__Checksum": { - "Data1": 5199944838976006594, - "Data2": 4007101254810437803, - "Data3": 6090989587223971368, - "Data4": -648145136491896209 + "Data1": 3527827789938207212, + "Data2": -3214545690236973872 }, "Flags": 0, "Kind": 0, @@ -24760,10 +24134,8 @@ }, { "__Checksum": { - "Data1": 9036827718374445953, - "Data2": 550882059903026640, - "Data3": 4679100303019830484, - "Data4": 5062426073934406311 + "Data1": 3977675024952893510, + "Data2": 3252590283459799752 }, "Flags": 0, "Kind": 0, @@ -24810,10 +24182,8 @@ }, { "__Checksum": { - "Data1": 4606913599014821776, - "Data2": -1742580466127879314, - "Data3": -4756237616638585234, - "Data4": 8466701857401148533 + "Data1": -3888310247708387137, + "Data2": -3090543984299363061 }, "Flags": 0, "Kind": 0, @@ -24867,10 +24237,8 @@ }, { "__Checksum": { - "Data1": -3033616768030345393, - "Data2": -6681501218583113283, - "Data3": 2859523206310007378, - "Data4": 608653453084494183 + "Data1": -43760720197532707, + "Data2": 2610980388012948177 }, "Flags": 0, "Kind": 0, @@ -24924,10 +24292,8 @@ }, { "__Checksum": { - "Data1": 5457220036169869457, - "Data2": 6865721294083217037, - "Data3": 6925837508904067267, - "Data4": -2491323053902709249 + "Data1": 7311630847991261292, + "Data2": 5010395414048035545 }, "Flags": 0, "Kind": 0, @@ -25026,10 +24392,8 @@ }, { "__Checksum": { - "Data1": -4927773496492575072, - "Data2": -6313420468846258516, - "Data3": -6578641020063850558, - "Data4": 9101304332852262758 + "Data1": 263938476031170165, + "Data2": -3467281525468294257 }, "Flags": 0, "Kind": 0, @@ -25076,10 +24440,8 @@ }, { "__Checksum": { - "Data1": 2989492404611213261, - "Data2": 3177451639722040116, - "Data3": 1777470139070356163, - "Data4": 1225188841551547926 + "Data1": -59242010789758434, + "Data2": -907454513996183818 }, "Flags": 0, "Kind": 0, @@ -25133,10 +24495,8 @@ }, { "__Checksum": { - "Data1": -684505258434743781, - "Data2": 1219735490743514148, - "Data3": -2852386120539589960, - "Data4": -563608060710845057 + "Data1": -6411998509421484054, + "Data2": 3740197977209445458 }, "Flags": 0, "Kind": 0, @@ -25214,10 +24574,8 @@ }, { "__Checksum": { - "Data1": 8160981772147432145, - "Data2": 7248054433289348816, - "Data3": -8302089302759718711, - "Data4": 2859249487257443179 + "Data1": 8868320827110312182, + "Data2": -6806718679259071643 }, "Flags": 0, "Kind": 0, @@ -25264,10 +24622,8 @@ }, { "__Checksum": { - "Data1": -4290937599517485817, - "Data2": 1095437509972052315, - "Data3": 6527937612756834457, - "Data4": -7170005009433488494 + "Data1": 716374751707008051, + "Data2": -3110388735871225501 }, "Flags": 0, "Kind": 0, @@ -25335,10 +24691,8 @@ }, { "__Checksum": { - "Data1": 4675432417256970932, - "Data2": -3700087745127002662, - "Data3": -2212981019834482050, - "Data4": 666904672954914401 + "Data1": 6120996139269028408, + "Data2": -7489736762594476019 }, "Flags": 0, "Kind": 0, @@ -25369,10 +24723,8 @@ }, { "__Checksum": { - "Data1": -1711295869258706245, - "Data2": -3929603630825026516, - "Data3": 3390375438776470686, - "Data4": 6121195108790922398 + "Data1": -524824980430415785, + "Data2": 3943206152032442809 }, "Flags": 0, "Kind": 0, @@ -25412,10 +24764,8 @@ }, { "__Checksum": { - "Data1": 1900590456816054504, - "Data2": -8721434195936449827, - "Data3": 6327163693708368851, - "Data4": 6426616339021644465 + "Data1": -9201725326406018755, + "Data2": -5200672660548892500 }, "Flags": 0, "Kind": 0, @@ -25469,10 +24819,8 @@ }, { "__Checksum": { - "Data1": 7502185662520166230, - "Data2": 7097275745947847645, - "Data3": 7960956097365088178, - "Data4": 1396108873900057963 + "Data1": 7668900518177547074, + "Data2": -1645580294822596174 }, "Flags": 0, "Kind": 0, @@ -25526,10 +24874,8 @@ }, { "__Checksum": { - "Data1": -6153116986066933736, - "Data2": 694714473670978576, - "Data3": -4152281386879353043, - "Data4": 6499637438794482096 + "Data1": 3211394991120232750, + "Data2": 1360909087166936840 }, "Flags": 0, "Kind": 0, @@ -25609,10 +24955,8 @@ }, { "__Checksum": { - "Data1": 1406829107953876454, - "Data2": -5006924700224256365, - "Data3": -724562774864475570, - "Data4": 521434975771345056 + "Data1": 5484682907191465402, + "Data2": 6021956630134150151 }, "Flags": 0, "Kind": 0, @@ -25666,10 +25010,8 @@ }, { "__Checksum": { - "Data1": 5447055447847464787, - "Data2": 9200419255129071364, - "Data3": 2882522480077099264, - "Data4": -3519487258514970250 + "Data1": 2602388318187075574, + "Data2": -9081462017335789416 }, "Flags": 0, "Kind": 0, @@ -25723,10 +25065,8 @@ }, { "__Checksum": { - "Data1": 2439721346159474675, - "Data2": 4213161122423335609, - "Data3": 8757064700575163489, - "Data4": -4020815415300326720 + "Data1": 769481625830615201, + "Data2": -5605529713809839334 }, "Flags": 0, "Kind": 0, @@ -25878,10 +25218,8 @@ }, { "__Checksum": { - "Data1": -999743452259484654, - "Data2": 7379238362401494911, - "Data3": 4489339078824812238, - "Data4": 2790363727649779970 + "Data1": 8181007147024667451, + "Data2": -6176707266953811369 }, "Flags": 0, "Kind": 0, @@ -25928,10 +25266,8 @@ }, { "__Checksum": { - "Data1": -7925885201640646316, - "Data2": -3666940268196843964, - "Data3": -1201267986629746248, - "Data4": 8455646614673100891 + "Data1": -8150464661758078991, + "Data2": -910682451249657909 }, "Flags": 0, "Kind": 0, @@ -25985,10 +25321,8 @@ }, { "__Checksum": { - "Data1": 4321631731764782271, - "Data2": 7276180869775502509, - "Data3": 6641256494026526874, - "Data4": 396368591696743596 + "Data1": -3797045667743547540, + "Data2": 6334825143728560691 }, "Flags": 0, "Kind": 0, @@ -26042,10 +25376,8 @@ }, { "__Checksum": { - "Data1": 1233132227059032464, - "Data2": -9150234662464400494, - "Data3": 3472678495931205144, - "Data4": -2961927784433705227 + "Data1": 8811144268807365644, + "Data2": 4939194487737988173 }, "Flags": 0, "Kind": 0, @@ -26137,10 +25469,8 @@ }, { "__Checksum": { - "Data1": 5788953809447381636, - "Data2": 2262780182017894309, - "Data3": -8060206237547051946, - "Data4": 3048757207016619149 + "Data1": 113878718261753212, + "Data2": 6712266510407624448 }, "Flags": 0, "Kind": 0, @@ -26187,10 +25517,8 @@ }, { "__Checksum": { - "Data1": -807133923176775219, - "Data2": -3709770854040190136, - "Data3": -1113486634661904530, - "Data4": -660485010529351686 + "Data1": 794454084461587578, + "Data2": -6035771709293775195 }, "Flags": 0, "Kind": 0, @@ -26237,10 +25565,8 @@ }, { "__Checksum": { - "Data1": 9189385961570136274, - "Data2": 6077430782809013570, - "Data3": -4436232508577224241, - "Data4": 1316660875178492215 + "Data1": -1011030357191426234, + "Data2": -6294929179115357598 }, "Flags": 0, "Kind": 0, @@ -26294,10 +25620,8 @@ }, { "__Checksum": { - "Data1": 4184442113730396023, - "Data2": 6542883733110908316, - "Data3": -6132259478986170773, - "Data4": 5245641155998963912 + "Data1": -1813126612209199168, + "Data2": 2952342701286063078 }, "Flags": 0, "Kind": 0, @@ -26351,10 +25675,8 @@ }, { "__Checksum": { - "Data1": -1047464598932381636, - "Data2": 7919900364053566747, - "Data3": -2434732797783533532, - "Data4": 12210102830013523 + "Data1": -4507695328214393662, + "Data2": 2702340685960794590 }, "Flags": 0, "Kind": 0, @@ -26423,10 +25745,8 @@ }, { "__Checksum": { - "Data1": -6660618134935638909, - "Data2": 2145484325307272702, - "Data3": -9058171079359385825, - "Data4": 7976939339662875650 + "Data1": 2761466886716005457, + "Data2": -7644506716598854016 }, "Flags": 0, "Kind": 0, @@ -26473,10 +25793,8 @@ }, { "__Checksum": { - "Data1": -1534917228163120389, - "Data2": 7505206828768377036, - "Data3": 3492579137227475615, - "Data4": 2721399602680438444 + "Data1": 4864117926227799780, + "Data2": 6061398113641315408 }, "Flags": 0, "Kind": 0, @@ -26530,10 +25848,8 @@ }, { "__Checksum": { - "Data1": -4938908004884346136, - "Data2": -3181000119810379340, - "Data3": 4121701677267200947, - "Data4": -6639758466226673773 + "Data1": 891377798089754679, + "Data2": 217326483147441753 }, "Flags": 0, "Kind": 0, @@ -26606,10 +25922,8 @@ }, { "__Checksum": { - "Data1": -8052534733123264844, - "Data2": 2421221748115620276, - "Data3": 1567983363285158066, - "Data4": -682108522985380655 + "Data1": 5466182494415597768, + "Data2": -2749902862385151937 }, "Flags": 0, "Kind": 0, @@ -26663,10 +25977,8 @@ }, { "__Checksum": { - "Data1": 1289765902541212127, - "Data2": -4853925300119098072, - "Data3": 3802574055614682526, - "Data4": -9112427768414098061 + "Data1": -6630268742905813742, + "Data2": -8996733619601481853 }, "Flags": 0, "Kind": 0, @@ -26720,10 +26032,8 @@ }, { "__Checksum": { - "Data1": -4051648520735442222, - "Data2": 690021266917753054, - "Data3": 2683307446691125216, - "Data4": -853136510188294489 + "Data1": -5580796797698649655, + "Data2": -6456186541163566142 }, "Flags": 0, "Kind": 0, @@ -26799,10 +26109,8 @@ }, { "__Checksum": { - "Data1": 2096380579967747894, - "Data2": 8187658111288415026, - "Data3": 2930121106858020067, - "Data4": -2139122156758634125 + "Data1": 4264230326925668334, + "Data2": -6748594692995955228 }, "Flags": 0, "Kind": 0, @@ -26842,10 +26150,8 @@ }, { "__Checksum": { - "Data1": -1939670463428774265, - "Data2": -3300589750089020579, - "Data3": -6598111001488829074, - "Data4": 7467562019848587094 + "Data1": 7956761383407342807, + "Data2": 8042935570273787677 }, "Flags": 0, "Kind": 0, @@ -26892,10 +26198,8 @@ }, { "__Checksum": { - "Data1": 4161604439154499116, - "Data2": -8410178403157553681, - "Data3": 4713617215046447361, - "Data4": -1629405811775961235 + "Data1": -1503458347967583059, + "Data2": 8075566816872980620 }, "Flags": 0, "Kind": 0, @@ -26949,10 +26253,8 @@ }, { "__Checksum": { - "Data1": -7607251539224431679, - "Data2": 7216736650967235215, - "Data3": 8519043178957350424, - "Data4": -3215760700079867014 + "Data1": 1097315379212211707, + "Data2": 5095764668407639703 }, "Flags": 0, "Kind": 0, @@ -27039,10 +26341,8 @@ }, { "__Checksum": { - "Data1": 697147325878763050, - "Data2": 7355227298362736347, - "Data3": 205437038493267311, - "Data4": 5914865174615246875 + "Data1": -2448413976423586509, + "Data2": 8579023856900034115 }, "Flags": 0, "Kind": 0, @@ -27095,10 +26395,8 @@ }, { "__Checksum": { - "Data1": -7147333803771153372, - "Data2": -2906965796727472550, - "Data3": -4553542358721191473, - "Data4": 1749481262634397741 + "Data1": -2795413643146285278, + "Data2": -6676305508497550850 }, "Flags": 0, "Kind": 0, @@ -27152,10 +26450,8 @@ }, { "__Checksum": { - "Data1": -5542676160142017107, - "Data2": -532016820459574678, - "Data3": 7409385359676754520, - "Data4": -6141730927994192651 + "Data1": 6650981537568702253, + "Data2": 2793212161766708057 }, "Flags": 0, "Kind": 0, @@ -27305,10 +26601,8 @@ }, { "__Checksum": { - "Data1": 2427552626450740666, - "Data2": 5130482324341886130, - "Data3": 6288697345050015177, - "Data4": 3112301840744342328 + "Data1": -3654767900490075448, + "Data2": 5578622678380248455 }, "Flags": 0, "Kind": 0, @@ -27355,10 +26649,8 @@ }, { "__Checksum": { - "Data1": 7470186635954969071, - "Data2": 7159936552561215345, - "Data3": -5861268924435388193, - "Data4": -2563044430335535781 + "Data1": 6728750463167440785, + "Data2": 5175862697364202964 }, "Flags": 0, "Kind": 0, @@ -27412,10 +26704,8 @@ }, { "__Checksum": { - "Data1": -8453551354867037801, - "Data2": -2049788870099535281, - "Data3": 2762046691613022342, - "Data4": 3004081195624987472 + "Data1": 2198319240709863642, + "Data2": 7391807483711799460 }, "Flags": 0, "Kind": 0, @@ -27469,10 +26759,8 @@ }, { "__Checksum": { - "Data1": -8478344252035443397, - "Data2": 771250752477767758, - "Data3": -6893810981242027416, - "Data4": 5954366997899702141 + "Data1": -4703885130940437969, + "Data2": -4438580652592086650 }, "Flags": 0, "Kind": 0, @@ -27541,10 +26829,8 @@ }, { "__Checksum": { - "Data1": 2232261080440218941, - "Data2": -4548775614177719144, - "Data3": -5836101411586258275, - "Data4": -473778229722368344 + "Data1": 2245206577501580239, + "Data2": 2287936197806080319 }, "Flags": 0, "Kind": 0, @@ -27724,10 +27010,8 @@ }, { "__Checksum": { - "Data1": -6694131318274696869, - "Data2": -209101852656228662, - "Data3": 3542979193543630396, - "Data4": -4688812745718873650 + "Data1": -3993189535956229057, + "Data2": -3555666829929645239 }, "Flags": 0, "Kind": 0, @@ -27809,10 +27093,8 @@ }, { "__Checksum": { - "Data1": 2766864555253877379, - "Data2": 7381768866303364554, - "Data3": -5196547693431261633, - "Data4": 3802086305713518494 + "Data1": 2957809447686889652, + "Data2": -6228529517667789171 }, "Flags": 0, "Kind": 0, @@ -27866,10 +27148,8 @@ }, { "__Checksum": { - "Data1": -5493438840267590430, - "Data2": 5227326107205815774, - "Data3": 4198223578149930542, - "Data4": -5355225794814226013 + "Data1": 8012423124320127593, + "Data2": 7011349007449512205 }, "Flags": 0, "Kind": 0, @@ -27916,10 +27196,8 @@ }, { "__Checksum": { - "Data1": -7981667645644714247, - "Data2": 4958967511243136599, - "Data3": -2740710514134950240, - "Data4": 5900408264632742455 + "Data1": 3031632774279106378, + "Data2": -6636378817705238980 }, "Flags": 0, "Kind": 0, @@ -27966,10 +27244,8 @@ }, { "__Checksum": { - "Data1": -7429435717204249477, - "Data2": 7424543151935824698, - "Data3": 6190444155946720449, - "Data4": 3920965251070565859 + "Data1": 2275689468759371902, + "Data2": 3192139761196083779 }, "Flags": 0, "Kind": 0, @@ -28016,10 +27292,8 @@ }, { "__Checksum": { - "Data1": 709773686397454866, - "Data2": 5465550707804421895, - "Data3": 2154190167993288139, - "Data4": 5218124828263296626 + "Data1": -5910912273440360845, + "Data2": -1440195954995391685 }, "Flags": 0, "Kind": 0, @@ -28073,10 +27347,8 @@ }, { "__Checksum": { - "Data1": -5198782287006995482, - "Data2": 7161513569932383880, - "Data3": -7276443193241289255, - "Data4": -8935842322052566918 + "Data1": -8855629402575019040, + "Data2": -7433692408027430060 }, "Flags": 0, "Kind": 0, @@ -28130,10 +27402,8 @@ }, { "__Checksum": { - "Data1": -5243323863001722655, - "Data2": 342970255871516887, - "Data3": -2595444719067863231, - "Data4": -8357735088578040900 + "Data1": -5937373326081458078, + "Data2": -5754188502223043104 }, "Flags": 0, "Kind": 0, @@ -28239,10 +27509,8 @@ }, { "__Checksum": { - "Data1": -6487724932892527905, - "Data2": -5216303335032580095, - "Data3": 3337439451606954018, - "Data4": -5899761063237259789 + "Data1": 8662439491774873068, + "Data2": -872618194019220124 }, "Flags": 0, "Kind": 0, @@ -28296,10 +27564,8 @@ }, { "__Checksum": { - "Data1": -9043382036126424282, - "Data2": -8308373993069417457, - "Data3": -4227728009496392415, - "Data4": 5729898021251181449 + "Data1": -4062239428299957930, + "Data2": 6116652705957416072 }, "Flags": 0, "Kind": 0, @@ -28353,10 +27619,8 @@ }, { "__Checksum": { - "Data1": -3508411493090839208, - "Data2": -5832706784489185454, - "Data3": 6818931749535537197, - "Data4": -6616020970445444825 + "Data1": -3754434182982472471, + "Data2": 3944790558572542547 }, "Flags": 0, "Kind": 0, @@ -28500,10 +27764,8 @@ }, { "__Checksum": { - "Data1": 2977287613018123918, - "Data2": -7781319147847386248, - "Data3": -6471241217514018904, - "Data4": 7415224962241813426 + "Data1": -6214967483660568355, + "Data2": 7918329987344712237 }, "Flags": 0, "Kind": 0, @@ -28550,10 +27812,8 @@ }, { "__Checksum": { - "Data1": 2057796281459680260, - "Data2": -4049009749100921036, - "Data3": -2840296946468107240, - "Data4": 1915505270277473687 + "Data1": 429873530137335861, + "Data2": 6151801353805936735 }, "Flags": 0, "Kind": 0, @@ -28607,10 +27867,8 @@ }, { "__Checksum": { - "Data1": 4397056313689831239, - "Data2": -8097238476159982209, - "Data3": -5327891014181903924, - "Data4": 6858033710491573458 + "Data1": 1373555583334031039, + "Data2": -6604320408337393019 }, "Flags": 0, "Kind": 0, @@ -28664,10 +27922,8 @@ }, { "__Checksum": { - "Data1": 4331827604091980189, - "Data2": -8552584640030708472, - "Data3": -370269142830282348, - "Data4": 7685145754279246850 + "Data1": -7769893416858593238, + "Data2": -6599143220692061231 }, "Flags": 0, "Kind": 0, @@ -28773,10 +28029,8 @@ }, { "__Checksum": { - "Data1": 4766132985176090569, - "Data2": 1382066551783098865, - "Data3": 2247592641434126050, - "Data4": 2661216821758513756 + "Data1": -1507032228854767071, + "Data2": 4617212448040689485 }, "Flags": 0, "Kind": 0, @@ -28816,10 +28070,8 @@ }, { "__Checksum": { - "Data1": 1002761325193955868, - "Data2": 8097783783955615163, - "Data3": -1063501580409703322, - "Data4": -1585532886554957749 + "Data1": -1567695753753432603, + "Data2": 9005092917057194118 }, "Flags": 0, "Kind": 0, @@ -28880,10 +28132,8 @@ }, { "__Checksum": { - "Data1": 1254263254168049818, - "Data2": 7223871985471249702, - "Data3": -725967844455289636, - "Data4": -6733238390470176078 + "Data1": -7912400406428965071, + "Data2": 2446960659307876547 }, "Flags": 0, "Kind": 0, @@ -28930,10 +28180,8 @@ }, { "__Checksum": { - "Data1": 1575975570105601504, - "Data2": -935157227634565965, - "Data3": 5283126798392813652, - "Data4": 2191194706826366658 + "Data1": -744061604557102871, + "Data2": 263314798149297231 }, "Flags": 0, "Kind": 0, @@ -29043,10 +28291,8 @@ }, { "__Checksum": { - "Data1": -5316267780112667839, - "Data2": -1197767585988456675, - "Data3": 7733225545304851061, - "Data4": 4459410951043103662 + "Data1": -5278635562256550734, + "Data2": -4613080889035370095 }, "Flags": 0, "Kind": 0, @@ -29100,10 +28346,8 @@ }, { "__Checksum": { - "Data1": 642944078477886735, - "Data2": 2978312972547348799, - "Data3": 3355506522427742683, - "Data4": -4521278742601266510 + "Data1": -2997319391352926786, + "Data2": 4344922259600408720 }, "Flags": 0, "Kind": 0, @@ -29153,10 +28397,8 @@ }, { "__Checksum": { - "Data1": 7073240555486635248, - "Data2": 2670485384707486367, - "Data3": -821290397126750780, - "Data4": -496087342265540535 + "Data1": -3758033461427233224, + "Data2": -462898716971677181 }, "Flags": 0, "Kind": 0, @@ -29189,10 +28431,8 @@ }, { "__Checksum": { - "Data1": -796043812541522481, - "Data2": 42497269161056963, - "Data3": 2693463059366211492, - "Data4": -6618434100632596481 + "Data1": 3436629697469719401, + "Data2": 4661896343322173502 }, "Flags": 0, "Kind": 0, @@ -29302,10 +28542,8 @@ }, { "__Checksum": { - "Data1": -2132281567145382613, - "Data2": -2477979354505058251, - "Data3": 6278750875973946173, - "Data4": 2933996549545611702 + "Data1": 623892552277303937, + "Data2": 5692433577332506278 }, "Flags": 0, "Kind": 0, @@ -29345,10 +28583,8 @@ }, { "__Checksum": { - "Data1": 3405283898480954313, - "Data2": -4166479996268276734, - "Data3": -7302198951027801674, - "Data4": -1241391562256379911 + "Data1": 7421235030252001313, + "Data2": -5788365886111242802 }, "Flags": 0, "Kind": 0, @@ -29388,10 +28624,8 @@ }, { "__Checksum": { - "Data1": 7958191531367329879, - "Data2": 2211577985733345612, - "Data3": -7232870385580712214, - "Data4": 5792061769269933269 + "Data1": 3976198173629296480, + "Data2": -2155094813351438514 }, "Flags": 0, "Kind": 0, @@ -29445,10 +28679,8 @@ }, { "__Checksum": { - "Data1": -8367137276947703257, - "Data2": -3523216581143776780, - "Data3": 7396312718432287458, - "Data4": 6765320904569098371 + "Data1": 8189441154067314620, + "Data2": 2208613599119222005 }, "Flags": 0, "Kind": 0, @@ -29549,10 +28781,8 @@ }, { "__Checksum": { - "Data1": -454025158274166391, - "Data2": -540596969414902883, - "Data3": -3443638100855022933, - "Data4": -2383829679932074200 + "Data1": -4893344920409859909, + "Data2": 521403679743870409 }, "Flags": 0, "Kind": 0, @@ -29592,10 +28822,8 @@ }, { "__Checksum": { - "Data1": 3798740153514884810, - "Data2": 3508087497493555726, - "Data3": -7706494194788095100, - "Data4": -569925043394228784 + "Data1": -8551655860074109297, + "Data2": 9217036245569907210 }, "Flags": 0, "Kind": 0, @@ -29697,10 +28925,8 @@ }, { "__Checksum": { - "Data1": -5491138637815677447, - "Data2": 4141300292108893409, - "Data3": 6405689114335775569, - "Data4": 1422896904305076391 + "Data1": 9024263872105739535, + "Data2": 5587029316359216058 }, "Flags": 0, "Kind": 0, @@ -29754,10 +28980,8 @@ }, { "__Checksum": { - "Data1": -6166314189093334620, - "Data2": 4312301738016784551, - "Data3": -650849746036209525, - "Data4": -5781243871740745988 + "Data1": -2424938357250444086, + "Data2": -5694113924181546527 }, "Flags": 0, "Kind": 0, @@ -29846,10 +29070,8 @@ }, { "__Checksum": { - "Data1": -4358005406779752430, - "Data2": 3110119153644327530, - "Data3": -1847796986820000922, - "Data4": -7819890364460489954 + "Data1": -2411537592928138941, + "Data2": 5929497587267637160 }, "Flags": 0, "Kind": 0, @@ -29896,10 +29118,8 @@ }, { "__Checksum": { - "Data1": 8486079335018178878, - "Data2": -5274414207727177322, - "Data3": 7855392949262434314, - "Data4": 5715309389776310834 + "Data1": 3620240943372510719, + "Data2": -5506207992948987462 }, "Flags": 0, "Kind": 0, @@ -29953,10 +29173,8 @@ }, { "__Checksum": { - "Data1": 1568262309472297273, - "Data2": 6013282157645106993, - "Data3": 445942106976511180, - "Data4": -1968131466453964496 + "Data1": 7026190802742595405, + "Data2": -379434249285022594 }, "Flags": 0, "Kind": 0, @@ -30036,10 +29254,8 @@ }, { "__Checksum": { - "Data1": 8377089543934089997, - "Data2": -1177752778466951473, - "Data3": -814160072597036852, - "Data4": 3871416816690820513 + "Data1": 9020182619364508096, + "Data2": 1779847864631711501 }, "Flags": 0, "Kind": 0, @@ -30107,10 +29323,8 @@ }, { "__Checksum": { - "Data1": 9130538118939903064, - "Data2": 2460973431653072645, - "Data3": -4420617205976607977, - "Data4": -1106424927503558572 + "Data1": 8614756831853002575, + "Data2": 8503072358353463608 }, "Flags": 0, "Kind": 0, @@ -30178,10 +29392,8 @@ }, { "__Checksum": { - "Data1": 6099718399299791929, - "Data2": -4165128292587191315, - "Data3": -4981244501349660963, - "Data4": -185974452576176389 + "Data1": 8752900981017045314, + "Data2": -3378123278231165815 }, "Flags": 0, "Kind": 0, @@ -30235,10 +29447,8 @@ }, { "__Checksum": { - "Data1": 3462880151283267561, - "Data2": 5216897667545120491, - "Data3": -8714368066824064029, - "Data4": -9150428238720599035 + "Data1": 6958744665459482724, + "Data2": -8337545471752950324 }, "Flags": 0, "Kind": 0, @@ -30292,10 +29502,8 @@ }, { "__Checksum": { - "Data1": 8411348830325725868, - "Data2": -3931142245439203544, - "Data3": 4167181167179380772, - "Data4": 6909283963636856957 + "Data1": 5647993482881804971, + "Data2": -371628208428251004 }, "Flags": 0, "Kind": 0, @@ -30450,10 +29658,8 @@ }, { "__Checksum": { - "Data1": 1750823466961230440, - "Data2": 1149490573207425386, - "Data3": -3160128706504703859, - "Data4": 9005857397731445933 + "Data1": 8820289398260872141, + "Data2": 1429347664777386804 }, "Flags": 0, "Kind": 0, @@ -30507,10 +29713,8 @@ }, { "__Checksum": { - "Data1": -4119239266623305122, - "Data2": -9118737268599135060, - "Data3": 2005208383074922982, - "Data4": -2473939392878251441 + "Data1": 3349451068189366509, + "Data2": 4229967262410911108 }, "Flags": 0, "Kind": 0, @@ -30564,10 +29768,8 @@ }, { "__Checksum": { - "Data1": -3981761658948681991, - "Data2": 7155018226550956340, - "Data3": -4152390786699986867, - "Data4": -5043395578959200862 + "Data1": 9010102980535378987, + "Data2": -1431227198021087866 }, "Flags": 0, "Kind": 0, @@ -30760,10 +29962,8 @@ }, { "__Checksum": { - "Data1": -4501265489291157153, - "Data2": 1393705142941067847, - "Data3": 6394777395646678363, - "Data4": -5541851661579566815 + "Data1": 6131529133114629263, + "Data2": -8702285099967139364 }, "Flags": 0, "Kind": 0, @@ -30831,10 +30031,8 @@ }, { "__Checksum": { - "Data1": 8985499955345426510, - "Data2": -7943697483779306939, - "Data3": -8734214368510954306, - "Data4": 1833264434671123862 + "Data1": 2712589770066844710, + "Data2": -7840939150268413701 }, "Flags": 0, "Kind": 0, @@ -30888,10 +30086,8 @@ }, { "__Checksum": { - "Data1": 6309207251713304939, - "Data2": 5706588995251303339, - "Data3": 8079931379238761534, - "Data4": -2472352517839244159 + "Data1": -3623289656284254948, + "Data2": 6772464544336712979 }, "Flags": 0, "Kind": 0, @@ -30945,10 +30141,8 @@ }, { "__Checksum": { - "Data1": 7473485230551072832, - "Data2": 3905224702042286582, - "Data3": -2265515659528866798, - "Data4": 8063514983259211559 + "Data1": 6664198461993637333, + "Data2": 3250441863061976201 }, "Flags": 0, "Kind": 0, @@ -31096,10 +30290,8 @@ }, { "__Checksum": { - "Data1": -8462703092816629369, - "Data2": 2164452017034442897, - "Data3": 8992581760208884676, - "Data4": 7296507591503925006 + "Data1": 7781986121047052703, + "Data2": 7203740116332989985 }, "Flags": 0, "Kind": 0, @@ -31153,10 +30345,8 @@ }, { "__Checksum": { - "Data1": 9149890225191734406, - "Data2": 3409580729776703756, - "Data3": 7595678124624505290, - "Data4": -1043007871870818272 + "Data1": -1958305632534423371, + "Data2": -7306949451281144045 }, "Flags": 0, "Kind": 0, @@ -31210,10 +30400,8 @@ }, { "__Checksum": { - "Data1": 6948110172804488786, - "Data2": 8884036460326259805, - "Data3": 6847462989437572827, - "Data4": 4838057646277087954 + "Data1": -8499181844148750562, + "Data2": -3283383901959624793 }, "Flags": 0, "Kind": 0, @@ -31267,10 +30455,8 @@ }, { "__Checksum": { - "Data1": 7842298717845710416, - "Data2": 1949874887697781228, - "Data3": 5817793754098556297, - "Data4": -6462409339159933358 + "Data1": 2709757807324343939, + "Data2": 864853744004052373 }, "Flags": 0, "Kind": 0, @@ -31380,10 +30566,8 @@ }, { "__Checksum": { - "Data1": -562257009590113748, - "Data2": 2736809793536711912, - "Data3": 7816378708417263941, - "Data4": 5937741806325314702 + "Data1": 3053376461861343997, + "Data2": -545000259465458694 }, "Flags": 0, "Kind": 0, @@ -31524,10 +30708,8 @@ }, { "__Checksum": { - "Data1": 7485435876590726118, - "Data2": 8466661270806544285, - "Data3": -7728215618837792403, - "Data4": 3200349899481157903 + "Data1": 5835966179585092571, + "Data2": 8475026226441203113 }, "Flags": 0, "Kind": 0, @@ -31581,10 +30763,8 @@ }, { "__Checksum": { - "Data1": -2479935073419305275, - "Data2": -3617467839250469096, - "Data3": 2380094337993944590, - "Data4": 5755008858494789740 + "Data1": 1457291926255513976, + "Data2": 953352504645368654 }, "Flags": 0, "Kind": 0, @@ -31694,10 +30874,8 @@ }, { "__Checksum": { - "Data1": -5248954058131872853, - "Data2": 5777534277396008065, - "Data3": 5426507733913055568, - "Data4": -661500270370534462 + "Data1": -3272852791604087678, + "Data2": -5853126182934869515 }, "Flags": 0, "Kind": 0, @@ -31751,10 +30929,8 @@ }, { "__Checksum": { - "Data1": -6597802685847654077, - "Data2": -3673102020336783075, - "Data3": 2814049087242774552, - "Data4": 1103810500958164429 + "Data1": 184523620927621718, + "Data2": -7408739204569195991 }, "Flags": 0, "Kind": 0, @@ -31808,10 +30984,8 @@ }, { "__Checksum": { - "Data1": -5312673060240041927, - "Data2": 2950349264232714096, - "Data3": -183583296489026440, - "Data4": 5061562037541792132 + "Data1": -741994776153115415, + "Data2": -5837503230320254732 }, "Flags": 0, "Kind": 0, @@ -31851,10 +31025,8 @@ }, { "__Checksum": { - "Data1": 707093855251410691, - "Data2": 6699247347844727386, - "Data3": 8563124976141992879, - "Data4": 8443686902829579483 + "Data1": 1437727243589449702, + "Data2": -5777698323026926985 }, "Flags": 0, "Kind": 0, @@ -31894,10 +31066,8 @@ }, { "__Checksum": { - "Data1": 1960124321494429605, - "Data2": 3487912008285339863, - "Data3": -6720719646484953254, - "Data4": -4581205841579307548 + "Data1": 5792288735516067863, + "Data2": -7306597645853283520 }, "Flags": 0, "Kind": 0, @@ -31958,10 +31128,8 @@ }, { "__Checksum": { - "Data1": 4979609435558116430, - "Data2": -5577914025334365695, - "Data3": -2512007049661680318, - "Data4": -33955027484571960 + "Data1": -4909531022454975297, + "Data2": 113576980467727545 }, "Flags": 0, "Kind": 0, @@ -32008,10 +31176,8 @@ }, { "__Checksum": { - "Data1": 6671709974914967910, - "Data2": 755056304710024522, - "Data3": 6813905798381595862, - "Data4": -3053430095620440396 + "Data1": -3681522939575181105, + "Data2": 6970144669659784826 }, "Flags": 0, "Kind": 0, @@ -32121,10 +31287,8 @@ }, { "__Checksum": { - "Data1": 6579207881219832794, - "Data2": 750892557489795829, - "Data3": 8760090770078963424, - "Data4": 1010654062315622003 + "Data1": -5779610063065146149, + "Data2": 5442047472013531303 }, "Flags": 0, "Kind": 0, @@ -32178,10 +31342,8 @@ }, { "__Checksum": { - "Data1": -4585819998306094009, - "Data2": -7846164517624386317, - "Data3": 6699533863827590073, - "Data4": 2032082401619325394 + "Data1": 2903053184036770578, + "Data2": 4228111853684736559 }, "Flags": 0, "Kind": 0, @@ -32238,10 +31400,8 @@ }, { "__Checksum": { - "Data1": 5722133802931720195, - "Data2": -4270086195635431745, - "Data3": -2169739094402556666, - "Data4": 9060437804189200641 + "Data1": 4030279270351818931, + "Data2": 8802279535291503036 }, "Flags": 0, "Kind": 0, @@ -32295,10 +31455,8 @@ }, { "__Checksum": { - "Data1": -4228554948553578048, - "Data2": 25014495770690200, - "Data3": 8001349165849522089, - "Data4": -3044375769768802870 + "Data1": 8578959772120953423, + "Data2": 107183547449255951 }, "Flags": 0, "Kind": 0, @@ -32387,10 +31545,8 @@ }, { "__Checksum": { - "Data1": -65030532138900179, - "Data2": 95314330871014067, - "Data3": 1809109731502927281, - "Data4": -2108354397399163625 + "Data1": 4068604915547453096, + "Data2": -6463618434365534464 }, "Flags": 0, "Kind": 0, @@ -32423,10 +31579,8 @@ }, { "__Checksum": { - "Data1": 7087444872717724015, - "Data2": 7988952508225665312, - "Data3": -2145771035953367564, - "Data4": 7027274265181572405 + "Data1": -6074409988558679103, + "Data2": 5595496302829304777 }, "Flags": 0, "Kind": 0, @@ -32473,10 +31627,8 @@ }, { "__Checksum": { - "Data1": 1115880982975842423, - "Data2": -4950610626944498062, - "Data3": 5878544866674111964, - "Data4": 5626520888141445805 + "Data1": 2525582131257921421, + "Data2": 8740657280568166888 }, "Flags": 0, "Kind": 0, @@ -33078,10 +32230,8 @@ }, { "__Checksum": { - "Data1": 4355696146794945793, - "Data2": 8572277270405476446, - "Data3": -5901175682912615533, - "Data4": 7668641346935525040 + "Data1": 5961184063591630685, + "Data2": -8620934272363462793 }, "Flags": 0, "Kind": 0, @@ -33126,10 +32276,8 @@ }, { "__Checksum": { - "Data1": 5531542189665033857, - "Data2": 8293065857617649512, - "Data3": 2022807619573366001, - "Data4": -1635553207073990210 + "Data1": -748413105332439729, + "Data2": -6091481708662037970 }, "Flags": 0, "Kind": 0, @@ -33197,10 +32345,8 @@ }, { "__Checksum": { - "Data1": -8198266095456733728, - "Data2": 814602478398161541, - "Data3": -7333348096236426764, - "Data4": -6762986965088585087 + "Data1": -7222726977061317836, + "Data2": -1821392106625734285 }, "Flags": 0, "Kind": 0, @@ -33233,10 +32379,8 @@ }, { "__Checksum": { - "Data1": 742768774574413579, - "Data2": 2612307808209959970, - "Data3": -8484594436819071598, - "Data4": -7673503533688059403 + "Data1": -5501272945982216347, + "Data2": 4761706086165137616 }, "Flags": 0, "Kind": 0, @@ -33288,10 +32432,8 @@ }, { "__Checksum": { - "Data1": 8862147396612632671, - "Data2": 4330886826899830804, - "Data3": 8242977394324860704, - "Data4": -4248684948641413570 + "Data1": -5036986432588500792, + "Data2": -1393216263162999005 }, "Flags": 0, "Kind": 0, @@ -33331,10 +32473,8 @@ }, { "__Checksum": { - "Data1": -8361815956867032898, - "Data2": 8964591039024821629, - "Data3": 1976171722997630982, - "Data4": 909091630664293244 + "Data1": 6884236698276542073, + "Data2": -8674830448542838003 }, "Flags": 0, "Kind": 0, @@ -33388,10 +32528,8 @@ }, { "__Checksum": { - "Data1": -4382658627016848228, - "Data2": -3238228317074799426, - "Data3": -28458106527598061, - "Data4": 7842651957543971399 + "Data1": -6715197371077060064, + "Data2": -2212073236780110091 }, "Flags": 0, "Kind": 0, @@ -33492,10 +32630,8 @@ }, { "__Checksum": { - "Data1": -9020675667081378037, - "Data2": -7837917981903967712, - "Data3": -1323152345213347175, - "Data4": 5823520926460996342 + "Data1": 872795712631952948, + "Data2": -7073700981819106219 }, "Flags": 0, "Kind": 0, @@ -33549,10 +32685,8 @@ }, { "__Checksum": { - "Data1": -5247161581562618086, - "Data2": 146044543262221062, - "Data3": 4512032002979502916, - "Data4": -2862351182245804978 + "Data1": 4980769937370792884, + "Data2": 4707901693082148070 }, "Flags": 0, "Kind": 0, @@ -33599,10 +32733,8 @@ }, { "__Checksum": { - "Data1": -6174112732964357549, - "Data2": -7480577064648051602, - "Data3": -4160090305631487165, - "Data4": 5871610372545127612 + "Data1": 271703838264945719, + "Data2": -7886590597494851619 }, "Flags": 0, "Kind": 0, @@ -33656,10 +32788,8 @@ }, { "__Checksum": { - "Data1": -5535245183613361291, - "Data2": -4779489225573095047, - "Data3": -312686873729316813, - "Data4": 8233305058887338028 + "Data1": 5736533366924262606, + "Data2": 4642458884951091176 }, "Flags": 0, "Kind": 0, @@ -33713,10 +32843,8 @@ }, { "__Checksum": { - "Data1": 1839293578173049097, - "Data2": -8197983570764296008, - "Data3": 2370894160050756519, - "Data4": -1310444703903506473 + "Data1": 5088785897786395359, + "Data2": 2080145322788027048 }, "Flags": 0, "Kind": 0, @@ -33808,10 +32936,8 @@ }, { "__Checksum": { - "Data1": -2828317922814755461, - "Data2": -778393101232977790, - "Data3": -4794842006495205272, - "Data4": 5434553477794615411 + "Data1": 8489326421139238160, + "Data2": 8744475124320205179 }, "Flags": 0, "Kind": 0, @@ -34186,10 +33312,8 @@ }, { "__Checksum": { - "Data1": 4817201053376145942, - "Data2": 7056888229685829796, - "Data3": 1126012237553653004, - "Data4": -1065882536164438177 + "Data1": -2349611790595940295, + "Data2": -321599228405246882 }, "Flags": 0, "Kind": 0, @@ -34236,10 +33360,8 @@ }, { "__Checksum": { - "Data1": 384503180534743422, - "Data2": -6600352840780045600, - "Data3": 3136834341638129705, - "Data4": -601175266039775196 + "Data1": 5468369949509996547, + "Data2": 2250958256842574465 }, "Flags": 0, "Kind": 0, @@ -34293,10 +33415,8 @@ }, { "__Checksum": { - "Data1": 8297806173302848072, - "Data2": 4078193122582604416, - "Data3": 8208578727395509096, - "Data4": 1611604308566391322 + "Data1": -8646839000259429829, + "Data2": -522139113858026618 }, "Flags": 0, "Kind": 0, @@ -34350,10 +33470,8 @@ }, { "__Checksum": { - "Data1": 8626414478780767488, - "Data2": 5745933565645095028, - "Data3": -1221191801841758441, - "Data4": -8100425667427464118 + "Data1": -5690234156193882605, + "Data2": -935755255850840552 }, "Flags": 0, "Kind": 0, @@ -34457,10 +33575,8 @@ }, { "__Checksum": { - "Data1": 1174301973272897400, - "Data2": 4695307333860109729, - "Data3": -2161545863471203922, - "Data4": -7070009921384660016 + "Data1": 2638370492095692125, + "Data2": 1758587409444356368 }, "Flags": 0, "Kind": 0, @@ -34500,10 +33616,8 @@ }, { "__Checksum": { - "Data1": 6454555288440122001, - "Data2": 6725790596842289658, - "Data3": 4241257447959753380, - "Data4": 7696969968405512539 + "Data1": 2339968650531549995, + "Data2": 3925501399856273840 }, "Flags": 0, "Kind": 0, @@ -34557,10 +33671,8 @@ }, { "__Checksum": { - "Data1": -7379989291088751555, - "Data2": 1190896767117048850, - "Data3": 4142270531713726822, - "Data4": -7410715915633487969 + "Data1": 223418628950237956, + "Data2": 3642613993510089861 }, "Flags": 0, "Kind": 0, @@ -34722,10 +33834,8 @@ }, { "__Checksum": { - "Data1": -3796138101293972119, - "Data2": -8729921778899845976, - "Data3": 1402233376278520269, - "Data4": 7604591270461084001 + "Data1": -7086564469266973177, + "Data2": 4552419105027327651 }, "Flags": 0, "Kind": 0, @@ -34793,10 +33903,8 @@ }, { "__Checksum": { - "Data1": 8192339357975376622, - "Data2": 4280025929385525915, - "Data3": 5129545861610800637, - "Data4": 3683294452265512279 + "Data1": 8317785621509905030, + "Data2": -1485249687957875021 }, "Flags": 0, "Kind": 0, @@ -34843,10 +33951,8 @@ }, { "__Checksum": { - "Data1": -910505062360185458, - "Data2": 1297891029615069741, - "Data3": 283611281736000048, - "Data4": -7006739293620577024 + "Data1": 8644172618726148463, + "Data2": -5333780790271549626 }, "Flags": 0, "Kind": 0, @@ -34900,10 +34006,8 @@ }, { "__Checksum": { - "Data1": -2846490415178576156, - "Data2": -1173344041089520570, - "Data3": -1021180374916371770, - "Data4": 8308959156711876061 + "Data1": 70712506062683354, + "Data2": 1832535636208344777 }, "Flags": 0, "Kind": 0, @@ -35011,10 +34115,8 @@ }, { "__Checksum": { - "Data1": 7245645849629336799, - "Data2": -844512120491467875, - "Data3": 390802436991598274, - "Data4": 3511130688556124160 + "Data1": -4389317454019993857, + "Data2": 2251965696125542667 }, "Flags": 0, "Kind": 0, @@ -35061,10 +34163,8 @@ }, { "__Checksum": { - "Data1": -6411901714340353147, - "Data2": 1907347127914548697, - "Data3": 2964541697324704519, - "Data4": -8087576553447583118 + "Data1": 4075221472678101102, + "Data2": 8561211665542916310 }, "Flags": 0, "Kind": 0, @@ -35118,10 +34218,8 @@ }, { "__Checksum": { - "Data1": 8796401842725306627, - "Data2": 3972911014802169935, - "Data3": -7118312667032175504, - "Data4": -954243092707096651 + "Data1": -7360840078989610153, + "Data2": -2249595083695057165 }, "Flags": 0, "Kind": 0, @@ -35175,10 +34273,8 @@ }, { "__Checksum": { - "Data1": -120428537005985229, - "Data2": -1853248916190037990, - "Data3": 3903799075282357297, - "Data4": 1676868393346149675 + "Data1": 6234498104850048086, + "Data2": 9175089310823452814 }, "Flags": 0, "Kind": 0, @@ -35218,10 +34314,8 @@ }, { "__Checksum": { - "Data1": 3825113681201544268, - "Data2": 1004749337029957117, - "Data3": -2273514945728729152, - "Data4": 7243254687536268886 + "Data1": 4681829526532613362, + "Data2": 7936239527128616804 }, "Flags": 0, "Kind": 0, @@ -35367,10 +34461,8 @@ }, { "__Checksum": { - "Data1": -1964075189932855278, - "Data2": 327550648568476021, - "Data3": 4300103236236377244, - "Data4": -4332250246525276496 + "Data1": -3297479546917754788, + "Data2": -7926669976761824038 }, "Flags": 0, "Kind": 0, @@ -35424,10 +34516,8 @@ }, { "__Checksum": { - "Data1": 8074613945832826994, - "Data2": -5584652187538413983, - "Data3": -9153980968966235848, - "Data4": 6079795010745442720 + "Data1": -3004612208062320992, + "Data2": -1416696386291099660 }, "Flags": 0, "Kind": 0, @@ -35502,10 +34592,8 @@ }, { "__Checksum": { - "Data1": 5694266815648411023, - "Data2": -8607032016530266048, - "Data3": 6309025145073502386, - "Data4": -6450770414768996898 + "Data1": -8122457216684165116, + "Data2": -4225494188541912867 }, "Flags": 0, "Kind": 0, @@ -35566,10 +34654,8 @@ }, { "__Checksum": { - "Data1": -5000218969660591948, - "Data2": -4874806024537468103, - "Data3": -7251887463185771209, - "Data4": -7282425327376015873 + "Data1": 9033122828000418503, + "Data2": -9026661960346834873 }, "Flags": 0, "Kind": 0, @@ -35644,10 +34730,8 @@ }, { "__Checksum": { - "Data1": -3151886343537109151, - "Data2": -551864726300917953, - "Data3": -8260578113330742624, - "Data4": -8711957261261857180 + "Data1": 932268381883630594, + "Data2": -5737027939523357839 }, "Flags": 0, "Kind": 0, @@ -35715,10 +34799,8 @@ }, { "__Checksum": { - "Data1": 4807934746661831125, - "Data2": -4591510315704275849, - "Data3": -7180375446105327730, - "Data4": 6381130727214491705 + "Data1": 8736746797853938550, + "Data2": -3035744167582062226 }, "Flags": 0, "Kind": 0, @@ -35758,10 +34840,8 @@ }, { "__Checksum": { - "Data1": 2416717461224025383, - "Data2": 3903049560288887991, - "Data3": -835662520095487707, - "Data4": 1743630787401725693 + "Data1": -2730138132140819332, + "Data2": 624601548548190362 }, "Flags": 0, "Kind": 0, @@ -35822,10 +34902,8 @@ }, { "__Checksum": { - "Data1": -3194170730696853002, - "Data2": -3581593444368750092, - "Data3": -820379429840795686, - "Data4": -8806566918776972982 + "Data1": -1919160113159850495, + "Data2": 8126219074800815810 }, "Flags": 0, "Kind": 0, @@ -35872,10 +34950,8 @@ }, { "__Checksum": { - "Data1": -466982148722548487, - "Data2": 4975246844393797047, - "Data3": -207703575887309361, - "Data4": 6627807093959046763 + "Data1": 4097477663350264110, + "Data2": -3946301962439104912 }, "Flags": 0, "Kind": 0, @@ -35985,10 +35061,8 @@ }, { "__Checksum": { - "Data1": -4008539820932494983, - "Data2": -4699486338251857875, - "Data3": -8587535951247564717, - "Data4": -2921241901085710061 + "Data1": 3375814896660873604, + "Data2": -8755554015416104702 }, "Flags": 0, "Kind": 0, @@ -36042,10 +35116,8 @@ }, { "__Checksum": { - "Data1": -8995766559987518107, - "Data2": -3258208400582404848, - "Data3": -8441094001930243379, - "Data4": 6230357164073972943 + "Data1": 7883488817312133290, + "Data2": -6218631286788552358 }, "Flags": 0, "Kind": 0, @@ -36102,10 +35174,8 @@ }, { "__Checksum": { - "Data1": -5182291634972447740, - "Data2": -1909293573638113808, - "Data3": -7774549365795509971, - "Data4": -1438839418148789265 + "Data1": 3142983700831408630, + "Data2": 4831272524110755076 }, "Flags": 0, "Kind": 0, @@ -36152,10 +35222,8 @@ }, { "__Checksum": { - "Data1": -117852638099501469, - "Data2": -3916044742501806648, - "Data3": 2485777053178435444, - "Data4": -1564464807776487503 + "Data1": -1889613619190890198, + "Data2": 1302521493193755088 }, "Flags": 0, "Kind": 0, @@ -36209,10 +35277,8 @@ }, { "__Checksum": { - "Data1": 135228373851575151, - "Data2": 8955408850278948338, - "Data3": 280260890029290989, - "Data4": -5713225647523840226 + "Data1": -5234863031280168580, + "Data2": -3582997496996858540 }, "Flags": 0, "Kind": 0, @@ -36266,10 +35332,8 @@ }, { "__Checksum": { - "Data1": -5462375314583295086, - "Data2": -5232869453999271900, - "Data3": -7297475889699298364, - "Data4": -8887831931508584952 + "Data1": 269559646712767148, + "Data2": -4797220064953565939 }, "Flags": 0, "Kind": 0, @@ -36375,10 +35439,8 @@ }, { "__Checksum": { - "Data1": 7584089636884267160, - "Data2": -1530045680531715028, - "Data3": -5847088089428127491, - "Data4": -6425753675423763712 + "Data1": -8802736526217085010, + "Data2": 4542589212138483418 }, "Flags": 0, "Kind": 0, @@ -36432,10 +35494,8 @@ }, { "__Checksum": { - "Data1": -1158372562579951190, - "Data2": 1039872778714750756, - "Data3": -3062024598604847655, - "Data4": -7012791319660554135 + "Data1": 3511804107630872292, + "Data2": -2780302475477324817 }, "Flags": 0, "Kind": 0, @@ -36465,10 +35525,8 @@ }, { "__Checksum": { - "Data1": -6276777227062033072, - "Data2": 5885144003554943537, - "Data3": -6140880507185277919, - "Data4": -5600639546008759779 + "Data1": 2191843992281727274, + "Data2": -2838843596898677776 }, "Flags": 0, "Kind": 0, @@ -36644,10 +35702,8 @@ }, { "__Checksum": { - "Data1": 8199013573281055351, - "Data2": -5297189188855091169, - "Data3": 3472179047224436580, - "Data4": -4094722908071022731 + "Data1": 5570449653293723205, + "Data2": 4046921549887660847 }, "Flags": 0, "Kind": 0, @@ -36687,10 +35743,8 @@ }, { "__Checksum": { - "Data1": 5282277113465453854, - "Data2": 3761738127699381559, - "Data3": 6900912623191532317, - "Data4": -7333830849391781501 + "Data1": 5589820085985328048, + "Data2": -6363510560922154161 }, "Flags": 0, "Kind": 0, @@ -36737,10 +35791,8 @@ }, { "__Checksum": { - "Data1": -2290329431843994773, - "Data2": 7127021757774179389, - "Data3": 8821141411933951131, - "Data4": -1950328054678691443 + "Data1": 7072276082322028329, + "Data2": 7239379275780035073 }, "Flags": 0, "Kind": 0, @@ -36794,10 +35846,8 @@ }, { "__Checksum": { - "Data1": 6770534678920469637, - "Data2": -1129531027727432536, - "Data3": 2635840126247063783, - "Data4": -4439214138701619873 + "Data1": 7922107230557451223, + "Data2": -6785872205107477371 }, "Flags": 0, "Kind": 0, @@ -36851,10 +35901,8 @@ }, { "__Checksum": { - "Data1": 3329061725976081537, - "Data2": -5282294078709696424, - "Data3": -7870334703508244706, - "Data4": -3334627478639413023 + "Data1": -6345950480935017431, + "Data2": 7233107247402851967 }, "Flags": 0, "Kind": 0, @@ -36953,10 +36001,8 @@ }, { "__Checksum": { - "Data1": -4409942718580252867, - "Data2": 2536440428087765192, - "Data3": 1159942994061538023, - "Data4": 7826927450831415028 + "Data1": -7556203270781012086, + "Data2": -563519150765132366 }, "Flags": 0, "Kind": 0, @@ -37024,10 +36070,8 @@ }, { "__Checksum": { - "Data1": 4624497412927411667, - "Data2": -7462762606910315442, - "Data3": 6413330207251175832, - "Data4": 7172619188785866548 + "Data1": 6339704218722232916, + "Data2": -7955301754516128621 }, "Flags": 0, "Kind": 0, @@ -37074,10 +36118,8 @@ }, { "__Checksum": { - "Data1": 1873954330809360023, - "Data2": -3572095479732636925, - "Data3": 5112153752053518364, - "Data4": 4534445606069617148 + "Data1": 7459520516616707800, + "Data2": -5332132453140935991 }, "Flags": 0, "Kind": 0, @@ -37131,10 +36173,8 @@ }, { "__Checksum": { - "Data1": 8225027798411620482, - "Data2": -1687290280928402221, - "Data3": -3683439201632307279, - "Data4": 8624788917968926679 + "Data1": 4421602738621930742, + "Data2": 7776538287903633962 }, "Flags": 0, "Kind": 0, @@ -37242,10 +36282,8 @@ }, { "__Checksum": { - "Data1": -7914844288845000832, - "Data2": -809480840785065516, - "Data3": -2015847691176559412, - "Data4": 270824815051182956 + "Data1": -4349787386737492977, + "Data2": 3071879315012080867 }, "Flags": 0, "Kind": 0, @@ -37292,10 +36330,8 @@ }, { "__Checksum": { - "Data1": 7179985632129594488, - "Data2": -5996334716843832607, - "Data3": -9134217827700065758, - "Data4": -4091188037457430652 + "Data1": -8724478367428471257, + "Data2": -1305690002105152564 }, "Flags": 0, "Kind": 0, @@ -37356,10 +36392,8 @@ }, { "__Checksum": { - "Data1": -2403549270371298476, - "Data2": 2093703941419583987, - "Data3": 2068645162069006522, - "Data4": 3911205892211190147 + "Data1": 3616350356387256074, + "Data2": -1927538380082463925 }, "Flags": 0, "Kind": 0, @@ -37413,10 +36447,8 @@ }, { "__Checksum": { - "Data1": -1476368883500884236, - "Data2": -1986173941261693854, - "Data3": 1400099858048123521, - "Data4": 6450166955963953645 + "Data1": -298441273399949922, + "Data2": 3496462901530889582 }, "Flags": 0, "Kind": 0, @@ -37470,10 +36502,8 @@ }, { "__Checksum": { - "Data1": 1382828888471323262, - "Data2": 1999721998211034413, - "Data3": 3968442898182588185, - "Data4": -1640910114447873466 + "Data1": -5971398782258131817, + "Data2": -9049003921880602704 }, "Flags": 0, "Kind": 0, @@ -37513,10 +36543,8 @@ }, { "__Checksum": { - "Data1": 8658744351505834251, - "Data2": -5685236650627490115, - "Data3": 8504554968822141732, - "Data4": 5791328634534051657 + "Data1": -2783485061542809956, + "Data2": 2408235107528324844 }, "Flags": 0, "Kind": 0, @@ -37674,10 +36702,8 @@ }, { "__Checksum": { - "Data1": 1753053633170276693, - "Data2": -2531194518283577394, - "Data3": 4449152423517047517, - "Data4": 7882973562438456758 + "Data1": 5039998505182149663, + "Data2": 1420750923782575903 }, "Flags": 0, "Kind": 0, @@ -37731,10 +36757,8 @@ }, { "__Checksum": { - "Data1": 8496209920041063389, - "Data2": 6448814693983445097, - "Data3": -6480949652290434952, - "Data4": 3608791653804000520 + "Data1": 9092500780466923234, + "Data2": -1705225696883921746 }, "Flags": 0, "Kind": 0, @@ -37802,10 +36826,8 @@ }, { "__Checksum": { - "Data1": 5985318376326556269, - "Data2": 2882931076352878664, - "Data3": -3772040049737158724, - "Data4": -4984863393389319968 + "Data1": 833268413732135567, + "Data2": 6134038882799131205 }, "Flags": 0, "Kind": 0, @@ -37873,10 +36895,8 @@ }, { "__Checksum": { - "Data1": -4679135645778608502, - "Data2": 6710639024661319624, - "Data3": 9063217515387680630, - "Data4": 838463860577206874 + "Data1": -5283900951385749412, + "Data2": 8827544767127901950 }, "Flags": 0, "Kind": 0, @@ -37944,10 +36964,8 @@ }, { "__Checksum": { - "Data1": 4989958719906015059, - "Data2": 7769763396141392675, - "Data3": -7563869796019532195, - "Data4": 4730423219283907731 + "Data1": 7507851327287501570, + "Data2": 9220188478979841865 }, "Flags": 0, "Kind": 0, @@ -38015,10 +37033,8 @@ }, { "__Checksum": { - "Data1": -273078785922165729, - "Data2": -3220269578992839669, - "Data3": -3832917551069038608, - "Data4": -7866709968650988129 + "Data1": -5986005790663611720, + "Data2": -358986699776136351 }, "Flags": 0, "Kind": 0, @@ -38058,10 +37074,8 @@ }, { "__Checksum": { - "Data1": 7223194906076295166, - "Data2": 515997091592390889, - "Data3": -1235391990686930488, - "Data4": -2579194288623742616 + "Data1": 6266734173395565353, + "Data2": -2236987709302284256 }, "Flags": 0, "Kind": 0, @@ -38122,10 +37136,8 @@ }, { "__Checksum": { - "Data1": 3747376636909803553, - "Data2": -5251582808080159548, - "Data3": 5841434044192555437, - "Data4": -2772733443105338304 + "Data1": -3126638084498629250, + "Data2": 1698442332365741283 }, "Flags": 0, "Kind": 0, @@ -38172,10 +37184,8 @@ }, { "__Checksum": { - "Data1": -8651163405182474489, - "Data2": 1199855674816542894, - "Data3": 1446591017610115979, - "Data4": -6153540487148769725 + "Data1": 4938325112909539374, + "Data2": -7981049543920868883 }, "Flags": 0, "Kind": 0, @@ -38285,10 +37295,8 @@ }, { "__Checksum": { - "Data1": 751768156256460500, - "Data2": 3682454053375074624, - "Data3": -2737742603447845040, - "Data4": 1050641368617536144 + "Data1": -3514851005635975854, + "Data2": -4684316922143847339 }, "Flags": 0, "Kind": 0, @@ -38342,10 +37350,8 @@ }, { "__Checksum": { - "Data1": 1022254021236920522, - "Data2": 6098492101860099868, - "Data3": -1472753769390973893, - "Data4": -6888304377751231971 + "Data1": 5482477766473027042, + "Data2": -5594734392556576792 }, "Flags": 0, "Kind": 0, @@ -38402,10 +37408,8 @@ }, { "__Checksum": { - "Data1": -2246259115922929365, - "Data2": -5714788338180499347, - "Data3": 6186577583892146887, - "Data4": 6918322093841788474 + "Data1": 1658648120847365874, + "Data2": 3831644791016455998 }, "Flags": 0, "Kind": 0, @@ -38452,10 +37456,8 @@ }, { "__Checksum": { - "Data1": 8133152928744175922, - "Data2": 1476105454525813271, - "Data3": -8241223644043064156, - "Data4": 4115911532649319517 + "Data1": 4903284409208695627, + "Data2": -2962696887005732408 }, "Flags": 0, "Kind": 0, @@ -38509,10 +37511,8 @@ }, { "__Checksum": { - "Data1": 2107587453110092917, - "Data2": -4998367008439293286, - "Data3": 6916338735498565474, - "Data4": 1331460261785682176 + "Data1": 7992045924233217549, + "Data2": 5284648747952063501 }, "Flags": 0, "Kind": 0, @@ -38566,10 +37566,8 @@ }, { "__Checksum": { - "Data1": 4766364195189350993, - "Data2": 8814856481679629192, - "Data3": -3565222148790280097, - "Data4": -4384601562999065295 + "Data1": 5415933294777194593, + "Data2": 6366523156348655921 }, "Flags": 0, "Kind": 0, @@ -38675,10 +37673,8 @@ }, { "__Checksum": { - "Data1": -2508869610998404804, - "Data2": 4063471807045916232, - "Data3": -6892777110355512156, - "Data4": -7608127731931402028 + "Data1": -1053405271793527644, + "Data2": 1948889218952161394 }, "Flags": 0, "Kind": 0, @@ -38732,10 +37728,8 @@ }, { "__Checksum": { - "Data1": 8948713276561619918, - "Data2": 4039108083142140110, - "Data3": -5148085945570530443, - "Data4": 6871557203134075982 + "Data1": -7294655767031086085, + "Data2": 8630861749361242599 }, "Flags": 0, "Kind": 0, @@ -38765,10 +37759,8 @@ }, { "__Checksum": { - "Data1": 8730037922961179813, - "Data2": 9019642218240322875, - "Data3": 356718118097922826, - "Data4": 3197659770305059918 + "Data1": -8135875178689586504, + "Data2": -9200592397798266611 }, "Flags": 0, "Kind": 0, @@ -38958,10 +37950,8 @@ }, { "__Checksum": { - "Data1": -6127106353999535034, - "Data2": 8923338635812113068, - "Data3": -2367808146879126077, - "Data4": 3619623638070032404 + "Data1": -4621591689881722787, + "Data2": 5071949023637828008 }, "Flags": 0, "Kind": 0, @@ -39001,10 +37991,8 @@ }, { "__Checksum": { - "Data1": -3745738291516783062, - "Data2": -529869614501808735, - "Data3": -7887707924500244571, - "Data4": -8174082219434645842 + "Data1": -8969804071189589423, + "Data2": 7585437628126816514 }, "Flags": 0, "Kind": 0, @@ -39051,10 +38039,8 @@ }, { "__Checksum": { - "Data1": 5920014094231148248, - "Data2": -5364347683638669365, - "Data3": 3763463940201133007, - "Data4": -3444178230062391259 + "Data1": 4159979065338616065, + "Data2": -3115423883188450923 }, "Flags": 0, "Kind": 0, @@ -39108,10 +38094,8 @@ }, { "__Checksum": { - "Data1": 4503846411902222566, - "Data2": 8926577991197208621, - "Data3": 361891683438694921, - "Data4": 8548054051046936061 + "Data1": -2002512472735076682, + "Data2": 6921008619488306010 }, "Flags": 0, "Kind": 0, @@ -39165,10 +38149,8 @@ }, { "__Checksum": { - "Data1": 1608108931490461189, - "Data2": -9107173937929684536, - "Data3": -7721834802226050230, - "Data4": 1489654789093885783 + "Data1": 4501575008186698920, + "Data2": 5427309830021552941 }, "Flags": 0, "Kind": 0, @@ -39267,10 +38249,8 @@ }, { "__Checksum": { - "Data1": -4440473771774296204, - "Data2": 7311354704986233856, - "Data3": 6592791305223586956, - "Data4": -32297129296387151 + "Data1": -984107595328529470, + "Data2": -916375241664776189 }, "Flags": 0, "Kind": 0, @@ -39338,10 +38318,8 @@ }, { "__Checksum": { - "Data1": 7792602894599048492, - "Data2": 1060254847028105771, - "Data3": -5521135814662679922, - "Data4": -8580688773836345565 + "Data1": -2437991047082872614, + "Data2": 8847937063262238154 }, "Flags": 0, "Kind": 0, @@ -39388,10 +38366,8 @@ }, { "__Checksum": { - "Data1": -4341757370616625836, - "Data2": -6127198869227717548, - "Data3": 8204176372163354250, - "Data4": -5469824597263793162 + "Data1": 3253583145065170484, + "Data2": 4756255164190047061 }, "Flags": 0, "Kind": 0, @@ -39445,10 +38421,8 @@ }, { "__Checksum": { - "Data1": -4967798108497291799, - "Data2": -2670563123304499160, - "Data3": 4310426958208413915, - "Data4": 6377376167703913124 + "Data1": 3964942518969699553, + "Data2": 576535141520761076 }, "Flags": 0, "Kind": 0, @@ -39556,10 +38530,8 @@ }, { "__Checksum": { - "Data1": -8391114108657324146, - "Data2": -6793211976396706751, - "Data3": 3667800557222173726, - "Data4": 5793547099059558255 + "Data1": 2365152942508031602, + "Data2": -1301214348559261334 }, "Flags": 0, "Kind": 0, @@ -39606,10 +38578,8 @@ }, { "__Checksum": { - "Data1": -6230819681295381488, - "Data2": 8694596063998416218, - "Data3": -3828889371069360498, - "Data4": 867394223279308823 + "Data1": 6102508172467439662, + "Data2": 2038853462507438741 }, "Flags": 0, "Kind": 0, @@ -39670,10 +38640,8 @@ }, { "__Checksum": { - "Data1": 381641149744624183, - "Data2": 5963238093748985878, - "Data3": 295899217966002773, - "Data4": -1100897266389302494 + "Data1": -7626993864794623972, + "Data2": -8790159374239764358 }, "Flags": 0, "Kind": 0, @@ -39727,10 +38695,8 @@ }, { "__Checksum": { - "Data1": 4735696851220329388, - "Data2": 2589622147268050779, - "Data3": -3562346332725656292, - "Data4": 4621585439252003177 + "Data1": 1219941374721209592, + "Data2": 6043748514580274945 }, "Flags": 0, "Kind": 0, @@ -39784,10 +38750,8 @@ }, { "__Checksum": { - "Data1": 4545945351990335692, - "Data2": 1833172629912045817, - "Data3": -6735056377369112207, - "Data4": 4189780368589716211 + "Data1": -3102738329725495048, + "Data2": 5259691695686291368 }, "Flags": 0, "Kind": 0, @@ -39827,10 +38791,8 @@ }, { "__Checksum": { - "Data1": -4396765275833540551, - "Data2": -8141877761678091486, - "Data3": -3666848106381865880, - "Data4": 2367132917185154470 + "Data1": 6321967470590330525, + "Data2": -7143809851480539180 }, "Flags": 0, "Kind": 0, @@ -39988,10 +38950,8 @@ }, { "__Checksum": { - "Data1": -4476041210986591854, - "Data2": 5457462341269065785, - "Data3": -6577394848964397041, - "Data4": 9073552378535922767 + "Data1": -8504223094937379188, + "Data2": -7949553138259573831 }, "Flags": 0, "Kind": 0, @@ -40045,10 +39005,8 @@ }, { "__Checksum": { - "Data1": 330291243074322095, - "Data2": -9028983543454175631, - "Data3": 3299237213428903041, - "Data4": 3144877514941332513 + "Data1": 258420464780807304, + "Data2": -6097766532115653331 }, "Flags": 0, "Kind": 0, @@ -40116,10 +39074,8 @@ }, { "__Checksum": { - "Data1": -5064128421600872463, - "Data2": -4660789313955892554, - "Data3": -8155356166387587295, - "Data4": 7121473396579330892 + "Data1": 2968061501817021358, + "Data2": -3888584247885098200 }, "Flags": 0, "Kind": 0, @@ -40187,10 +39143,8 @@ }, { "__Checksum": { - "Data1": 1280631343407766174, - "Data2": 299453043542802421, - "Data3": 7081129536831500041, - "Data4": -5893505061616338864 + "Data1": 1683166619263795417, + "Data2": 8437332695855377368 }, "Flags": 0, "Kind": 0, @@ -40258,10 +39212,8 @@ }, { "__Checksum": { - "Data1": -4444876841264671701, - "Data2": 7412129381334753515, - "Data3": -7350656585231368894, - "Data4": -3463418558669300015 + "Data1": -4953183079135960014, + "Data2": -1889375118045426039 }, "Flags": 0, "Kind": 0, @@ -40329,10 +39281,8 @@ }, { "__Checksum": { - "Data1": 6226337571733592661, - "Data2": 1376183863356071010, - "Data3": 5696117881966659685, - "Data4": -2074695895261102235 + "Data1": -5002450388928674179, + "Data2": 3990430198224327476 }, "Flags": 0, "Kind": 0, @@ -40372,10 +39322,8 @@ }, { "__Checksum": { - "Data1": -2984201535497939034, - "Data2": 7564355407966990716, - "Data3": -7212262105681825497, - "Data4": -6219506474297083361 + "Data1": -41774807687101467, + "Data2": 5710193512155695863 }, "Flags": 0, "Kind": 0, @@ -40436,10 +39384,8 @@ }, { "__Checksum": { - "Data1": -352238705460669454, - "Data2": -5115660001922880164, - "Data3": -4533856679944653652, - "Data4": -6859913708955574758 + "Data1": -2269805086764390181, + "Data2": 9096013320688787117 }, "Flags": 0, "Kind": 0, @@ -40486,10 +39432,8 @@ }, { "__Checksum": { - "Data1": -5140781427415825653, - "Data2": 6886835668409381038, - "Data3": 9154559154415926435, - "Data4": 5480774566465865010 + "Data1": 3350615173853279643, + "Data2": 408859765493274971 }, "Flags": 0, "Kind": 0, @@ -40599,10 +39543,8 @@ }, { "__Checksum": { - "Data1": 2345548853535655630, - "Data2": -3297130813507142911, - "Data3": -3705979707366994103, - "Data4": 2866809105159071394 + "Data1": 4674038092326974789, + "Data2": -2170184587087549903 }, "Flags": 0, "Kind": 0, @@ -40656,10 +39598,8 @@ }, { "__Checksum": { - "Data1": 7376850026338105778, - "Data2": 8171304015480909288, - "Data3": 8240120438555863605, - "Data4": -81933907531393861 + "Data1": -5287431114114778102, + "Data2": 984673225258267972 }, "Flags": 0, "Kind": 0, @@ -40716,10 +39656,8 @@ }, { "__Checksum": { - "Data1": -1578211993147013049, - "Data2": -6415982404350933588, - "Data3": -6542391103190875613, - "Data4": -8534770964216222116 + "Data1": -4362927391302367476, + "Data2": -277861700021556084 }, "Flags": 0, "Kind": 0, @@ -40766,10 +39704,8 @@ }, { "__Checksum": { - "Data1": -196431290779439952, - "Data2": -5785668029127474626, - "Data3": -4930506829364737019, - "Data4": -8856689766311980706 + "Data1": -54321948178011118, + "Data2": 8992084053779268060 }, "Flags": 0, "Kind": 0, @@ -40823,10 +39759,8 @@ }, { "__Checksum": { - "Data1": 518353674160999691, - "Data2": -7074598291188522710, - "Data3": -5560717434128727057, - "Data4": -6337453957267913332 + "Data1": -5748210313977697701, + "Data2": 8085214017579007151 }, "Flags": 0, "Kind": 0, @@ -40880,10 +39814,8 @@ }, { "__Checksum": { - "Data1": -2212048229985003196, - "Data2": 2444335058963493823, - "Data3": -4007897096421364942, - "Data4": 394839723190969167 + "Data1": -122048113582750176, + "Data2": 6462579321906828882 }, "Flags": 0, "Kind": 0, @@ -40989,10 +39921,8 @@ }, { "__Checksum": { - "Data1": 210009780082434110, - "Data2": 3865650195120454629, - "Data3": -6093103422818378328, - "Data4": -4946931529386160956 + "Data1": 3574689301969554145, + "Data2": 9055408884567610678 }, "Flags": 0, "Kind": 0, @@ -41046,10 +39976,8 @@ }, { "__Checksum": { - "Data1": -6377314243006946888, - "Data2": -2364403593676389001, - "Data3": -4569805155832441749, - "Data4": -7354083238266804979 + "Data1": -3493595823120288958, + "Data2": 1566413416170127109 }, "Flags": 0, "Kind": 0, @@ -41079,10 +40007,8 @@ }, { "__Checksum": { - "Data1": 3506862527946929138, - "Data2": -3517858426461614089, - "Data3": 5069108253768293790, - "Data4": -4108317605196946212 + "Data1": 8842784476348315286, + "Data2": -4079098215980333301 }, "Flags": 0, "Kind": 0, @@ -41265,10 +40191,8 @@ }, { "__Checksum": { - "Data1": 1579017499426155778, - "Data2": 2393388598374557858, - "Data3": -5137729969970687385, - "Data4": 3984050442833739866 + "Data1": -4826684233566932353, + "Data2": 5605298349040829132 }, "Flags": 0, "Kind": 0, @@ -41298,10 +40222,8 @@ }, { "__Checksum": { - "Data1": -5993769351769084827, - "Data2": 8573007742990573018, - "Data3": -4314281547637209682, - "Data4": 6592240933099327158 + "Data1": -5120433570139520293, + "Data2": 3964890736093147978 }, "Flags": 0, "Kind": 0, @@ -41348,10 +40270,8 @@ }, { "__Checksum": { - "Data1": 1825638045484204425, - "Data2": -4849259302768147166, - "Data3": 6741637402829841569, - "Data4": -3338101189196634924 + "Data1": -2080836879397287826, + "Data2": -4953477100480981331 }, "Flags": 0, "Kind": 0, @@ -41405,10 +40325,8 @@ }, { "__Checksum": { - "Data1": -4359056268770630120, - "Data2": -7789744378202417619, - "Data3": -8099139361540792422, - "Data4": -815283708135322185 + "Data1": 1981845514721071037, + "Data2": -8334347376142151268 }, "Flags": 0, "Kind": 0, @@ -41462,10 +40380,8 @@ }, { "__Checksum": { - "Data1": -1077114713486080834, - "Data2": 8722137767738072701, - "Data3": 5735750228939261080, - "Data4": 4041114714620732955 + "Data1": -5280557470528430783, + "Data2": -228460782734408159 }, "Flags": 0, "Kind": 0, @@ -41564,10 +40480,8 @@ }, { "__Checksum": { - "Data1": -4830515265187650466, - "Data2": 8919588002736608097, - "Data3": 2542055156414519324, - "Data4": -3617661833749197924 + "Data1": -391732022356815522, + "Data2": 4905657150994276230 }, "Flags": 0, "Kind": 0, @@ -41614,10 +40528,8 @@ }, { "__Checksum": { - "Data1": 5615910511147372676, - "Data2": 4415822016621219608, - "Data3": -6035908628191763190, - "Data4": -4572266448163292620 + "Data1": -2700710263102475990, + "Data2": 1206650169171169395 }, "Flags": 0, "Kind": 0, @@ -41664,10 +40576,8 @@ }, { "__Checksum": { - "Data1": 7773433041416612215, - "Data2": -449366979359843189, - "Data3": 4629494043399819591, - "Data4": -8566140841236701417 + "Data1": -5754790480212836097, + "Data2": 6523547154523646158 }, "Flags": 0, "Kind": 0, @@ -41718,10 +40628,8 @@ }, { "__Checksum": { - "Data1": -8359001405283151657, - "Data2": 8128112443525502269, - "Data3": 1047483932484553619, - "Data4": 2243340234221491850 + "Data1": 2183839105612072129, + "Data2": 30864699168015708 }, "Flags": 0, "Kind": 0, @@ -41768,10 +40676,8 @@ }, { "__Checksum": { - "Data1": 7113696007641183427, - "Data2": 4533068016450813808, - "Data3": 4545400655773638213, - "Data4": 1843089374257200595 + "Data1": -16104289318900592, + "Data2": -8582859390560801026 }, "Flags": 0, "Kind": 0, @@ -41883,10 +40789,8 @@ }, { "__Checksum": { - "Data1": -8256348581920911124, - "Data2": 6921380337117831790, - "Data3": 6512173774109440866, - "Data4": -4430825680045626228 + "Data1": 2148983538838241069, + "Data2": -408079977715828584 }, "Flags": 0, "Kind": 0, @@ -41945,10 +40849,8 @@ }, { "__Checksum": { - "Data1": -4304242373790836000, - "Data2": -561634160535898623, - "Data3": -2769340033747505032, - "Data4": 6994292614925886512 + "Data1": -4704268513818484046, + "Data2": -3477045374471701561 }, "Flags": 0, "Kind": 0, @@ -41995,10 +40897,8 @@ }, { "__Checksum": { - "Data1": -5745359721708579953, - "Data2": -1154354018277753675, - "Data3": 8581397858404274651, - "Data4": 3966264920225891474 + "Data1": 4626355984340021467, + "Data2": 7049909886370903612 }, "Flags": 0, "Kind": 0, @@ -42028,10 +40928,8 @@ }, { "__Checksum": { - "Data1": 7879627541028128562, - "Data2": 7642479346639160896, - "Data3": -5144422339809762199, - "Data4": 2629089271090970431 + "Data1": 3142862953985232129, + "Data2": 4277343668188672271 }, "Flags": 0, "Kind": 0, @@ -42083,10 +40981,8 @@ }, { "__Checksum": { - "Data1": 7466285188820455239, - "Data2": 3291874323983480457, - "Data3": 5225235056685052644, - "Data4": -9169042024938076756 + "Data1": 3095250885942251336, + "Data2": -5111528646996100946 }, "Flags": 0, "Kind": 0, @@ -42126,10 +41022,8 @@ }, { "__Checksum": { - "Data1": -8727550165834033190, - "Data2": 9105745861658942420, - "Data3": -7591785384182072091, - "Data4": 921778375708372845 + "Data1": -641094158454915373, + "Data2": -5159472552708097243 }, "Flags": 0, "Kind": 0, @@ -42244,10 +41138,8 @@ }, { "__Checksum": { - "Data1": -3312060188080931995, - "Data2": -7932871652075058815, - "Data3": 5563830958740441801, - "Data4": 4227772127995714854 + "Data1": 2673071844576721605, + "Data2": 6787677995123483811 }, "Flags": 0, "Kind": 0, @@ -42317,10 +41209,8 @@ }, { "__Checksum": { - "Data1": -2078410820486288139, - "Data2": 4693846827482139259, - "Data3": 8735412321720305569, - "Data4": -8624281947113168501 + "Data1": 3505562368887947718, + "Data2": -5705584951337702348 }, "Flags": 0, "Kind": 0, @@ -42355,10 +41245,8 @@ }, { "__Checksum": { - "Data1": 7139003970956737905, - "Data2": -7201186809288240634, - "Data3": -4583575676063984967, - "Data4": -1423701927727681622 + "Data1": -698084329609834601, + "Data2": -3249713340286710326 }, "Flags": 0, "Kind": 0, @@ -42492,10 +41380,8 @@ }, { "__Checksum": { - "Data1": -1047695412506784761, - "Data2": 3741443652739380895, - "Data3": 3699118537027941423, - "Data4": -2713024240955392494 + "Data1": -8108543451866185230, + "Data2": 6499623571817237576 }, "Flags": 0, "Kind": 0, @@ -42675,10 +41561,8 @@ }, { "__Checksum": { - "Data1": -8478562275819613921, - "Data2": -4197323379895898119, - "Data3": 2205783189917592487, - "Data4": 1850930537274768697 + "Data1": 5548623116559548502, + "Data2": 8900672051406490065 }, "Flags": 0, "Kind": 0, @@ -42762,10 +41646,8 @@ }, { "__Checksum": { - "Data1": -5855193408092412615, - "Data2": -7100947405920905563, - "Data3": -5398007574088591116, - "Data4": -7940532568214175440 + "Data1": 5700371259305430284, + "Data2": -3051063946683857360 }, "Flags": 0, "Kind": 0, @@ -42795,10 +41677,8 @@ }, { "__Checksum": { - "Data1": 5816271254672701881, - "Data2": 7907933564686406450, - "Data3": 8091920205786528772, - "Data4": -1275166819695510903 + "Data1": -8992900836059971395, + "Data2": -3842297415707634810 }, "Flags": 0, "Kind": 0, @@ -42913,10 +41793,8 @@ }, { "__Checksum": { - "Data1": -6617008685586343429, - "Data2": -2236735698075516096, - "Data3": -2627229996602094623, - "Data4": -5447611853516230784 + "Data1": -3127000202225862538, + "Data2": 4007144076062431862 }, "Flags": 0, "Kind": 0, @@ -42963,10 +41841,8 @@ }, { "__Checksum": { - "Data1": -3380066313494511908, - "Data2": -8346045583411278141, - "Data3": -5613998331002763260, - "Data4": -5208306331729091697 + "Data1": 6315930945841751511, + "Data2": 1643115538314324736 }, "Flags": 0, "Kind": 0, @@ -42996,10 +41872,8 @@ }, { "__Checksum": { - "Data1": 7170541472695662861, - "Data2": 8190205741111206418, - "Data3": 820865069233126961, - "Data4": -2783036513175869490 + "Data1": -8340435657153319426, + "Data2": -7887104879693173195 }, "Flags": 0, "Kind": 0, @@ -43053,10 +41927,8 @@ }, { "__Checksum": { - "Data1": -17558100259488508, - "Data2": -2659980065488230374, - "Data3": -3411075841603062162, - "Data4": 5636267907711699350 + "Data1": -60120264133047896, + "Data2": -7550248582921042981 }, "Flags": 0, "Kind": 0, @@ -43110,10 +41982,8 @@ }, { "__Checksum": { - "Data1": -2689928927056954874, - "Data2": 2934965302221637483, - "Data3": 1752734309178694382, - "Data4": 8917264861906357039 + "Data1": -2259802649129387965, + "Data2": -4954429909638637902 }, "Flags": 0, "Kind": 0, @@ -43172,10 +42042,8 @@ }, { "__Checksum": { - "Data1": -8401996994571300061, - "Data2": -908789690441584171, - "Data3": 6375107346914027466, - "Data4": 8419163067193471374 + "Data1": 6507911323814578832, + "Data2": -904112969312173267 }, "Flags": 0, "Kind": 0, @@ -43229,10 +42097,8 @@ }, { "__Checksum": { - "Data1": 2059820188113737515, - "Data2": -5911504455686327052, - "Data3": -7052920551417507472, - "Data4": -6176648302260331894 + "Data1": 7833053380541965900, + "Data2": -6779869999962259217 }, "Flags": 0, "Kind": 0, @@ -43286,10 +42152,8 @@ }, { "__Checksum": { - "Data1": 8608907678830685547, - "Data2": -5065497801401261717, - "Data3": -116022139513871993, - "Data4": -7069202638572260538 + "Data1": -334377027007082725, + "Data2": -489850176998109645 }, "Flags": 0, "Kind": 0, @@ -43343,10 +42207,8 @@ }, { "__Checksum": { - "Data1": 1541468244493005809, - "Data2": 6281257109615033314, - "Data3": -7084509199977756172, - "Data4": -9150900891610215786 + "Data1": -504946245238076660, + "Data2": 6497962929603970059 }, "Flags": 0, "Kind": 0, @@ -43459,10 +42321,8 @@ }, { "__Checksum": { - "Data1": 1739249340114868453, - "Data2": -8633583418302072888, - "Data3": 2049346816504936106, - "Data4": -4148044579671410924 + "Data1": -1337811607278144170, + "Data2": 9042997214563244365 }, "Flags": 0, "Kind": 0, @@ -43516,10 +42376,8 @@ }, { "__Checksum": { - "Data1": 7694554824302010049, - "Data2": -9109152594474323904, - "Data3": 4526233217412732108, - "Data4": 1146430638118393359 + "Data1": -5730840039673170065, + "Data2": -3230210534866822795 }, "Flags": 0, "Kind": 0, @@ -43573,10 +42431,8 @@ }, { "__Checksum": { - "Data1": -3112454522148958790, - "Data2": -5514629473397213961, - "Data3": -2055582729814465320, - "Data4": -536742176553530495 + "Data1": -3894039242615933910, + "Data2": 6835905165777636016 }, "Flags": 0, "Kind": 0, @@ -43682,10 +42538,8 @@ }, { "__Checksum": { - "Data1": 3400952826343417765, - "Data2": 2400585394037616980, - "Data3": -8436313477905228543, - "Data4": 1337552207947604330 + "Data1": 7981646271177148614, + "Data2": -1053579388110072808 }, "Flags": 0, "Kind": 0, @@ -43824,10 +42678,8 @@ }, { "__Checksum": { - "Data1": -4153581960003976864, - "Data2": -8638268319105048375, - "Data3": 753520377305801954, - "Data4": -8653493283765743022 + "Data1": 5742281881951375025, + "Data2": -2201344561059339355 }, "Flags": 0, "Kind": 0, @@ -43874,10 +42726,8 @@ }, { "__Checksum": { - "Data1": 7352662148845798886, - "Data2": 3887316380506437840, - "Data3": -1916570238510892635, - "Data4": -3956967382948356803 + "Data1": 8835604174859662225, + "Data2": 5387505864062093256 }, "Flags": 0, "Kind": 0, @@ -43907,10 +42757,8 @@ }, { "__Checksum": { - "Data1": -5648136691277697555, - "Data2": 7028403150921644275, - "Data3": -4755694736008939734, - "Data4": 3447598454475780373 + "Data1": 1670750462546378308, + "Data2": -5951715916038315217 }, "Flags": 0, "Kind": 0, @@ -44067,10 +42915,8 @@ }, { "__Checksum": { - "Data1": -3533725767787887716, - "Data2": 3539223838521390257, - "Data3": -8068119307679691933, - "Data4": -698480313187760413 + "Data1": -3049499754564578487, + "Data2": -4781528891044974199 }, "Flags": 0, "Kind": 0, @@ -44110,10 +42956,8 @@ }, { "__Checksum": { - "Data1": 4296741609931365714, - "Data2": -7005743595949138615, - "Data3": 26639441310123891, - "Data4": -2848536927637050481 + "Data1": 8328684291235692089, + "Data2": -581639461544474964 }, "Flags": 0, "Kind": 0, @@ -44202,10 +43046,8 @@ }, { "__Checksum": { - "Data1": 3330728968128594177, - "Data2": -276879213537612002, - "Data3": 6442839840392795924, - "Data4": 2235489884710897619 + "Data1": 8131781021388608373, + "Data2": 600499032454807747 }, "Flags": 0, "Kind": 0, @@ -44323,10 +43165,8 @@ }, { "__Checksum": { - "Data1": 5383327590529803620, - "Data2": 1790509077852839862, - "Data3": 8623062452798836414, - "Data4": 3226151796702397162 + "Data1": -5861740835352400126, + "Data2": 4285352643107340582 }, "Flags": 0, "Kind": 0, @@ -44433,10 +43273,8 @@ }, { "__Checksum": { - "Data1": -5552764959212535107, - "Data2": -3739725647781632083, - "Data3": -1432928268142459627, - "Data4": 2493899272358212740 + "Data1": -5224363795006833477, + "Data2": -8159562129026553786 }, "Flags": 0, "Kind": 0, @@ -44476,10 +43314,8 @@ }, { "__Checksum": { - "Data1": -5525755619569681130, - "Data2": 4279641353581532859, - "Data3": 6599980003625168466, - "Data4": 1545893220434999902 + "Data1": -2294608631525670373, + "Data2": -1189203195484439919 }, "Flags": 0, "Kind": 0, @@ -44519,10 +43355,8 @@ }, { "__Checksum": { - "Data1": -6385209024000142512, - "Data2": -621634657990093972, - "Data3": 2074917850893114594, - "Data4": 7607263074172145404 + "Data1": 3886961774687610079, + "Data2": 3672719891388290642 }, "Flags": 0, "Kind": 0, @@ -44659,10 +43493,8 @@ }, { "__Checksum": { - "Data1": 7735361695905761155, - "Data2": 1314662044812889058, - "Data3": -2293231316763893404, - "Data4": -7941406429815932351 + "Data1": 5183712149682121226, + "Data2": -9064205404122298682 }, "Flags": 0, "Kind": 0, @@ -44898,10 +43730,8 @@ }, { "__Checksum": { - "Data1": -5728472243705357853, - "Data2": 7782353527473461154, - "Data3": 5001314562068875056, - "Data4": 3446905227897830855 + "Data1": 4601582977527193940, + "Data2": 873137207820709608 }, "Flags": 0, "Kind": 0, @@ -44947,10 +43777,8 @@ }, { "__Checksum": { - "Data1": -1922374722556370837, - "Data2": -2727689075840458611, - "Data3": -1642740421181207552, - "Data4": 5739569918391343145 + "Data1": -1958250723257804673, + "Data2": 3743455610112413999 }, "Flags": 0, "Kind": 0, @@ -45001,10 +43829,8 @@ }, { "__Checksum": { - "Data1": -4716760575420694872, - "Data2": 4501689229543543063, - "Data3": -7101670193529419663, - "Data4": 6018326394783883672 + "Data1": -1117232309788629146, + "Data2": -7427395050534946006 }, "Flags": 0, "Kind": 0, @@ -45051,10 +43877,8 @@ }, { "__Checksum": { - "Data1": -7545176144847845163, - "Data2": 201725002001319407, - "Data3": 7569753581794535489, - "Data4": 4321710128219789126 + "Data1": 3492518630138016731, + "Data2": 4716148502290817630 }, "Flags": 0, "Kind": 0, @@ -45100,10 +43924,8 @@ }, { "__Checksum": { - "Data1": 5987489719611172847, - "Data2": 2569404454276944891, - "Data3": 8734931538853291465, - "Data4": -1098774973103997975 + "Data1": 1631869402049901841, + "Data2": 8369990421127457723 }, "Flags": 0, "Kind": 0, @@ -45198,10 +44020,8 @@ }, { "__Checksum": { - "Data1": -4260356657794759978, - "Data2": -8807049103750965878, - "Data3": -7551103768224625076, - "Data4": 7885947058226247076 + "Data1": 7904490271631503214, + "Data2": 7893795695387562286 }, "Flags": 0, "Kind": 0, @@ -45718,10 +44538,8 @@ }, { "__Checksum": { - "Data1": 9070807709969247433, - "Data2": -7545944002837432425, - "Data3": -6044848545965575564, - "Data4": 2566768570189401982 + "Data1": -2206085642648703372, + "Data2": 9113486913820759230 }, "Flags": 0, "Kind": 0, @@ -45781,10 +44599,8 @@ }, { "__Checksum": { - "Data1": 5905486753825926331, - "Data2": -140331708144057122, - "Data3": -8800470508319438348, - "Data4": -1014116636868416128 + "Data1": 2251640811704128026, + "Data2": 8301591857898073239 }, "Flags": 0, "Kind": 0, @@ -45824,10 +44640,8 @@ }, { "__Checksum": { - "Data1": 1805383308654726667, - "Data2": 7285997122871647174, - "Data3": 7258009754573995834, - "Data4": 5620667304454602335 + "Data1": 909845183113015707, + "Data2": 3243571841589914030 }, "Flags": 0, "Kind": 0, @@ -45867,10 +44681,8 @@ }, { "__Checksum": { - "Data1": 6250356946553309322, - "Data2": -4528197665740816638, - "Data3": 7964570611717174009, - "Data4": 4073015980796164662 + "Data1": 204084632956973882, + "Data2": 2644198441339242591 }, "Flags": 0, "Kind": 0, @@ -45915,10 +44727,8 @@ }, { "__Checksum": { - "Data1": -9195699655599509485, - "Data2": -6819373692780001950, - "Data3": -4192035181532156419, - "Data4": 501580685386232565 + "Data1": -2297108072745527407, + "Data2": 8708079668353115265 }, "Flags": 0, "Kind": 0, @@ -45977,10 +44787,8 @@ }, { "__Checksum": { - "Data1": -152287863744827422, - "Data2": 365696123336247296, - "Data3": -5125578050630913227, - "Data4": -7087531712060098473 + "Data1": -7663519630400489155, + "Data2": -6739160512550481188 }, "Flags": 0, "Kind": 0, @@ -46002,10 +44810,8 @@ }, { "__Checksum": { - "Data1": 8917545606039570992, - "Data2": -7141058998007744263, - "Data3": -4015204760947540162, - "Data4": 3500353163358304410 + "Data1": -1464120528248379744, + "Data2": -8038377722076947813 }, "Flags": 0, "Kind": 0, @@ -46071,10 +44877,8 @@ }, { "__Checksum": { - "Data1": 4643219491436759158, - "Data2": -278153531270344851, - "Data3": -5697628441414794171, - "Data4": -6651335249337187394 + "Data1": -2941116064853055841, + "Data2": 704167401955407387 }, "Flags": 0, "Kind": 0, @@ -46121,10 +44925,8 @@ }, { "__Checksum": { - "Data1": -2657182471460087204, - "Data2": -925076281289457807, - "Data3": -1780115645311920015, - "Data4": 3036241178415980379 + "Data1": 536654089621614899, + "Data2": 8557358864176566186 }, "Flags": 0, "Kind": 0, @@ -46171,10 +44973,8 @@ }, { "__Checksum": { - "Data1": 1757144171164722347, - "Data2": -5189205487941341471, - "Data3": 6678211214858892542, - "Data4": -1531544720390205215 + "Data1": -6285973157646629005, + "Data2": -5960182329750825437 }, "Flags": 0, "Kind": 0, @@ -46205,10 +45005,8 @@ }, { "__Checksum": { - "Data1": -2241488911557853255, - "Data2": -7591461612403293119, - "Data3": 7397007808056915220, - "Data4": -1929737533122834012 + "Data1": 5148579232828942414, + "Data2": -6044385505707528011 }, "Flags": 0, "Kind": 0, @@ -46295,10 +45093,8 @@ }, { "__Checksum": { - "Data1": 1223447479104347522, - "Data2": 9223223072320487631, - "Data3": -340802595354311602, - "Data4": 4997793491412766942 + "Data1": 5566366371137015574, + "Data2": 4515963056041857734 }, "Flags": 0, "Kind": 0, @@ -46350,10 +45146,8 @@ }, { "__Checksum": { - "Data1": 8864359801011334074, - "Data2": -5251020058671828841, - "Data3": -5562260425820086367, - "Data4": 5470078924590728220 + "Data1": -4279815178520706722, + "Data2": -1583195580611486405 }, "Flags": 0, "Kind": 0, @@ -46400,10 +45194,8 @@ }, { "__Checksum": { - "Data1": 7689269432508655642, - "Data2": 3733045910650526329, - "Data3": -7196418371594126946, - "Data4": -1573101225396797202 + "Data1": -6472286997443808268, + "Data2": -6418622248532245477 }, "Flags": 0, "Kind": 0, @@ -46450,10 +45242,8 @@ }, { "__Checksum": { - "Data1": 7016086856451777558, - "Data2": -4317869108099326338, - "Data3": 2499706391886199244, - "Data4": 8553704223433224499 + "Data1": 1859347541122520753, + "Data2": -3070504301490783950 }, "Flags": 0, "Kind": 0, @@ -46498,10 +45288,8 @@ }, { "__Checksum": { - "Data1": -8018366069265798032, - "Data2": 3789821269081801859, - "Data3": 2785636197326630322, - "Data4": 5165762075673147898 + "Data1": -9221579878350035927, + "Data2": -8524888405763278940 }, "Flags": 0, "Kind": 0, @@ -46541,10 +45329,8 @@ }, { "__Checksum": { - "Data1": 1661556048722003206, - "Data2": -1304601250330912864, - "Data3": 503390311188278175, - "Data4": 3347420779668972916 + "Data1": -5399464064216829681, + "Data2": -2131659137248070913 }, "Flags": 0, "Kind": 0, @@ -46780,10 +45566,8 @@ }, { "__Checksum": { - "Data1": -8461744988675178228, - "Data2": 8210665540647083546, - "Data3": 7148158585238700490, - "Data4": 6215573119513931511 + "Data1": -5054109350161359831, + "Data2": -1683967684035932400 }, "Flags": 0, "Kind": 0, @@ -46823,10 +45607,8 @@ }, { "__Checksum": { - "Data1": -5443960465500760103, - "Data2": 3741242861111624615, - "Data3": 259356641025920187, - "Data4": -2754540235281634419 + "Data1": -3264816411228192212, + "Data2": 2807036934892649626 }, "Flags": 0, "Kind": 0, @@ -46899,10 +45681,8 @@ }, { "__Checksum": { - "Data1": -1546761717315135702, - "Data2": -8729968450005369923, - "Data3": 5511799651550262967, - "Data4": 6318571413739916150 + "Data1": -5253523374422191977, + "Data2": 256796362062841403 }, "Flags": 0, "Kind": 0, @@ -46970,10 +45750,8 @@ }, { "__Checksum": { - "Data1": -3373346508967764212, - "Data2": 6339808126570345098, - "Data3": 3848621996488889743, - "Data4": 8359349354733977869 + "Data1": 1643072031288490594, + "Data2": 3865681362544306062 }, "Flags": 0, "Kind": 0, @@ -47070,10 +45848,8 @@ }, { "__Checksum": { - "Data1": 4496961311093135278, - "Data2": 1384259502942978559, - "Data3": 8799799082252960370, - "Data4": 8705086146877244826 + "Data1": -7748594425008504739, + "Data2": 1977083754715910111 }, "Flags": 0, "Kind": 0, @@ -47103,10 +45879,8 @@ }, { "__Checksum": { - "Data1": -9209457954825600231, - "Data2": 9006846821491854187, - "Data3": -1025518518378774641, - "Data4": -5942098561123481900 + "Data1": -716576238096641797, + "Data2": 8167112409385313047 }, "Flags": 0, "Kind": 0, @@ -47160,10 +45934,8 @@ }, { "__Checksum": { - "Data1": 7613981010542893838, - "Data2": 3210830576394696413, - "Data3": -2539783903591360290, - "Data4": -7734163043485484344 + "Data1": -7377237697337217461, + "Data2": 1809079809273129672 }, "Flags": 0, "Kind": 0, @@ -47236,10 +46008,8 @@ }, { "__Checksum": { - "Data1": -3860330331242198097, - "Data2": 4766386669960127505, - "Data3": -6432883630690192614, - "Data4": -7935803243976187972 + "Data1": 4127720569744650257, + "Data2": -1803947757268224395 }, "Flags": 0, "Kind": 0, @@ -47269,10 +46039,8 @@ }, { "__Checksum": { - "Data1": 1765275829491946892, - "Data2": 8386469732436286611, - "Data3": -2899323353924570466, - "Data4": -212909077512140769 + "Data1": -8036211818469616176, + "Data2": -2562126597179521786 }, "Flags": 0, "Kind": 0, @@ -47354,10 +46122,8 @@ }, { "__Checksum": { - "Data1": -192174626234904842, - "Data2": 4494632051820047586, - "Data3": -8630938721021374756, - "Data4": 2896323713460613454 + "Data1": 5801998246728180604, + "Data2": 3959544271916035613 }, "Flags": 0, "Kind": 0, @@ -47418,10 +46184,8 @@ }, { "__Checksum": { - "Data1": -206059440562076847, - "Data2": -266260753402216155, - "Data3": 9014122771007684807, - "Data4": 4395340683854473047 + "Data1": -8907212180281271548, + "Data2": -1137609233974413247 }, "Flags": 0, "Kind": 0, @@ -47468,10 +46232,8 @@ }, { "__Checksum": { - "Data1": 4713265184135491640, - "Data2": -7212974131866596061, - "Data3": -6310984794203741196, - "Data4": -1564051325141556995 + "Data1": 917123525146010163, + "Data2": 1649800860273489342 }, "Flags": 0, "Kind": 0, @@ -47517,10 +46279,8 @@ }, { "__Checksum": { - "Data1": 3598478801875541905, - "Data2": 8301780757959984284, - "Data3": 6738414720176522061, - "Data4": 2970018109858605390 + "Data1": -8010473524191650067, + "Data2": 7905932671683220710 }, "Flags": 0, "Kind": 0, @@ -47673,10 +46433,8 @@ }, { "__Checksum": { - "Data1": -58580272041574511, - "Data2": -2686056209720883167, - "Data3": -465594588407322254, - "Data4": 366345736202796763 + "Data1": 4688182280568223409, + "Data2": 2277637785081852329 }, "Flags": 0, "Kind": 0, @@ -47723,10 +46481,8 @@ }, { "__Checksum": { - "Data1": 6495781601479227871, - "Data2": 8484465575011007659, - "Data3": 2581589422241679862, - "Data4": -2748581881704945247 + "Data1": -5156702682311377326, + "Data2": -8343353615428612415 }, "Flags": 0, "Kind": 0, @@ -47811,10 +46567,8 @@ }, { "__Checksum": { - "Data1": 5777626408228977327, - "Data2": 2330866467370955483, - "Data3": -7083394413304615562, - "Data4": 2603902820056148660 + "Data1": 5649923079240263799, + "Data2": 7892398451658029158 }, "Flags": 0, "Kind": 0, @@ -48199,10 +46953,8 @@ }, { "__Checksum": { - "Data1": 3113811219273170549, - "Data2": 8271199795152436697, - "Data3": -267193934812837067, - "Data4": 1763424760721496967 + "Data1": 4732406907671958831, + "Data2": -6778392433617877391 }, "Flags": 0, "Kind": 0, @@ -48279,10 +47031,8 @@ }, { "__Checksum": { - "Data1": -6406287533804253598, - "Data2": -3873433423272696477, - "Data3": 7262342955487989189, - "Data4": 5036870336606978949 + "Data1": -8052119897345394705, + "Data2": -9164691285449966094 }, "Flags": 0, "Kind": 0, @@ -48359,10 +47109,8 @@ }, { "__Checksum": { - "Data1": 3067271628493402515, - "Data2": -2843804049028992106, - "Data3": 2238835453695668054, - "Data4": 6541854717671673991 + "Data1": -2640498989559796156, + "Data2": 7774718405629446929 }, "Flags": 0, "Kind": 0, @@ -48439,10 +47187,8 @@ }, { "__Checksum": { - "Data1": 5553726310743685641, - "Data2": 3282604464927073945, - "Data3": -1675237998259133029, - "Data4": 1290878668405930256 + "Data1": 7895052297445815035, + "Data2": -6930725414656263348 }, "Flags": 0, "Kind": 0, @@ -48601,10 +47347,8 @@ }, { "__Checksum": { - "Data1": 2861058637564855427, - "Data2": 773712365459647219, - "Data3": -4875545210967277167, - "Data4": 3952242931885269152 + "Data1": -2125782070480546205, + "Data2": -4025637598122658341 }, "Flags": 0, "Kind": 0, @@ -48681,10 +47425,8 @@ }, { "__Checksum": { - "Data1": -2313764309958266943, - "Data2": 2245904922478712908, - "Data3": -7487190059880655853, - "Data4": 6772771143319062445 + "Data1": -1602446845485300558, + "Data2": 7402859114745237700 }, "Flags": 0, "Kind": 0, @@ -48731,10 +47473,8 @@ }, { "__Checksum": { - "Data1": -1095856948464164472, - "Data2": 2513708249917792247, - "Data3": -5857637784526502335, - "Data4": 5295205581342492318 + "Data1": -5700171101508819030, + "Data2": 4148230409686109840 }, "Flags": 0, "Kind": 0, @@ -48822,10 +47562,8 @@ }, { "__Checksum": { - "Data1": -1503748177384222852, - "Data2": 6180222894405000004, - "Data3": 4098485241767310147, - "Data4": -7579619542321991696 + "Data1": 2380117644305820027, + "Data2": -3297319837562970711 }, "Flags": 0, "Kind": 0, @@ -48945,10 +47683,8 @@ }, { "__Checksum": { - "Data1": 4323596387923935673, - "Data2": -7042189310206889253, - "Data3": 3165371038629755033, - "Data4": -3399995168265931195 + "Data1": 8784874939810577405, + "Data2": 5324568905745117823 }, "Flags": 0, "Kind": 0, @@ -48995,10 +47731,8 @@ }, { "__Checksum": { - "Data1": -6604407587181399925, - "Data2": 4075471863636922085, - "Data3": 6461099988621471468, - "Data4": 7327868096291550833 + "Data1": 7887374627783058998, + "Data2": 6990790039608611207 }, "Flags": 0, "Kind": 0, @@ -49080,10 +47814,8 @@ }, { "__Checksum": { - "Data1": 7163675799706208761, - "Data2": 7896246168645158133, - "Data3": 8619371027460270761, - "Data4": 5609376879228941583 + "Data1": -7637283093253871098, + "Data2": -8688391367165517730 }, "Flags": 0, "Kind": 0, @@ -49116,10 +47848,8 @@ }, { "__Checksum": { - "Data1": -6931493265769336135, - "Data2": 6440950758488189024, - "Data3": 7716763328446159478, - "Data4": 8060098557315630316 + "Data1": -2977207304125757062, + "Data2": -8142861590489985058 }, "Flags": 0, "Kind": 0, @@ -49229,10 +47959,8 @@ }, { "__Checksum": { - "Data1": -4517316804338115583, - "Data2": -7722727582777650381, - "Data3": 6928871238015790115, - "Data4": 4813732701784448031 + "Data1": -928874392869562375, + "Data2": 6308920319998179696 }, "Flags": 0, "Kind": 0, @@ -49285,10 +48013,8 @@ }, { "__Checksum": { - "Data1": -633847625150674533, - "Data2": -8267987853351967394, - "Data3": -6503637264325412127, - "Data4": 229140732879814428 + "Data1": 7304329179027579393, + "Data2": -8836983271284437635 }, "Flags": 0, "Kind": 0, @@ -49550,10 +48276,8 @@ }, { "__Checksum": { - "Data1": 7198722185623924286, - "Data2": -5779567627613298808, - "Data3": 7198839063739674974, - "Data4": -8784810610057672896 + "Data1": 2113340419913280642, + "Data2": 4832195372893087185 }, "Flags": 0, "Kind": 0, @@ -49593,10 +48317,8 @@ }, { "__Checksum": { - "Data1": -1994734171926298575, - "Data2": 8166419430396752294, - "Data3": -1344519792550101295, - "Data4": -6656837165292362028 + "Data1": -8790097427319668971, + "Data2": -3967825915153966597 }, "Flags": 0, "Kind": 0, @@ -49643,10 +48365,8 @@ }, { "__Checksum": { - "Data1": 5093210690546284256, - "Data2": 6435190652111565880, - "Data3": -8979204880098588929, - "Data4": 2632522329700906611 + "Data1": 2717864275528309651, + "Data2": 6571240277512392238 }, "Flags": 0, "Kind": 0, @@ -49686,10 +48406,8 @@ }, { "__Checksum": { - "Data1": 1666384695441952547, - "Data2": -4803346836444677101, - "Data3": 5030790088027317694, - "Data4": -1771698698511532252 + "Data1": 6764126933443351708, + "Data2": -6140825464466242075 }, "Flags": 0, "Kind": 0, @@ -49934,10 +48652,8 @@ }, { "__Checksum": { - "Data1": -2961221145605480922, - "Data2": -745130444285007832, - "Data3": -4606893095668628946, - "Data4": -6825418079192955962 + "Data1": 2098967182459731008, + "Data2": -8797444227112263868 }, "Flags": 0, "Kind": 0, @@ -49984,10 +48700,8 @@ }, { "__Checksum": { - "Data1": 583994226946608202, - "Data2": 106117357225159515, - "Data3": 5429573966391584563, - "Data4": 8258339157791661240 + "Data1": -6849728116506003173, + "Data2": -3004602544901089649 }, "Flags": 0, "Kind": 0, @@ -50069,10 +48783,8 @@ }, { "__Checksum": { - "Data1": 8070900114448667907, - "Data2": 8698532568380614717, - "Data3": 4167256845279219075, - "Data4": -7293515138742207999 + "Data1": 3317217702323488030, + "Data2": -5318643484961015046 }, "Flags": 0, "Kind": 0, @@ -50105,10 +48817,8 @@ }, { "__Checksum": { - "Data1": -5325572794413924382, - "Data2": 8451381650359111887, - "Data3": 3452226410206765661, - "Data4": -2362644304570383020 + "Data1": 3126412320941103409, + "Data2": -4006560602313239356 }, "Flags": 0, "Kind": 0, @@ -50218,10 +48928,8 @@ }, { "__Checksum": { - "Data1": -6424088097309072150, - "Data2": -3145312662845701384, - "Data3": 4507199367470018601, - "Data4": 3152065450873930559 + "Data1": -2211912790993677768, + "Data2": -4258033949820535113 }, "Flags": 0, "Kind": 0, @@ -50274,10 +48982,8 @@ }, { "__Checksum": { - "Data1": -6013345278358762989, - "Data2": 917181695691429248, - "Data3": -6209886116708918252, - "Data4": 42291376571775594 + "Data1": 1687013358528217569, + "Data2": 7268478732383853951 }, "Flags": 0, "Kind": 0, @@ -50546,10 +49252,8 @@ }, { "__Checksum": { - "Data1": 7176774354366739182, - "Data2": -4545637403657300146, - "Data3": 3312585123236419824, - "Data4": 747056355993312928 + "Data1": 6883668054968670320, + "Data2": -4155356441934330889 }, "Flags": 0, "Kind": 0, @@ -50652,10 +49356,8 @@ }, { "__Checksum": { - "Data1": -4967993256295549110, - "Data2": -5124621407683705673, - "Data3": 8195087232402373784, - "Data4": 8250000121736825588 + "Data1": -4250892827382765251, + "Data2": -2634444624298608765 }, "Flags": 0, "Kind": 0, @@ -50758,10 +49460,8 @@ }, { "__Checksum": { - "Data1": -7318660878749410765, - "Data2": -8705474386193985520, - "Data3": -7340940363071111186, - "Data4": 9082703009856590342 + "Data1": 3013127476586867177, + "Data2": 289232522546395570 }, "Flags": 0, "Kind": 0, @@ -50815,10 +49515,8 @@ }, { "__Checksum": { - "Data1": -6251131804016573119, - "Data2": 5209069816937117184, - "Data3": -8087018331597593386, - "Data4": 5093142890204850547 + "Data1": 5978620595295719612, + "Data2": -4215404709652906919 }, "Flags": 0, "Kind": 0, @@ -50951,10 +49649,8 @@ }, { "__Checksum": { - "Data1": -1285250680621292165, - "Data2": -5737434193039973707, - "Data3": -4361635332000812839, - "Data4": 4019635769089812952 + "Data1": 5303412716579073797, + "Data2": -3551330574938697844 }, "Flags": 0, "Kind": 0, @@ -50984,10 +49680,8 @@ }, { "__Checksum": { - "Data1": -1544647694560071829, - "Data2": 6464200690373197819, - "Data3": -1527503990992635521, - "Data4": 3346010480430890050 + "Data1": 3256257149682971570, + "Data2": -7136744169615647369 }, "Flags": 0, "Kind": 0, @@ -51071,10 +49765,8 @@ }, { "__Checksum": { - "Data1": -294572382219790415, - "Data2": 6722607234263228626, - "Data3": -4390681150164624063, - "Data4": -8897626485806416241 + "Data1": -8997962699943403855, + "Data2": -8664902626966669852 }, "Flags": 0, "Kind": 0, @@ -51104,10 +49796,8 @@ }, { "__Checksum": { - "Data1": 9162500702307258529, - "Data2": -6150301222137184891, - "Data3": -5585868751483254815, - "Data4": 2821509826363242692 + "Data1": 8928988873314184969, + "Data2": -1216373647974568760 }, "Flags": 0, "Kind": 0, @@ -51336,10 +50026,8 @@ }, { "__Checksum": { - "Data1": -7976101805552007304, - "Data2": 4811711170506055999, - "Data3": 1290808499230012784, - "Data4": -8256415367469889888 + "Data1": 4073402113294245727, + "Data2": 3962892297969142996 }, "Flags": 0, "Kind": 0, @@ -51369,10 +50057,8 @@ }, { "__Checksum": { - "Data1": 4959785961729693092, - "Data2": 172240816599652242, - "Data3": -5049567758192709732, - "Data4": -1479686683550100593 + "Data1": -8679655291046394438, + "Data2": 6550047042580445882 }, "Flags": 0, "Kind": 0, @@ -51405,10 +50091,8 @@ }, { "__Checksum": { - "Data1": 8014003855282830194, - "Data2": -7427072864479312891, - "Data3": 7083204209744742283, - "Data4": 2483489697267546436 + "Data1": -8426105943024515041, + "Data2": -5295316180245529376 }, "Flags": 0, "Kind": 0, @@ -51453,10 +50137,8 @@ }, { "__Checksum": { - "Data1": -5160441794015624827, - "Data2": -2272765884754543826, - "Data3": 5898784136101121183, - "Data4": -1945025467193645162 + "Data1": -7510832420702569056, + "Data2": 126362524377822246 }, "Flags": 0, "Kind": 0, @@ -51503,10 +50185,8 @@ }, { "__Checksum": { - "Data1": 6805212830878442283, - "Data2": -4156710599146339853, - "Data3": 5642866860380241938, - "Data4": 6513920105589330356 + "Data1": -775187509159661537, + "Data2": 5297512847356904832 }, "Flags": 0, "Kind": 0, @@ -51537,10 +50217,8 @@ }, { "__Checksum": { - "Data1": -872768535302181202, - "Data2": -3520592569508997942, - "Data3": 5136065677621387312, - "Data4": 5683622015867940108 + "Data1": -7529650605818898937, + "Data2": 4656674383169818611 }, "Flags": 0, "Kind": 0, @@ -51573,10 +50251,8 @@ }, { "__Checksum": { - "Data1": -600525083674571298, - "Data2": -3781988065046766104, - "Data3": -8046211030265129580, - "Data4": 2662721591884371830 + "Data1": 2074252122340740306, + "Data2": 999027844781832186 }, "Flags": 0, "Kind": 0, @@ -51609,10 +50285,8 @@ }, { "__Checksum": { - "Data1": 8020619721259757786, - "Data2": -1155922609965669095, - "Data3": -3747171216580516799, - "Data4": 5789377103986599521 + "Data1": 8997369347168057608, + "Data2": 6355321566139272849 }, "Flags": 0, "Kind": 0, @@ -51664,10 +50338,8 @@ }, { "__Checksum": { - "Data1": -9108947274022885598, - "Data2": -6451348609270096217, - "Data3": 1804287357594232012, - "Data4": 5629591722054305161 + "Data1": -5524840462716646483, + "Data2": 8659080680933113543 }, "Flags": 0, "Kind": 0, @@ -51700,10 +50372,8 @@ }, { "__Checksum": { - "Data1": 9200776684722386946, - "Data2": 6175628142553034672, - "Data3": 577672877552394400, - "Data4": -5814760609049295825 + "Data1": -7948213304970380236, + "Data2": -7489262196723256773 }, "Flags": 0, "Kind": 0, @@ -51734,10 +50404,8 @@ }, { "__Checksum": { - "Data1": -289015955156917733, - "Data2": -6571816820394340348, - "Data3": 3152925054033525934, - "Data4": -7468646165706984681 + "Data1": -7896608409799862600, + "Data2": -3287079060358139820 }, "Flags": 0, "Kind": 0, @@ -51828,10 +50496,8 @@ }, { "__Checksum": { - "Data1": -261980300319449139, - "Data2": 9058594678221407849, - "Data3": 2438060609974292068, - "Data4": -5702790851630563783 + "Data1": -1513130764387992419, + "Data2": 970050727134339030 }, "Flags": 0, "Kind": 0, @@ -51864,10 +50530,8 @@ }, { "__Checksum": { - "Data1": -2157424948736570661, - "Data2": 6190026823789984459, - "Data3": -5481552194847764674, - "Data4": 7067866765424421035 + "Data1": -9173936088803892287, + "Data2": -7993830147141521617 }, "Flags": 0, "Kind": 0, @@ -51912,10 +50576,8 @@ }, { "__Checksum": { - "Data1": 1159466441957969801, - "Data2": -7460142608682698923, - "Data3": -5732896334337899605, - "Data4": -7974877963749336108 + "Data1": -973050187622285213, + "Data2": 716991911029284829 }, "Flags": 0, "Kind": 0, @@ -51962,10 +50624,8 @@ }, { "__Checksum": { - "Data1": 1424449620685147075, - "Data2": -394947823497854756, - "Data3": -4050372442143872056, - "Data4": 4139784618149919474 + "Data1": 367452392173210518, + "Data2": -7310459470308371122 }, "Flags": 0, "Kind": 0, @@ -52005,10 +50665,8 @@ }, { "__Checksum": { - "Data1": 979910132388267525, - "Data2": 6321443215807574205, - "Data3": -4995175637047974084, - "Data4": 7881481707959332583 + "Data1": 1354850784775164670, + "Data2": 2973236105607961835 }, "Flags": 0, "Kind": 0, @@ -52048,10 +50706,8 @@ }, { "__Checksum": { - "Data1": 8858731743696218171, - "Data2": 4276184374690095490, - "Data3": -3553598211754225497, - "Data4": 6693702525384638227 + "Data1": 8774718351330152, + "Data2": 8163614718693345448 }, "Flags": 0, "Kind": 0, @@ -52184,10 +50840,8 @@ }, { "__Checksum": { - "Data1": -7575847780798059575, - "Data2": 6783736100158195167, - "Data3": -6323078889285260868, - "Data4": 6035844439009984113 + "Data1": -9134336825845275804, + "Data2": 4851406270035065136 }, "Flags": 0, "Kind": 0, @@ -52217,10 +50871,8 @@ }, { "__Checksum": { - "Data1": 3708909093875317187, - "Data2": -3979490625415389766, - "Data3": -4789245232167696075, - "Data4": -3017116219511309799 + "Data1": -7527102124684245458, + "Data2": 495758517373196232 }, "Flags": 0, "Kind": 0, @@ -52304,10 +50956,8 @@ }, { "__Checksum": { - "Data1": 2536670269385763319, - "Data2": 7579708635675182021, - "Data3": 1110031260284821026, - "Data4": 8463211923351885578 + "Data1": -7974886492466291561, + "Data2": -8075323552160095987 }, "Flags": 0, "Kind": 0, @@ -52337,10 +50987,8 @@ }, { "__Checksum": { - "Data1": -513289545561707441, - "Data2": 6346992931132160732, - "Data3": 8872826804058919596, - "Data4": -4571005550493120648 + "Data1": -6964836371107539967, + "Data2": 4529181411484116835 }, "Flags": 0, "Kind": 0, @@ -52569,10 +51217,8 @@ }, { "__Checksum": { - "Data1": 2077146601451663962, - "Data2": -6734947285151883103, - "Data3": 1959849162983980499, - "Data4": 8261406516130417568 + "Data1": 341254838415745633, + "Data2": -754454078200061846 }, "Flags": 0, "Kind": 0, @@ -52602,10 +51248,8 @@ }, { "__Checksum": { - "Data1": -2965846720144666818, - "Data2": 7155284023843135599, - "Data3": 3497719654851852255, - "Data4": 3819121501869524291 + "Data1": 4815905692389138460, + "Data2": -7218425099348935361 }, "Flags": 0, "Kind": 0, @@ -52638,10 +51282,8 @@ }, { "__Checksum": { - "Data1": 2815190314601218119, - "Data2": -6919881458385621182, - "Data3": 2822890277287770749, - "Data4": 1770963745527565218 + "Data1": -3889510369238530349, + "Data2": -3823472342082257232 }, "Flags": 0, "Kind": 0, @@ -52686,10 +51328,8 @@ }, { "__Checksum": { - "Data1": -3335022507866306922, - "Data2": 6497983826242155869, - "Data3": 3873823394349354040, - "Data4": -5272621889928524813 + "Data1": 436537187212201708, + "Data2": 26645976862861504 }, "Flags": 0, "Kind": 0, @@ -52736,10 +51376,8 @@ }, { "__Checksum": { - "Data1": -9069777958249806145, - "Data2": -2956530007323322015, - "Data3": 8826066991378182744, - "Data4": 3199185813692885333 + "Data1": 346620020768095847, + "Data2": -582114882665242401 }, "Flags": 0, "Kind": 0, @@ -52779,10 +51417,8 @@ }, { "__Checksum": { - "Data1": -7350272248019499759, - "Data2": 7523550801549196477, - "Data3": -5760839757497449674, - "Data4": 653275653722436408 + "Data1": 424967472337347887, + "Data2": -4729841510493499176 }, "Flags": 0, "Kind": 0, @@ -52813,10 +51449,8 @@ }, { "__Checksum": { - "Data1": -2116832453075922489, - "Data2": -8219723766231459399, - "Data3": -5211287192217937790, - "Data4": -2196937957646159201 + "Data1": -5449095006135799494, + "Data2": -3387090408783999892 }, "Flags": 0, "Kind": 0, @@ -52849,10 +51483,8 @@ }, { "__Checksum": { - "Data1": 1338094052090002725, - "Data2": 8446764598371121386, - "Data3": -5970696959493760636, - "Data4": 2355457482164726540 + "Data1": 8397646465842422006, + "Data2": -2572652831153708423 }, "Flags": 0, "Kind": 0, @@ -52892,10 +51524,8 @@ }, { "__Checksum": { - "Data1": 1186697457870239052, - "Data2": 598601906211717320, - "Data3": -9171901010424989090, - "Data4": -8504080490096599823 + "Data1": -4642532648380036336, + "Data2": -2793496267351136399 }, "Flags": 0, "Kind": 0, @@ -52925,10 +51555,8 @@ }, { "__Checksum": { - "Data1": -1462891811166106688, - "Data2": 7411012702157212384, - "Data3": -1181352848606933401, - "Data4": -8797449104150718913 + "Data1": 4612622419884095369, + "Data2": -5775308724611243458 }, "Flags": 0, "Kind": 0, @@ -52961,10 +51589,8 @@ }, { "__Checksum": { - "Data1": 3340942409510099725, - "Data2": -5200582417103369179, - "Data3": -2870081040242871814, - "Data4": 1819515824205388391 + "Data1": -7282228515454640412, + "Data2": 7145189546966947391 }, "Flags": 0, "Kind": 0, @@ -53016,10 +51642,8 @@ }, { "__Checksum": { - "Data1": -3462900963195117823, - "Data2": -7056797312259839252, - "Data3": -8319031370926612723, - "Data4": 8283510104219447406 + "Data1": -4616513761149621569, + "Data2": 2268031604369572758 }, "Flags": 0, "Kind": 0, @@ -53052,10 +51676,8 @@ }, { "__Checksum": { - "Data1": 2941536370356980902, - "Data2": -8404453373541936933, - "Data3": 1583618524409553821, - "Data4": 7167639329255854065 + "Data1": -5821069036234603497, + "Data2": -6723424345829041072 }, "Flags": 0, "Kind": 0, @@ -53086,10 +51708,8 @@ }, { "__Checksum": { - "Data1": -2523362717196261491, - "Data2": -359004861273342737, - "Data3": 3299394800466360557, - "Data4": 6262589932764511098 + "Data1": 2336972403202589632, + "Data2": -7341739064621107099 }, "Flags": 0, "Kind": 0, @@ -53122,10 +51742,8 @@ }, { "__Checksum": { - "Data1": 1402361462521492446, - "Data2": -6034490927666840904, - "Data3": -4106200963351528351, - "Data4": -4678993781510566601 + "Data1": -9132103380890206325, + "Data2": 3576324121604856871 }, "Flags": 0, "Kind": 0, @@ -53170,10 +51788,8 @@ }, { "__Checksum": { - "Data1": -5492371674063294306, - "Data2": -2135402863875100317, - "Data3": 1871298800747019485, - "Data4": -8121876840281582981 + "Data1": -5864652747925258108, + "Data2": 3022289511226742182 }, "Flags": 0, "Kind": 0, @@ -53220,10 +51836,8 @@ }, { "__Checksum": { - "Data1": 1132297650545548645, - "Data2": 586663382503534087, - "Data3": 2384175589618697764, - "Data4": -391932571879982064 + "Data1": 2144149654248706352, + "Data2": -4193988332167814660 }, "Flags": 0, "Kind": 0, @@ -53263,10 +51877,8 @@ }, { "__Checksum": { - "Data1": -3693468302934381955, - "Data2": 5787450930430084892, - "Data3": -8984194531634379060, - "Data4": 3961926119595690059 + "Data1": 7362954822265326050, + "Data2": 1896912220982715533 }, "Flags": 0, "Kind": 0, @@ -53365,10 +51977,8 @@ }, { "__Checksum": { - "Data1": -7087968163725540100, - "Data2": -7393967432099029123, - "Data3": 5916451578871262804, - "Data4": 5169020398115831189 + "Data1": 2319413722840539223, + "Data2": 7862076712474192285 }, "Flags": 0, "Kind": 0, @@ -53398,10 +52008,8 @@ }, { "__Checksum": { - "Data1": 5848028439840320216, - "Data2": -6790965375271672095, - "Data3": 6974895997634926291, - "Data4": 893120815793433452 + "Data1": 2866346933429508995, + "Data2": -5533925964669129919 }, "Flags": 0, "Kind": 0, @@ -53441,10 +52049,8 @@ }, { "__Checksum": { - "Data1": -5712450925379231931, - "Data2": -4371853284024510675, - "Data3": 6399530544875262857, - "Data4": 3098157526730866286 + "Data1": 8415076236144774323, + "Data2": 2799124231737481826 }, "Flags": 0, "Kind": 0, @@ -53484,10 +52090,8 @@ }, { "__Checksum": { - "Data1": 7988561835351441079, - "Data2": 3675702128424444613, - "Data3": 6562556997349511650, - "Data4": -4876098939466740277 + "Data1": 3545314326843483617, + "Data2": -2430652062219650828 }, "Flags": 0, "Kind": 0, @@ -53527,10 +52131,8 @@ }, { "__Checksum": { - "Data1": -6571489233629104772, - "Data2": -808407604177927784, - "Data3": -1011769238271985858, - "Data4": 4545731691770840784 + "Data1": -2056466398828918376, + "Data2": -5287353093280088752 }, "Flags": 0, "Kind": 0, @@ -53570,10 +52172,8 @@ }, { "__Checksum": { - "Data1": -858669875240838453, - "Data2": -6567019933399791967, - "Data3": 4678196487007174422, - "Data4": -2920356560994382881 + "Data1": 7381918675028464709, + "Data2": 1275013805613821521 }, "Flags": 0, "Kind": 0, @@ -53613,10 +52213,8 @@ }, { "__Checksum": { - "Data1": 3654100646415409944, - "Data2": -1228669442574146922, - "Data3": -101780747821206330, - "Data4": -4426703266756738532 + "Data1": 6929811973128437207, + "Data2": 1422578015842650597 }, "Flags": 0, "Kind": 0, @@ -53652,10 +52250,8 @@ }, { "__Checksum": { - "Data1": 4363551972708650791, - "Data2": -367157325478890162, - "Data3": -6668908545457145859, - "Data4": -7880772026367482342 + "Data1": -2489100784684180962, + "Data2": -226780767788428432 }, "Flags": 0, "Kind": 0, @@ -53702,10 +52298,8 @@ }, { "__Checksum": { - "Data1": -6773308553809312107, - "Data2": -3675731043280826925, - "Data3": 1799265177409351049, - "Data4": 4757340811958640381 + "Data1": 6280809977618809185, + "Data2": -5784025276472252861 }, "Flags": 0, "Kind": 0, @@ -53762,10 +52356,8 @@ }, { "__Checksum": { - "Data1": 7716529386557861796, - "Data2": -6719981726577816781, - "Data3": -920769444129587821, - "Data4": -7730837827129953105 + "Data1": -3491850139524768885, + "Data2": 4214145825259100317 }, "Flags": 0, "Kind": 0, @@ -53812,10 +52404,8 @@ }, { "__Checksum": { - "Data1": 8405961455731166688, - "Data2": 6478285662166752738, - "Data3": 5008947733700969458, - "Data4": 707116986291655553 + "Data1": 3466327086724696566, + "Data2": 1731548544695966826 }, "Flags": 0, "Kind": 0, @@ -53855,10 +52445,8 @@ }, { "__Checksum": { - "Data1": 6355378367272912402, - "Data2": -5738427832247494741, - "Data3": 2116752902735222625, - "Data4": 2198719565556776974 + "Data1": 1547851937204184587, + "Data2": -5519018655069853583 }, "Flags": 0, "Kind": 0, @@ -53898,10 +52486,8 @@ }, { "__Checksum": { - "Data1": -5982292104695603400, - "Data2": 8685651050668612755, - "Data3": -529255994365475795, - "Data4": -3124439092442909991 + "Data1": -3037939395069558913, + "Data2": -9013148976495934860 }, "Flags": 0, "Kind": 0, @@ -53946,10 +52532,8 @@ }, { "__Checksum": { - "Data1": 8161124189285573317, - "Data2": -5279808961889092181, - "Data3": 6897358116259703837, - "Data4": -8826625777495826747 + "Data1": -6981911569852175006, + "Data2": -1244821734142438040 }, "Flags": 0, "Kind": 0, @@ -53989,10 +52573,8 @@ }, { "__Checksum": { - "Data1": 7453072198954721980, - "Data2": -535448531941127058, - "Data3": -4536760134526761549, - "Data4": 598871263100990351 + "Data1": 8007030798635046360, + "Data2": 1270431658453205760 }, "Flags": 0, "Kind": 0, @@ -54110,10 +52692,8 @@ }, { "__Checksum": { - "Data1": -8423409627974100191, - "Data2": 1064828135352083705, - "Data3": -5601175088295187175, - "Data4": 1496617782124873136 + "Data1": 1951506106225859123, + "Data2": 3965499147634060257 }, "Flags": 0, "Kind": 0, @@ -54246,10 +52826,8 @@ }, { "__Checksum": { - "Data1": -1544026819608153608, - "Data2": 9053753991543157988, - "Data3": -5829365066744252758, - "Data4": 4988015222914281674 + "Data1": -1841284768146041086, + "Data2": 1951274675776448697 }, "Flags": 0, "Kind": 0, @@ -54279,10 +52857,8 @@ }, { "__Checksum": { - "Data1": -3414271185168398953, - "Data2": -7980159539883755683, - "Data3": 45663996268315424, - "Data4": 5850529612052214227 + "Data1": 1479186693475870838, + "Data2": 2595228664093256690 }, "Flags": 0, "Kind": 0, @@ -54366,10 +52942,8 @@ }, { "__Checksum": { - "Data1": 4801221253639479694, - "Data2": -8781432150380947072, - "Data3": -6665894484668102140, - "Data4": 9198042043960269276 + "Data1": -5106428196902516688, + "Data2": 4970787671000128132 }, "Flags": 0, "Kind": 0, @@ -54399,10 +52973,8 @@ }, { "__Checksum": { - "Data1": 4524983015929845508, - "Data2": -6748577485321931327, - "Data3": 1212001643886739958, - "Data4": -3205049190627615108 + "Data1": 4661801418049929939, + "Data2": 3661385191451429189 }, "Flags": 0, "Kind": 0, @@ -54638,10 +53210,8 @@ }, { "__Checksum": { - "Data1": 417617526891801312, - "Data2": 640444958058551640, - "Data3": -7584851746591309151, - "Data4": 9207268562662799697 + "Data1": -8642451442652428720, + "Data2": -5447503044417551455 }, "Flags": 0, "Kind": 0, @@ -54671,10 +53241,8 @@ }, { "__Checksum": { - "Data1": -3760746320627304504, - "Data2": -1802113896510706684, - "Data3": -9182201875666436638, - "Data4": 3848547004765497944 + "Data1": 74628272798928415, + "Data2": 2199768983058211897 }, "Flags": 0, "Kind": 0, @@ -54735,10 +53303,8 @@ }, { "__Checksum": { - "Data1": 4767439814929770313, - "Data2": 7650520336101198125, - "Data3": -2690156556106967324, - "Data4": 1096916495793773063 + "Data1": 8721837982024520577, + "Data2": 5758826433801398688 }, "Flags": 0, "Kind": 0, @@ -54876,10 +53442,8 @@ }, { "__Checksum": { - "Data1": -4628215661023580710, - "Data2": 4322327629770905510, - "Data3": -2955022057055495734, - "Data4": 7793758321004519681 + "Data1": 1323894317069998482, + "Data2": 8267241755211956510 }, "Flags": 0, "Kind": 0, @@ -54919,10 +53483,8 @@ }, { "__Checksum": { - "Data1": -1664229628499434915, - "Data2": 2329212081377083028, - "Data3": 4703298370743596983, - "Data4": 1748515552062076519 + "Data1": 3548104787233606269, + "Data2": 4861871841316539461 }, "Flags": 0, "Kind": 0, @@ -54976,10 +53538,8 @@ }, { "__Checksum": { - "Data1": 8561177666588117426, - "Data2": -5167569418829329941, - "Data3": 4538725723691983513, - "Data4": 3695321616204756923 + "Data1": -1517291190889769075, + "Data2": -6050872688973190759 }, "Flags": 0, "Kind": 0, @@ -55096,10 +53656,8 @@ }, { "__Checksum": { - "Data1": 3793363424730047053, - "Data2": -2606064003633998800, - "Data3": 7825226984365203506, - "Data4": -8930899420150977992 + "Data1": 403698106802689586, + "Data2": 450584568850513895 }, "Flags": 0, "Kind": 0, @@ -55153,10 +53711,8 @@ }, { "__Checksum": { - "Data1": 6923294208394032806, - "Data2": -1289012610988667429, - "Data3": 7516179666102113770, - "Data4": 1176035270889389206 + "Data1": -7440773628341382514, + "Data2": -1198885815987028268 }, "Flags": 0, "Kind": 0, @@ -55203,10 +53759,8 @@ }, { "__Checksum": { - "Data1": -6631792136229140176, - "Data2": 3300738211664021570, - "Data3": -7451811072953293590, - "Data4": 7850736995928006703 + "Data1": 6898569959389682389, + "Data2": -2516070638890302586 }, "Flags": 0, "Kind": 0, @@ -55246,10 +53800,8 @@ }, { "__Checksum": { - "Data1": 714327775837002433, - "Data2": 5843554489810657751, - "Data3": 5047662751186017529, - "Data4": 4021687639750247728 + "Data1": 2781989624951294391, + "Data2": -7471533791408320507 }, "Flags": 0, "Kind": 0, @@ -55289,10 +53841,8 @@ }, { "__Checksum": { - "Data1": -3477566324382376941, - "Data2": 2793087615335940741, - "Data3": -1234272640946607463, - "Data4": -9108241816130412969 + "Data1": -6604753298096878095, + "Data2": -730544112401639649 }, "Flags": 0, "Kind": 0, @@ -55328,10 +53878,8 @@ }, { "__Checksum": { - "Data1": 2405332482742883828, - "Data2": -8718865989034154714, - "Data3": 3623487160771163835, - "Data4": -2311591546571532139 + "Data1": -6885988909301161859, + "Data2": 7993440679112317167 }, "Flags": 0, "Kind": 0, @@ -55378,10 +53926,8 @@ }, { "__Checksum": { - "Data1": -8579298781611102362, - "Data2": 5999437760957605992, - "Data3": 3934718439894139865, - "Data4": -4984279904998367981 + "Data1": -5728473026278305657, + "Data2": -3935729771048683121 }, "Flags": 0, "Kind": 0, @@ -55438,10 +53984,8 @@ }, { "__Checksum": { - "Data1": -2811617998476644629, - "Data2": -4940837655597364360, - "Data3": 9080329253436830156, - "Data4": 7308444515302978564 + "Data1": 3902751070311927389, + "Data2": -3827891414703731116 }, "Flags": 0, "Kind": 0, @@ -55488,10 +54032,8 @@ }, { "__Checksum": { - "Data1": 3855593875510165026, - "Data2": -9203945200192265293, - "Data3": 2249980725567140644, - "Data4": -4286754921958646679 + "Data1": 3115395588204085492, + "Data2": -836973472201112174 }, "Flags": 0, "Kind": 0, @@ -55531,10 +54073,8 @@ }, { "__Checksum": { - "Data1": 8505396844141969409, - "Data2": -3893384515788328228, - "Data3": 7684803388078714512, - "Data4": 2665062655559290755 + "Data1": 1299739017700319636, + "Data2": 5412460532794497428 }, "Flags": 0, "Kind": 0, @@ -55574,10 +54114,8 @@ }, { "__Checksum": { - "Data1": -80403295561628803, - "Data2": -3067865913983430532, - "Data3": -8025644476060506167, - "Data4": 1489913724221722847 + "Data1": -5871203469964543991, + "Data2": -4181127327143645677 }, "Flags": 0, "Kind": 0, @@ -55613,10 +54151,8 @@ }, { "__Checksum": { - "Data1": -8638073062924436115, - "Data2": -3925608013367976525, - "Data3": -1673124192810508772, - "Data4": -6791497082834339970 + "Data1": 2818877536763397117, + "Data2": 2962731458250796728 }, "Flags": 0, "Kind": 0, @@ -55663,10 +54199,8 @@ }, { "__Checksum": { - "Data1": -9189511961986162759, - "Data2": -1592494047028288660, - "Data3": 8150430461784141529, - "Data4": -3658351998240190793 + "Data1": -7335205319408863912, + "Data2": -898354520894682478 }, "Flags": 0, "Kind": 0, @@ -55713,10 +54247,8 @@ }, { "__Checksum": { - "Data1": -4952892569367291852, - "Data2": -1481838791625882857, - "Data3": 229882700729671194, - "Data4": 7876380063811425049 + "Data1": 3991038185538732141, + "Data2": -987496973802041659 }, "Flags": 0, "Kind": 0, @@ -55794,10 +54326,8 @@ }, { "__Checksum": { - "Data1": 6370746978715723731, - "Data2": -8902219968057468582, - "Data3": -5823858073318369332, - "Data4": 1781917394066108182 + "Data1": -7990482774966776876, + "Data2": 8418445762038966950 }, "Flags": 0, "Kind": 0, @@ -55827,10 +54357,8 @@ }, { "__Checksum": { - "Data1": -8473152307159529781, - "Data2": -687897821090108459, - "Data3": 7010693455851737566, - "Data4": 2468049212190482235 + "Data1": -8433467408039320765, + "Data2": -8826370045648215138 }, "Flags": 0, "Kind": 0, @@ -55933,10 +54461,8 @@ }, { "__Checksum": { - "Data1": -6775891223620916181, - "Data2": -3374045946617433665, - "Data3": 1774409699856896994, - "Data4": -7480028729964948565 + "Data1": 881563399003550641, + "Data2": 4496310728468291653 }, "Flags": 0, "Kind": 0, @@ -55976,10 +54502,8 @@ }, { "__Checksum": { - "Data1": -3834555396750595574, - "Data2": -5508206404766634828, - "Data3": -2367972925387353948, - "Data4": 2933199160141647090 + "Data1": -5258941978261812426, + "Data2": 2611144501281546724 }, "Flags": 0, "Kind": 0, @@ -56019,10 +54543,8 @@ }, { "__Checksum": { - "Data1": 8778776374977557669, - "Data2": -5739770086476115613, - "Data3": 3651226615308406600, - "Data4": 1875654083848915046 + "Data1": -21031093070946188, + "Data2": 8187168789199153228 }, "Flags": 0, "Kind": 0, @@ -56058,10 +54580,8 @@ }, { "__Checksum": { - "Data1": 333755957258348357, - "Data2": 4995668803401222562, - "Data3": -4455956404758122602, - "Data4": 3684970634265229926 + "Data1": 8566850816546722971, + "Data2": 4973449917165936959 }, "Flags": 0, "Kind": 0, @@ -56108,10 +54628,8 @@ }, { "__Checksum": { - "Data1": 5787709520672143249, - "Data2": -4596481933028167616, - "Data3": 5055683728988448744, - "Data4": -432848404938069651 + "Data1": 1760857940535083099, + "Data2": 4464690995509110049 }, "Flags": 0, "Kind": 0, @@ -56168,10 +54686,8 @@ }, { "__Checksum": { - "Data1": -2865525971380548932, - "Data2": -421671475130174254, - "Data3": -5984208881548333489, - "Data4": -6447395731561544535 + "Data1": 3044670193190907424, + "Data2": -3096317658367695511 }, "Flags": 0, "Kind": 0, @@ -56218,10 +54734,8 @@ }, { "__Checksum": { - "Data1": 709131668475686298, - "Data2": 5531317580272654498, - "Data3": -4320727071514957230, - "Data4": -961887453988646767 + "Data1": 8439452789415637118, + "Data2": 6548965525436957308 }, "Flags": 0, "Kind": 0, @@ -56261,10 +54775,8 @@ }, { "__Checksum": { - "Data1": -2473942574130909481, - "Data2": 3165817711092646737, - "Data3": -2429502522910698250, - "Data4": -721397028830908023 + "Data1": 2979554590562516397, + "Data2": -1360590166626493706 }, "Flags": 0, "Kind": 0, @@ -56304,10 +54816,8 @@ }, { "__Checksum": { - "Data1": 3983048726862888974, - "Data2": 6926691955012842966, - "Data3": 3237100611522891626, - "Data4": 544751231911503561 + "Data1": -2594795629626371572, + "Data2": -3183661811888113835 }, "Flags": 0, "Kind": 0, @@ -56343,10 +54853,8 @@ }, { "__Checksum": { - "Data1": -4062871242536649183, - "Data2": 4573205812778211341, - "Data3": -1413000160525254316, - "Data4": -8593215277289625188 + "Data1": -1848171548510202441, + "Data2": -792386594142247578 }, "Flags": 0, "Kind": 0, @@ -56393,10 +54901,8 @@ }, { "__Checksum": { - "Data1": 2923149221270890962, - "Data2": 2963159357971691197, - "Data3": 5874454236815116375, - "Data4": -9009089913680578598 + "Data1": 5134324773367470231, + "Data2": 5312578754562858228 }, "Flags": 0, "Kind": 0, @@ -56443,10 +54949,8 @@ }, { "__Checksum": { - "Data1": 1123188959465221642, - "Data2": -7905630628508989390, - "Data3": 3803529933148443844, - "Data4": -1400828485612041821 + "Data1": 5168666915916036706, + "Data2": -4182466681490365824 }, "Flags": 0, "Kind": 0, @@ -56549,10 +55053,8 @@ }, { "__Checksum": { - "Data1": -6661309344382592060, - "Data2": 913260077149803980, - "Data3": 1769164637731784275, - "Data4": -5759650750936707518 + "Data1": -7637314648865942453, + "Data2": 4258957239775762944 }, "Flags": 0, "Kind": 0, @@ -56613,10 +55115,8 @@ }, { "__Checksum": { - "Data1": -6648248953962407674, - "Data2": 7021461405496408590, - "Data3": 7618631623908510747, - "Data4": 6887039748072903591 + "Data1": -6240847999846564299, + "Data2": 8817541848072321982 }, "Flags": 0, "Kind": 0, @@ -56749,10 +55249,8 @@ }, { "__Checksum": { - "Data1": -955313303428658567, - "Data2": -8374595217564832203, - "Data3": 6646783257249376295, - "Data4": 3942330263492793211 + "Data1": -4153414793977640860, + "Data2": -902786235501060220 }, "Flags": 0, "Kind": 0, @@ -56782,10 +55280,8 @@ }, { "__Checksum": { - "Data1": 5851826844705911847, - "Data2": -6176390631703271405, - "Data3": 1097274102290869100, - "Data4": -3733479198938401577 + "Data1": 5543628028795937667, + "Data2": -4145151332408474338 }, "Flags": 0, "Kind": 0, @@ -56869,10 +55365,8 @@ }, { "__Checksum": { - "Data1": -2579770451224499295, - "Data2": 1446654178996474895, - "Data3": 1676624106653343616, - "Data4": 1010213784309432381 + "Data1": 5694801673379354858, + "Data2": 2553280334945641436 }, "Flags": 0, "Kind": 0, @@ -56902,10 +55396,8 @@ }, { "__Checksum": { - "Data1": -1442357629103713342, - "Data2": 1968528300724269094, - "Data3": -1873826036711441151, - "Data4": -8166465076367240865 + "Data1": -1443160986115965512, + "Data2": 6484091604838095969 }, "Flags": 0, "Kind": 0, @@ -57141,10 +55633,8 @@ }, { "__Checksum": { - "Data1": 279720033858591209, - "Data2": -8649753487177951606, - "Data3": -7158858866598149037, - "Data4": 3384566121971282943 + "Data1": 4717677938664976553, + "Data2": 1142143784507944903 }, "Flags": 0, "Kind": 0, @@ -57174,10 +55664,8 @@ }, { "__Checksum": { - "Data1": 6433389782741085210, - "Data2": -2825787687272285731, - "Data3": 6274379971871501312, - "Data4": -622814471287718448 + "Data1": 6202795954292100129, + "Data2": -7191793191886759156 }, "Flags": 0, "Kind": 0, @@ -57224,10 +55712,8 @@ }, { "__Checksum": { - "Data1": 879148924407127598, - "Data2": -7201974455781299439, - "Data3": -555151483299880873, - "Data4": 2108997988377972799 + "Data1": -2209513271894651534, + "Data2": 4511026773157733943 }, "Flags": 0, "Kind": 0, @@ -57257,10 +55743,8 @@ }, { "__Checksum": { - "Data1": -4171612777428898590, - "Data2": -1821613464252355892, - "Data3": 2619470190270819591, - "Data4": 1039629508476612935 + "Data1": -4766395661447507391, + "Data2": 7089004907654975417 }, "Flags": 0, "Kind": 0, @@ -57328,10 +55812,8 @@ }, { "__Checksum": { - "Data1": 6660574940497795334, - "Data2": -5170558584264076619, - "Data3": 4474786736680009114, - "Data4": -651361932701191869 + "Data1": -1707512536381084246, + "Data2": -5352367433953486067 }, "Flags": 0, "Kind": 0, @@ -57378,10 +55860,8 @@ }, { "__Checksum": { - "Data1": 2920013822942706068, - "Data2": -7641212993113162849, - "Data3": 8995001846617170024, - "Data4": 1631596758387016221 + "Data1": -3374625354177250003, + "Data2": 5405156880396132501 }, "Flags": 0, "Kind": 0, @@ -57421,10 +55901,8 @@ }, { "__Checksum": { - "Data1": 8082083079532526281, - "Data2": 2217850277842449500, - "Data3": -6004272680205334717, - "Data4": -5988891962302591760 + "Data1": -2514508649597431330, + "Data2": -7513601697044846739 }, "Flags": 0, "Kind": 0, @@ -57455,10 +55933,8 @@ }, { "__Checksum": { - "Data1": -4838830970519241879, - "Data2": 697154284087399943, - "Data3": -6531219950513391540, - "Data4": 7119659892989982513 + "Data1": 7464611192761161895, + "Data2": 7379354489464615132 }, "Flags": 0, "Kind": 0, @@ -57491,10 +55967,8 @@ }, { "__Checksum": { - "Data1": 2291275882883911275, - "Data2": 6394490454234280419, - "Data3": 466578173512533982, - "Data4": -8454154157160839310 + "Data1": -1156930813824951448, + "Data2": 1228976312432401931 }, "Flags": 0, "Kind": 0, @@ -57565,10 +56039,8 @@ }, { "__Checksum": { - "Data1": -5236545904649585253, - "Data2": 8111013381791297576, - "Data3": 8138466944905781148, - "Data4": -3490740159849104228 + "Data1": -3741162855986532985, + "Data2": 6457987159778156706 }, "Flags": 0, "Kind": 0, @@ -57598,10 +56070,8 @@ }, { "__Checksum": { - "Data1": -1464730534687891406, - "Data2": 7283351431267396315, - "Data3": 7047895005236862354, - "Data4": -2387586243443807667 + "Data1": 3817341009415343271, + "Data2": 4673743021780862970 }, "Flags": 0, "Kind": 0, @@ -57746,10 +56216,8 @@ }, { "__Checksum": { - "Data1": 7523995792776393576, - "Data2": -9099519166887030165, - "Data3": 8384652211401789751, - "Data4": -3802991361984567518 + "Data1": 887451380745723158, + "Data2": -2101818175394879486 }, "Flags": 0, "Kind": 0, @@ -57796,10 +56264,8 @@ }, { "__Checksum": { - "Data1": 497965607212224754, - "Data2": -2971543707216623721, - "Data3": 728709982443442493, - "Data4": -8906955175375875973 + "Data1": -3157981509813942644, + "Data2": -7689740180202472679 }, "Flags": 0, "Kind": 0, @@ -57846,10 +56312,8 @@ }, { "__Checksum": { - "Data1": 3262004727576511778, - "Data2": -5883894757466880662, - "Data3": -182997466019211296, - "Data4": -8677220460397194606 + "Data1": 7536876180531238438, + "Data2": -1461555757436384769 }, "Flags": 0, "Kind": 0, @@ -57982,10 +56446,8 @@ }, { "__Checksum": { - "Data1": -1245030050678082602, - "Data2": -3936847652083625951, - "Data3": -1915953213542591273, - "Data4": -8843852162041085475 + "Data1": -2127920273026383917, + "Data2": -6217828429596957285 }, "Flags": 0, "Kind": 0, @@ -58015,10 +56477,8 @@ }, { "__Checksum": { - "Data1": -7019171750182878924, - "Data2": -6045938514059238034, - "Data3": 262106104634610324, - "Data4": 2540207646360719946 + "Data1": -4660518226033243678, + "Data2": -9221993629820751864 }, "Flags": 0, "Kind": 0, @@ -58102,10 +56562,8 @@ }, { "__Checksum": { - "Data1": -1373283183311141644, - "Data2": 45353607997872373, - "Data3": 9148849216277838700, - "Data4": 5097956521573864821 + "Data1": 2448289200906788556, + "Data2": 4781396480103948768 }, "Flags": 0, "Kind": 0, @@ -58135,10 +56593,8 @@ }, { "__Checksum": { - "Data1": 7843095437845596727, - "Data2": -5918010434565823436, - "Data3": -5895612085207265041, - "Data4": 3880366410926654919 + "Data1": 4672383370651421568, + "Data2": 3041174444899398770 }, "Flags": 0, "Kind": 0, @@ -58374,10 +56830,8 @@ }, { "__Checksum": { - "Data1": -2102690224618659957, - "Data2": -2883867916015376759, - "Data3": -8429394236157494470, - "Data4": -218217653490749552 + "Data1": -4148686071173422737, + "Data2": -7853415720224437121 }, "Flags": 0, "Kind": 0, @@ -58407,10 +56861,8 @@ }, { "__Checksum": { - "Data1": 2801505603228110311, - "Data2": 7228866285153439962, - "Data3": 1596789165554115360, - "Data4": -3297451285399992894 + "Data1": -5035001475981966446, + "Data2": -8461669106576071378 }, "Flags": 0, "Kind": 0, @@ -58457,10 +56909,8 @@ }, { "__Checksum": { - "Data1": -2910015969538301781, - "Data2": 7645691876388369479, - "Data3": -7715784465007742686, - "Data4": 8289388678696732727 + "Data1": -5300869981452146192, + "Data2": 4167050322497450611 }, "Flags": 0, "Kind": 0, @@ -58490,10 +56940,8 @@ }, { "__Checksum": { - "Data1": 2639222709039048234, - "Data2": -1583085291158845877, - "Data3": -8148889233107275459, - "Data4": -640144807351430460 + "Data1": -6405974970475069739, + "Data2": -8836145079954003869 }, "Flags": 0, "Kind": 0, @@ -58561,10 +57009,8 @@ }, { "__Checksum": { - "Data1": -8260699695935064723, - "Data2": 992040870549482551, - "Data3": 3781908136516523879, - "Data4": -7760065351570204568 + "Data1": -5701476766820266781, + "Data2": -4995392558871235966 }, "Flags": 0, "Kind": 0, @@ -58611,10 +57057,8 @@ }, { "__Checksum": { - "Data1": 5509938583594995365, - "Data2": 8838968750538750778, - "Data3": 5413213222771613369, - "Data4": -8689764380836391559 + "Data1": 6897755480655122678, + "Data2": 6808104523868370838 }, "Flags": 0, "Kind": 0, @@ -58654,10 +57098,8 @@ }, { "__Checksum": { - "Data1": 3447163780723693382, - "Data2": 3694905363019971046, - "Data3": 3816816445502110390, - "Data4": -7958356861040795583 + "Data1": 6084142326591894699, + "Data2": -4065437583328597672 }, "Flags": 0, "Kind": 0, @@ -58688,10 +57130,8 @@ }, { "__Checksum": { - "Data1": -164674216835762072, - "Data2": 8969689416951801903, - "Data3": -4698799587544922338, - "Data4": -3353432114925805800 + "Data1": 8729458447742006008, + "Data2": 7673198979753820287 }, "Flags": 0, "Kind": 0, @@ -58724,10 +57164,8 @@ }, { "__Checksum": { - "Data1": -7643249750203665495, - "Data2": 1169688971000920704, - "Data3": -2379955965652865574, - "Data4": 7368049870736109213 + "Data1": 617090964202610347, + "Data2": 3842490919195759480 }, "Flags": 0, "Kind": 0, @@ -58774,10 +57212,8 @@ }, { "__Checksum": { - "Data1": -6154847254869909344, - "Data2": -1919838968672052937, - "Data3": -7746043049899204272, - "Data4": -4004581545065017369 + "Data1": -7326632069408613322, + "Data2": 7462683465303641808 }, "Flags": 0, "Kind": 0, @@ -58922,10 +57358,8 @@ }, { "__Checksum": { - "Data1": -5057548527186750062, - "Data2": 3796678650027314431, - "Data3": 3864947183197024852, - "Data4": 2598014975461650097 + "Data1": -6325741212171468192, + "Data2": 6525777366661296174 }, "Flags": 0, "Kind": 0, @@ -58955,10 +57389,8 @@ }, { "__Checksum": { - "Data1": 5951335715179678279, - "Data2": 2318489288386456551, - "Data3": 6262852112212670911, - "Data4": -577910133103538675 + "Data1": 7569379665159975811, + "Data2": 7498387515775531073 }, "Flags": 0, "Kind": 0, @@ -59284,10 +57716,8 @@ }, { "__Checksum": { - "Data1": 3985917159583923610, - "Data2": 4743418541455813322, - "Data3": 5260963973293811306, - "Data4": -7671733851978970968 + "Data1": 5010439592216435184, + "Data2": -7958936705235890912 }, "Flags": 0, "Kind": 0, @@ -59341,10 +57771,8 @@ }, { "__Checksum": { - "Data1": -9174523293922402675, - "Data2": 3765614069614029473, - "Data3": 192964318291599480, - "Data4": 9195580381553919910 + "Data1": 6701967999235096489, + "Data2": 1960962814215151508 }, "Flags": 0, "Kind": 0, @@ -59374,10 +57802,8 @@ }, { "__Checksum": { - "Data1": -7166199946357558653, - "Data2": 1392675149444708014, - "Data3": 405748434971336752, - "Data4": 4745560771565466126 + "Data1": -927886143102503091, + "Data2": 1724738598084788128 }, "Flags": 0, "Kind": 0, @@ -59425,10 +57851,8 @@ }, { "__Checksum": { - "Data1": -5370578421708054374, - "Data2": 4343608927543762027, - "Data3": -7755373421467674086, - "Data4": 6015440993907214402 + "Data1": -3035282716218429612, + "Data2": -695098028246620311 }, "Flags": 0, "Kind": 0, @@ -59468,10 +57892,8 @@ }, { "__Checksum": { - "Data1": 1809535752365793599, - "Data2": 2189521474334744937, - "Data3": 4925508234429281682, - "Data4": 7672016064739503237 + "Data1": -2358486496547466493, + "Data2": 8584744589588360706 }, "Flags": 0, "Kind": 0, @@ -59511,10 +57933,8 @@ }, { "__Checksum": { - "Data1": 4289324398217937302, - "Data2": -8566709112725280126, - "Data3": 5432898037323061142, - "Data4": -869009187739249619 + "Data1": 6166983001659540820, + "Data2": 7588185189577845814 }, "Flags": 0, "Kind": 0, @@ -59561,10 +57981,8 @@ }, { "__Checksum": { - "Data1": 3297323991006806789, - "Data2": -9022946642043023345, - "Data3": 7581789756629642343, - "Data4": 1100683572372007005 + "Data1": 3358280480933900367, + "Data2": 3642763487512844070 }, "Flags": 0, "Kind": 0, @@ -59611,10 +58029,8 @@ }, { "__Checksum": { - "Data1": -4174346774183960321, - "Data2": 426022494153579200, - "Data3": 2170710127152058959, - "Data4": 2410916088533110516 + "Data1": 158956809156156078, + "Data2": 8517554671693596612 }, "Flags": 0, "Kind": 0, @@ -59659,10 +58075,8 @@ }, { "__Checksum": { - "Data1": 8124591688573303277, - "Data2": -5172001617475034018, - "Data3": 3589372064628084936, - "Data4": -3454532928103577750 + "Data1": 3942705202095272530, + "Data2": 6773285356397628556 }, "Flags": 0, "Kind": 0, @@ -59868,10 +58282,8 @@ }, { "__Checksum": { - "Data1": 1973553378756528560, - "Data2": -718362750552491472, - "Data3": 4120887683345952013, - "Data4": 3816981112038880964 + "Data1": 7063313510868013683, + "Data2": 767581536875441476 }, "Flags": 0, "Kind": 0, @@ -59911,10 +58323,8 @@ }, { "__Checksum": { - "Data1": 5403892922084413489, - "Data2": -6240861685162231603, - "Data3": 5574656448946097350, - "Data4": 843398807780605253 + "Data1": 1248442563521198276, + "Data2": -8473541353629934982 }, "Flags": 0, "Kind": 0, @@ -60171,10 +58581,8 @@ }, { "__Checksum": { - "Data1": -7448500377768208056, - "Data2": 8169007429928610913, - "Data3": 7057478086120621807, - "Data4": -3811542372596222635 + "Data1": -4373248927874105619, + "Data2": 5728269552411561482 }, "Flags": 0, "Kind": 0, @@ -60197,10 +58605,8 @@ }, { "__Checksum": { - "Data1": 3111173296156042085, - "Data2": -3065444926140371610, - "Data3": -4654994157760597828, - "Data4": -320327055813035622 + "Data1": 8521573949568100928, + "Data2": -8157253218600240882 }, "Flags": 0, "Kind": 0, @@ -60268,10 +58674,8 @@ }, { "__Checksum": { - "Data1": -5711177456089296903, - "Data2": -1906762505058826828, - "Data3": -5600215279549031666, - "Data4": -8430432067535998571 + "Data1": 6897691498751795055, + "Data2": 7699380622541850560 }, "Flags": 0, "Kind": 0, @@ -60433,10 +58837,8 @@ }, { "__Checksum": { - "Data1": -4522225529304887361, - "Data2": -2639008809606940929, - "Data3": 196582254355111891, - "Data4": 2846982848732086661 + "Data1": 5883703278592231796, + "Data2": -841866010683353574 }, "Flags": 0, "Kind": 0, @@ -60534,10 +58936,8 @@ }, { "__Checksum": { - "Data1": -8390601531188440668, - "Data2": -4129279103488349662, - "Data3": -8859370808970898657, - "Data4": 3244583493568287848 + "Data1": 4597801777063179535, + "Data2": 4867917677399784834 }, "Flags": 0, "Kind": 0, @@ -60567,10 +58967,8 @@ }, { "__Checksum": { - "Data1": -6327766471012132220, - "Data2": 5127752200220764587, - "Data3": -6896781196336946106, - "Data4": 4768448161167917983 + "Data1": 2556465794607161972, + "Data2": -6365150214071030894 }, "Flags": 0, "Kind": 0, @@ -60603,10 +59001,8 @@ }, { "__Checksum": { - "Data1": -3743241759528754428, - "Data2": -2559027468429514546, - "Data3": 7441733359663388918, - "Data4": 1750351805831174562 + "Data1": 6806124353848366492, + "Data2": -2049793609234308795 }, "Flags": 0, "Kind": 0, @@ -60639,10 +59035,8 @@ }, { "__Checksum": { - "Data1": 679625500702925891, - "Data2": -3487982954043130896, - "Data3": -4766130549606709686, - "Data4": 8214872389038479120 + "Data1": -7459872370203435947, + "Data2": -8976381067899239924 }, "Flags": 0, "Kind": 0, @@ -60830,10 +59224,8 @@ }, { "__Checksum": { - "Data1": 7168446338084917183, - "Data2": 4994809616923705366, - "Data3": 4418903969863050776, - "Data4": 7474196476541865369 + "Data1": 8177444831584087431, + "Data2": 4294624250629461407 }, "Flags": 0, "Kind": 0, @@ -60884,10 +59276,8 @@ }, { "__Checksum": { - "Data1": -4650153362915887204, - "Data2": 7712797445294507482, - "Data3": -5806580003671400298, - "Data4": -1015474566977554600 + "Data1": -4278085749678721071, + "Data2": -1995838448890305009 }, "Flags": 0, "Kind": 0, @@ -60934,10 +59324,8 @@ }, { "__Checksum": { - "Data1": 7459355327402975204, - "Data2": -952082687195681029, - "Data3": 2638203731076810285, - "Data4": -842793793101800167 + "Data1": 2005396315089985771, + "Data2": -5870180002802921017 }, "Flags": 0, "Kind": 0, @@ -60976,10 +59364,8 @@ }, { "__Checksum": { - "Data1": 5047192092889246153, - "Data2": -7007847442782631332, - "Data3": 8568252863190785854, - "Data4": -158426439050171015 + "Data1": 430777719205562380, + "Data2": 7690786441315662600 }, "Flags": 0, "Kind": 0, @@ -61074,10 +59460,8 @@ }, { "__Checksum": { - "Data1": -581126348258603513, - "Data2": -5084258952179370652, - "Data3": 7457340448250311419, - "Data4": 8378419694308344852 + "Data1": -2317493820219844574, + "Data2": 7241864096364332732 }, "Flags": 0, "Kind": 0, @@ -61622,10 +60006,8 @@ }, { "__Checksum": { - "Data1": -806541024466401372, - "Data2": 6819068534084786679, - "Data3": -1764730598636171696, - "Data4": -731347807797174080 + "Data1": 5324678947979196669, + "Data2": -1430010492278580109 }, "Flags": 0, "Kind": 0, @@ -61685,10 +60067,8 @@ }, { "__Checksum": { - "Data1": 4637034411505408405, - "Data2": -1068765191950467960, - "Data3": -7519827759388388097, - "Data4": 8142232444743033024 + "Data1": 298631386551646403, + "Data2": -1385136299952496550 }, "Flags": 0, "Kind": 0, @@ -61739,10 +60119,8 @@ }, { "__Checksum": { - "Data1": -3338631797288193859, - "Data2": -9074182530675486317, - "Data3": -6525695502077430653, - "Data4": 5293975085443324028 + "Data1": 6896945476287103030, + "Data2": 316734778598469592 }, "Flags": 0, "Kind": 0, @@ -61809,10 +60187,8 @@ }, { "__Checksum": { - "Data1": -7726102382181599554, - "Data2": 6405345968169697858, - "Data3": -1033184466521161339, - "Data4": 7508798891390650775 + "Data1": 9063117766738812406, + "Data2": 1272035925356357084 }, "Flags": 0, "Kind": 0, @@ -61938,10 +60314,8 @@ }, { "__Checksum": { - "Data1": -3842954210608228341, - "Data2": -8572506160919083599, - "Data3": -5193839296565672231, - "Data4": 1241553707693967586 + "Data1": -2943238236780012269, + "Data2": -8308184894407175688 }, "Flags": 0, "Kind": 0, @@ -61976,10 +60350,8 @@ }, { "__Checksum": { - "Data1": -2882096737490705739, - "Data2": -3414861977250162771, - "Data3": 2151355200948350305, - "Data4": 351469246434512252 + "Data1": -23000492764930842, + "Data2": -5500396460995276818 }, "Flags": 0, "Kind": 0, @@ -62026,10 +60398,8 @@ }, { "__Checksum": { - "Data1": -2967172371437537913, - "Data2": -6057778915235509295, - "Data3": -6380569254398713914, - "Data4": -3532299963369235168 + "Data1": 8878759421131998832, + "Data2": 5587881426495607827 }, "Flags": 0, "Kind": 0, @@ -62089,10 +60459,8 @@ }, { "__Checksum": { - "Data1": 8248249999128523617, - "Data2": -8867405780328867714, - "Data3": 7100799273682335102, - "Data4": 6093184583376174172 + "Data1": 3138724983850181781, + "Data2": 8211451924535168631 }, "Flags": 0, "Kind": 0, @@ -62122,10 +60490,8 @@ }, { "__Checksum": { - "Data1": 1030365686238882849, - "Data2": -2587415465945871246, - "Data3": -5850317443527516996, - "Data4": 3041880794125640494 + "Data1": 6423448676448708726, + "Data2": 810094103787048334 }, "Flags": 0, "Kind": 0, @@ -62220,10 +60586,8 @@ }, { "__Checksum": { - "Data1": -3701630428156068598, - "Data2": -5628166926347174418, - "Data3": -9173894021362329763, - "Data4": 4784318697013815255 + "Data1": 2705138262795473471, + "Data2": 62818739085993009 }, "Flags": 0, "Kind": 0, @@ -62737,10 +61101,8 @@ }, { "__Checksum": { - "Data1": 6471912473258841589, - "Data2": -4883525965146626463, - "Data3": -428553059997181127, - "Data4": 4251730085994275677 + "Data1": -2329876237178484010, + "Data2": -7707267476194982617 }, "Flags": 0, "Kind": 0, @@ -62920,10 +61282,8 @@ }, { "__Checksum": { - "Data1": -208360027492985529, - "Data2": 5540678524465459969, - "Data3": -5983073468786353319, - "Data4": -8935345845080491627 + "Data1": 1621767331666950539, + "Data2": -2180818683083442429 }, "Flags": 0, "Kind": 0, @@ -63096,10 +61456,8 @@ }, { "__Checksum": { - "Data1": -7350693789901162092, - "Data2": -5957083446875778833, - "Data3": 3770940152558874507, - "Data4": 3904258989303528433 + "Data1": 8743981535176563373, + "Data2": 138618897009464463 }, "Flags": 0, "Kind": 0, @@ -63138,10 +61496,8 @@ }, { "__Checksum": { - "Data1": 525922767082292902, - "Data2": -5534069184825730997, - "Data3": -8819387175492784780, - "Data4": 5357666767698057547 + "Data1": -5354851987248325518, + "Data2": -1032646867508631237 }, "Flags": 0, "Kind": 0, @@ -63187,10 +61543,8 @@ }, { "__Checksum": { - "Data1": -4009123433733182703, - "Data2": 5259011127538665188, - "Data3": -8179427359277830849, - "Data4": -4327804531354391505 + "Data1": 4383772685565504999, + "Data2": 6035323611269391551 }, "Flags": 0, "Kind": 0, @@ -63286,10 +61640,8 @@ }, { "__Checksum": { - "Data1": 1393720266297076758, - "Data2": 1960168263942218996, - "Data3": -5450933980855013783, - "Data4": 7906858433052902589 + "Data1": -8869963418475386774, + "Data2": 2534614355685414246 }, "Flags": 0, "Kind": 0, @@ -63329,10 +61681,8 @@ }, { "__Checksum": { - "Data1": 120691310194773854, - "Data2": -8644723000213183614, - "Data3": -7232992631573838732, - "Data4": 2994463902805452950 + "Data1": -5202882584503157554, + "Data2": 1545268901140501509 }, "Flags": 0, "Kind": 0, @@ -63373,10 +61723,8 @@ }, { "__Checksum": { - "Data1": -1257076082964783124, - "Data2": -829477450920570960, - "Data3": 3155890839228290119, - "Data4": -8616016763924946396 + "Data1": 6341867109311157825, + "Data2": -7128495950991521227 }, "Flags": 0, "Kind": 0, @@ -63416,10 +61764,8 @@ }, { "__Checksum": { - "Data1": 6649923510238680262, - "Data2": 7817518800128165310, - "Data3": 2591449557554036396, - "Data4": -5908588553399236355 + "Data1": 8056757233958969841, + "Data2": 3227410931124658323 }, "Flags": 0, "Kind": 0, @@ -63459,10 +61805,8 @@ }, { "__Checksum": { - "Data1": 713732983564729741, - "Data2": -757434657992390869, - "Data3": -7694421939970697277, - "Data4": -6018941872264416680 + "Data1": -3439276701038607178, + "Data2": -460445625600298842 }, "Flags": 0, "Kind": 0, @@ -63502,10 +61846,8 @@ }, { "__Checksum": { - "Data1": 1227278049951417462, - "Data2": 3754819501614405913, - "Data3": -5993873786850228372, - "Data4": -8034796622196891411 + "Data1": -882297472036934415, + "Data2": -9064758788720568854 }, "Flags": 0, "Kind": 0, @@ -63536,10 +61878,8 @@ }, { "__Checksum": { - "Data1": 1097789728313074278, - "Data2": -5072842295543760142, - "Data3": -5859091250823236633, - "Data4": 285774219238311141 + "Data1": 7466336435245432973, + "Data2": -502283144295772453 }, "Flags": 0, "Kind": 0, @@ -63602,10 +61942,8 @@ }, { "__Checksum": { - "Data1": 9186100576584668447, - "Data2": 1425337849146845568, - "Data3": 8923635250974808918, - "Data4": -8219856280137041324 + "Data1": 8186276151890327693, + "Data2": 4693291186309057197 }, "Flags": 0, "Kind": 0, @@ -63659,10 +61997,8 @@ }, { "__Checksum": { - "Data1": -554955401489373592, - "Data2": -3026845832981287225, - "Data3": 6248818070476985925, - "Data4": 7180163141188281431 + "Data1": 7241779590915076182, + "Data2": 2308515498986848721 }, "Flags": 0, "Kind": 0, @@ -63716,10 +62052,8 @@ }, { "__Checksum": { - "Data1": 1170381810692310845, - "Data2": -1230184666999366473, - "Data3": 2555175299925791074, - "Data4": 3073481948447759448 + "Data1": -7482491785179012796, + "Data2": -7558653346797458722 }, "Flags": 0, "Kind": 0, @@ -63773,10 +62107,8 @@ }, { "__Checksum": { - "Data1": -3513093551530931993, - "Data2": 7424887881270790152, - "Data3": 6064948724034595134, - "Data4": -5454084075349961469 + "Data1": -1323731397365270963, + "Data2": -9168210519096744317 }, "Flags": 0, "Kind": 0, @@ -63840,10 +62172,8 @@ }, { "__Checksum": { - "Data1": -3337992450196685411, - "Data2": -16959687238908813, - "Data3": 506359410405445861, - "Data4": -8706949379398705948 + "Data1": 7559295212816039375, + "Data2": -2833834900217004526 }, "Flags": 0, "Kind": 0, @@ -63939,10 +62269,8 @@ }, { "__Checksum": { - "Data1": -2007235782708572141, - "Data2": 2639847723533372139, - "Data3": 8277095610086953026, - "Data4": -8225362953854598035 + "Data1": -6901878461269599424, + "Data2": 4542069707396069663 }, "Flags": 0, "Kind": 0, @@ -63982,10 +62310,8 @@ }, { "__Checksum": { - "Data1": -8525149222957738844, - "Data2": -4018295853833401192, - "Data3": 5250012197071741391, - "Data4": 3312552257921242656 + "Data1": -3542031299450125857, + "Data2": 887766216695048608 }, "Flags": 0, "Kind": 0, @@ -64026,10 +62352,8 @@ }, { "__Checksum": { - "Data1": -1120581019111934447, - "Data2": -17419642593784270, - "Data3": 331107650593269204, - "Data4": 2913312185892888142 + "Data1": 8986369470202438486, + "Data2": -309998548719702669 }, "Flags": 0, "Kind": 0, @@ -64069,10 +62393,8 @@ }, { "__Checksum": { - "Data1": 3404967597658227859, - "Data2": -8841829385640393813, - "Data3": 1735214245818199502, - "Data4": 6945689156775392583 + "Data1": -4668545798158252242, + "Data2": 3457673770577283139 }, "Flags": 0, "Kind": 0, @@ -64112,10 +62434,8 @@ }, { "__Checksum": { - "Data1": 6311987336286252029, - "Data2": 8898452779210142823, - "Data3": 1738758573228754617, - "Data4": 2746943401616792857 + "Data1": -2409737852226588165, + "Data2": -103490220055647895 }, "Flags": 0, "Kind": 0, @@ -64155,10 +62475,8 @@ }, { "__Checksum": { - "Data1": 7127886338263747489, - "Data2": -5014259869698980893, - "Data3": -1379085400217572512, - "Data4": 8425874923928564463 + "Data1": 1333523540851621721, + "Data2": -3256042992107044348 }, "Flags": 0, "Kind": 0, @@ -64189,10 +62507,8 @@ }, { "__Checksum": { - "Data1": 8050929352387134391, - "Data2": -3461037520016885204, - "Data3": -8926277024308711819, - "Data4": -4883854054427499659 + "Data1": -1545950959939518151, + "Data2": -7992990097857027127 }, "Flags": 0, "Kind": 0, @@ -64255,10 +62571,8 @@ }, { "__Checksum": { - "Data1": 9055146617990279593, - "Data2": -5165473758630564532, - "Data3": -1729524795771294922, - "Data4": 3353162481567885025 + "Data1": -5926611299552563063, + "Data2": -2912286094068535257 }, "Flags": 0, "Kind": 0, @@ -64319,10 +62633,8 @@ }, { "__Checksum": { - "Data1": -994488215713619560, - "Data2": -3413300375529255644, - "Data3": 8157145259355925679, - "Data4": 3934870069525897611 + "Data1": -4773371773502240366, + "Data2": -6626819582467775300 }, "Flags": 0, "Kind": 0, @@ -64383,10 +62695,8 @@ }, { "__Checksum": { - "Data1": 6962504485361073765, - "Data2": -3440225263480857426, - "Data3": 2472132757527832475, - "Data4": 4205876693026000340 + "Data1": 6524712025682127241, + "Data2": -1967051976244178363 }, "Flags": 0, "Kind": 0, @@ -64447,10 +62757,8 @@ }, { "__Checksum": { - "Data1": 129540008226163186, - "Data2": -5993685176038784270, - "Data3": 4493649931470725871, - "Data4": 2447638442640664485 + "Data1": 3817438558357228332, + "Data2": -7993655105978833689 }, "Flags": 0, "Kind": 0, @@ -64528,10 +62836,8 @@ }, { "__Checksum": { - "Data1": 7535205692778938706, - "Data2": 2811567791392763278, - "Data3": -473745780833470146, - "Data4": 2296562746295328586 + "Data1": -4344047567748995549, + "Data2": -139036793996553502 }, "Flags": 0, "Kind": 0, @@ -64591,10 +62897,8 @@ }, { "__Checksum": { - "Data1": 9207670054517589642, - "Data2": 5319573546192708947, - "Data3": 1041810171084084207, - "Data4": 6642195519986092032 + "Data1": -6438257371200405538, + "Data2": -7368251369895567644 }, "Flags": 0, "Kind": 0, @@ -64682,10 +62986,8 @@ }, { "__Checksum": { - "Data1": -4041783687465727628, - "Data2": 5343308760889367917, - "Data3": 8098928091400743224, - "Data4": -8101420847107563409 + "Data1": 5509158044384452781, + "Data2": 3503033581341881985 }, "Flags": 0, "Kind": 0, @@ -65417,10 +63719,8 @@ }, { "__Checksum": { - "Data1": -6702276761288849194, - "Data2": -6010309673501207396, - "Data3": -7666830138730423577, - "Data4": -6988512390486830123 + "Data1": 7557737402943969315, + "Data2": -2901510019177871229 }, "Flags": 0, "Kind": 0, @@ -65515,10 +63815,8 @@ }, { "__Checksum": { - "Data1": 2894365138198702418, - "Data2": -4674265842410368104, - "Data3": -687930354518677843, - "Data4": 776211494152090538 + "Data1": -4507919877007441258, + "Data2": 5719128162148322469 }, "Flags": 0, "Kind": 0, @@ -65572,10 +63870,8 @@ }, { "__Checksum": { - "Data1": -7110837875226867923, - "Data2": 8391955151569694356, - "Data3": 8209899868195667709, - "Data4": -663237723905424980 + "Data1": -7674971464003660248, + "Data2": -8884228805812796701 }, "Flags": 0, "Kind": 0, @@ -65726,10 +64022,8 @@ }, { "__Checksum": { - "Data1": 7957428556039877530, - "Data2": 3526500062472416996, - "Data3": 6585004565935725536, - "Data4": 1762836124572125844 + "Data1": 267844465130470581, + "Data2": -6171627230074415046 }, "Flags": 0, "Kind": 0, @@ -65796,10 +64090,8 @@ }, { "__Checksum": { - "Data1": 8005574308925107072, - "Data2": -909144557366696098, - "Data3": -87808944186914586, - "Data4": 3292523722245069757 + "Data1": 387609756546636329, + "Data2": -2994991955919651843 }, "Flags": 0, "Kind": 0, @@ -65866,10 +64158,8 @@ }, { "__Checksum": { - "Data1": 7295736752265338163, - "Data2": -4943047429649587480, - "Data3": -3025276982842882792, - "Data4": 4154901952773247098 + "Data1": 4794182950460633904, + "Data2": -2839582244165211546 }, "Flags": 0, "Kind": 0, @@ -66091,10 +64381,8 @@ }, { "__Checksum": { - "Data1": 2640181806900702052, - "Data2": 2816624894674722606, - "Data3": 7841203858349675762, - "Data4": 3077864576662250384 + "Data1": -6804460462972701814, + "Data2": -5193388784939916727 }, "Flags": 0, "Kind": 0, @@ -66141,10 +64429,8 @@ }, { "__Checksum": { - "Data1": -2937353963772599949, - "Data2": -5902439402424746074, - "Data3": 512583125624872358, - "Data4": -7788351297479949220 + "Data1": 5835368087237971537, + "Data2": -7289321763461547112 }, "Flags": 0, "Kind": 0, @@ -66174,10 +64460,8 @@ }, { "__Checksum": { - "Data1": 4650688971931624636, - "Data2": -5468645433230698614, - "Data3": -4281660880846910192, - "Data4": 4534418640240574920 + "Data1": -2527214426090355561, + "Data2": -1868146995757306673 }, "Flags": 0, "Kind": 0, @@ -66273,10 +64557,8 @@ }, { "__Checksum": { - "Data1": 3671745652144538285, - "Data2": 1089708924810227391, - "Data3": 2780027255740016061, - "Data4": 2262583944742868393 + "Data1": -509544894668173101, + "Data2": 763701636209384599 }, "Flags": 0, "Kind": 0, @@ -66311,10 +64593,8 @@ }, { "__Checksum": { - "Data1": 3638268070447949851, - "Data2": -2338953113404279476, - "Data3": 4476215754885246527, - "Data4": 8650785939697309202 + "Data1": -4728052332578410986, + "Data2": -4224884865583178665 }, "Flags": 0, "Kind": 0, @@ -66354,10 +64634,8 @@ }, { "__Checksum": { - "Data1": -4220101335821997619, - "Data2": -3865426078416092284, - "Data3": -4812163676687921103, - "Data4": 8759033057980486574 + "Data1": -5542780788924552243, + "Data2": -8128426062598169308 }, "Flags": 0, "Kind": 0, @@ -66397,10 +64675,8 @@ }, { "__Checksum": { - "Data1": -5548727824624403922, - "Data2": -2293675480102616476, - "Data3": 64825735994537151, - "Data4": -7666684855759973607 + "Data1": -3202423584992351405, + "Data2": -4135103864321577084 }, "Flags": 0, "Kind": 0, @@ -66445,10 +64721,8 @@ }, { "__Checksum": { - "Data1": -8766991263710165875, - "Data2": -9097955189849389949, - "Data3": -5998103988980773256, - "Data4": -4136132362478021808 + "Data1": 961651761177991889, + "Data2": -6055354457056287507 }, "Flags": 0, "Kind": 0, @@ -66471,10 +64745,8 @@ }, { "__Checksum": { - "Data1": 1288915103610931552, - "Data2": 7507789355668795799, - "Data3": 5675428151525528368, - "Data4": -4937368531928702588 + "Data1": 6022334613301259590, + "Data2": 6367400622410115035 }, "Flags": 0, "Kind": 0, @@ -66615,10 +64887,8 @@ }, { "__Checksum": { - "Data1": -8172830382436128755, - "Data2": -5274743641233537478, - "Data3": -8500154539624051437, - "Data4": 4184594374805125535 + "Data1": 3418772230141963916, + "Data2": -4411589457701073794 }, "Flags": 0, "Kind": 0, @@ -66665,10 +64935,8 @@ }, { "__Checksum": { - "Data1": -2752997437573846974, - "Data2": -7095238843584479890, - "Data3": 415515660117674308, - "Data4": 4538453109001461932 + "Data1": 6498338904349223272, + "Data2": 9206970560610631266 }, "Flags": 0, "Kind": 0, @@ -66722,10 +64990,8 @@ }, { "__Checksum": { - "Data1": 3977406274919962447, - "Data2": -5638327088747477540, - "Data3": -2777953703484185957, - "Data4": -6821322534185228750 + "Data1": -1760859797185645436, + "Data2": 8361914325843881584 }, "Flags": 0, "Kind": 0, @@ -66755,10 +65021,8 @@ }, { "__Checksum": { - "Data1": 6174842532366674806, - "Data2": -2722222478888285691, - "Data3": -7084070654395204618, - "Data4": -5059886268648482241 + "Data1": 387999902755975539, + "Data2": -1790486613982775528 }, "Flags": 0, "Kind": 0, @@ -66833,10 +65097,8 @@ }, { "__Checksum": { - "Data1": 418697920908331928, - "Data2": -1451775423876323397, - "Data3": 1210891283361353068, - "Data4": -7404106726492937196 + "Data1": 8709954004526492818, + "Data2": 5456479889223846972 }, "Flags": 0, "Kind": 0, @@ -66883,10 +65145,8 @@ }, { "__Checksum": { - "Data1": 4374615559609894378, - "Data2": 661079871214086142, - "Data3": -799268622996814532, - "Data4": 4020683868992592837 + "Data1": -7462217758748718567, + "Data2": -5899945231949445140 }, "Flags": 0, "Kind": 0, @@ -66916,10 +65176,8 @@ }, { "__Checksum": { - "Data1": 6569253908800484828, - "Data2": 7436921089449699813, - "Data3": 8210039716570539966, - "Data4": -5825196320792754601 + "Data1": -401130459794020388, + "Data2": -791592115942664545 }, "Flags": 0, "Kind": 0, @@ -66980,10 +65238,8 @@ }, { "__Checksum": { - "Data1": 1616602031808388939, - "Data2": 8995089826377549903, - "Data3": -5855062887898015265, - "Data4": 8978003015251888772 + "Data1": -8210657069388312919, + "Data2": -4839745755954136611 }, "Flags": 0, "Kind": 0, @@ -67030,10 +65286,8 @@ }, { "__Checksum": { - "Data1": 7085642539535482402, - "Data2": -890671485469161735, - "Data3": -2885595978915889435, - "Data4": 8553713499408577865 + "Data1": -1108080574347759872, + "Data2": 6069052693542113477 }, "Flags": 0, "Kind": 0, @@ -67063,10 +65317,8 @@ }, { "__Checksum": { - "Data1": -4834253248226397923, - "Data2": 3763503819175402179, - "Data3": 2229088240699554157, - "Data4": -7697067300388700261 + "Data1": 5998672385667935018, + "Data2": -227706541070486019 }, "Flags": 0, "Kind": 0, @@ -67127,10 +65379,8 @@ }, { "__Checksum": { - "Data1": -1114912748708204718, - "Data2": -1339260039601128937, - "Data3": -1463503247144832536, - "Data4": -7198755231753690439 + "Data1": 738617968969167048, + "Data2": 1509915702246417394 }, "Flags": 0, "Kind": 0, @@ -67177,10 +65427,8 @@ }, { "__Checksum": { - "Data1": -2232827219850696478, - "Data2": -2430295571472104758, - "Data3": -3122535922163649327, - "Data4": 1756660986335573883 + "Data1": -8777576057289845427, + "Data2": -7493192320728352655 }, "Flags": 0, "Kind": 0, @@ -67210,10 +65458,8 @@ }, { "__Checksum": { - "Data1": 4012155546603784996, - "Data2": 7204159137498520398, - "Data3": 8824191570211376195, - "Data4": 5165043000081658279 + "Data1": -2033392387568499819, + "Data2": 4757417566275304006 }, "Flags": 0, "Kind": 0, @@ -67274,10 +65520,8 @@ }, { "__Checksum": { - "Data1": 1103026699001821168, - "Data2": 788918455463346439, - "Data3": 1845677482678576095, - "Data4": 6171012450666247183 + "Data1": -5041893011423695869, + "Data2": 1168331332677469120 }, "Flags": 0, "Kind": 0, @@ -67323,10 +65567,8 @@ }, { "__Checksum": { - "Data1": 7247055628691669880, - "Data2": -60804421011627740, - "Data3": -1640390005061607749, - "Data4": -8625256697470268423 + "Data1": -8157895990208490314, + "Data2": 7119247007934721041 }, "Flags": 0, "Kind": 0, @@ -67373,10 +65615,8 @@ }, { "__Checksum": { - "Data1": 3962161376158726973, - "Data2": -239729153947528587, - "Data3": -9121133592260107998, - "Data4": 5447763202087694110 + "Data1": 3298932467783601063, + "Data2": -3766378261483110239 }, "Flags": 0, "Kind": 0, @@ -67406,10 +65646,8 @@ }, { "__Checksum": { - "Data1": 1116164742046517816, - "Data2": -5713887747882906132, - "Data3": -7311231517009136325, - "Data4": -4351021884749433192 + "Data1": 5915294766745581084, + "Data2": 8540702339483930095 }, "Flags": 0, "Kind": 0, @@ -67470,10 +65708,8 @@ }, { "__Checksum": { - "Data1": 6916741821956856567, - "Data2": 1797883786959983799, - "Data3": 1969888721895792186, - "Data4": -3070758106730462313 + "Data1": 6801886198838389578, + "Data2": -7324873377468327917 }, "Flags": 0, "Kind": 0, @@ -67534,10 +65770,8 @@ }, { "__Checksum": { - "Data1": 7231256669180930531, - "Data2": -1096505372692327523, - "Data3": 94731393377200506, - "Data4": -6333479141060763137 + "Data1": 7717582612920119933, + "Data2": -353445378474416930 }, "Flags": 0, "Kind": 0, @@ -67598,10 +65832,8 @@ }, { "__Checksum": { - "Data1": 1753062146696095568, - "Data2": -6732447374492020707, - "Data3": 1598572855615011369, - "Data4": 8206898090462750992 + "Data1": 7976779169509858019, + "Data2": -8603250546641292875 }, "Flags": 0, "Kind": 0, @@ -67662,10 +65894,8 @@ }, { "__Checksum": { - "Data1": 9068856435804239461, - "Data2": 970690826050753700, - "Data3": 9088897031135781082, - "Data4": -5238964239707731319 + "Data1": -864205691829140773, + "Data2": 6019507149331028113 }, "Flags": 0, "Kind": 0, @@ -67711,10 +65941,8 @@ }, { "__Checksum": { - "Data1": 1080492977425002283, - "Data2": 7714139476590416065, - "Data3": 718436151989913851, - "Data4": 183377985668173120 + "Data1": -5331985003516963435, + "Data2": 6797991085552411646 }, "Flags": 0, "Kind": 0, @@ -67761,10 +65989,8 @@ }, { "__Checksum": { - "Data1": 7825550352850362042, - "Data2": 7091681397999495577, - "Data3": 2381104631869770094, - "Data4": 9078378580889815410 + "Data1": -8941599198122894009, + "Data2": 7409860335647446603 }, "Flags": 0, "Kind": 0, @@ -67832,10 +66058,8 @@ }, { "__Checksum": { - "Data1": 5570907126568761218, - "Data2": 4199788908229891647, - "Data3": -1535639701487842233, - "Data4": 2012549117602732641 + "Data1": -4757069395229548873, + "Data2": -6360233678277359579 }, "Flags": 0, "Kind": 0, @@ -67881,10 +66105,8 @@ }, { "__Checksum": { - "Data1": -3859239864034701781, - "Data2": -5197355374333819165, - "Data3": -1980381158444325729, - "Data4": 6900766195644336681 + "Data1": 3818030603323715970, + "Data2": 7082898577678532818 }, "Flags": 0, "Kind": 0, @@ -68029,10 +66251,8 @@ }, { "__Checksum": { - "Data1": 9193504985526392578, - "Data2": 2592635121817227685, - "Data3": -2892724215957070465, - "Data4": 3841600823206861413 + "Data1": 4056504099030898171, + "Data2": -4503333071371461446 }, "Flags": 0, "Kind": 0, @@ -68100,10 +66320,8 @@ }, { "__Checksum": { - "Data1": 6869008296940886521, - "Data2": -7899301407672303650, - "Data3": 8290893217541833166, - "Data4": -1529704131794533201 + "Data1": 100966353527577462, + "Data2": -5448660994947452034 }, "Flags": 0, "Kind": 0, @@ -68220,10 +66438,8 @@ }, { "__Checksum": { - "Data1": -5675678363006852525, - "Data2": -2208488748226419753, - "Data3": -530011882448045599, - "Data4": 759226813253829394 + "Data1": -947910608677836341, + "Data2": 7970467638973448010 }, "Flags": 0, "Kind": 0, @@ -68434,10 +66650,8 @@ }, { "__Checksum": { - "Data1": 4569809188048914199, - "Data2": 354762393754662833, - "Data3": 4594290058529134770, - "Data4": -3275332186918574157 + "Data1": 6089323893954269867, + "Data2": -4779928379600703792 }, "Flags": 0, "Kind": 0, @@ -68619,10 +66833,8 @@ }, { "__Checksum": { - "Data1": 6460700349051761752, - "Data2": -8211623575162936701, - "Data3": -4403759885090965988, - "Data4": 1600195909947458650 + "Data1": 988027316747536046, + "Data2": -4134698042106939631 }, "Flags": 0, "Kind": 0, @@ -68652,10 +66864,8 @@ }, { "__Checksum": { - "Data1": -338010125583431293, - "Data2": -3024644487048918848, - "Data3": -7175411445148412501, - "Data4": 6084639280082488880 + "Data1": 5194223339080673890, + "Data2": -476069440198750661 }, "Flags": 0, "Kind": 0, @@ -68737,10 +66947,8 @@ }, { "__Checksum": { - "Data1": 7931283489094950717, - "Data2": 1762593361756086510, - "Data3": 2717068975726755701, - "Data4": 6526018568405313240 + "Data1": 5665933178875041132, + "Data2": -1042591837840579514 }, "Flags": 0, "Kind": 0, @@ -68836,10 +67044,8 @@ }, { "__Checksum": { - "Data1": 346415826593028539, - "Data2": 8799222867381785838, - "Data3": -5623778128122473994, - "Data4": 5021453045693652148 + "Data1": -5612353351054276428, + "Data2": -120426249247026932 }, "Flags": 0, "Kind": 0, @@ -68977,10 +67183,8 @@ }, { "__Checksum": { - "Data1": -4586067834146895017, - "Data2": 6309603917898270933, - "Data3": 4975614402440356154, - "Data4": -8227682617638933094 + "Data1": -4288528927525506374, + "Data2": 6863099978827134745 }, "Flags": 0, "Kind": 0, @@ -69121,10 +67325,8 @@ }, { "__Checksum": { - "Data1": -2598713980603618032, - "Data2": -1495900372642969716, - "Data3": 5138185495577795999, - "Data4": -5803417933085291452 + "Data1": -3210602269458515330, + "Data2": 7713048339939508479 }, "Flags": 0, "Kind": 0, @@ -69171,10 +67373,8 @@ }, { "__Checksum": { - "Data1": 94402742000292196, - "Data2": -5045201818696371876, - "Data3": 6164236385139264044, - "Data4": 8638574575512547583 + "Data1": 6514793006217594283, + "Data2": -4858336351031000315 }, "Flags": 0, "Kind": 0, @@ -69284,10 +67484,8 @@ }, { "__Checksum": { - "Data1": 5828187404599627230, - "Data2": -958152568697625675, - "Data3": 1610260098665357400, - "Data4": 9071396583090193220 + "Data1": 4681082759036746989, + "Data2": 3617868193187058834 }, "Flags": 0, "Kind": 0, @@ -69317,10 +67515,8 @@ }, { "__Checksum": { - "Data1": 2830500817907870049, - "Data2": 6585765414558019078, - "Data3": 8417807192757994387, - "Data4": 1253308620663244695 + "Data1": 55651186135451954, + "Data2": 3969246595000432907 }, "Flags": 0, "Kind": 0, @@ -69351,10 +67547,8 @@ }, { "__Checksum": { - "Data1": -985609893596326203, - "Data2": 8759614402984911586, - "Data3": 4926150672666542503, - "Data4": -4332318012208171899 + "Data1": 1728747787042302892, + "Data2": -350618827802741122 }, "Flags": 0, "Kind": 0, @@ -69464,10 +67658,8 @@ }, { "__Checksum": { - "Data1": -5377940781411732849, - "Data2": -5598662921938176653, - "Data3": 3759036759824772412, - "Data4": 2492380844814561734 + "Data1": -1965934579574907690, + "Data2": -6149782325709023891 }, "Flags": 0, "Kind": 0, @@ -69508,10 +67700,8 @@ }, { "__Checksum": { - "Data1": 7751777704032962864, - "Data2": -1504487893528784986, - "Data3": 3247611023620457341, - "Data4": 1078759556470979914 + "Data1": 2964966626550192302, + "Data2": 258287477167786989 }, "Flags": 0, "Kind": 0, @@ -69565,10 +67755,8 @@ }, { "__Checksum": { - "Data1": 7313422238051434863, - "Data2": 7906150404998092335, - "Data3": -7712696630541526965, - "Data4": -6254866162490653632 + "Data1": 3366094610886375399, + "Data2": -5725706045252906239 }, "Flags": 0, "Kind": 0, @@ -69622,10 +67810,8 @@ }, { "__Checksum": { - "Data1": 538201397594418129, - "Data2": 3205284701971484813, - "Data3": -4564070280262513592, - "Data4": -1900640845972310248 + "Data1": -189176597514060114, + "Data2": -7078126094401179646 }, "Flags": 0, "Kind": 0, @@ -69748,10 +67934,8 @@ }, { "__Checksum": { - "Data1": 1483584678817654402, - "Data2": -3703298249589538017, - "Data3": 3802876102154163393, - "Data4": 1043925065351278040 + "Data1": 5926240026128978386, + "Data2": -4775236263694008752 }, "Flags": 0, "Kind": 0, @@ -69986,10 +68170,8 @@ }, { "__Checksum": { - "Data1": -3416082417882661311, - "Data2": -7642001413029474007, - "Data3": -1791794669271078232, - "Data4": 749246512532114480 + "Data1": 4765354956566258192, + "Data2": 2671258874125668845 }, "Flags": 0, "Kind": 0, @@ -70054,10 +68236,8 @@ }, { "__Checksum": { - "Data1": -1239968305457289938, - "Data2": 8165424192374909352, - "Data3": -7590749209032359228, - "Data4": 4631563700677197557 + "Data1": 9118375593809523428, + "Data2": 8451972164765728677 }, "Flags": 0, "Kind": 0, @@ -70146,10 +68326,8 @@ }, { "__Checksum": { - "Data1": 7467888291754707849, - "Data2": 2372741968202781812, - "Data3": -4584072246746751959, - "Data4": 6723730831392260288 + "Data1": 3297391573988483816, + "Data2": -7202754530063413075 }, "Flags": 0, "Kind": 0, @@ -70179,10 +68357,8 @@ }, { "__Checksum": { - "Data1": -3630793526547779960, - "Data2": -6219955012921596009, - "Data3": -1134548889529295299, - "Data4": -5930601923790552160 + "Data1": -1163109399354308397, + "Data2": 7502607329346384999 }, "Flags": 0, "Kind": 0, @@ -70264,10 +68440,8 @@ }, { "__Checksum": { - "Data1": -6703368641060126830, - "Data2": 6856418532212605470, - "Data3": -7822143817117968722, - "Data4": 6920201542957387626 + "Data1": 362607662550648458, + "Data2": -7236919340921455560 }, "Flags": 0, "Kind": 0, @@ -70306,10 +68480,8 @@ }, { "__Checksum": { - "Data1": -7649557227078753428, - "Data2": 1541531014681912838, - "Data3": -7047002048008038317, - "Data4": -6901017128666858784 + "Data1": -2498120977040455471, + "Data2": 8774281405760901216 }, "Flags": 0, "Kind": 0, @@ -70390,10 +68562,8 @@ }, { "__Checksum": { - "Data1": -1533510028335945318, - "Data2": 5271671919179163143, - "Data3": 589104494095629202, - "Data4": 7719857829620085992 + "Data1": -6845135781220337147, + "Data2": 8240586296269126833 }, "Flags": 0, "Kind": 0, @@ -70474,10 +68644,8 @@ }, { "__Checksum": { - "Data1": -4087343071297462549, - "Data2": 505008773925497253, - "Data3": 1341249674465572384, - "Data4": -1391423456999694159 + "Data1": -7945729695271551868, + "Data2": -7856085520289280116 }, "Flags": 0, "Kind": 0, @@ -70529,10 +68697,8 @@ }, { "__Checksum": { - "Data1": -8814408285241889649, - "Data2": 5437277536976570947, - "Data3": 5510642222024738459, - "Data4": -1155475580053111831 + "Data1": -2779117491039561898, + "Data2": 5713799177047665065 }, "Flags": 0, "Kind": 0, @@ -70641,10 +68807,8 @@ }, { "__Checksum": { - "Data1": 47435073197670380, - "Data2": -5663265654688060008, - "Data3": -4592473969627011308, - "Data4": -1682390410428383662 + "Data1": -2584246102688039116, + "Data2": -7528651572598553063 }, "Flags": 0, "Kind": 0, @@ -70755,10 +68919,8 @@ }, { "__Checksum": { - "Data1": -8619649773255056069, - "Data2": -2417811933581686536, - "Data3": 6051458370655073301, - "Data4": -7978147037821440820 + "Data1": 1843265656003982268, + "Data2": -6152570278109186683 }, "Flags": 0, "Kind": 0, @@ -70798,10 +68960,8 @@ }, { "__Checksum": { - "Data1": 4519667213146838855, - "Data2": -6204759390165961261, - "Data3": 8509889206505224282, - "Data4": -405862436216424875 + "Data1": -653834662288159185, + "Data2": -23965203740697493 }, "Flags": 0, "Kind": 0, @@ -70925,10 +69085,8 @@ }, { "__Checksum": { - "Data1": 1449992308195836238, - "Data2": -7288199334608706342, - "Data3": 6566647154016665056, - "Data4": 854006440321051051 + "Data1": 3488510985770785776, + "Data2": -73310582596246508 }, "Flags": 0, "Kind": 0, @@ -71109,10 +69267,8 @@ }, { "__Checksum": { - "Data1": 7080330229528586937, - "Data2": -6041707879341971916, - "Data3": 5303479299430008598, - "Data4": -3348657062737331621 + "Data1": 7187081772080982285, + "Data2": 4138125416744483029 }, "Flags": 0, "Kind": 0, @@ -71208,10 +69364,8 @@ }, { "__Checksum": { - "Data1": -5168472171459410888, - "Data2": -6808854943942461239, - "Data3": -8304685518198152746, - "Data4": -6013288473094673824 + "Data1": -7151115516831224449, + "Data2": -6957428575119676563 }, "Flags": 0, "Kind": 0, @@ -71241,10 +69395,8 @@ }, { "__Checksum": { - "Data1": 8537323273006780372, - "Data2": -1662251672191141175, - "Data3": -2546920779780109203, - "Data4": 7972939813234368178 + "Data1": -6127569496142365071, + "Data2": -9133611367130748142 }, "Flags": 0, "Kind": 0, @@ -71408,10 +69560,8 @@ }, { "__Checksum": { - "Data1": -7586261920021875824, - "Data2": 675197696387278514, - "Data3": 5753517545159108224, - "Data4": -106505993955338338 + "Data1": 4384765172360240844, + "Data2": 3900644224642420314 }, "Flags": 0, "Kind": 0, @@ -71513,10 +69663,8 @@ }, { "__Checksum": { - "Data1": 6202280485087166275, - "Data2": 7136384167431020479, - "Data3": 7003036004208827330, - "Data4": 4254054347505515225 + "Data1": -4884963542661215400, + "Data2": 1740304005729789850 }, "Flags": 0, "Kind": 0, @@ -71568,10 +69716,8 @@ }, { "__Checksum": { - "Data1": 8284433213020267504, - "Data2": -3183484504241752339, - "Data3": 4488913395620233698, - "Data4": 6702712339154830464 + "Data1": 8306599190816410491, + "Data2": 9066459364768359890 }, "Flags": 0, "Kind": 0, @@ -71618,10 +69764,8 @@ }, { "__Checksum": { - "Data1": 6092634584809583752, - "Data2": 1997505946632021323, - "Data3": -6367740962599375604, - "Data4": -458589506577827558 + "Data1": -769019148892977571, + "Data2": 955777680318641198 }, "Flags": 0, "Kind": 0, @@ -71878,10 +70022,8 @@ }, { "__Checksum": { - "Data1": 7205890902209575801, - "Data2": -8363033840340813243, - "Data3": -8822825548796327974, - "Data4": -4848626321537096996 + "Data1": -1427939852471870754, + "Data2": 9210181456599104909 }, "Flags": 0, "Kind": 0, @@ -71921,10 +70063,8 @@ }, { "__Checksum": { - "Data1": -8675414449693032623, - "Data2": -2700285912430363516, - "Data3": -3098893647599813465, - "Data4": -4751105932351470082 + "Data1": 8836551237130411249, + "Data2": 4761582172144903913 }, "Flags": 0, "Kind": 0, @@ -71977,10 +70117,8 @@ }, { "__Checksum": { - "Data1": -3020820062056922300, - "Data2": 4127572414865315571, - "Data3": 7490765549375952636, - "Data4": 351086341157736281 + "Data1": -897115458134682029, + "Data2": -61837533811046541 }, "Flags": 0, "Kind": 0, @@ -72170,10 +70308,8 @@ }, { "__Checksum": { - "Data1": -4354443232945487948, - "Data2": -4710183313370749729, - "Data3": -4722941818073045501, - "Data4": -978329385164392360 + "Data1": 3524724746592563566, + "Data2": -8439842041392143454 }, "Flags": 0, "Kind": 0, @@ -72247,10 +70383,8 @@ }, { "__Checksum": { - "Data1": -310433482569853175, - "Data2": 8385029315499419842, - "Data3": 2037796629653547606, - "Data4": 2998677793492071992 + "Data1": -7893536873364159669, + "Data2": -2297501280380830746 }, "Flags": 0, "Kind": 0, @@ -72318,10 +70452,8 @@ }, { "__Checksum": { - "Data1": 8464297318026347826, - "Data2": -7369064131054728813, - "Data3": -8425466357317521023, - "Data4": -4234939140418448678 + "Data1": -2091665343687522557, + "Data2": -4528050674324757318 }, "Flags": 0, "Kind": 0, @@ -72368,10 +70500,8 @@ }, { "__Checksum": { - "Data1": 6031956932905743177, - "Data2": -1720434010901079179, - "Data3": 6920563043059080810, - "Data4": -8222118146296051163 + "Data1": 8241951619851668743, + "Data2": 8253363068268279197 }, "Flags": 0, "Kind": 0, @@ -72411,10 +70541,8 @@ }, { "__Checksum": { - "Data1": 3069731714499810634, - "Data2": -3770761720108185429, - "Data3": 6328023257682364792, - "Data4": -113724678261386876 + "Data1": 8377676808306058771, + "Data2": -2206501304108763802 }, "Flags": 0, "Kind": 0, @@ -72601,10 +70729,8 @@ }, { "__Checksum": { - "Data1": -7707599934531879049, - "Data2": 5096887515206491988, - "Data3": 4068995873505072407, - "Data4": 8042316551375699075 + "Data1": -6588452385594714181, + "Data2": -7613954705149103602 }, "Flags": 0, "Kind": 0, @@ -72634,10 +70760,8 @@ }, { "__Checksum": { - "Data1": -2192840685457690995, - "Data2": 3695491154764548768, - "Data3": -3211741483649700103, - "Data4": -6378072428050437495 + "Data1": -4069933001439197006, + "Data2": 651388782047973567 }, "Flags": 0, "Kind": 0, @@ -72677,10 +70801,8 @@ }, { "__Checksum": { - "Data1": -1872797544421352900, - "Data2": -8194703581454538394, - "Data3": -8301651074909035420, - "Data4": 3850589053946623750 + "Data1": -2781451162970464490, + "Data2": 8130744956587194499 }, "Flags": 0, "Kind": 0, @@ -72818,10 +70940,8 @@ }, { "__Checksum": { - "Data1": 8635480054348602605, - "Data2": 7347930298036696731, - "Data3": -490100940480288927, - "Data4": -4027586077831529032 + "Data1": 779653035151867760, + "Data2": 518830778644489030 }, "Flags": 0, "Kind": 0, @@ -72882,10 +71002,8 @@ }, { "__Checksum": { - "Data1": 5785444233842811070, - "Data2": -8761113571001989315, - "Data3": -2129201287502229509, - "Data4": -3970885925396830853 + "Data1": 8541132218959342562, + "Data2": 8554912728061341187 }, "Flags": 0, "Kind": 0, @@ -73079,10 +71197,8 @@ }, { "__Checksum": { - "Data1": 2616561309245195916, - "Data2": -3048520275588863740, - "Data3": -1224750096791035745, - "Data4": -6758773559797375956 + "Data1": -2116236598453115601, + "Data2": 8510827659470650458 }, "Flags": 0, "Kind": 0, @@ -73157,10 +71273,8 @@ }, { "__Checksum": { - "Data1": 5365228676702960178, - "Data2": 3566344336344856608, - "Data3": -242359733138406257, - "Data4": -3319067124099031658 + "Data1": 6880648616544350896, + "Data2": 542528450986473593 }, "Flags": 0, "Kind": 0, @@ -73259,10 +71373,8 @@ }, { "__Checksum": { - "Data1": 5479989783668454220, - "Data2": -7884601323632997414, - "Data3": -2030402753161351206, - "Data4": -707832347112295458 + "Data1": -5457610709682158056, + "Data2": 5116555714804192153 }, "Flags": 0, "Kind": 0, @@ -73330,10 +71442,8 @@ }, { "__Checksum": { - "Data1": 4223134210831994491, - "Data2": -6657051482445739950, - "Data3": -1058141489985970159, - "Data4": -3523524548522765355 + "Data1": 2083684172920027257, + "Data2": -5004344456963096025 }, "Flags": 0, "Kind": 0, @@ -73363,10 +71473,8 @@ }, { "__Checksum": { - "Data1": 7932028234245871467, - "Data2": 6833116090972050619, - "Data3": -4561931064704283355, - "Data4": 1001841770719221061 + "Data1": 6244935951080616829, + "Data2": 437386675896385597 }, "Flags": 0, "Kind": 0, @@ -73420,10 +71528,8 @@ }, { "__Checksum": { - "Data1": 7592603065046756361, - "Data2": -3515146943695559421, - "Data3": 954685831702671947, - "Data4": 5602348222948510302 + "Data1": -4770024006396290726, + "Data2": 8136373232248313237 }, "Flags": 0, "Kind": 0, @@ -73568,10 +71674,8 @@ }, { "__Checksum": { - "Data1": 5389394179129682827, - "Data2": -414066773334542142, - "Data3": -4905000690759507022, - "Data4": -1378755662214736466 + "Data1": 6976390826252808271, + "Data2": 6822636587304589727 }, "Flags": 0, "Kind": 0, @@ -73611,10 +71715,8 @@ }, { "__Checksum": { - "Data1": -6584285903879970196, - "Data2": -5117682408591164798, - "Data3": -4101262705553722395, - "Data4": 3410216546534307816 + "Data1": -6487723399469192114, + "Data2": 7788691730984527755 }, "Flags": 0, "Kind": 0, @@ -73689,10 +71791,8 @@ }, { "__Checksum": { - "Data1": 2166939374438496811, - "Data2": 3183870581142655839, - "Data3": -8474602507844636526, - "Data4": 5134205052335894563 + "Data1": -8679252282674768125, + "Data2": -3840129657063143114 }, "Flags": 0, "Kind": 0, @@ -74147,10 +72247,8 @@ }, { "__Checksum": { - "Data1": -2536303706619511226, - "Data2": -7908899336519727981, - "Data3": 4030085256543010193, - "Data4": 6708561704433758909 + "Data1": -7191315907203654560, + "Data2": 4699152106026163178 }, "Flags": 0, "Kind": 0, @@ -74218,10 +72316,8 @@ }, { "__Checksum": { - "Data1": 8221989223340451613, - "Data2": -7482682212891961593, - "Data3": 6442171974844082875, - "Data4": -6756506439085388902 + "Data1": -9134838912107580392, + "Data2": -3292355083292244603 }, "Flags": 0, "Kind": 0, @@ -74251,10 +72347,8 @@ }, { "__Checksum": { - "Data1": 6541971406724923963, - "Data2": -5138307892839241045, - "Data3": 5080356412967034777, - "Data4": 109678517203254158 + "Data1": 2842146667273673645, + "Data2": 1388370702214112427 }, "Flags": 0, "Kind": 0, @@ -74315,10 +72409,8 @@ }, { "__Checksum": { - "Data1": 5555425507655835816, - "Data2": 439003243119258458, - "Data3": 3164152561859599833, - "Data4": -3251245956151638769 + "Data1": -1814943800444626951, + "Data2": 2810683503901948288 }, "Flags": 0, "Kind": 0, @@ -74358,10 +72450,8 @@ }, { "__Checksum": { - "Data1": 8087490576167798305, - "Data2": -6114744380947738318, - "Data3": 605036229956175099, - "Data4": 5531177562271549433 + "Data1": 8062454489807579747, + "Data2": 3284511237479975524 }, "Flags": 0, "Kind": 0, @@ -74569,10 +72659,8 @@ }, { "__Checksum": { - "Data1": -1049305404671512928, - "Data2": -3773693346275601337, - "Data3": 3563988629573439574, - "Data4": -1031869143821612715 + "Data1": 2579001742918627878, + "Data2": -5191931589863848318 }, "Flags": 0, "Kind": 0, @@ -74602,10 +72690,8 @@ }, { "__Checksum": { - "Data1": -8588451438667804557, - "Data2": -6517264326357705215, - "Data3": -3831548355690566919, - "Data4": 553792664296770835 + "Data1": 7856828534515859790, + "Data2": -4662185703418751900 }, "Flags": 0, "Kind": 0, @@ -74855,10 +72941,8 @@ }, { "__Checksum": { - "Data1": -6902488054848568720, - "Data2": 6943494611533008735, - "Data3": 6004390051717021258, - "Data4": 1963987017817232835 + "Data1": 335542389078767356, + "Data2": 6541955051655105035 }, "Flags": 0, "Kind": 0, @@ -75108,10 +73192,8 @@ }, { "__Checksum": { - "Data1": 8624653512892417774, - "Data2": 2328290698532252361, - "Data3": -1248196234855374412, - "Data4": -2245141231972488864 + "Data1": 7643464478460758825, + "Data2": 3809891909832587769 }, "Flags": 0, "Kind": 0, @@ -75151,10 +73233,8 @@ }, { "__Checksum": { - "Data1": -6479633635716695894, - "Data2": -9063499584249347780, - "Data3": -2156707545939399641, - "Data4": 371806866433127787 + "Data1": 8228075006828872086, + "Data2": -8464972905996890657 }, "Flags": 0, "Kind": 0, @@ -75250,10 +73330,8 @@ }, { "__Checksum": { - "Data1": 901781072918299432, - "Data2": 5617735500562294593, - "Data3": -1995624964573851378, - "Data4": -7175091029984678074 + "Data1": -3958773370324322524, + "Data2": 2312135335119746798 }, "Flags": 0, "Kind": 0, @@ -75283,10 +73361,8 @@ }, { "__Checksum": { - "Data1": 7611536192432806374, - "Data2": -7523457270107797056, - "Data3": 9107544376205554267, - "Data4": -4920916884283010451 + "Data1": -8444326949038937788, + "Data2": -1752339521514649507 }, "Flags": 0, "Kind": 0, @@ -75333,10 +73409,8 @@ }, { "__Checksum": { - "Data1": -7554075572292048236, - "Data2": 9041344116914462482, - "Data3": -2978960011577718652, - "Data4": -256046479431498181 + "Data1": 2926690881474008076, + "Data2": -5400314215550841983 }, "Flags": 0, "Kind": 0, @@ -75418,10 +73492,8 @@ }, { "__Checksum": { - "Data1": 3977042043699171400, - "Data2": 130444899702327147, - "Data3": 353949446367637254, - "Data4": 406508599351966967 + "Data1": 5967085929831926496, + "Data2": 2076986033377749253 }, "Flags": 0, "Kind": 0, @@ -75548,10 +73620,8 @@ }, { "__Checksum": { - "Data1": -5908124194904241978, - "Data2": 5657994134525905530, - "Data3": -7400421326229794565, - "Data4": -7914798382558378331 + "Data1": -7263874206226385806, + "Data2": -7145123492979270377 }, "Flags": 0, "Kind": 0, @@ -75782,10 +73852,8 @@ }, { "__Checksum": { - "Data1": -5870747263532652447, - "Data2": -7040906103020252883, - "Data3": 2375258134357162856, - "Data4": -6183011906630349074 + "Data1": 74636099254928729, + "Data2": 8053429551020709641 }, "Flags": 0, "Kind": 0, @@ -75825,10 +73893,8 @@ }, { "__Checksum": { - "Data1": 7934456183559814399, - "Data2": -4760303132963763345, - "Data3": 1340238275028026119, - "Data4": -2769037167242717537 + "Data1": -1477890437945326105, + "Data2": 1389141315898281186 }, "Flags": 0, "Kind": 0, @@ -75868,10 +73934,8 @@ }, { "__Checksum": { - "Data1": -6829366655085270759, - "Data2": -6324772589563344757, - "Data3": 7607676588039702995, - "Data4": -5451476996724207568 + "Data1": -4114535919172482615, + "Data2": -1790544119055302199 }, "Flags": 0, "Kind": 0, @@ -75901,10 +73965,8 @@ }, { "__Checksum": { - "Data1": 5387672831824397827, - "Data2": 1015709622793287519, - "Data3": 8821116212391090781, - "Data4": 5064105821331773316 + "Data1": 1297246329894351794, + "Data2": -8950773400221532028 }, "Flags": 0, "Kind": 0, @@ -75944,10 +74006,8 @@ }, { "__Checksum": { - "Data1": 965018296127095462, - "Data2": -3410298429284902592, - "Data3": -5703274078954160480, - "Data4": -1396852409624969922 + "Data1": 3343794554661201692, + "Data2": 3999883259162655510 }, "Flags": 0, "Kind": 0, @@ -75994,10 +74054,8 @@ }, { "__Checksum": { - "Data1": -3236737067421556602, - "Data2": -8454946420807298855, - "Data3": -358494803168054132, - "Data4": -8022147326616856791 + "Data1": 1558866872062321630, + "Data2": 3259625223009672071 }, "Flags": 0, "Kind": 0, @@ -76114,10 +74172,8 @@ }, { "__Checksum": { - "Data1": -3472715215653001128, - "Data2": -2845197013691089715, - "Data3": 3442454590727686490, - "Data4": 6742887712249688608 + "Data1": 5952047974079895894, + "Data2": -5305510618945898454 }, "Flags": 0, "Kind": 0, @@ -76183,10 +74239,8 @@ }, { "__Checksum": { - "Data1": 4489506806059347954, - "Data2": -7773859461165096793, - "Data3": 3504886346074688824, - "Data4": -4756448246943568335 + "Data1": -656400053280423567, + "Data2": 543549830038559646 }, "Flags": 0, "Kind": 0, @@ -76240,10 +74294,8 @@ }, { "__Checksum": { - "Data1": 8752186612740600774, - "Data2": 7060436748397849786, - "Data3": 5920129234290289064, - "Data4": 5345430282351389593 + "Data1": -644976428197217670, + "Data2": -5358627945153027129 }, "Flags": 0, "Kind": 0, @@ -76608,10 +74660,8 @@ }, { "__Checksum": { - "Data1": 8475193428509496468, - "Data2": -3283634122324763962, - "Data3": 4260369116202385354, - "Data4": -1065982403682325758 + "Data1": 2685500509628831097, + "Data2": 959692520537775951 }, "Flags": 0, "Kind": 0, @@ -76646,10 +74696,8 @@ }, { "__Checksum": { - "Data1": 662598297861179718, - "Data2": -1658548149257892681, - "Data3": -5310218848932787412, - "Data4": 7745860547821996218 + "Data1": 2847911305029491403, + "Data2": -6865612018453548074 }, "Flags": 0, "Kind": 0, @@ -76766,10 +74814,8 @@ }, { "__Checksum": { - "Data1": -1740433172420897082, - "Data2": -8506855365362821471, - "Data3": -702585032704082175, - "Data4": 5502334024295888851 + "Data1": -2280685041314958298, + "Data2": -227940979267066083 }, "Flags": 0, "Kind": 0, @@ -76837,10 +74883,8 @@ }, { "__Checksum": { - "Data1": 8513546265556969696, - "Data2": -3567050505558547832, - "Data3": -6627344283234746339, - "Data4": -5368403015420536406 + "Data1": 3909568137565625040, + "Data2": -5448306987665799777 }, "Flags": 0, "Kind": 0, @@ -76964,10 +75008,8 @@ }, { "__Checksum": { - "Data1": -7976596497342638967, - "Data2": -8704395366343430127, - "Data3": -5266248606442371156, - "Data4": 6163303756120468219 + "Data1": -1491386618301286519, + "Data2": -5183287382339864318 }, "Flags": 0, "Kind": 0, @@ -77049,10 +75091,8 @@ }, { "__Checksum": { - "Data1": 3428270600851029000, - "Data2": 5978981382739907890, - "Data3": -1627666946287379095, - "Data4": -2606341706341384751 + "Data1": 1576103891105928074, + "Data2": -4925134389039327661 }, "Flags": 0, "Kind": 0, @@ -77106,10 +75146,8 @@ }, { "__Checksum": { - "Data1": 1193668320957289942, - "Data2": -7440647456634449859, - "Data3": -3961493083516783164, - "Data4": 622274883541534266 + "Data1": 4340225189409992324, + "Data2": -1486000380307129431 }, "Flags": 0, "Kind": 0, @@ -77191,10 +75229,8 @@ }, { "__Checksum": { - "Data1": 3176418669381029789, - "Data2": -6429362260132278249, - "Data3": 7195124727439784180, - "Data4": 2702722353709802525 + "Data1": -4429541397171077093, + "Data2": 49099940122643196 }, "Flags": 0, "Kind": 0, @@ -77270,10 +75306,8 @@ }, { "__Checksum": { - "Data1": -58100436323208027, - "Data2": 368444347704494188, - "Data3": -5220070430593812178, - "Data4": 9012749993342814685 + "Data1": 2931430803275109429, + "Data2": -7036539433312978849 }, "Flags": 0, "Kind": 0, @@ -77383,10 +75417,8 @@ }, { "__Checksum": { - "Data1": 4058806520214693672, - "Data2": -1356679056607119706, - "Data3": 7529304394570664791, - "Data4": 4037153114883606010 + "Data1": 299484970353932542, + "Data2": -2812315375935133632 }, "Flags": 0, "Kind": 0, @@ -77459,10 +75491,8 @@ }, { "__Checksum": { - "Data1": -8164175314044886387, - "Data2": 3459342462657768043, - "Data3": -8175312248115655980, - "Data4": 6288698204495712877 + "Data1": -893341342879136381, + "Data2": 7331346019789866610 }, "Flags": 0, "Kind": 0, @@ -77855,10 +75885,8 @@ }, { "__Checksum": { - "Data1": -7146871650617057221, - "Data2": -3108691677653480568, - "Data3": -4213788229912851955, - "Data4": -3909721492503698144 + "Data1": -5108420019772514722, + "Data2": -1404645695678241034 }, "Flags": 0, "Kind": 0, @@ -77891,10 +75919,8 @@ }, { "__Checksum": { - "Data1": 8790634263265299990, - "Data2": -8110342847185667146, - "Data3": 5713525387635324767, - "Data4": -3465335179917821121 + "Data1": 4111341504563022631, + "Data2": -79496057525412890 }, "Flags": 0, "Kind": 0, @@ -77946,10 +75972,8 @@ }, { "__Checksum": { - "Data1": -9054661594407396036, - "Data2": 1818385092642579168, - "Data3": -7567051153773578949, - "Data4": -4750956379781372713 + "Data1": 2222978992572625948, + "Data2": 8676291339909359422 }, "Flags": 0, "Kind": 0, @@ -77989,10 +76013,8 @@ }, { "__Checksum": { - "Data1": -2624304974289964294, - "Data2": 35783732451557932, - "Data3": -8349086964829207758, - "Data4": 2293083541864284213 + "Data1": -4946838562096178123, + "Data2": 6735947686725437166 }, "Flags": 0, "Kind": 0, @@ -78081,10 +76103,8 @@ }, { "__Checksum": { - "Data1": -7185741117575404301, - "Data2": -5806394065879366074, - "Data3": 6125209916550423930, - "Data4": 1203935682049801862 + "Data1": -8666739362439806462, + "Data2": 2515405818882272097 }, "Flags": 0, "Kind": 0, @@ -78131,10 +76151,8 @@ }, { "__Checksum": { - "Data1": 5818447242983554145, - "Data2": -5495072354375838021, - "Data3": -8407386292606502283, - "Data4": -5539385851455977291 + "Data1": -7855471953933329506, + "Data2": 5373651864111295088 }, "Flags": 0, "Kind": 0, @@ -78164,10 +76182,8 @@ }, { "__Checksum": { - "Data1": 1438678663135339678, - "Data2": 6496498785606678000, - "Data3": -2654747365745478974, - "Data4": -6422310653694048419 + "Data1": 3772578993650947230, + "Data2": 3301279927541834619 }, "Flags": 0, "Kind": 0, @@ -78228,10 +76244,8 @@ }, { "__Checksum": { - "Data1": -5082833416799184473, - "Data2": -1068814739646583426, - "Data3": 868397729369079464, - "Data4": 8430453232814695702 + "Data1": 4201115035078770299, + "Data2": 8426989406741388899 }, "Flags": 0, "Kind": 0, @@ -78334,10 +76348,8 @@ }, { "__Checksum": { - "Data1": 577639371531705150, - "Data2": 8840060705890584672, - "Data3": -4245753255695530832, - "Data4": -4389435184472365083 + "Data1": 1346452060978888168, + "Data2": -109730860087675012 }, "Flags": 0, "Kind": 0, @@ -78461,10 +76473,8 @@ }, { "__Checksum": { - "Data1": 8031434856229876975, - "Data2": -6094114028358344344, - "Data3": -8470779073884949741, - "Data4": -7286727583691446004 + "Data1": 2273462764052549921, + "Data2": -1247598112591136529 }, "Flags": 0, "Kind": 0, @@ -78518,10 +76528,8 @@ }, { "__Checksum": { - "Data1": 1528389469532863874, - "Data2": -5680794063155616656, - "Data3": 7030576972529095414, - "Data4": 5017962033016027735 + "Data1": -1178498460777449199, + "Data2": 1019907568395906394 }, "Flags": 0, "Kind": 0, @@ -78715,10 +76723,8 @@ }, { "__Checksum": { - "Data1": 6129181511064532764, - "Data2": 8916635364531762459, - "Data3": 7169275631755689241, - "Data4": -7632639727121435358 + "Data1": -1834420911637959395, + "Data2": 5640684413607809627 }, "Flags": 0, "Kind": 0, @@ -78765,10 +76771,8 @@ }, { "__Checksum": { - "Data1": 1401708284044208623, - "Data2": -6556396045095051584, - "Data3": 5933443375083641821, - "Data4": 3629559276107307044 + "Data1": -3691995786718571544, + "Data2": -2166929681934095996 }, "Flags": 0, "Kind": 0, @@ -78815,10 +76819,8 @@ }, { "__Checksum": { - "Data1": -7137459787102862751, - "Data2": -8407954887561338747, - "Data3": 9219741594763993088, - "Data4": 7347135554028454996 + "Data1": -5836866817035534224, + "Data2": -8997145485172513077 }, "Flags": 0, "Kind": 0, @@ -78858,10 +76860,8 @@ }, { "__Checksum": { - "Data1": -4271401575606188068, - "Data2": -2058075689133341220, - "Data3": 4308306232284968569, - "Data4": 5138219448521161650 + "Data1": 1373597633222221536, + "Data2": 3030196333050922660 }, "Flags": 0, "Kind": 0, @@ -78908,10 +76908,8 @@ }, { "__Checksum": { - "Data1": -7684650493307808592, - "Data2": 1508585122603116311, - "Data3": 6846458453777943093, - "Data4": -4231783175545697475 + "Data1": -7896345274045299790, + "Data2": -5011104871271711005 }, "Flags": 0, "Kind": 0, @@ -78972,10 +76970,8 @@ }, { "__Checksum": { - "Data1": -1784654500693515126, - "Data2": 5939393067717339400, - "Data3": 6474799695377014769, - "Data4": -4097070279214873844 + "Data1": 3321212765012241114, + "Data2": 1801268782194116415 }, "Flags": 0, "Kind": 0, @@ -79546,10 +77542,8 @@ }, { "__Checksum": { - "Data1": -4600869687758612715, - "Data2": 2307806457679351194, - "Data3": 35336140606917925, - "Data4": 1849679572301267574 + "Data1": -5989828472979459053, + "Data2": -3797933176362715976 }, "Flags": 0, "Kind": 0, @@ -79603,10 +77597,8 @@ }, { "__Checksum": { - "Data1": 7704133682772855812, - "Data2": -923040547771721261, - "Data3": 3165748191388975435, - "Data4": -1245422053455304083 + "Data1": -4965207378017536328, + "Data2": -8953955865447468931 }, "Flags": 0, "Kind": 0, @@ -79666,10 +77658,8 @@ }, { "__Checksum": { - "Data1": 8463381411326865877, - "Data2": 2160290488821607453, - "Data3": 4425276275140253886, - "Data4": -3869257066163401973 + "Data1": 5697531067047992421, + "Data2": 7435713804091700133 }, "Flags": 0, "Kind": 0, @@ -79774,10 +77764,8 @@ }, { "__Checksum": { - "Data1": -7562922143169158932, - "Data2": -412515388286402663, - "Data3": -9912382234380565, - "Data4": -7683466625209656786 + "Data1": -7089286483968842382, + "Data2": 5244338848452831901 }, "Flags": 0, "Kind": 0, @@ -79810,10 +77798,8 @@ }, { "__Checksum": { - "Data1": 993204558772383158, - "Data2": -27515563649460869, - "Data3": -6430131570824748127, - "Data4": 5846604483382324675 + "Data1": -857844216314242683, + "Data2": -8205778017858053793 }, "Flags": 0, "Kind": 0, @@ -79843,10 +77829,8 @@ }, { "__Checksum": { - "Data1": 5755084128579973338, - "Data2": 4432010337435182409, - "Data3": 1160372708025395333, - "Data4": -4987179715821810562 + "Data1": 321882399710572420, + "Data2": -6993618870276397101 }, "Flags": 0, "Kind": 0, @@ -79907,10 +77891,8 @@ }, { "__Checksum": { - "Data1": -1916101186237739711, - "Data2": 6496432983047097775, - "Data3": 4758659340048061465, - "Data4": -8926947569541501636 + "Data1": -4436566357922684378, + "Data2": -2204282145224724706 }, "Flags": 0, "Kind": 0, @@ -79940,10 +77922,8 @@ }, { "__Checksum": { - "Data1": 8550272091504914701, - "Data2": 2078556298988804430, - "Data3": -91546456555313690, - "Data4": 6621592994974128966 + "Data1": -678556715788790508, + "Data2": 5012795244895142625 }, "Flags": 0, "Kind": 0, @@ -79976,10 +77956,8 @@ }, { "__Checksum": { - "Data1": -7232187126076005113, - "Data2": -2895460573135900108, - "Data3": -1455712007252615804, - "Data4": 6055341607527235531 + "Data1": -1085639044607078463, + "Data2": 4717945149141333990 }, "Flags": 0, "Kind": 0, @@ -80009,10 +77987,8 @@ }, { "__Checksum": { - "Data1": -7123426915339345557, - "Data2": -6630550611678676275, - "Data3": -7504722580449326232, - "Data4": 779262678432811174 + "Data1": 9138574287835035689, + "Data2": -2652993145598027955 }, "Flags": 0, "Kind": 0, @@ -80066,10 +78042,8 @@ }, { "__Checksum": { - "Data1": -3032328580833345218, - "Data2": 4884117385232529574, - "Data3": -8121570563642199989, - "Data4": -7181735351521693875 + "Data1": 2532963157902917359, + "Data2": -1864530346246423203 }, "Flags": 0, "Kind": 0, @@ -80199,10 +78173,8 @@ }, { "__Checksum": { - "Data1": 3522956868953234190, - "Data2": 4024074242514141234, - "Data3": 6998119699729639834, - "Data4": -5039368026523642049 + "Data1": -961855562192444220, + "Data2": 702155101482332529 }, "Flags": 0, "Kind": 0, @@ -80472,10 +78444,8 @@ }, { "__Checksum": { - "Data1": -6101904065858087011, - "Data2": 6464851657397827665, - "Data3": 9124062307445154541, - "Data4": -3454075296985997814 + "Data1": -342347319429170049, + "Data2": -4711806858073698725 }, "Flags": 0, "Kind": 0, @@ -80536,10 +78506,8 @@ }, { "__Checksum": { - "Data1": 7969900793454558987, - "Data2": -685116953542666905, - "Data3": -3120323787223301041, - "Data4": -1282590348971462040 + "Data1": -7086785765972557120, + "Data2": 6446362120520832367 }, "Flags": 0, "Kind": 0, @@ -80600,10 +78568,8 @@ }, { "__Checksum": { - "Data1": -6041729481754171403, - "Data2": -4624882898886058330, - "Data3": -3636352243350575444, - "Data4": 5550720914903214891 + "Data1": -4051715226067792314, + "Data2": -3869786469234716629 }, "Flags": 0, "Kind": 0, @@ -80650,10 +78616,8 @@ }, { "__Checksum": { - "Data1": 8476365902634410444, - "Data2": -644927312845976381, - "Data3": -4384448333822937784, - "Data4": 4942297971278807229 + "Data1": 5900040963345538674, + "Data2": 8173670795415071412 }, "Flags": 0, "Kind": 0, @@ -80689,10 +78653,8 @@ }, { "__Checksum": { - "Data1": -6842359896946943951, - "Data2": 5061995529332792927, - "Data3": 6565410255662361353, - "Data4": -7912028694005202670 + "Data1": 6090295430901031894, + "Data2": 3064208609051965040 }, "Flags": 0, "Kind": 0, @@ -80733,10 +78695,8 @@ }, { "__Checksum": { - "Data1": -923618746989706125, - "Data2": 4227603167988747082, - "Data3": 5734010805601226258, - "Data4": -1671000699342239190 + "Data1": 2762811812492453870, + "Data2": -1397394579901732464 }, "Flags": 0, "Kind": 0, @@ -80839,10 +78799,8 @@ }, { "__Checksum": { - "Data1": 79841009772692075, - "Data2": -2952241428952198501, - "Data3": -3037041811616986500, - "Data4": 6368002849782666650 + "Data1": -2663655899449542113, + "Data2": -8754359343646118852 }, "Flags": 0, "Kind": 0, @@ -80896,10 +78854,8 @@ }, { "__Checksum": { - "Data1": 6357308093038488273, - "Data2": -590221267978626193, - "Data3": -2813028512931838099, - "Data4": -5741325089293471617 + "Data1": 3507708905815758046, + "Data2": -5992433472031933315 }, "Flags": 0, "Kind": 0, @@ -81017,10 +78973,8 @@ }, { "__Checksum": { - "Data1": -5358893479713659131, - "Data2": -2402568364620000586, - "Data3": -6745191798513769980, - "Data4": -5642587779183136642 + "Data1": 5673208721365739650, + "Data2": -2691800461872323678 }, "Flags": 0, "Kind": 0, @@ -81202,10 +79156,8 @@ }, { "__Checksum": { - "Data1": 5944728564506036853, - "Data2": 5986712273956370036, - "Data3": -5472611059364917144, - "Data4": 648471601623891404 + "Data1": -4515681604057336624, + "Data2": 2718632959241416511 }, "Flags": 0, "Kind": 0, @@ -81235,10 +79187,8 @@ }, { "__Checksum": { - "Data1": -5790374759278495312, - "Data2": -5781577031452499736, - "Data3": 1825440571378990394, - "Data4": -7765678758283729548 + "Data1": -4877357090630237673, + "Data2": -1402125495406797604 }, "Flags": 0, "Kind": 0, @@ -81320,10 +79270,8 @@ }, { "__Checksum": { - "Data1": -319212888573528935, - "Data2": 4781136246579382843, - "Data3": -171587018636297407, - "Data4": -4219352666900912935 + "Data1": -5165075839233423477, + "Data2": -5592925214349163386 }, "Flags": 0, "Kind": 0, @@ -81370,10 +79318,8 @@ }, { "__Checksum": { - "Data1": -643558682560672798, - "Data2": 5621877394696188322, - "Data3": -2836291252375092218, - "Data4": -7081941850982470291 + "Data1": -9141030196579206720, + "Data2": -5190641485232954020 }, "Flags": 0, "Kind": 0, @@ -81427,10 +79373,8 @@ }, { "__Checksum": { - "Data1": -26445416106042325, - "Data2": 183005403126985918, - "Data3": -3605213424710367092, - "Data4": -5891134132886743643 + "Data1": 7805578555914778800, + "Data2": 6112924000440823299 }, "Flags": 0, "Kind": 0, @@ -81489,10 +79433,8 @@ }, { "__Checksum": { - "Data1": 6402422368241231071, - "Data2": -3409924537754252723, - "Data3": 33868101308219001, - "Data4": -3851967501114225349 + "Data1": 178589890824493724, + "Data2": 3511718243385985987 }, "Flags": 0, "Kind": 0, @@ -81539,10 +79481,8 @@ }, { "__Checksum": { - "Data1": 3294007472844321801, - "Data2": 5288020896198773622, - "Data3": -591511968589158104, - "Data4": 1535527063816626164 + "Data1": -6426978650064452105, + "Data2": 7310869436234430215 }, "Flags": 0, "Kind": 0, @@ -81622,10 +79562,8 @@ }, { "__Checksum": { - "Data1": -5511213276636612432, - "Data2": -7315732885625886243, - "Data3": 7275543891687759368, - "Data4": 3122094341494611823 + "Data1": -6831043225861974880, + "Data2": -7055029692807566113 }, "Flags": 0, "Kind": 0, @@ -81655,10 +79593,8 @@ }, { "__Checksum": { - "Data1": 5681931512146051728, - "Data2": 1171716135850293227, - "Data3": -3520304351997331697, - "Data4": 2398112905845781755 + "Data1": -1995686178844060649, + "Data2": 7113591873652307470 }, "Flags": 0, "Kind": 0, @@ -81705,10 +79641,8 @@ }, { "__Checksum": { - "Data1": -862143888178267538, - "Data2": -1233797604564493950, - "Data3": 2528621040691249135, - "Data4": -6185971080846653767 + "Data1": 5276715078971068427, + "Data2": -2316870861745151056 }, "Flags": 0, "Kind": 0, @@ -81769,10 +79703,8 @@ }, { "__Checksum": { - "Data1": -1068447800697818517, - "Data2": -2180657638167789436, - "Data3": 5566859166523450613, - "Data4": -4952885343736918039 + "Data1": -4675139049870281556, + "Data2": 9087413528125928448 }, "Flags": 0, "Kind": 0, @@ -81819,10 +79751,8 @@ }, { "__Checksum": { - "Data1": -9040510474403957344, - "Data2": 8133179642666704600, - "Data3": 5916923385494697571, - "Data4": 1806739495516187533 + "Data1": -13475361927492368, + "Data2": 8927002645332287661 }, "Flags": 0, "Kind": 0, @@ -81876,10 +79806,8 @@ }, { "__Checksum": { - "Data1": 7443940092200960274, - "Data2": -2302520695221903842, - "Data3": 2894425633493122518, - "Data4": -8413250361124616046 + "Data1": 8271339722290035992, + "Data2": -1389090065655049758 }, "Flags": 0, "Kind": 0, @@ -81933,10 +79861,8 @@ }, { "__Checksum": { - "Data1": -6067826381727825500, - "Data2": -7122290610451194532, - "Data3": -5376314565751492700, - "Data4": -5845233532052611904 + "Data1": -1565644528740351463, + "Data2": 2356010124229506845 }, "Flags": 0, "Kind": 0, @@ -82042,10 +79968,8 @@ }, { "__Checksum": { - "Data1": 2999849698700213839, - "Data2": 3069867938521466041, - "Data3": -5762701017497726857, - "Data4": -7496441322636307355 + "Data1": 4668026210849753825, + "Data2": 5859975536301331888 }, "Flags": 0, "Kind": 0, @@ -82099,10 +80023,8 @@ }, { "__Checksum": { - "Data1": -4791808362500001359, - "Data2": -5796902506827321406, - "Data3": 4369316630489892390, - "Data4": -4928497457887030859 + "Data1": -5047552813454326468, + "Data2": -3503957363834753867 }, "Flags": 0, "Kind": 0, @@ -82156,10 +80078,8 @@ }, { "__Checksum": { - "Data1": 4326655859163906173, - "Data2": -5397004952699540246, - "Data3": 1143531101179843810, - "Data4": -5100416675327084450 + "Data1": 1017021631062318257, + "Data2": 5731332736424437023 }, "Flags": 0, "Kind": 0, @@ -82213,10 +80133,8 @@ }, { "__Checksum": { - "Data1": -2629247447738509390, - "Data2": 226481303575573525, - "Data3": -1365426462638432020, - "Data4": 7849051893112526504 + "Data1": 4872238159873903179, + "Data2": 538381416650800953 }, "Flags": 0, "Kind": 0, @@ -82270,10 +80188,8 @@ }, { "__Checksum": { - "Data1": 2753204010590902230, - "Data2": 203051380607338661, - "Data3": -924252779358353986, - "Data4": 7289398089165250733 + "Data1": -3525556234775114918, + "Data2": -8088344275229689054 }, "Flags": 0, "Kind": 0, @@ -82303,10 +80219,8 @@ }, { "__Checksum": { - "Data1": -7925182783885337366, - "Data2": -3109511055501846297, - "Data3": -4195694077576093870, - "Data4": -8236129109722918486 + "Data1": -4694159241279474258, + "Data2": 2290104022240172569 }, "Flags": 0, "Kind": 0, @@ -82422,10 +80336,8 @@ }, { "__Checksum": { - "Data1": 4245779871021445183, - "Data2": 2401446374359852196, - "Data3": 6614557890405253754, - "Data4": 4354498947078068395 + "Data1": 5573280651284031388, + "Data2": 7376836577182467638 }, "Flags": 0, "Kind": 0, @@ -82515,10 +80427,8 @@ }, { "__Checksum": { - "Data1": -259964969547255980, - "Data2": 3024841006622247182, - "Data3": 239676028967934323, - "Data4": 8763084388213702615 + "Data1": 2558264761293407339, + "Data2": -517870662192627869 }, "Flags": 0, "Kind": 0, @@ -82565,10 +80475,8 @@ }, { "__Checksum": { - "Data1": -5131199078058219354, - "Data2": -3232041030555439571, - "Data3": 3126646538468824999, - "Data4": -8514627196665799044 + "Data1": 3704182969475144037, + "Data2": -2347592466437552449 }, "Flags": 0, "Kind": 0, @@ -82599,10 +80507,8 @@ }, { "__Checksum": { - "Data1": -5836178454553673236, - "Data2": -1585013994309688357, - "Data3": -2434295458944261012, - "Data4": 6360994487852394532 + "Data1": 4240368093632645519, + "Data2": 1931752516165651417 }, "Flags": 0, "Kind": 0, @@ -82677,10 +80583,8 @@ }, { "__Checksum": { - "Data1": -7208782614861315512, - "Data2": 3376703359933200161, - "Data3": 7451784114185547013, - "Data4": 2917431603229037853 + "Data1": 328963547609925029, + "Data2": 3704282485359255893 }, "Flags": 0, "Kind": 0, @@ -82908,10 +80812,8 @@ }, { "__Checksum": { - "Data1": 10040371328805314, - "Data2": -799600833556787066, - "Data3": -1506347185225842154, - "Data4": 6549823965772075056 + "Data1": -3707121440754685698, + "Data2": 1328726902477057281 }, "Flags": 0, "Kind": 0, @@ -82951,10 +80853,8 @@ }, { "__Checksum": { - "Data1": 6798091608035255846, - "Data2": 1312874950651368179, - "Data3": -1358650269754816676, - "Data4": -2897764748166429137 + "Data1": -6357919353816521294, + "Data2": 5869141887352532476 }, "Flags": 0, "Kind": 0, @@ -82994,10 +80894,8 @@ }, { "__Checksum": { - "Data1": -4851752313173988585, - "Data2": -4953084585838279537, - "Data3": -8988653415264343388, - "Data4": 6463220340500911201 + "Data1": -2857530648624438601, + "Data2": 3618418675103158173 }, "Flags": 0, "Kind": 0, @@ -83044,10 +80942,8 @@ }, { "__Checksum": { - "Data1": 2160616508406577201, - "Data2": -7261957949814667199, - "Data3": -5661215183574915532, - "Data4": 5654313126646841403 + "Data1": -5586142188442151652, + "Data2": 601018275357348401 }, "Flags": 0, "Kind": 0, @@ -83143,10 +81039,8 @@ }, { "__Checksum": { - "Data1": 4463657768566109627, - "Data2": 7400419818599228842, - "Data3": -867524837463791312, - "Data4": 6302931693201333601 + "Data1": 6613641549303227499, + "Data2": -660628293967656241 }, "Flags": 0, "Kind": 0, @@ -83249,10 +81143,8 @@ }, { "__Checksum": { - "Data1": -3722817700218848418, - "Data2": 7518321932683341890, - "Data3": -4339406937405383908, - "Data4": 6103154041626812043 + "Data1": 8646740778941087531, + "Data2": 6195730506774779377 }, "Flags": 0, "Kind": 0, @@ -83292,10 +81184,8 @@ }, { "__Checksum": { - "Data1": -944684283571085115, - "Data2": -1965269703592919988, - "Data3": -6707111595774124328, - "Data4": -3621355268257495292 + "Data1": 6261927728037289791, + "Data2": 3848697647455796515 }, "Flags": 0, "Kind": 0, @@ -83335,10 +81225,8 @@ }, { "__Checksum": { - "Data1": -1513884231478169097, - "Data2": -1965783262950718222, - "Data3": 4692924244148077292, - "Data4": -1322591086644750029 + "Data1": 2220291597144294677, + "Data2": 3076492141608679348 }, "Flags": 0, "Kind": 0, @@ -83632,10 +81520,8 @@ }, { "__Checksum": { - "Data1": -7997480663883219968, - "Data2": 3564713622892237563, - "Data3": -5678896655206372003, - "Data4": -2797491195106568856 + "Data1": 4671970866537115307, + "Data2": -5256279907485164947 }, "Flags": 0, "Kind": 0, @@ -83668,10 +81554,8 @@ }, { "__Checksum": { - "Data1": 7857424351699934230, - "Data2": -7257556628696110288, - "Data3": 4060929961553564999, - "Data4": -7338589209722215927 + "Data1": 4237483960856268504, + "Data2": 4092900193162819178 }, "Flags": 0, "Kind": 0, @@ -83751,10 +81635,8 @@ }, { "__Checksum": { - "Data1": 7937271305396460451, - "Data2": 226255705872922352, - "Data3": -4626327303890486451, - "Data4": -3606523741139496088 + "Data1": -8478950923017202208, + "Data2": 4502905893898010211 }, "Flags": 0, "Kind": 0, @@ -83794,10 +81676,8 @@ }, { "__Checksum": { - "Data1": 4175334668408248644, - "Data2": -3227566332669687944, - "Data3": -6075402920702070057, - "Data4": -336468431022482448 + "Data1": -6030859996304857939, + "Data2": 6895836441531480750 }, "Flags": 0, "Kind": 0, @@ -83837,10 +81717,8 @@ }, { "__Checksum": { - "Data1": -3378987887778810081, - "Data2": 1425205191085188109, - "Data3": -1672733585250620205, - "Data4": 8582059236541988863 + "Data1": -7729476504066039342, + "Data2": 5999819323627834312 }, "Flags": 0, "Kind": 0, @@ -83881,10 +81759,8 @@ }, { "__Checksum": { - "Data1": -7566977287338100742, - "Data2": 561519272467353430, - "Data3": -2859348563112448055, - "Data4": -7987719649289897902 + "Data1": 3462795062659435866, + "Data2": 7382564716538602336 }, "Flags": 0, "Kind": 0, @@ -83924,10 +81800,8 @@ }, { "__Checksum": { - "Data1": 545621692362626889, - "Data2": 491629585663273200, - "Data3": -2300787220419308376, - "Data4": -8235970456314056026 + "Data1": -1435840966710068803, + "Data2": 6788734144973192583 }, "Flags": 0, "Kind": 0, @@ -83988,10 +81862,8 @@ }, { "__Checksum": { - "Data1": 7820123960719364262, - "Data2": 492811524873459687, - "Data3": 8175050503364939926, - "Data4": 6250620361168922580 + "Data1": -6020997124083744144, + "Data2": 6140444169999968937 }, "Flags": 0, "Kind": 0, @@ -84073,10 +81945,8 @@ }, { "__Checksum": { - "Data1": -4241220659428613655, - "Data2": 5497369162126152548, - "Data3": -2654370060543081587, - "Data4": 644948587934722037 + "Data1": 8011269727583374922, + "Data2": 1283586963508938334 }, "Flags": 0, "Kind": 0, @@ -84130,10 +82000,8 @@ }, { "__Checksum": { - "Data1": 7829377378917842452, - "Data2": 5994430050913574682, - "Data3": -4558910567754996605, - "Data4": -1164076406161486955 + "Data1": -4298718780883897597, + "Data2": -1046723096992372805 }, "Flags": 0, "Kind": 0, @@ -84193,10 +82061,8 @@ }, { "__Checksum": { - "Data1": -4006521584620432083, - "Data2": -7365044804663657705, - "Data3": -6094338357147694628, - "Data4": -8858434562965780643 + "Data1": 2462390800695552904, + "Data2": -3356164836703998158 }, "Flags": 0, "Kind": 0, @@ -84250,10 +82116,8 @@ }, { "__Checksum": { - "Data1": -2128679360139847443, - "Data2": 8417079790177910382, - "Data3": -5566169617139483776, - "Data4": 4921727092863713949 + "Data1": -7568729117956105392, + "Data2": -5440248889398258372 }, "Flags": 0, "Kind": 0, @@ -84328,10 +82192,8 @@ }, { "__Checksum": { - "Data1": 1055578075238076105, - "Data2": 3619328326210119033, - "Data3": -5247458267437967328, - "Data4": -6270276587096319128 + "Data1": -6956540871716298495, + "Data2": 9065104439074712513 }, "Flags": 0, "Kind": 0, @@ -84577,10 +82439,8 @@ }, { "__Checksum": { - "Data1": 2960844190601706606, - "Data2": -729526386944492204, - "Data3": -8777164770250167123, - "Data4": 1664160813412432604 + "Data1": 4663101058627741406, + "Data2": 8540822858393378551 }, "Flags": 0, "Kind": 0, @@ -84610,10 +82470,8 @@ }, { "__Checksum": { - "Data1": -3061933988715505663, - "Data2": 6275513504993924947, - "Data3": 1350642602144745930, - "Data4": -5599698761140757949 + "Data1": 9118473269643556368, + "Data2": -2985561450141691360 }, "Flags": 0, "Kind": 0, @@ -84660,10 +82518,8 @@ }, { "__Checksum": { - "Data1": 1173465331231241995, - "Data2": 2454048023020067663, - "Data3": 7118595976422114405, - "Data4": 7528120796079215227 + "Data1": -7847929025438371500, + "Data2": 3364014095654657191 }, "Flags": 0, "Kind": 0, @@ -84730,10 +82586,8 @@ }, { "__Checksum": { - "Data1": 1872790472937305477, - "Data2": -172569408194244711, - "Data3": 516363223129043326, - "Data4": -3682694806721583720 + "Data1": 598460647985136669, + "Data2": 4895649668433264332 }, "Flags": 0, "Kind": 0, @@ -84763,10 +82617,8 @@ }, { "__Checksum": { - "Data1": 8183964032777964208, - "Data2": 6139156096736192472, - "Data3": -4484194876195583884, - "Data4": -960192563575842650 + "Data1": -1023969867708008275, + "Data2": 6251387030947163284 }, "Flags": 0, "Kind": 0, @@ -84806,10 +82658,8 @@ }, { "__Checksum": { - "Data1": -1602307915445855719, - "Data2": -7703127636290899948, - "Data3": 6485514132443927448, - "Data4": 9077896348149999637 + "Data1": -4341669065968753872, + "Data2": -8127917311847209521 }, "Flags": 0, "Kind": 0, @@ -84873,10 +82723,8 @@ }, { "__Checksum": { - "Data1": 4604849030390128580, - "Data2": -2731795260578685114, - "Data3": 1989770626095690960, - "Data4": -5310489917093443895 + "Data1": -4725732303668886757, + "Data2": 5484488404301793673 }, "Flags": 0, "Kind": 0, @@ -84930,10 +82778,8 @@ }, { "__Checksum": { - "Data1": 976201292216575848, - "Data2": 7046889333078981819, - "Data3": 7670416448838418052, - "Data4": -4792541691661481194 + "Data1": 6894960042670378381, + "Data2": 169260171560033744 }, "Flags": 0, "Kind": 0, @@ -85173,10 +83019,8 @@ }, { "__Checksum": { - "Data1": -2927286333294680967, - "Data2": 5629632198939845022, - "Data3": 438318085674149228, - "Data4": -4029102788101916807 + "Data1": 2023240939446281963, + "Data2": -3961992196401511427 }, "Flags": 0, "Kind": 0, @@ -85223,10 +83067,8 @@ }, { "__Checksum": { - "Data1": -1961878580728239869, - "Data2": 8454164920375123346, - "Data3": 1085189110098296316, - "Data4": -3540780514368358488 + "Data1": 7390587564164687573, + "Data2": 3204250109662192221 }, "Flags": 0, "Kind": 0, @@ -85273,10 +83115,8 @@ }, { "__Checksum": { - "Data1": 4497614540882466708, - "Data2": -6163952936326420831, - "Data3": 4369479276749997252, - "Data4": 800908144929865776 + "Data1": 5018182531599503087, + "Data2": -2188400999409247109 }, "Flags": 0, "Kind": 0, @@ -85321,10 +83161,8 @@ }, { "__Checksum": { - "Data1": -2566909407904645960, - "Data2": -5724611424359321603, - "Data3": 3307224868100875204, - "Data4": 2727501482133806656 + "Data1": -6124169109551269687, + "Data2": -7828211083796658385 }, "Flags": 0, "Kind": 0, @@ -85480,10 +83318,8 @@ }, { "__Checksum": { - "Data1": 1728230270954372960, - "Data2": -4186077717123442825, - "Data3": -1312649551791997927, - "Data4": -5752320569802222647 + "Data1": -894221031743133334, + "Data2": -1847700993775701681 }, "Flags": 0, "Kind": 0, @@ -85536,10 +83372,8 @@ }, { "__Checksum": { - "Data1": -3731139326624940098, - "Data2": 5592032672401981292, - "Data3": 3176748125220842466, - "Data4": -8407433221855702154 + "Data1": 4449158771056320719, + "Data2": -7725535951231632584 }, "Flags": 0, "Kind": 0, @@ -85697,10 +83531,8 @@ }, { "__Checksum": { - "Data1": 5055102293288094635, - "Data2": -612856892994658261, - "Data3": -1998456644592543714, - "Data4": 757535856315646308 + "Data1": 7021393268803502587, + "Data2": 9155000302948588446 }, "Flags": 0, "Kind": 0, @@ -85740,10 +83572,8 @@ }, { "__Checksum": { - "Data1": 7826316585542609126, - "Data2": -5951970258108598816, - "Data3": 2969282041397928898, - "Data4": 5455215235896588699 + "Data1": 532421719950810661, + "Data2": 6875564986392873810 }, "Flags": 0, "Kind": 0, @@ -85811,10 +83641,8 @@ }, { "__Checksum": { - "Data1": 1971011827508589392, - "Data2": 1136696551122770103, - "Data3": -7766507964430422329, - "Data4": -517216873519287893 + "Data1": -861752925650816412, + "Data2": -8653860620791637288 }, "Flags": 0, "Kind": 0, @@ -85969,10 +83797,8 @@ }, { "__Checksum": { - "Data1": 8348114557271982040, - "Data2": -5683563858363116744, - "Data3": -7844048889865693328, - "Data4": 3140738443425876688 + "Data1": 6907695807570893086, + "Data2": -2092610086634711619 }, "Flags": 0, "Kind": 0, @@ -86019,10 +83845,8 @@ }, { "__Checksum": { - "Data1": -7493847953877662714, - "Data2": -2755054143211689274, - "Data3": -8768204081167443837, - "Data4": 6499720612577051786 + "Data1": -1307868164753575122, + "Data2": 2152439832661122870 }, "Flags": 0, "Kind": 0, @@ -86069,10 +83893,8 @@ }, { "__Checksum": { - "Data1": -458624563487209319, - "Data2": 7396874179270711935, - "Data3": -4111893411114921531, - "Data4": 4448883019156753331 + "Data1": -9137407715203377298, + "Data2": 2671836885714677621 }, "Flags": 0, "Kind": 0, @@ -86117,10 +83939,8 @@ }, { "__Checksum": { - "Data1": -5250832387972610849, - "Data2": 2032075224619072500, - "Data3": -7799269000327796666, - "Data4": 1389933545942251305 + "Data1": 119509547514686782, + "Data2": 1326206212581122970 }, "Flags": 0, "Kind": 0, @@ -86144,10 +83964,8 @@ }, { "__Checksum": { - "Data1": 4822912581710071616, - "Data2": 7032918168406412304, - "Data3": 8431610164706640711, - "Data4": -7027360435465633889 + "Data1": -5609955202335299110, + "Data2": 6871508839404209109 }, "Flags": 0, "Kind": 0, @@ -86182,10 +84000,8 @@ }, { "__Checksum": { - "Data1": -6251179829283471520, - "Data2": -5109482696736383077, - "Data3": 1135393951204507953, - "Data4": -5702834655434763122 + "Data1": 7133826808822225945, + "Data2": 1764358619717571083 }, "Flags": 0, "Kind": 0, @@ -86216,10 +84032,8 @@ }, { "__Checksum": { - "Data1": -4193663739586775594, - "Data2": 8864569755451010659, - "Data3": -9050284181855403154, - "Data4": 1531274131227855754 + "Data1": 833475303932675253, + "Data2": 1592417876295350126 }, "Flags": 0, "Kind": 0, @@ -86430,10 +84244,8 @@ }, { "__Checksum": { - "Data1": -8231839052644154816, - "Data2": 3972452644702979677, - "Data3": -3687582502076025824, - "Data4": 5498436326317642430 + "Data1": -6826740470371855114, + "Data2": 3783507759357444968 }, "Flags": 0, "Kind": 0, @@ -86480,10 +84292,8 @@ }, { "__Checksum": { - "Data1": 9105251389870836396, - "Data2": -1896305580049995548, - "Data3": 5021255423687373540, - "Data4": -8388666090447964474 + "Data1": 970118508071892818, + "Data2": -8433771589064412730 }, "Flags": 0, "Kind": 0, @@ -86523,10 +84333,8 @@ }, { "__Checksum": { - "Data1": -8591536587485239870, - "Data2": 3432442557389181313, - "Data3": 2585322641923835996, - "Data4": -7077582426563086834 + "Data1": -7845279972767409321, + "Data2": -7252364528598992968 }, "Flags": 0, "Kind": 0, @@ -86744,10 +84552,8 @@ }, { "__Checksum": { - "Data1": -6555607201600940028, - "Data2": -5631345773296635355, - "Data3": -5053369474264128727, - "Data4": -327927057680112476 + "Data1": -7778186335436584473, + "Data2": -5854331879801591035 }, "Flags": 0, "Kind": 0, @@ -86798,10 +84604,8 @@ }, { "__Checksum": { - "Data1": 2329631366355633352, - "Data2": -6278003983623421339, - "Data3": 1111122230953692481, - "Data4": -4037802770511694906 + "Data1": 9124880371552317516, + "Data2": -7069058474571024817 }, "Flags": 0, "Kind": 0, @@ -86904,10 +84708,8 @@ }, { "__Checksum": { - "Data1": -8210664441275056094, - "Data2": 5279502077202921878, - "Data3": 4614332242462751700, - "Data4": -3438098703011876301 + "Data1": 7184958060201731454, + "Data2": -8580408999385120817 }, "Flags": 0, "Kind": 0, @@ -86942,10 +84744,8 @@ }, { "__Checksum": { - "Data1": 6849157031054149969, - "Data2": 2761568600842001516, - "Data3": -3411706064217935965, - "Data4": -9041932635805199378 + "Data1": -6865441354312427211, + "Data2": 2328659852700089057 }, "Flags": 0, "Kind": 0, @@ -86992,10 +84792,8 @@ }, { "__Checksum": { - "Data1": -106375043854889438, - "Data2": -3737662662578970279, - "Data3": 7486329516137145513, - "Data4": -9103374203376313305 + "Data1": 1767673884119664662, + "Data2": 8255906872581009673 }, "Flags": 0, "Kind": 0, @@ -87041,10 +84839,8 @@ }, { "__Checksum": { - "Data1": -2506208984453521174, - "Data2": -7354875687824841222, - "Data3": 7904493270976839666, - "Data4": 8448614420872113132 + "Data1": 6183149820639705630, + "Data2": -6175282246737788249 }, "Flags": 0, "Kind": 0, @@ -87139,10 +84935,8 @@ }, { "__Checksum": { - "Data1": -2461903200574431551, - "Data2": 4214831010778528537, - "Data3": -8174204391826776435, - "Data4": -6170823584537315722 + "Data1": -284155871930671966, + "Data2": -8316889331665756942 }, "Flags": 0, "Kind": 0, @@ -87642,10 +85436,8 @@ }, { "__Checksum": { - "Data1": -6241897199623078785, - "Data2": -5009017713284052588, - "Data3": -3815239264640618004, - "Data4": -7606087879122279010 + "Data1": -1948163522226365190, + "Data2": 894868353464403035 }, "Flags": 0, "Kind": 0, @@ -87705,10 +85497,8 @@ }, { "__Checksum": { - "Data1": 4127726349412418495, - "Data2": -2254322118543933909, - "Data3": 6594640460682258869, - "Data4": 9161358433692689967 + "Data1": -7286160219947523740, + "Data2": -5260825288286968930 }, "Flags": 0, "Kind": 0, @@ -87759,10 +85549,8 @@ }, { "__Checksum": { - "Data1": -1605031261337062163, - "Data2": -5039308220904818513, - "Data3": 3107184748371588908, - "Data4": -7352527035562687312 + "Data1": 7608133710547199592, + "Data2": 8667283994938132569 }, "Flags": 0, "Kind": 0, @@ -87809,10 +85597,8 @@ }, { "__Checksum": { - "Data1": -9013974280313783623, - "Data2": -9113122014960941704, - "Data3": 1973786544557038782, - "Data4": 3424950996618729496 + "Data1": 5263849118419257338, + "Data2": -2443434117436946910 }, "Flags": 0, "Kind": 0, @@ -87879,10 +85665,8 @@ }, { "__Checksum": { - "Data1": 7423176409769543790, - "Data2": -5882651038688248646, - "Data3": 5928224627729280213, - "Data4": -5903903569224540518 + "Data1": -8216169004180991548, + "Data2": -2942024109546066228 }, "Flags": 0, "Kind": 0, @@ -87977,10 +85761,8 @@ }, { "__Checksum": { - "Data1": -2816146879265245983, - "Data2": 3944789001055278108, - "Data3": -7782858546241179367, - "Data4": -2780533961859081407 + "Data1": 7330356546061315960, + "Data2": 2450077665364594548 }, "Flags": 0, "Kind": 0, @@ -88497,10 +86279,8 @@ }, { "__Checksum": { - "Data1": -8333225582392552439, - "Data2": -6598662470991238900, - "Data3": -9004275431360159948, - "Data4": 2609499995095151460 + "Data1": -7911955615639855755, + "Data2": 4654608592003995633 }, "Flags": 0, "Kind": 0, @@ -88560,10 +86340,8 @@ }, { "__Checksum": { - "Data1": -7833310973729949839, - "Data2": -7060776557072937121, - "Data3": 7104216504914614364, - "Data4": 2622228442929108690 + "Data1": -9063057760335765081, + "Data2": 7494601800901727961 }, "Flags": 0, "Kind": 0, @@ -88596,10 +86374,8 @@ }, { "__Checksum": { - "Data1": -2208835202527862782, - "Data2": 7855447887828883450, - "Data3": 7349137094262136943, - "Data4": 6117681419279713798 + "Data1": 1460370140059852513, + "Data2": -6897059974835967766 }, "Flags": 0, "Kind": 0, @@ -88646,10 +86422,8 @@ }, { "__Checksum": { - "Data1": -7676897133916657326, - "Data2": -5721760308476224107, - "Data3": 8005520496212370171, - "Data4": 965072445167429644 + "Data1": 7265469300810303805, + "Data2": -4933946430080152774 }, "Flags": 0, "Kind": 0, @@ -88689,10 +86463,8 @@ }, { "__Checksum": { - "Data1": -8506059694405922128, - "Data2": 1908488284467604248, - "Data3": -5326111635463201403, - "Data4": 7320733344298677441 + "Data1": -7552462844619314445, + "Data2": -1597363401469697634 }, "Flags": 0, "Kind": 0, @@ -88894,10 +86666,8 @@ }, { "__Checksum": { - "Data1": 2016210892959599442, - "Data2": 6560282499196346377, - "Data3": -6675670081819925580, - "Data4": -572358654235451354 + "Data1": -4684174121536186137, + "Data2": 8577400875079038531 }, "Flags": 0, "Kind": 0, @@ -88944,10 +86714,8 @@ }, { "__Checksum": { - "Data1": -1152326973569096852, - "Data2": 4388237314134921122, - "Data3": -1923526082080066929, - "Data4": -5687939517159962398 + "Data1": -3099289554218115041, + "Data2": 577568169903161480 }, "Flags": 0, "Kind": 0, @@ -88994,10 +86762,8 @@ }, { "__Checksum": { - "Data1": 5298989650742581614, - "Data2": -2726802744677615022, - "Data3": -5480701362446127788, - "Data4": 938718493251005198 + "Data1": -5181616402347772127, + "Data2": -2008499809085311275 }, "Flags": 0, "Kind": 0, @@ -89042,10 +86808,8 @@ }, { "__Checksum": { - "Data1": -1990850396549311507, - "Data2": -3326984682250434368, - "Data3": -5675096476651205098, - "Data4": 4180262253364950188 + "Data1": -9221187830287185365, + "Data2": -1623573066379999899 }, "Flags": 0, "Kind": 0, @@ -89106,10 +86870,8 @@ }, { "__Checksum": { - "Data1": -1024748052838330928, - "Data2": -1381819360889887937, - "Data3": 5156652333301276544, - "Data4": -8081363456981581600 + "Data1": -8125914608578199132, + "Data2": -5540903569619679071 }, "Flags": 0, "Kind": 0, @@ -89256,10 +87018,8 @@ }, { "__Checksum": { - "Data1": -910858899819530666, - "Data2": -4329720378056114517, - "Data3": -1529136810930134819, - "Data4": 5657900011977326718 + "Data1": 5834876516037027489, + "Data2": 168333804585176831 }, "Flags": 0, "Kind": 0, @@ -89320,10 +87080,8 @@ }, { "__Checksum": { - "Data1": -7175636986130688741, - "Data2": 2873835459959486443, - "Data3": -3397325908977163951, - "Data4": -3634460012777382079 + "Data1": -1275322205345427142, + "Data2": 164019816868444989 }, "Flags": 0, "Kind": 0, @@ -89353,10 +87111,8 @@ }, { "__Checksum": { - "Data1": 4133281047926837570, - "Data2": 778680050833011035, - "Data3": 1649781057888114417, - "Data4": -7011486332042443047 + "Data1": -155871451478332048, + "Data2": -4614779733739565520 }, "Flags": 0, "Kind": 0, @@ -89409,10 +87165,8 @@ }, { "__Checksum": { - "Data1": -1649289207117574360, - "Data2": 2124448607756317249, - "Data3": 6645564815033636330, - "Data4": 5068727873610670771 + "Data1": -1539414966543317241, + "Data2": -2417377149480555123 }, "Flags": 0, "Kind": 0, @@ -89631,10 +87385,8 @@ }, { "__Checksum": { - "Data1": 4115741328570440041, - "Data2": 3026365949310639266, - "Data3": -1042982448166961320, - "Data4": 2970949868089024035 + "Data1": 1460954363314173919, + "Data2": -8174947366189770352 }, "Flags": 0, "Kind": 0, @@ -89702,10 +87454,8 @@ }, { "__Checksum": { - "Data1": -4501523636368318158, - "Data2": 3990040663938312361, - "Data3": -4621233057461208382, - "Data4": 6380403987212366613 + "Data1": 846765413197922473, + "Data2": 8948287366620028160 }, "Flags": 0, "Kind": 0, @@ -89843,10 +87593,8 @@ }, { "__Checksum": { - "Data1": 2255397199740451149, - "Data2": -8763734473383453490, - "Data3": -4491940126382746338, - "Data4": -8697382164448355699 + "Data1": -6484175248809510114, + "Data2": 6735235331324765407 }, "Flags": 0, "Kind": 0, @@ -90069,10 +87817,8 @@ }, { "__Checksum": { - "Data1": 8211525306189241537, - "Data2": 3738733186207670971, - "Data3": 4235274883495233769, - "Data4": 2134965269679396206 + "Data1": -9048884633309900093, + "Data2": -4862392706804738907 }, "Flags": 0, "Kind": 0, @@ -90154,10 +87900,8 @@ }, { "__Checksum": { - "Data1": -2737164173777898215, - "Data2": -7051268329471981122, - "Data3": 3511839554845046576, - "Data4": 8883899450132131551 + "Data1": 6060730136133457741, + "Data2": 2975129124741458111 }, "Flags": 0, "Kind": 0, @@ -90287,10 +88031,8 @@ }, { "__Checksum": { - "Data1": 501637591897550419, - "Data2": 6408186305901270679, - "Data3": 4108843179172169377, - "Data4": -7192546700067295133 + "Data1": 9198647489482835652, + "Data2": -5077788958966449653 }, "Flags": 0, "Kind": 0, @@ -90530,10 +88272,8 @@ }, { "__Checksum": { - "Data1": 1187247699031600490, - "Data2": 8781017886918587397, - "Data3": 3308044826540907686, - "Data4": 6717449266006944663 + "Data1": -153161732019912513, + "Data2": 3379900640809116785 }, "Flags": 0, "Kind": 0, @@ -90657,10 +88397,8 @@ }, { "__Checksum": { - "Data1": -1141634561356931921, - "Data2": 4127772290678889922, - "Data3": 6934740999376718019, - "Data4": -6766139798064977683 + "Data1": -8712842092990504742, + "Data2": 1023508308125820291 }, "Flags": 0, "Kind": 0, @@ -90887,10 +88625,8 @@ }, { "__Checksum": { - "Data1": 5529635906185363667, - "Data2": 7859664131347338860, - "Data3": -8394508801504710409, - "Data4": 8162796307560717355 + "Data1": 2200202416381200806, + "Data2": 7907925147723342364 }, "Flags": 0, "Kind": 0, @@ -90949,10 +88685,8 @@ }, { "__Checksum": { - "Data1": 4392189677623773155, - "Data2": -5857795651986867425, - "Data3": 5806825531536398422, - "Data4": 8387563920235112073 + "Data1": 6363727539275019739, + "Data2": -7746982833017778205 }, "Flags": 0, "Kind": 0, @@ -90985,10 +88719,8 @@ }, { "__Checksum": { - "Data1": -2966485144223015453, - "Data2": 4525436540277874421, - "Data3": -5992359739369693466, - "Data4": -82348698658543288 + "Data1": 1686731137620591310, + "Data2": -293129758338596094 }, "Flags": 0, "Kind": 0, @@ -91118,10 +88850,8 @@ }, { "__Checksum": { - "Data1": -982563931417698204, - "Data2": 4884886507000507336, - "Data3": -4577510630091647496, - "Data4": -2660092048663448714 + "Data1": 220512028963792563, + "Data2": -3319007497291018848 }, "Flags": 0, "Kind": 0, @@ -91151,10 +88881,8 @@ }, { "__Checksum": { - "Data1": -1191611615782942320, - "Data2": -1706914564053307358, - "Data3": 7399846075575165667, - "Data4": -8966246995167811084 + "Data1": 2744961599071578285, + "Data2": 9136954988518417984 }, "Flags": 0, "Kind": 0, @@ -91201,10 +88929,8 @@ }, { "__Checksum": { - "Data1": 9079852245370037820, - "Data2": -6786165223088413164, - "Data3": -5098536825258526166, - "Data4": -3923279915057169632 + "Data1": 3211382517084119716, + "Data2": -8628514299474908431 }, "Flags": 0, "Kind": 0, @@ -91235,10 +88961,8 @@ }, { "__Checksum": { - "Data1": -5544199444519555504, - "Data2": 8478102168472228483, - "Data3": -4523438335862058452, - "Data4": -8170452022604220751 + "Data1": 7959888600802438390, + "Data2": -2509953481163719901 }, "Flags": 0, "Kind": 0, @@ -91458,10 +89182,8 @@ }, { "__Checksum": { - "Data1": 1667231320940535324, - "Data2": 3581462355448813754, - "Data3": -6365519066829942907, - "Data4": -6167213148283402865 + "Data1": 1245436460055086567, + "Data2": 5045304630666205730 }, "Flags": 0, "Kind": 0, @@ -91501,10 +89223,8 @@ }, { "__Checksum": { - "Data1": -521125837285069760, - "Data2": -2029182454830830861, - "Data3": 3580758409868217308, - "Data4": -7660157250453228250 + "Data1": 6551745922400841090, + "Data2": 8519040710005771571 }, "Flags": 0, "Kind": 0, @@ -91537,10 +89257,8 @@ }, { "__Checksum": { - "Data1": -3210877275081111072, - "Data2": -2921518135194637108, - "Data3": -1529599115302327974, - "Data4": 773201106826790293 + "Data1": 4293510644495471999, + "Data2": 1678787373335617783 }, "Flags": 0, "Kind": 0, @@ -91594,10 +89312,8 @@ }, { "__Checksum": { - "Data1": -3576967706771276712, - "Data2": -6151030919991784341, - "Data3": 8551048775522568720, - "Data4": 8047163670920228395 + "Data1": 6506448594591376625, + "Data2": 6560737539235863096 }, "Flags": 0, "Kind": 0, @@ -91647,10 +89363,8 @@ }, { "__Checksum": { - "Data1": 8136423506523537004, - "Data2": 4485972031544623045, - "Data3": 7343793772139716710, - "Data4": 7100762904703837088 + "Data1": 1553462114652538592, + "Data2": 3226918520649338558 }, "Flags": 0, "Kind": 0, @@ -91690,10 +89404,8 @@ }, { "__Checksum": { - "Data1": 5169014018142477188, - "Data2": 2356706578705863875, - "Data3": 896456829444216250, - "Data4": -4207013758497904447 + "Data1": 8927993439308061019, + "Data2": 1209905517012222343 }, "Flags": 0, "Kind": 0, @@ -91740,10 +89452,8 @@ }, { "__Checksum": { - "Data1": 2550060678499191091, - "Data2": -8394629133596741583, - "Data3": -6218300387976850357, - "Data4": 5643965298564965418 + "Data1": 3608905330802189734, + "Data2": -3988170182898715202 }, "Flags": 0, "Kind": 0, @@ -91811,10 +89521,8 @@ }, { "__Checksum": { - "Data1": -8584852408582080903, - "Data2": -9121209794159583880, - "Data3": 1671438526214077737, - "Data4": -9029225262413065699 + "Data1": -6002129520817465426, + "Data2": -371114573351798952 }, "Flags": 0, "Kind": 0, @@ -91889,10 +89597,8 @@ }, { "__Checksum": { - "Data1": 4113458371443734246, - "Data2": -5101633481513172564, - "Data3": -8446397982175879537, - "Data4": 3648471332076519897 + "Data1": 4237130970923253922, + "Data2": 746603826117560518 }, "Flags": 0, "Kind": 0, @@ -91951,10 +89657,8 @@ }, { "__Checksum": { - "Data1": 5654486355681824727, - "Data2": -7490356542408758645, - "Data3": -7259975524213974912, - "Data4": -4771594491706349500 + "Data1": -5660936712984208487, + "Data2": 7987274508981795715 }, "Flags": 0, "Kind": 0, @@ -92008,10 +89712,8 @@ }, { "__Checksum": { - "Data1": 1557763137084017594, - "Data2": -6534952209127884627, - "Data3": -2843792740971077442, - "Data4": -3933770011569406001 + "Data1": 2275706821282718431, + "Data2": 6596580923929911175 }, "Flags": 0, "Kind": 0, @@ -92061,10 +89763,8 @@ }, { "__Checksum": { - "Data1": -1382200893034535419, - "Data2": -6051603578108244932, - "Data3": -7123136596977258257, - "Data4": -7620176588945463460 + "Data1": -1088304316942876792, + "Data2": 1245513315363712394 }, "Flags": 0, "Kind": 0, @@ -92139,10 +89839,8 @@ }, { "__Checksum": { - "Data1": 5985475591607834504, - "Data2": 6166035148743520704, - "Data3": 6826733261146472919, - "Data4": -1676129737155823680 + "Data1": 4033816135188635665, + "Data2": 7328532857097426426 }, "Flags": 0, "Kind": 0, @@ -92229,10 +89927,8 @@ }, { "__Checksum": { - "Data1": 2085365324885120601, - "Data2": -1048116426082836502, - "Data3": 7107654961134967601, - "Data4": -4856644988031255615 + "Data1": -4909250524265010603, + "Data2": -1763519224232202790 }, "Flags": 0, "Kind": 0, @@ -92307,10 +90003,8 @@ }, { "__Checksum": { - "Data1": -958702504218037949, - "Data2": -9110469117042328003, - "Data3": 8552573292835244353, - "Data4": -6926403926701612070 + "Data1": 7676831662727225051, + "Data2": -1166143061405703741 }, "Flags": 0, "Kind": 0, @@ -92371,10 +90065,8 @@ }, { "__Checksum": { - "Data1": -363965740195677328, - "Data2": 2377369156272566748, - "Data3": 3804230050906273789, - "Data4": -1710155926078287159 + "Data1": 2381677159042259372, + "Data2": 1581636625616605064 }, "Flags": 0, "Kind": 0, @@ -92530,10 +90222,8 @@ }, { "__Checksum": { - "Data1": -3224180478069774678, - "Data2": 5435125945944932610, - "Data3": 2201450988322848172, - "Data4": 3693583402166790950 + "Data1": -2060184457551295129, + "Data2": -5006798383979134494 }, "Flags": 0, "Kind": 0, @@ -92715,10 +90405,8 @@ }, { "__Checksum": { - "Data1": -757679498455187409, - "Data2": -4823308709767812299, - "Data3": -817732480492761284, - "Data4": 3014337379308016595 + "Data1": 5418043399828551010, + "Data2": 3190994011828689574 }, "Flags": 0, "Kind": 0, @@ -92748,10 +90436,8 @@ }, { "__Checksum": { - "Data1": 5264602298664979396, - "Data2": -4782031934658437317, - "Data3": 3384030357207634169, - "Data4": -2023299953497420220 + "Data1": -884939635473107982, + "Data2": 6836152213515180136 }, "Flags": 0, "Kind": 0, @@ -92791,10 +90477,8 @@ }, { "__Checksum": { - "Data1": -6988030220709081360, - "Data2": 401066954090873018, - "Data3": 5028241016365278446, - "Data4": 608570567827965417 + "Data1": 1758745021426947666, + "Data2": -4572797258881400115 }, "Flags": 0, "Kind": 0, @@ -92827,10 +90511,8 @@ }, { "__Checksum": { - "Data1": 4254349130506330511, - "Data2": 4503491567411621533, - "Data3": 5146860497821094611, - "Data4": -8280163337195028136 + "Data1": 8727633347017809403, + "Data2": 3059594490738747196 }, "Flags": 0, "Kind": 0, @@ -92898,10 +90580,8 @@ }, { "__Checksum": { - "Data1": 4681900961524153925, - "Data2": 4569115872184252973, - "Data3": 625291112728017119, - "Data4": 6393376438934314455 + "Data1": -2657872999229221016, + "Data2": 5612794311309639231 }, "Flags": 0, "Kind": 0, @@ -93004,10 +90684,8 @@ }, { "__Checksum": { - "Data1": 23762966136722077, - "Data2": 240987922729171225, - "Data3": 9090445988575534215, - "Data4": -4272922564914679782 + "Data1": 2327824470571704858, + "Data2": -1036250107007713926 }, "Flags": 0, "Kind": 0, @@ -93089,10 +90767,8 @@ }, { "__Checksum": { - "Data1": -8528546461173608007, - "Data2": 6646466454374253112, - "Data3": -555174646737574543, - "Data4": -2806900519804198951 + "Data1": -4129044059722577608, + "Data2": -2101597395718599691 }, "Flags": 0, "Kind": 0, @@ -93132,10 +90808,8 @@ }, { "__Checksum": { - "Data1": -6765007443478372700, - "Data2": 8051754657954374302, - "Data3": 5055758319881677378, - "Data4": -3081838416004028471 + "Data1": -1198779158247709035, + "Data2": -7134241773906170044 }, "Flags": 0, "Kind": 0, @@ -93225,10 +90899,8 @@ }, { "__Checksum": { - "Data1": 6322019702851685226, - "Data2": 8419498485038146491, - "Data3": -1143820722678815665, - "Data4": 8380797785369802875 + "Data1": -861817440636478660, + "Data2": -5762684324198680015 }, "Flags": 0, "Kind": 0, @@ -93294,10 +90966,8 @@ }, { "__Checksum": { - "Data1": 4203274613650184349, - "Data2": 5807057966251800254, - "Data3": -9139363467507166007, - "Data4": 2727875508202653410 + "Data1": 3482222224391394793, + "Data2": 8282288786275353852 }, "Flags": 0, "Kind": 0, @@ -93365,10 +91035,8 @@ }, { "__Checksum": { - "Data1": -7105367334509422564, - "Data2": -8249473597708717391, - "Data3": -1152594019022990451, - "Data4": 7343615494571348128 + "Data1": 8639947838734565557, + "Data2": 2252627557602894955 }, "Flags": 0, "Kind": 0, @@ -93457,10 +91125,8 @@ }, { "__Checksum": { - "Data1": -4715992306481650128, - "Data2": -205559948506057973, - "Data3": -1779513485434264539, - "Data4": 2905720195066248974 + "Data1": 2410804034946857145, + "Data2": -2513327407382848969 }, "Flags": 0, "Kind": 0, @@ -93535,10 +91201,8 @@ }, { "__Checksum": { - "Data1": 5364675233617387940, - "Data2": -3629051885353247326, - "Data3": 8876673032345332551, - "Data4": -7289209815746775485 + "Data1": 3374562678437169288, + "Data2": -8136133653113517809 }, "Flags": 0, "Kind": 0, @@ -93625,10 +91289,8 @@ }, { "__Checksum": { - "Data1": -7894348945288117617, - "Data2": -7685205074307386317, - "Data3": -1831868065740496325, - "Data4": -8607588605951475828 + "Data1": -6776774529191224409, + "Data2": 2867783991961372030 }, "Flags": 0, "Kind": 0, @@ -93688,10 +91350,8 @@ }, { "__Checksum": { - "Data1": -1203611404148780875, - "Data2": 2547027945291955156, - "Data3": -8957375359501259652, - "Data4": -3148140428573317776 + "Data1": -8244439305150752650, + "Data2": -2806538136733907441 }, "Flags": 0, "Kind": 0, @@ -93731,10 +91391,8 @@ }, { "__Checksum": { - "Data1": -9029439528561141161, - "Data2": 1175142839108768558, - "Data3": 9131182222407452764, - "Data4": -7853118380969336121 + "Data1": 7207503054001445871, + "Data2": 3298766521685808474 }, "Flags": 0, "Kind": 0, @@ -93774,10 +91432,8 @@ }, { "__Checksum": { - "Data1": 4633246185851047881, - "Data2": 8310066299873503775, - "Data3": -236557203908558636, - "Data4": -120284727823333258 + "Data1": 4106323150683425441, + "Data2": 3204858998332264233 }, "Flags": 0, "Kind": 0, @@ -93817,10 +91473,8 @@ }, { "__Checksum": { - "Data1": -2893338398160047226, - "Data2": -8030308100138645750, - "Data3": 6525681672875655311, - "Data4": -3169855347809185378 + "Data1": -1941782182025325073, + "Data2": -587592566128653392 }, "Flags": 0, "Kind": 0, @@ -93851,10 +91505,8 @@ }, { "__Checksum": { - "Data1": -342445591334828882, - "Data2": 7321967516083977208, - "Data3": 2309760711362370788, - "Data4": -5159734070790316378 + "Data1": -2203944264266373781, + "Data2": -1037058445654294686 }, "Flags": 0, "Kind": 0, @@ -93929,10 +91581,8 @@ }, { "__Checksum": { - "Data1": 1502364996124197907, - "Data2": -9052898465034819706, - "Data3": 4976107115147325311, - "Data4": -2531178839034021294 + "Data1": -2383802682770405559, + "Data2": 7772020652182871285 }, "Flags": 0, "Kind": 0, @@ -93963,10 +91613,8 @@ }, { "__Checksum": { - "Data1": 3926214736388960127, - "Data2": -1920049811015259991, - "Data3": -8286162496313966150, - "Data4": 7967671195756225010 + "Data1": 3162819332762975130, + "Data2": -3828997566279789979 }, "Flags": 0, "Kind": 0, @@ -94018,10 +91666,8 @@ }, { "__Checksum": { - "Data1": -6047494980788204597, - "Data2": 5223943950899945399, - "Data3": -6416102272868722040, - "Data4": 5052394430286966860 + "Data1": -2126842959662505622, + "Data2": 2788371340336393380 }, "Flags": 0, "Kind": 0, @@ -94061,10 +91707,8 @@ }, { "__Checksum": { - "Data1": 3084098894118224723, - "Data2": 2848001857081691560, - "Data3": 4960929066592165848, - "Data4": -2639453560907752108 + "Data1": 3558341025306048996, + "Data2": 1777550799128250365 }, "Flags": 0, "Kind": 0, @@ -94104,10 +91748,8 @@ }, { "__Checksum": { - "Data1": 2049694144502075801, - "Data2": 5818922885096434263, - "Data3": -3494529841516532037, - "Data4": -3269566104719932301 + "Data1": 2172171514930628015, + "Data2": -3161865648664135839 }, "Flags": 0, "Kind": 0, @@ -94143,10 +91785,8 @@ }, { "__Checksum": { - "Data1": 2391621654809118047, - "Data2": 8911389832826671608, - "Data3": -138194335767252219, - "Data4": 8358598790640489271 + "Data1": 498629536945016980, + "Data2": -7644534414635850609 }, "Flags": 0, "Kind": 0, @@ -94379,10 +92019,8 @@ }, { "__Checksum": { - "Data1": 536260152316433550, - "Data2": -8157254209878934162, - "Data3": 8103105095953496404, - "Data4": 5233009261776173318 + "Data1": 1213391537620839403, + "Data2": -5810543154297442482 }, "Flags": 0, "Kind": 0, @@ -94632,10 +92270,8 @@ }, { "__Checksum": { - "Data1": 8126457184854456138, - "Data2": -3999168037303665699, - "Data3": -1545383251572119790, - "Data4": 436929441887080877 + "Data1": -8057851609033560966, + "Data2": -873672242795557931 }, "Flags": 0, "Kind": 0, @@ -94675,10 +92311,8 @@ }, { "__Checksum": { - "Data1": -8441474744868596083, - "Data2": -2043138184739616153, - "Data3": -4769851338611263426, - "Data4": 7766743376118123374 + "Data1": 7157338885016538583, + "Data2": 8968080481804123024 }, "Flags": 0, "Kind": 0, @@ -94755,10 +92389,8 @@ }, { "__Checksum": { - "Data1": -1568342964054040284, - "Data2": 6970357332631371141, - "Data3": -5023961693696659728, - "Data4": 8684472123472465522 + "Data1": 5016322656020512763, + "Data2": -6979353958726712640 }, "Flags": 0, "Kind": 0, @@ -94864,10 +92496,8 @@ }, { "__Checksum": { - "Data1": 6806233739267355174, - "Data2": 3810551128997305986, - "Data3": 4183228794176844211, - "Data4": -6705399653685497503 + "Data1": -1650928179212592511, + "Data2": -829945511791357017 }, "Flags": 0, "Kind": 0, @@ -95080,10 +92710,8 @@ }, { "__Checksum": { - "Data1": 7756058951324039537, - "Data2": -7904352261689414294, - "Data3": 1479889633161596534, - "Data4": -7684462712773365511 + "Data1": 1595153956852380782, + "Data2": 6596321925287442521 }, "Flags": 0, "Kind": 0, @@ -95333,10 +92961,8 @@ }, { "__Checksum": { - "Data1": 6804600231923759723, - "Data2": 8948555583851245361, - "Data3": -4872338849297864151, - "Data4": -1932044323421370454 + "Data1": -7032062085300008934, + "Data2": 1704811876465139746 }, "Flags": 0, "Kind": 0, @@ -95390,10 +93016,8 @@ }, { "__Checksum": { - "Data1": -776394147104812854, - "Data2": -1345015843168821017, - "Data3": -723023157326422940, - "Data4": -3851498504511028497 + "Data1": 2006973256418064712, + "Data2": 7480707590708730404 }, "Flags": 0, "Kind": 0, @@ -95461,10 +93085,8 @@ }, { "__Checksum": { - "Data1": -8936901209235739711, - "Data2": 8066889857044216530, - "Data3": 8415577414618282514, - "Data4": 8197382348577777951 + "Data1": 6808183449329970559, + "Data2": 189436567892206140 }, "Flags": 0, "Kind": 0, @@ -95567,10 +93189,8 @@ }, { "__Checksum": { - "Data1": 6853934041709664844, - "Data2": -2736680937620092547, - "Data3": -9159282918739830002, - "Data4": 916527756877389471 + "Data1": 38823742577701564, + "Data2": -5694504920997292437 }, "Flags": 0, "Kind": 0, @@ -95624,10 +93244,8 @@ }, { "__Checksum": { - "Data1": -2654759959309653356, - "Data2": 4402474682259086160, - "Data3": 7864815541611704170, - "Data4": -1656443494235573734 + "Data1": -7170447221030555841, + "Data2": 3723413815037394548 }, "Flags": 0, "Kind": 0, @@ -95681,10 +93299,8 @@ }, { "__Checksum": { - "Data1": 4205147297397294048, - "Data2": 686154771490889314, - "Data3": -7679525039525878894, - "Data4": -1910749378158041564 + "Data1": 3644119163101203054, + "Data2": -5502967435176298137 }, "Flags": 0, "Kind": 0, @@ -95829,10 +93445,8 @@ }, { "__Checksum": { - "Data1": 2094069235573864684, - "Data2": 7120602219831511728, - "Data3": 7723995133031640710, - "Data4": 6405579141762381726 + "Data1": -8158801395866491531, + "Data2": 1740057634313530788 }, "Flags": 0, "Kind": 0, @@ -95872,10 +93486,8 @@ }, { "__Checksum": { - "Data1": 6395016510104074270, - "Data2": -3361687186589861034, - "Data3": 1242686149556759276, - "Data4": 5919696018778398426 + "Data1": -59669407009017878, + "Data2": -999645346606168317 }, "Flags": 0, "Kind": 0, @@ -96164,10 +93776,8 @@ }, { "__Checksum": { - "Data1": 5891953738733656443, - "Data2": -3458011353980278625, - "Data3": 4305647982772340851, - "Data4": -1684172327435648890 + "Data1": 8562756333306092618, + "Data2": -5291803048509130661 }, "Flags": 0, "Kind": 0, @@ -96221,10 +93831,8 @@ }, { "__Checksum": { - "Data1": 9090459845473575104, - "Data2": 4994951413086816500, - "Data3": 8022504538503157408, - "Data4": 5893044506582573081 + "Data1": 6490775176595723459, + "Data2": -4940513059110555382 }, "Flags": 0, "Kind": 0, @@ -96369,10 +93977,8 @@ }, { "__Checksum": { - "Data1": 5353962991919403075, - "Data2": 720599063526546571, - "Data3": 8609137270047280920, - "Data4": 5403960605625549489 + "Data1": 6630159737526288709, + "Data2": -225197935902531913 }, "Flags": 0, "Kind": 0, @@ -96590,10 +94196,8 @@ }, { "__Checksum": { - "Data1": -7285969436233453128, - "Data2": 471198200257935987, - "Data3": -1592444651282361423, - "Data4": -6165267730058068101 + "Data1": -259580275363691747, + "Data2": 6031797843926035024 }, "Flags": 0, "Kind": 0, @@ -96640,10 +94244,8 @@ }, { "__Checksum": { - "Data1": -1875401660807598650, - "Data2": -5679094219814616963, - "Data3": -7181400772228632146, - "Data4": -1084197522107275868 + "Data1": 2630461591310654830, + "Data2": -1479969317642859822 }, "Flags": 0, "Kind": 0, @@ -96673,10 +94275,8 @@ }, { "__Checksum": { - "Data1": 6213702375392022356, - "Data2": 7434328444938379983, - "Data3": 6811525562037665190, - "Data4": -8189641924023420254 + "Data1": -42096838473830759, + "Data2": -3365735889591695711 }, "Flags": 0, "Kind": 0, @@ -96716,10 +94316,8 @@ }, { "__Checksum": { - "Data1": 8844547795103050407, - "Data2": -462395489433938296, - "Data3": -957339882420682375, - "Data4": -6189222520197712932 + "Data1": 3052085835264383857, + "Data2": -1682920557752145157 }, "Flags": 0, "Kind": 0, @@ -96759,10 +94357,8 @@ }, { "__Checksum": { - "Data1": -7975730931685649855, - "Data2": 8863184169383071585, - "Data3": 5457573662034752484, - "Data4": 9084458678495108817 + "Data1": -589140985788053768, + "Data2": -6475446672937487546 }, "Flags": 0, "Kind": 0, @@ -96807,10 +94403,8 @@ }, { "__Checksum": { - "Data1": 1027774212515573589, - "Data2": 1003759179936954604, - "Data3": 479586028293241594, - "Data4": -6857245851395460883 + "Data1": 4923583821969074634, + "Data2": 7218355664881515367 }, "Flags": 0, "Kind": 0, @@ -96979,10 +94573,8 @@ }, { "__Checksum": { - "Data1": -7110540510889453002, - "Data2": -5480136932069217965, - "Data3": -2517651266723140345, - "Data4": 5420926687313265622 + "Data1": 2575010549817689914, + "Data2": 7152898124048840687 }, "Flags": 0, "Kind": 0, @@ -97029,10 +94621,8 @@ }, { "__Checksum": { - "Data1": -6695403060763563076, - "Data2": 8568019875531747771, - "Data3": -2508015779923822865, - "Data4": 4471611753663700955 + "Data1": -4309589388724676746, + "Data2": 4550410576622853663 }, "Flags": 0, "Kind": 0, @@ -97079,10 +94669,8 @@ }, { "__Checksum": { - "Data1": 2071506637509077368, - "Data2": -3985519145940268879, - "Data3": 6589474608178357850, - "Data4": -7814896975294582973 + "Data1": -224456759429288012, + "Data2": -1480129799885573499 }, "Flags": 0, "Kind": 0, @@ -97127,10 +94715,8 @@ }, { "__Checksum": { - "Data1": 277374697599211702, - "Data2": -1656042131074388685, - "Data3": -1291436749601844663, - "Data4": 1587348503659788332 + "Data1": 6344694321833469769, + "Data2": 7952016848999212294 }, "Flags": 0, "Kind": 0, @@ -97258,10 +94844,8 @@ }, { "__Checksum": { - "Data1": -7797424935181585232, - "Data2": -6860410742994192799, - "Data3": 1946130956404746843, - "Data4": 7557366829519776143 + "Data1": 5592118877439080077, + "Data2": -200640721453134075 }, "Flags": 0, "Kind": 0, @@ -97426,10 +95010,8 @@ }, { "__Checksum": { - "Data1": 7854774385915566474, - "Data2": 6443424995007119241, - "Data3": -6472656287435196791, - "Data4": 6952889391117971851 + "Data1": -5624798308200040775, + "Data2": 6232200475434487307 }, "Flags": 0, "Kind": 0, @@ -97469,10 +95051,8 @@ }, { "__Checksum": { - "Data1": -6629050681474077892, - "Data2": 1803629644672931092, - "Data3": 118163535664841758, - "Data4": -3296399799200206206 + "Data1": 6935098340378197108, + "Data2": -838090151499708513 }, "Flags": 0, "Kind": 0, @@ -97526,10 +95106,8 @@ }, { "__Checksum": { - "Data1": -8921233474791500992, - "Data2": -4517401052226932805, - "Data3": 6859246243993485583, - "Data4": 2996366244763740837 + "Data1": -4519459709286854843, + "Data2": 3608847725535420704 }, "Flags": 0, "Kind": 0, @@ -97649,10 +95227,8 @@ }, { "__Checksum": { - "Data1": 6723290816116112798, - "Data2": -2705769922005756503, - "Data3": 158305977271372268, - "Data4": -4465425703587961334 + "Data1": -3458932722759855868, + "Data2": 2291322572332593297 }, "Flags": 0, "Kind": 0, @@ -97706,10 +95282,8 @@ }, { "__Checksum": { - "Data1": -8256615327168759394, - "Data2": -8137863337513689168, - "Data3": 2726526806956826163, - "Data4": -5493166700250556308 + "Data1": -4271595526277710214, + "Data2": -7263554806252279614 }, "Flags": 0, "Kind": 0, @@ -97763,10 +95337,8 @@ }, { "__Checksum": { - "Data1": -1633129147601768160, - "Data2": -4512718560670372653, - "Data3": -8838797553631156652, - "Data4": -7948495936081647065 + "Data1": -8274684306093203752, + "Data2": -867800260908885282 }, "Flags": 0, "Kind": 0, @@ -97825,10 +95397,8 @@ }, { "__Checksum": { - "Data1": -5048405219756056144, - "Data2": -4555295258070270920, - "Data3": 1737884523502312822, - "Data4": 6129677897290229171 + "Data1": -5053380669220120494, + "Data2": 3565534609987467070 }, "Flags": 0, "Kind": 0, @@ -97868,10 +95438,8 @@ }, { "__Checksum": { - "Data1": 8409593914542310070, - "Data2": 3883833707870839538, - "Data3": -4165775581222026523, - "Data4": -8018608898088187429 + "Data1": -413026210716891277, + "Data2": -1067689069638900203 }, "Flags": 0, "Kind": 0, @@ -97925,10 +95493,8 @@ }, { "__Checksum": { - "Data1": 6830140504421446930, - "Data2": 5472520630783344594, - "Data3": 7044613862358790522, - "Data4": -3274646449868194909 + "Data1": 2115140279627981883, + "Data2": -6043406994923841156 }, "Flags": 0, "Kind": 0, @@ -97958,10 +95524,8 @@ }, { "__Checksum": { - "Data1": -3961752542711188010, - "Data2": -8431764663883167452, - "Data3": -5471420539090136930, - "Data4": -1938452042772989121 + "Data1": -3264539037816884839, + "Data2": -3760551309911774711 }, "Flags": 0, "Kind": 0, @@ -98015,10 +95579,8 @@ }, { "__Checksum": { - "Data1": 6781622918577867415, - "Data2": 7273895384683401247, - "Data3": -5643384228721076119, - "Data4": -3640557909646803816 + "Data1": -558912912419599373, + "Data2": 6644167216499031608 }, "Flags": 0, "Kind": 0, @@ -98072,10 +95634,8 @@ }, { "__Checksum": { - "Data1": -2096604269655157732, - "Data2": -3053086973656261381, - "Data3": 7183438314761817945, - "Data4": 5150498652034752905 + "Data1": -6369850633712553229, + "Data2": -9033516107720448204 }, "Flags": 0, "Kind": 0, @@ -98129,10 +95689,8 @@ }, { "__Checksum": { - "Data1": 7547296608232205169, - "Data2": 1096641591369729857, - "Data3": 9031678188706016844, - "Data4": -7515058963416650163 + "Data1": 6596798326958085311, + "Data2": -6208060390132748143 }, "Flags": 0, "Kind": 0, @@ -98245,10 +95803,8 @@ }, { "__Checksum": { - "Data1": -8865955744967084460, - "Data2": 6073457255198535907, - "Data3": -8570164254046768295, - "Data4": -3242106951048697980 + "Data1": -7782972308401603099, + "Data2": -7144050228440887985 }, "Flags": 0, "Kind": 0, @@ -98302,10 +95858,8 @@ }, { "__Checksum": { - "Data1": 4380613323758700202, - "Data2": 6968598838268957559, - "Data3": -4149523777862593432, - "Data4": -1553233324040373687 + "Data1": -1943234338401670148, + "Data2": 1836719506160560637 }, "Flags": 0, "Kind": 0, @@ -98359,10 +95913,8 @@ }, { "__Checksum": { - "Data1": 6756896587355408949, - "Data2": -8313581847466800444, - "Data3": 8207162698505693736, - "Data4": -7630106331452442747 + "Data1": 6483650459470862954, + "Data2": 3879152956634215235 }, "Flags": 0, "Kind": 0, @@ -98416,10 +95968,8 @@ }, { "__Checksum": { - "Data1": 5355347174963271634, - "Data2": 9141357368355535290, - "Data3": -2603939225237503440, - "Data4": 3279297262415214152 + "Data1": -8059184732616066820, + "Data2": -7551224923950182443 }, "Flags": 0, "Kind": 0, @@ -98449,10 +95999,8 @@ }, { "__Checksum": { - "Data1": 488264832851230948, - "Data2": -7801730940586535746, - "Data3": -5178293423752932843, - "Data4": -1613216765647920487 + "Data1": 5845378053642695449, + "Data2": -1906149357118292843 }, "Flags": 0, "Kind": 0, @@ -98570,10 +96118,8 @@ }, { "__Checksum": { - "Data1": 6772712421886403281, - "Data2": 3918996218357389053, - "Data3": 6802163445897381115, - "Data4": -3004995301201720815 + "Data1": 2436547072337464787, + "Data2": -1585940578310220739 }, "Flags": 0, "Kind": 0, @@ -98663,10 +96209,8 @@ }, { "__Checksum": { - "Data1": -4845784744048859738, - "Data2": 3939497018219394873, - "Data3": -5697883144812606310, - "Data4": -1878368739241773742 + "Data1": 8341152685201778091, + "Data2": 3304161425849484266 }, "Flags": 0, "Kind": 0, @@ -98774,10 +96318,8 @@ }, { "__Checksum": { - "Data1": -6802319876136761001, - "Data2": 9198539836693743747, - "Data3": -7216667347263747640, - "Data4": -1238687669253293909 + "Data1": 538569414130053478, + "Data2": -5712713633966891268 }, "Flags": 0, "Kind": 0, @@ -98847,10 +96389,8 @@ }, { "__Checksum": { - "Data1": 5791115515400900261, - "Data2": -5917121619258474202, - "Data3": 6268549499296310848, - "Data4": -1832222099561342780 + "Data1": 8039753713363240919, + "Data2": 5527187685004871764 }, "Flags": 0, "Kind": 0, @@ -98885,10 +96425,8 @@ }, { "__Checksum": { - "Data1": -1765938030733738378, - "Data2": 3920611511124153296, - "Data3": 2190534708628058239, - "Data4": 4866408979815390757 + "Data1": 1440315310121282397, + "Data2": 903340149927623140 }, "Flags": 0, "Kind": 0, @@ -99022,10 +96560,8 @@ }, { "__Checksum": { - "Data1": -8523724939081286583, - "Data2": -7704657486895985647, - "Data3": 1810346512042296150, - "Data4": 7188229229015023971 + "Data1": -5021599813588172177, + "Data2": 3630301668975901922 }, "Flags": 0, "Kind": 0, @@ -99183,10 +96719,8 @@ }, { "__Checksum": { - "Data1": 4751101499369742982, - "Data2": -7786948052744515186, - "Data3": -8546997313044194580, - "Data4": -6509376170048011580 + "Data1": 5723514919918389692, + "Data2": 2186226944124206076 }, "Flags": 0, "Kind": 0, @@ -99254,10 +96788,8 @@ }, { "__Checksum": { - "Data1": 8077998041431477589, - "Data2": -8770386033209998644, - "Data3": -2326727838928892458, - "Data4": 3960887835307622234 + "Data1": -1859073164499833510, + "Data2": -3231661059790823689 }, "Flags": 0, "Kind": 0, @@ -99324,10 +96856,8 @@ }, { "__Checksum": { - "Data1": 2958648910430827879, - "Data2": -7483816126791985955, - "Data3": 368684142207016381, - "Data4": -7300423607012182998 + "Data1": -2063973289654486440, + "Data2": 7440509338015959416 }, "Flags": 0, "Kind": 0, @@ -99559,10 +97089,8 @@ }, { "__Checksum": { - "Data1": -7286049699775976176, - "Data2": -6227980465306360652, - "Data3": 8972319461713257396, - "Data4": -6336819602630405904 + "Data1": -5934939232711319687, + "Data2": 8816736749724196231 }, "Flags": 0, "Kind": 0, @@ -99656,10 +97184,8 @@ }, { "__Checksum": { - "Data1": 1471381193959328660, - "Data2": -4480997993825414544, - "Data3": -7479280407405617278, - "Data4": 3820316589402567272 + "Data1": -5237850339508491145, + "Data2": 4524679415685596750 }, "Flags": 0, "Kind": 0, @@ -99706,10 +97232,8 @@ }, { "__Checksum": { - "Data1": 7253207078691554543, - "Data2": 7443352799240720072, - "Data3": -3350592289961189418, - "Data4": -6026913403274717367 + "Data1": 5235789334122559768, + "Data2": -8050863426573511023 }, "Flags": 0, "Kind": 0, @@ -99833,10 +97357,8 @@ }, { "__Checksum": { - "Data1": -3352760642334436447, - "Data2": -8021904359361292910, - "Data3": -3574022637307101435, - "Data4": 5637201015347788262 + "Data1": 233051350696727704, + "Data2": -6549130464307261239 }, "Flags": 0, "Kind": 0, @@ -100128,10 +97650,8 @@ }, { "__Checksum": { - "Data1": 2441360181116662263, - "Data2": -8182158476329417104, - "Data3": 3051658329861094677, - "Data4": -2515942032379079803 + "Data1": 2835061414506952066, + "Data2": 7713210514190792046 }, "Flags": 0, "Kind": 0, @@ -100171,10 +97691,8 @@ }, { "__Checksum": { - "Data1": -5980409433384458548, - "Data2": 7032493038563624442, - "Data3": 4806716256920630999, - "Data4": -4236114037732967599 + "Data1": -6620690051818506524, + "Data2": -1987637464001102952 }, "Flags": 0, "Kind": 0, @@ -100207,10 +97725,8 @@ }, { "__Checksum": { - "Data1": -8197720607894052190, - "Data2": -7609086288713128848, - "Data3": 3275023471728297805, - "Data4": -2942465902361517172 + "Data1": 5253481689676063747, + "Data2": -6326587199537314991 }, "Flags": 0, "Kind": 0, @@ -100241,10 +97757,8 @@ }, { "__Checksum": { - "Data1": -9112248675979062423, - "Data2": 8419302321697460314, - "Data3": 266963560739484298, - "Data4": 5930166532555508750 + "Data1": 4096736731723754958, + "Data2": 622167286163635186 }, "Flags": 0, "Kind": 0, @@ -100291,10 +97805,8 @@ }, { "__Checksum": { - "Data1": 3794558324348420326, - "Data2": -4805770510626598743, - "Data3": -4782366945724227294, - "Data4": 6061373773312964665 + "Data1": -1093838853007282619, + "Data2": -7196259674076403005 }, "Flags": 0, "Kind": 0, @@ -100327,10 +97839,8 @@ }, { "__Checksum": { - "Data1": 7277767957850542043, - "Data2": 6144364004461595071, - "Data3": 766076954300042959, - "Data4": -6838628373128168394 + "Data1": -8467387478264172022, + "Data2": -4325539875604974951 }, "Flags": 0, "Kind": 0, @@ -100447,10 +97957,8 @@ }, { "__Checksum": { - "Data1": -8452391855302051990, - "Data2": -5501961236213901328, - "Data3": -8626461286230890657, - "Data4": -4926404234256126620 + "Data1": 3173157027040964856, + "Data2": 7256375557662018912 }, "Flags": 0, "Kind": 0, @@ -100490,10 +97998,8 @@ }, { "__Checksum": { - "Data1": 3902133871965767274, - "Data2": -4673774844867715690, - "Data3": -7491164736365896887, - "Data4": -7682004822057363890 + "Data1": 2910040998055257212, + "Data2": 1956973467232270672 }, "Flags": 0, "Kind": 0, @@ -100561,10 +98067,8 @@ }, { "__Checksum": { - "Data1": -1392665787478441678, - "Data2": 7701629422174675100, - "Data3": 8073772451268813853, - "Data4": -59418497106986405 + "Data1": 3255066476342366217, + "Data2": -1085700014939110571 }, "Flags": 0, "Kind": 0, @@ -100625,10 +98129,8 @@ }, { "__Checksum": { - "Data1": 6540813415254497586, - "Data2": 3150078180429706802, - "Data3": -8020511964308996877, - "Data4": -9176397263825755786 + "Data1": -9194172250930585071, + "Data2": -241723873802025495 }, "Flags": 0, "Kind": 0, @@ -100689,10 +98191,8 @@ }, { "__Checksum": { - "Data1": -3316273672196904492, - "Data2": 84199784513444086, - "Data3": 8519083810631905230, - "Data4": 4372233111041354776 + "Data1": 8252127068265361364, + "Data2": -6221252968022037844 }, "Flags": 0, "Kind": 0, @@ -100753,10 +98253,8 @@ }, { "__Checksum": { - "Data1": 7420944100489386049, - "Data2": 3571881424880812179, - "Data3": -5744771181011513014, - "Data4": -1973305630366073028 + "Data1": -346207989374889214, + "Data2": 2309635859076398586 }, "Flags": 0, "Kind": 0, @@ -100866,10 +98364,8 @@ }, { "__Checksum": { - "Data1": -5132716147560633362, - "Data2": -8014852804426936368, - "Data3": -6863240361279564891, - "Data4": 8739159276524775664 + "Data1": 4525589108430925599, + "Data2": 3954470499251717579 }, "Flags": 0, "Kind": 0, @@ -100916,10 +98412,8 @@ }, { "__Checksum": { - "Data1": -8180488633969593710, - "Data2": 1103065717685329409, - "Data3": -5322161181834982167, - "Data4": 5008865266879927618 + "Data1": -2548548296235527714, + "Data2": 6591598965026609508 }, "Flags": 0, "Kind": 0, @@ -100966,10 +98460,8 @@ }, { "__Checksum": { - "Data1": 732681378517839243, - "Data2": -4964894062479060154, - "Data3": -6009072057567003805, - "Data4": 954609255695201325 + "Data1": -5911801408670820849, + "Data2": 8989093929623697483 }, "Flags": 0, "Kind": 0, @@ -101037,10 +98529,8 @@ }, { "__Checksum": { - "Data1": 1836123367550328691, - "Data2": 776676976588395587, - "Data3": -3511994609224321376, - "Data4": -7765473219273471316 + "Data1": 6901645971732334829, + "Data2": -1817722322559905711 }, "Flags": 0, "Kind": 0, @@ -101129,10 +98619,8 @@ }, { "__Checksum": { - "Data1": 4731004001631679076, - "Data2": -4938498696548364372, - "Data3": 1538899483755241322, - "Data4": -2226344911727631134 + "Data1": -7743857827697063713, + "Data2": -7513280417626130832 }, "Flags": 0, "Kind": 0, @@ -101339,10 +98827,8 @@ }, { "__Checksum": { - "Data1": -1180239379591377852, - "Data2": 4202264700810056953, - "Data3": -1689107224054670122, - "Data4": -7018081141650342940 + "Data1": 8068171080328061953, + "Data2": 978784724216318188 }, "Flags": 0, "Kind": 0, @@ -101417,10 +98903,8 @@ }, { "__Checksum": { - "Data1": 7888988915212495764, - "Data2": -5941281524149269630, - "Data3": 8930714344448914334, - "Data4": -7034579226770951521 + "Data1": -1771147558237159663, + "Data2": -4171673464609975943 }, "Flags": 0, "Kind": 0, @@ -101474,10 +98958,8 @@ }, { "__Checksum": { - "Data1": -2211450679122639903, - "Data2": 5875366339767924759, - "Data3": 3305031531379705303, - "Data4": -8710338821003138836 + "Data1": -1079958476678605919, + "Data2": 4005045773981429455 }, "Flags": 0, "Kind": 0, @@ -101622,10 +99104,8 @@ }, { "__Checksum": { - "Data1": -4357118766269946023, - "Data2": 2110562485858204707, - "Data3": -3917659936325220987, - "Data4": 5295956488757433886 + "Data1": 276044028698499776, + "Data2": -3703841090513004722 }, "Flags": 0, "Kind": 0, @@ -101728,10 +99208,8 @@ }, { "__Checksum": { - "Data1": -1280578273100719806, - "Data2": 219683759705738803, - "Data3": -4563450116364604812, - "Data4": -4259979296520509290 + "Data1": 3340791592318898300, + "Data2": 996034478663639993 }, "Flags": 0, "Kind": 0, @@ -101761,10 +99239,8 @@ }, { "__Checksum": { - "Data1": -9128220375413960947, - "Data2": -3776132929376003854, - "Data3": -8901332208674600680, - "Data4": -7834105000967864095 + "Data1": 612702687547948605, + "Data2": -3608235294539356393 }, "Flags": 0, "Kind": 0, @@ -102303,10 +99779,8 @@ }, { "__Checksum": { - "Data1": 8352209184762271815, - "Data2": -3830481575333626892, - "Data3": -7232614465871381601, - "Data4": -5240065180453767033 + "Data1": -7812758281463820430, + "Data2": 3641209262248720927 }, "Flags": 0, "Kind": 0, @@ -102339,10 +99813,8 @@ }, { "__Checksum": { - "Data1": 6725355759397147630, - "Data2": -3409430078819424205, - "Data3": -4474033373457058211, - "Data4": -5577336060877489797 + "Data1": 6014554538543077857, + "Data2": 8109945440807012678 }, "Flags": 0, "Kind": 0, @@ -102372,10 +99844,8 @@ }, { "__Checksum": { - "Data1": -1058108000201742076, - "Data2": 4893862441524686092, - "Data3": -7900887240041375782, - "Data4": 8637150542304637921 + "Data1": -1716692737444830289, + "Data2": 3549237856955491832 }, "Flags": 0, "Kind": 0, @@ -102429,10 +99899,8 @@ }, { "__Checksum": { - "Data1": -933796073662252875, - "Data2": 7922285364406659934, - "Data3": 9198951868075604450, - "Data4": 905289616200175860 + "Data1": 7245944814814470839, + "Data2": -6148264334182846251 }, "Flags": 0, "Kind": 0, @@ -102472,10 +99940,8 @@ }, { "__Checksum": { - "Data1": 2624966746758735455, - "Data2": -6776591971673912466, - "Data3": 1014331398796234561, - "Data4": 4186203365186432631 + "Data1": 4395849205892596082, + "Data2": 7176298961332867285 }, "Flags": 0, "Kind": 0, @@ -102961,10 +100427,8 @@ }, { "__Checksum": { - "Data1": 2008612175601521063, - "Data2": 1337802193800457781, - "Data3": 1605130353571052685, - "Data4": 7361808821040201954 + "Data1": 9195743791050005703, + "Data2": 853301776941957440 }, "Flags": 0, "Kind": 0, @@ -102994,10 +100458,8 @@ }, { "__Checksum": { - "Data1": 8883270224818753203, - "Data2": -1765474541091242311, - "Data3": -688064350468095619, - "Data4": -8939048009843649441 + "Data1": 3493837528837289885, + "Data2": 3900330538574343933 }, "Flags": 0, "Kind": 0, @@ -103037,10 +100499,8 @@ }, { "__Checksum": { - "Data1": 7642830771305680892, - "Data2": -8863153881069367201, - "Data3": -3205958766687400177, - "Data4": 1852743696735189311 + "Data1": 6442807942838930216, + "Data2": -6748350679487417446 }, "Flags": 0, "Kind": 0, @@ -103177,10 +100637,8 @@ }, { "__Checksum": { - "Data1": 6422440072215653449, - "Data2": -646006866862490234, - "Data3": -3952128617840531498, - "Data4": 2183030190335699171 + "Data1": -2212542542039193674, + "Data2": 5283338735336296235 }, "Flags": 0, "Kind": 0, @@ -103430,10 +100888,8 @@ }, { "__Checksum": { - "Data1": -5816278347539926211, - "Data2": -7932304586989082952, - "Data3": 4631508963827629181, - "Data4": 186828512828937562 + "Data1": 4641022759728973396, + "Data2": -2868762414532069028 }, "Flags": 0, "Kind": 0, @@ -103457,10 +100913,8 @@ }, { "__Checksum": { - "Data1": 2091748435210090660, - "Data2": -2538060544478726498, - "Data3": 4526036521269978197, - "Data4": 2698407696702718521 + "Data1": 9103570761461204805, + "Data2": -1755572943713677184 }, "Flags": 0, "Kind": 0, @@ -103492,10 +100946,8 @@ }, { "__Checksum": { - "Data1": -3518752755289948186, - "Data2": -2705804207684506609, - "Data3": -5849842024267220085, - "Data4": -1615860923889892245 + "Data1": 7904523522042801726, + "Data2": 9082283623208286673 }, "Flags": 0, "Kind": 0, @@ -103525,10 +100977,8 @@ }, { "__Checksum": { - "Data1": 2927312527685570555, - "Data2": 4504967412183265789, - "Data3": -7829481297773418809, - "Data4": -1468641039829509989 + "Data1": -6248690671005171718, + "Data2": 8271711444375597761 }, "Flags": 0, "Kind": 0, @@ -103568,10 +101018,8 @@ }, { "__Checksum": { - "Data1": -8993686980109684503, - "Data2": 3153234820852721131, - "Data3": -9137438843488633620, - "Data4": -7886108290547056040 + "Data1": 1971482593183914811, + "Data2": 6291997677035963981 }, "Flags": 0, "Kind": 0, @@ -103632,10 +101080,8 @@ }, { "__Checksum": { - "Data1": 2926317225641139904, - "Data2": 6792288717121857939, - "Data3": -7497585950247750443, - "Data4": -4803634193403255752 + "Data1": -1041285653649229209, + "Data2": 7020253430090984083 }, "Flags": 0, "Kind": 0, @@ -103871,10 +101317,8 @@ }, { "__Checksum": { - "Data1": -2166077089358206523, - "Data2": 666324208373802540, - "Data3": -2649034028646436753, - "Data4": 7188893156957936803 + "Data1": -820433097026860250, + "Data2": 1081678438669959493 }, "Flags": 0, "Kind": 0, @@ -104064,10 +101508,8 @@ }, { "__Checksum": { - "Data1": 8554454561106636690, - "Data2": 6193250714149628792, - "Data3": 3837444965427733450, - "Data4": 7110835860597742253 + "Data1": 4820451043571719001, + "Data2": -4648357873964153563 }, "Flags": 0, "Kind": 0, @@ -104107,10 +101549,8 @@ }, { "__Checksum": { - "Data1": 1765495006982245420, - "Data2": 8370897017959751539, - "Data3": -6470395862953408452, - "Data4": 9216698895464542380 + "Data1": -5928876074371489373, + "Data2": 7599250400035769581 }, "Flags": 0, "Kind": 0, @@ -104171,10 +101611,8 @@ }, { "__Checksum": { - "Data1": 7725343677797248752, - "Data2": 6947603396686306757, - "Data3": 2814485649918890957, - "Data4": -1903292399971712116 + "Data1": -5482866511028943483, + "Data2": -2533891857035589381 }, "Flags": 0, "Kind": 0, @@ -104204,10 +101642,8 @@ }, { "__Checksum": { - "Data1": -1168718083111992009, - "Data2": -5486670565549870794, - "Data3": -2901058085207558545, - "Data4": 1005870001110377766 + "Data1": 2656058165498654680, + "Data2": 6978138237056376812 }, "Flags": 0, "Kind": 0, @@ -104259,10 +101695,8 @@ }, { "__Checksum": { - "Data1": -2838921510008606569, - "Data2": -8286391302332551617, - "Data3": -2993314926900217292, - "Data4": -5495059625149357352 + "Data1": -1141260627196174089, + "Data2": 599894690223245847 }, "Flags": 0, "Kind": 0, @@ -104370,10 +101804,8 @@ }, { "__Checksum": { - "Data1": 4336460067386388618, - "Data2": -7394491538777293157, - "Data3": 6293337653416494916, - "Data4": 8980014810139312897 + "Data1": 8049905260415473618, + "Data2": -1651194488692154878 }, "Flags": 0, "Kind": 0, @@ -104536,10 +101968,8 @@ }, { "__Checksum": { - "Data1": -5984483191694212755, - "Data2": -2381925808998952597, - "Data3": 577748757874815860, - "Data4": 8384125349563598256 + "Data1": -2112243493311002710, + "Data2": 8445947849414406083 }, "Flags": 0, "Kind": 0, @@ -104613,10 +102043,8 @@ }, { "__Checksum": { - "Data1": 4161051771339483175, - "Data2": -3278147748134065065, - "Data3": -1185568281933072281, - "Data4": -2573877797757520084 + "Data1": 6320419251513211211, + "Data2": 5004214877967247307 }, "Flags": 0, "Kind": 0, @@ -104656,10 +102084,8 @@ }, { "__Checksum": { - "Data1": -1134674834430776573, - "Data2": -5060539950680608895, - "Data3": -142301121501020394, - "Data4": 937867696138588648 + "Data1": -2558335330301754577, + "Data2": -1049938961099715771 }, "Flags": 0, "Kind": 0, @@ -104837,10 +102263,8 @@ }, { "__Checksum": { - "Data1": -5791093930338730933, - "Data2": 751715332359122672, - "Data3": 8379944508135363834, - "Data4": 7411058185388880268 + "Data1": 1222231572147186802, + "Data2": 4860001890171955219 }, "Flags": 0, "Kind": 0, @@ -105216,10 +102640,8 @@ }, { "__Checksum": { - "Data1": -7168991628024048912, - "Data2": 1416046226230291146, - "Data3": -1816102848829641409, - "Data4": 3373598031077525849 + "Data1": -1478435428773117689, + "Data2": 5962388182847463323 }, "Flags": 0, "Kind": 0, @@ -105317,10 +102739,8 @@ }, { "__Checksum": { - "Data1": -8523142434026759336, - "Data2": -7581166895488988742, - "Data3": -325577880994220920, - "Data4": 6984036910160399376 + "Data1": 8706308072226285917, + "Data2": 9109217174649462153 }, "Flags": 0, "Kind": 0, @@ -105350,10 +102770,8 @@ }, { "__Checksum": { - "Data1": -451805407452667190, - "Data2": 5016471327957499403, - "Data3": 7371135098006771715, - "Data4": 5751933269797323358 + "Data1": 5636744456066877717, + "Data2": 1622102987052544422 }, "Flags": 0, "Kind": 0, @@ -105386,10 +102804,8 @@ }, { "__Checksum": { - "Data1": 6373423619526782620, - "Data2": 1989644979575796553, - "Data3": 8079016802992201187, - "Data4": -6644499930222599358 + "Data1": -3765862605527073926, + "Data2": -4288908705788228344 }, "Flags": 0, "Kind": 0, @@ -105422,10 +102838,8 @@ }, { "__Checksum": { - "Data1": 5634866664674229586, - "Data2": -7244993787540097413, - "Data3": 3086625706445014423, - "Data4": -5317647288566646794 + "Data1": 7806247550408752981, + "Data2": 8616761625862271525 }, "Flags": 0, "Kind": 0, @@ -105620,10 +103034,8 @@ }, { "__Checksum": { - "Data1": -6537289884399065489, - "Data2": 2339736641222273724, - "Data3": 8249457720792519845, - "Data4": 3678769729539062440 + "Data1": -1422950070721548406, + "Data2": 1520634707645541085 }, "Flags": 0, "Kind": 0, @@ -105733,10 +103145,8 @@ }, { "__Checksum": { - "Data1": -1614353054985841067, - "Data2": 3334857330168564043, - "Data3": 6761469209860568685, - "Data4": -1129178280780655356 + "Data1": 3523277175502885470, + "Data2": 5163505986882535445 }, "Flags": 0, "Kind": 0, @@ -105845,10 +103255,8 @@ }, { "__Checksum": { - "Data1": 2802918595209846532, - "Data2": 4984867790332099687, - "Data3": 6485779209597312164, - "Data4": 2537240218938488771 + "Data1": -6541127458860822075, + "Data2": 6934504327330110862 }, "Flags": 0, "Kind": 0, @@ -105881,10 +103289,8 @@ }, { "__Checksum": { - "Data1": 3780031576645444391, - "Data2": 1125820408347932797, - "Data3": 8574656049390328364, - "Data4": 6851714423963406257 + "Data1": 7190615449467541377, + "Data2": -2701605299109315497 }, "Flags": 0, "Kind": 0, @@ -105966,10 +103372,8 @@ }, { "__Checksum": { - "Data1": -5373190342295917003, - "Data2": 8215107361285748932, - "Data3": 2194370626520358858, - "Data4": -5190911683551730302 + "Data1": 1529605770194671699, + "Data2": 7125609324322175185 }, "Flags": 0, "Kind": 0, @@ -106016,10 +103420,8 @@ }, { "__Checksum": { - "Data1": -5847437702216760719, - "Data2": -3965327939259220931, - "Data3": 20404528810327064, - "Data4": 2070042097635013846 + "Data1": -404666963781102522, + "Data2": 8952410492837014331 }, "Flags": 0, "Kind": 0, @@ -106052,10 +103454,8 @@ }, { "__Checksum": { - "Data1": 2193511871249229039, - "Data2": -1754918640804748461, - "Data3": 8631275287076364584, - "Data4": -3814247377512954687 + "Data1": -5932982040478240971, + "Data2": -3025950059840369785 }, "Flags": 0, "Kind": 0, @@ -106088,10 +103488,8 @@ }, { "__Checksum": { - "Data1": -1171984894845914934, - "Data2": 7920793714258487603, - "Data3": 1033626228100413046, - "Data4": -8510248921572009354 + "Data1": -3231267016138586842, + "Data2": -4700711626206147815 }, "Flags": 0, "Kind": 0, @@ -106124,10 +103522,8 @@ }, { "__Checksum": { - "Data1": 5573913676626461633, - "Data2": -1925851546097680971, - "Data3": 1130771508771261006, - "Data4": -1373544191867284493 + "Data1": 7568556114519744905, + "Data2": -1408090446641363748 }, "Flags": 0, "Kind": 0, @@ -106181,10 +103577,8 @@ }, { "__Checksum": { - "Data1": -3076567358275536987, - "Data2": 154868687586119764, - "Data3": -4460242477882606458, - "Data4": 900456474602987096 + "Data1": 5131293811952736555, + "Data2": 2157116065872986605 }, "Flags": 0, "Kind": 0, @@ -106357,10 +103751,8 @@ }, { "__Checksum": { - "Data1": -7075589356061991801, - "Data2": -249052074312555562, - "Data3": -7651063938372098362, - "Data4": -7081966875965275173 + "Data1": 8824036220125637276, + "Data2": -1401712304559997740 }, "Flags": 0, "Kind": 0, @@ -106400,10 +103792,8 @@ }, { "__Checksum": { - "Data1": 4294238498180067264, - "Data2": 6888536353920857213, - "Data3": 3890376144794381232, - "Data4": -1635716565959957558 + "Data1": -8908024423759288219, + "Data2": -2290664197112985571 }, "Flags": 0, "Kind": 0, @@ -106433,10 +103823,8 @@ }, { "__Checksum": { - "Data1": -6537671294978651777, - "Data2": 8502744257501378530, - "Data3": -7065830861664193905, - "Data4": 4544356618118028836 + "Data1": 6850802821664080292, + "Data2": 7936883018388399556 }, "Flags": 0, "Kind": 0, @@ -106504,10 +103892,8 @@ }, { "__Checksum": { - "Data1": 7705693209066581697, - "Data2": -5977507060547191745, - "Data3": -4889003763285902937, - "Data4": 7203374625849196522 + "Data1": 7472861893156037167, + "Data2": -3109252054843395551 }, "Flags": 0, "Kind": 0, @@ -106537,10 +103923,8 @@ }, { "__Checksum": { - "Data1": -5381687497158937959, - "Data2": -6660068348998703589, - "Data3": 6033692235468348987, - "Data4": 8729829362721679322 + "Data1": -3918057490162299779, + "Data2": -5005285384754056476 }, "Flags": 0, "Kind": 0, @@ -106580,10 +103964,8 @@ }, { "__Checksum": { - "Data1": 6625765199198117602, - "Data2": 2655217281282863720, - "Data3": -6595634068535867695, - "Data4": -1068410532762153288 + "Data1": -3301356655555371654, + "Data2": 5654773832962402586 }, "Flags": 0, "Kind": 0, @@ -106613,10 +103995,8 @@ }, { "__Checksum": { - "Data1": 1492003261026686610, - "Data2": 718701805280430227, - "Data3": 232674111425584867, - "Data4": -6014866895202183985 + "Data1": -5294514079415509519, + "Data2": -348305182928743972 }, "Flags": 0, "Kind": 0, @@ -106691,10 +104071,8 @@ }, { "__Checksum": { - "Data1": 3785607655885503325, - "Data2": 207487176160624011, - "Data3": -3831353790589539055, - "Data4": 8693921633454241485 + "Data1": 4276562647994274699, + "Data2": -5975102364367632800 }, "Flags": 0, "Kind": 0, @@ -106724,10 +104102,8 @@ }, { "__Checksum": { - "Data1": -2996856512407580082, - "Data2": -5193526105079422530, - "Data3": -4847917035425056250, - "Data4": 429041388681260325 + "Data1": 2393003125719801074, + "Data2": -5873598256500294009 }, "Flags": 0, "Kind": 0, @@ -106767,10 +104143,8 @@ }, { "__Checksum": { - "Data1": 3485174770046445651, - "Data2": -2366005913157545239, - "Data3": -2804767278982677038, - "Data4": -5367014561164742533 + "Data1": 2090543653759356461, + "Data2": 9059098298378130367 }, "Flags": 0, "Kind": 0, @@ -106810,10 +104184,8 @@ }, { "__Checksum": { - "Data1": -6109118836485437411, - "Data2": 2738567767951483743, - "Data3": -5788366847891624143, - "Data4": -3103095833308233657 + "Data1": 188736178786788220, + "Data2": -4263101963579279508 }, "Flags": 0, "Kind": 0, @@ -106853,10 +104225,8 @@ }, { "__Checksum": { - "Data1": -2608370550844482759, - "Data2": -6222181298266741118, - "Data3": 1515557361406811514, - "Data4": -216431755442429820 + "Data1": 5587726139686844718, + "Data2": -319207173224806491 }, "Flags": 0, "Kind": 0, @@ -106896,10 +104266,8 @@ }, { "__Checksum": { - "Data1": 6736117339200862864, - "Data2": -7223256341811439219, - "Data3": 7906185888190877724, - "Data4": 8507690664922754484 + "Data1": -8096641265221165527, + "Data2": 383829414477940389 }, "Flags": 0, "Kind": 0, @@ -106939,10 +104307,8 @@ }, { "__Checksum": { - "Data1": -4896642504441246721, - "Data2": 4404315931294081386, - "Data3": 1912271170874857892, - "Data4": 6614448307752073093 + "Data1": -2303373056985901011, + "Data2": 9136154420040931763 }, "Flags": 0, "Kind": 0, @@ -107121,10 +104487,8 @@ }, { "__Checksum": { - "Data1": 7891611777075466262, - "Data2": -8312738297236828311, - "Data3": -4830774242660697557, - "Data4": -8361179693959884477 + "Data1": 7447572576346609948, + "Data2": -9014136404508185050 }, "Flags": 0, "Kind": 0, @@ -107154,10 +104518,8 @@ }, { "__Checksum": { - "Data1": 1578736989825808793, - "Data2": -5730074152344908104, - "Data3": 3293875507569644173, - "Data4": -7732105086306234922 + "Data1": 2939881751486069509, + "Data2": 8457295150061063549 }, "Flags": 0, "Kind": 0, @@ -107288,10 +104650,8 @@ }, { "__Checksum": { - "Data1": -2095875519872362364, - "Data2": -7515160112123073526, - "Data3": -8259576959312331772, - "Data4": 1983432360246538359 + "Data1": -6476345432519938280, + "Data2": -5467389395081515139 }, "Flags": 0, "Kind": 0, @@ -107345,10 +104705,8 @@ }, { "__Checksum": { - "Data1": -496028299842805838, - "Data2": -7634956689688617831, - "Data3": -5659118113148490665, - "Data4": -1987739476199846215 + "Data1": -5365949271119674517, + "Data2": 8226931590777891655 }, "Flags": 0, "Kind": 0, @@ -107378,10 +104736,8 @@ }, { "__Checksum": { - "Data1": 5218953421567976231, - "Data2": 5627669024872456668, - "Data3": -6246906300708850030, - "Data4": -9180416004012294306 + "Data1": -7604834377793455014, + "Data2": 3545162321941048080 }, "Flags": 0, "Kind": 0, @@ -107421,10 +104777,8 @@ }, { "__Checksum": { - "Data1": -8065239119448120018, - "Data2": 4403377694933279741, - "Data3": -5191119031206460732, - "Data4": 2900936585722796821 + "Data1": 2860764826007371429, + "Data2": 7313998036421201339 }, "Flags": 0, "Kind": 0, @@ -107454,10 +104808,8 @@ }, { "__Checksum": { - "Data1": -6087318753976377995, - "Data2": 1759307846223236088, - "Data3": -6255312607957856613, - "Data4": -2869371499629644861 + "Data1": 3353048068574100208, + "Data2": -8110367991812735164 }, "Flags": 0, "Kind": 0, @@ -107497,10 +104849,8 @@ }, { "__Checksum": { - "Data1": -7857836374657515802, - "Data2": -5706758493180914768, - "Data3": -5867777467501842089, - "Data4": -312137748757729171 + "Data1": -8437117646116466799, + "Data2": 508501538367554578 }, "Flags": 0, "Kind": 0, @@ -107602,10 +104952,8 @@ }, { "__Checksum": { - "Data1": 7178239143787754667, - "Data2": 1811554002821053632, - "Data3": -7586131863348192136, - "Data4": 2653590199740345456 + "Data1": 6611699168064050438, + "Data2": 275390815186114979 }, "Flags": 0, "Kind": 0, @@ -107635,10 +104983,8 @@ }, { "__Checksum": { - "Data1": 5730871103915130831, - "Data2": -522492048599919259, - "Data3": 1949809808806011893, - "Data4": 7967223083575923046 + "Data1": -5888352423256388186, + "Data2": 7889055883930161907 }, "Flags": 0, "Kind": 0, @@ -107963,10 +105309,8 @@ }, { "__Checksum": { - "Data1": 8388711414104586418, - "Data2": 7303216407191653464, - "Data3": -6050699946722865660, - "Data4": 4791491612257996281 + "Data1": -3420647095860516715, + "Data2": 5149321851717229915 }, "Flags": 0, "Kind": 0, @@ -108016,10 +105360,8 @@ }, { "__Checksum": { - "Data1": -2648216742469378289, - "Data2": 3954474722279848149, - "Data3": 4569365657219513516, - "Data4": 8295152184669254778 + "Data1": 1334188346915850463, + "Data2": -7184024980851372804 }, "Flags": 0, "Kind": 0, @@ -108071,10 +105413,8 @@ }, { "__Checksum": { - "Data1": -7811373971693421671, - "Data2": -51473591825569587, - "Data3": -8372832253404067454, - "Data4": 4877509268414302435 + "Data1": -8290878253078570843, + "Data2": -5593838783148217202 }, "Flags": 0, "Kind": 0, @@ -108119,10 +105459,8 @@ }, { "__Checksum": { - "Data1": -7826179356443599541, - "Data2": -6945441915313009115, - "Data3": 2884282909251825532, - "Data4": 7329269948807130261 + "Data1": -6213073715227663907, + "Data2": -1427887205517406686 }, "Flags": 0, "Kind": 0, @@ -108155,10 +105493,8 @@ }, { "__Checksum": { - "Data1": 5400611490460700638, - "Data2": -3420187361284295506, - "Data3": -5635539480569551386, - "Data4": -3893802599112163081 + "Data1": -450240532838901929, + "Data2": -4418628616402687361 }, "Flags": 0, "Kind": 0, @@ -108260,10 +105596,8 @@ }, { "__Checksum": { - "Data1": -570408648834440797, - "Data2": 5839213721325508253, - "Data3": -1353208597205361692, - "Data4": 8945096695893933629 + "Data1": 5698246438856955692, + "Data2": 4245318413418068337 }, "Flags": 0, "Kind": 0, @@ -108359,10 +105693,8 @@ }, { "__Checksum": { - "Data1": -8749464085194040608, - "Data2": -2973695944770122874, - "Data3": -6854851781103734885, - "Data4": 3752322786179957225 + "Data1": 2109870182382647779, + "Data2": -5110691914690543902 }, "Flags": 0, "Kind": 0, @@ -108392,10 +105724,8 @@ }, { "__Checksum": { - "Data1": -6577333609083947316, - "Data2": -4423260850924476930, - "Data3": 8158038130437898891, - "Data4": -676740387991143279 + "Data1": 1910838445028410540, + "Data2": 4377268962430710701 }, "Flags": 0, "Kind": 0, @@ -108503,10 +105833,8 @@ }, { "__Checksum": { - "Data1": 5811822130812387091, - "Data2": 8065357600705570849, - "Data3": -6456237317736641235, - "Data4": -4273659709975406440 + "Data1": 5044506580386641008, + "Data2": 6556564974513138123 }, "Flags": 0, "Kind": 0, @@ -108581,10 +105909,8 @@ }, { "__Checksum": { - "Data1": 5640802821573054488, - "Data2": -52756016518905719, - "Data3": 5449285194605205317, - "Data4": -2830493626311222798 + "Data1": -5470865150823297346, + "Data2": 4593089801321822492 }, "Flags": 0, "Kind": 0, @@ -108645,10 +105971,8 @@ }, { "__Checksum": { - "Data1": -4014757085934532436, - "Data2": 3505732978945231012, - "Data3": 116507735273383994, - "Data4": -6961400947566023712 + "Data1": -7772254407929717356, + "Data2": -3372137365859428789 }, "Flags": 0, "Kind": 0, @@ -108695,10 +106019,8 @@ }, { "__Checksum": { - "Data1": 4252709711268492626, - "Data2": 2963619661236522791, - "Data3": 5119829215169610957, - "Data4": 1678231904247259316 + "Data1": 5527799072985591811, + "Data2": 7102166474141964578 }, "Flags": 0, "Kind": 0, @@ -108752,10 +106074,8 @@ }, { "__Checksum": { - "Data1": -3454685169624006751, - "Data2": 2896105437383300444, - "Data3": -1811582324142602900, - "Data4": 2453733074242179995 + "Data1": -4939177979875555069, + "Data2": 8338275713979203931 }, "Flags": 0, "Kind": 0, @@ -108842,10 +106162,8 @@ }, { "__Checksum": { - "Data1": 5425848135691609351, - "Data2": -8833433652291456354, - "Data3": 9175383009655687425, - "Data4": -1509943706480211806 + "Data1": -8463492621350438857, + "Data2": -412829043790409375 }, "Flags": 0, "Kind": 0, @@ -108892,10 +106210,8 @@ }, { "__Checksum": { - "Data1": 947113237189566646, - "Data2": 4598695548655455066, - "Data3": 284604180431889181, - "Data4": -5059325354125240819 + "Data1": -5325337025718781495, + "Data2": -1044338132678283924 }, "Flags": 0, "Kind": 0, @@ -108956,10 +106272,8 @@ }, { "__Checksum": { - "Data1": -6991279822832689905, - "Data2": -5948794591726718989, - "Data3": 8308803133669512692, - "Data4": -7855741493484280412 + "Data1": 579123457118366817, + "Data2": 8126762402359857631 }, "Flags": 0, "Kind": 0, @@ -109013,10 +106327,8 @@ }, { "__Checksum": { - "Data1": 741495501874029799, - "Data2": -6533250217186091869, - "Data3": 5252256343850961232, - "Data4": 2356516858259567536 + "Data1": 2776156796901150058, + "Data2": 3783557485063469302 }, "Flags": 0, "Kind": 0, @@ -109070,10 +106382,8 @@ }, { "__Checksum": { - "Data1": 857468913363139058, - "Data2": 5023416672842477323, - "Data3": 7159327350748968740, - "Data4": 4219990335811548800 + "Data1": 237385919130854806, + "Data2": 289268123594513569 }, "Flags": 0, "Kind": 0, @@ -109205,10 +106515,8 @@ }, { "__Checksum": { - "Data1": 1475024101079881735, - "Data2": 2077793230178679620, - "Data3": -262166553823506356, - "Data4": 4809815927082713399 + "Data1": -1030486679460231811, + "Data2": -864470194908818353 }, "Flags": 0, "Kind": 0, @@ -109262,10 +106570,8 @@ }, { "__Checksum": { - "Data1": -4909359933754960645, - "Data2": 490354282526312112, - "Data3": 6381692697309358753, - "Data4": 1869610288596034754 + "Data1": -3373246681783892103, + "Data2": 1510345445595061996 }, "Flags": 0, "Kind": 0, @@ -109333,10 +106639,8 @@ }, { "__Checksum": { - "Data1": -670850831685871072, - "Data2": -961204738712237943, - "Data3": 9004845551075613246, - "Data4": -7877489153144098761 + "Data1": -8982865699000167970, + "Data2": -1905980174429194683 }, "Flags": 0, "Kind": 0, @@ -109404,10 +106708,8 @@ }, { "__Checksum": { - "Data1": 2574388571224172358, - "Data2": 2918235616140447240, - "Data3": 1324961624948730760, - "Data4": -1094274793802174709 + "Data1": 7980325625235964652, + "Data2": 7174086729676843498 }, "Flags": 0, "Kind": 0, @@ -109475,10 +106777,8 @@ }, { "__Checksum": { - "Data1": -2551266172679651837, - "Data2": -6305539410636729274, - "Data3": 541826542405099492, - "Data4": -1720102028380965959 + "Data1": -2228568820564253192, + "Data2": -6297902310841275415 }, "Flags": 0, "Kind": 0, @@ -109546,10 +106846,8 @@ }, { "__Checksum": { - "Data1": -8442438805483827575, - "Data2": 991758935168643406, - "Data3": 6412613392878734666, - "Data4": 7664087021715868951 + "Data1": -6124229529341539904, + "Data2": -4462037442131864720 }, "Flags": 0, "Kind": 0, @@ -109589,10 +106887,8 @@ }, { "__Checksum": { - "Data1": -481919019671122359, - "Data2": -9060103707753964386, - "Data3": -6849150439300531311, - "Data4": 4830924398893524506 + "Data1": -4697605510388191812, + "Data2": 3942594230926294718 }, "Flags": 0, "Kind": 0, @@ -109653,10 +106949,8 @@ }, { "__Checksum": { - "Data1": -4032706184754698527, - "Data2": 2361777921096951036, - "Data3": -2050642342453039724, - "Data4": -7402628050608075737 + "Data1": 4812559856719374633, + "Data2": -1809586538457174406 }, "Flags": 0, "Kind": 0, @@ -109703,10 +106997,8 @@ }, { "__Checksum": { - "Data1": 7455503039846466763, - "Data2": -8294056845547730611, - "Data3": 3186840773400976449, - "Data4": -1619812910664164154 + "Data1": 1465374346441001504, + "Data2": -2784110825505840141 }, "Flags": 0, "Kind": 0, @@ -109802,10 +107094,8 @@ }, { "__Checksum": { - "Data1": 4343636647506293268, - "Data2": -655088330699348618, - "Data3": 1585791662252732299, - "Data4": -4470394251609457730 + "Data1": 8805657677803322059, + "Data2": 4168512181809892474 }, "Flags": 0, "Kind": 0, @@ -109852,10 +107142,8 @@ }, { "__Checksum": { - "Data1": -1623310634880497518, - "Data2": 877185481522151613, - "Data3": 3353946528939882249, - "Data4": 2079931261289267659 + "Data1": 6126324775271747804, + "Data2": 4123503830036064937 }, "Flags": 0, "Kind": 0, @@ -109905,10 +107193,8 @@ }, { "__Checksum": { - "Data1": 4409683461890199997, - "Data2": -3590655440997132497, - "Data3": 8733369656325283347, - "Data4": 2691055486650026387 + "Data1": 435308302644146252, + "Data2": -2520600152328410538 }, "Flags": 0, "Kind": 0, @@ -109962,10 +107248,8 @@ }, { "__Checksum": { - "Data1": 7659782003192453710, - "Data2": 8552036824839520590, - "Data3": 9190034610359172389, - "Data4": -2989939129285387435 + "Data1": 7072921324004033463, + "Data2": -4798008917926002175 }, "Flags": 0, "Kind": 0, @@ -109995,10 +107279,8 @@ }, { "__Checksum": { - "Data1": 3387351584162715041, - "Data2": -3268948093069851465, - "Data3": -591838266700888182, - "Data4": 5835469594593099522 + "Data1": 8340702868863040223, + "Data2": -4534367933049979080 }, "Flags": 0, "Kind": 0, @@ -110200,10 +107482,8 @@ }, { "__Checksum": { - "Data1": 5139284939684209405, - "Data2": 4376105342520019956, - "Data3": -8496729327507740667, - "Data4": -449327505388366848 + "Data1": 5132133934385405736, + "Data2": 8018594042524083488 }, "Flags": 0, "Kind": 0, @@ -110250,10 +107530,8 @@ }, { "__Checksum": { - "Data1": 7616875346120700823, - "Data2": -6843863361671215350, - "Data3": 7942860253196125449, - "Data4": -4695436122791317544 + "Data1": 8588908343437490462, + "Data2": 7014390027661349961 }, "Flags": 0, "Kind": 0, @@ -110307,10 +107585,8 @@ }, { "__Checksum": { - "Data1": 8448418752073945474, - "Data2": 2150889701893335225, - "Data3": 4436009425638080787, - "Data4": 7768882431669060318 + "Data1": 2360207463042279118, + "Data2": -5718164177041873742 }, "Flags": 0, "Kind": 0, @@ -110364,10 +107640,8 @@ }, { "__Checksum": { - "Data1": 598681340737094687, - "Data2": 5262665402772621229, - "Data3": 612692867097540468, - "Data4": 3479186586660392605 + "Data1": 152907287860952116, + "Data2": -952034147060154623 }, "Flags": 0, "Kind": 0, @@ -110459,10 +107733,8 @@ }, { "__Checksum": { - "Data1": -1061022418412991585, - "Data2": -4278410224578509727, - "Data3": 5331679558003099981, - "Data4": -7591582239764941950 + "Data1": -6594169508355990147, + "Data2": 9052815142620596648 }, "Flags": 0, "Kind": 0, @@ -110516,10 +107788,8 @@ }, { "__Checksum": { - "Data1": -5042774313779515151, - "Data2": 4826904996316612987, - "Data3": 490542727687841044, - "Data4": 2253924916762659832 + "Data1": 2698005634124000635, + "Data2": -3627955976318921757 }, "Flags": 0, "Kind": 0, @@ -110566,10 +107836,8 @@ }, { "__Checksum": { - "Data1": -6079779480119954568, - "Data2": -7651024005587762875, - "Data3": 916692258727386374, - "Data4": 450445795039945361 + "Data1": -8365281401356682267, + "Data2": 973417285975546489 }, "Flags": 0, "Kind": 0, @@ -110623,10 +107891,8 @@ }, { "__Checksum": { - "Data1": -3365715392549174826, - "Data2": -2941666969145396651, - "Data3": 5501558472909502720, - "Data4": -6238100182331184347 + "Data1": -8219791770706039211, + "Data2": -5740953097571473772 }, "Flags": 0, "Kind": 0, @@ -110680,10 +107946,8 @@ }, { "__Checksum": { - "Data1": -9075689060447433749, - "Data2": -5916519830305954699, - "Data3": -2982854146957454639, - "Data4": 3780254715862374038 + "Data1": -7202718123472559343, + "Data2": -4788786748166136072 }, "Flags": 0, "Kind": 0, @@ -110752,10 +108016,8 @@ }, { "__Checksum": { - "Data1": 6620983937953656574, - "Data2": -1913918543800779491, - "Data3": 9130525567757944308, - "Data4": 6031968978206342466 + "Data1": -4998094339811312008, + "Data2": -1032441796857679907 }, "Flags": 0, "Kind": 0, @@ -110802,10 +108064,8 @@ }, { "__Checksum": { - "Data1": -6411527437647793421, - "Data2": 975587015575255587, - "Data3": 3859733976640634631, - "Data4": -6920577280451676222 + "Data1": 4987926415939864379, + "Data2": -1177647120502052710 }, "Flags": 0, "Kind": 0, @@ -110859,10 +108119,8 @@ }, { "__Checksum": { - "Data1": 9124331330708946343, - "Data2": 4105124586005237566, - "Data3": 6119611855008233278, - "Data4": 771889018596568783 + "Data1": -213564224776003147, + "Data2": 7690532018485756864 }, "Flags": 0, "Kind": 0, @@ -110942,10 +108200,8 @@ }, { "__Checksum": { - "Data1": 6243774340848503349, - "Data2": 3654756522420107600, - "Data3": 3794252407152071665, - "Data4": 6553879924923268916 + "Data1": -8169865439155068363, + "Data2": 534114548678769534 }, "Flags": 0, "Kind": 0, @@ -110992,10 +108248,8 @@ }, { "__Checksum": { - "Data1": -7135683376075427654, - "Data2": -2622372390627496036, - "Data3": -3263898872815471459, - "Data4": 2140637250123655702 + "Data1": 7666227803666412656, + "Data2": 177910978116091710 }, "Flags": 0, "Kind": 0, @@ -111042,10 +108296,8 @@ }, { "__Checksum": { - "Data1": 5829125361455193903, - "Data2": -980044943912662686, - "Data3": 8053888739942126442, - "Data4": -2313115469673325059 + "Data1": -4210119139123110523, + "Data2": 5724008335988073831 }, "Flags": 0, "Kind": 0, @@ -111138,10 +108390,8 @@ }, { "__Checksum": { - "Data1": -1088094950782012449, - "Data2": -2854750545008652507, - "Data3": -1627932732989013552, - "Data4": -3006012944696629073 + "Data1": 5445819067546795431, + "Data2": 7093484044624196736 }, "Flags": 0, "Kind": 0, @@ -111518,10 +108768,8 @@ }, { "__Checksum": { - "Data1": 9195640589667791003, - "Data2": -3538345313143786708, - "Data3": -6454637513114079801, - "Data4": -8778204711005528135 + "Data1": 5506013560827696568, + "Data2": -7705946115373302034 }, "Flags": 0, "Kind": 0, @@ -111567,10 +108815,8 @@ }, { "__Checksum": { - "Data1": 783246010902186069, - "Data2": 6634449503625407387, - "Data3": 6295313575962931472, - "Data4": 1623638459880098650 + "Data1": 6545596264075333671, + "Data2": 1471691653763583559 }, "Flags": 0, "Kind": 0, @@ -111697,10 +108943,8 @@ }, { "__Checksum": { - "Data1": 6777664319068885921, - "Data2": 5610638372392800241, - "Data3": -7757191415674909930, - "Data4": -6713233224227906122 + "Data1": -3946668826642050542, + "Data2": 5128757721344783842 }, "Flags": 0, "Kind": 0, @@ -111747,10 +108991,8 @@ }, { "__Checksum": { - "Data1": -2591520137371115781, - "Data2": -8760085842283553209, - "Data3": -8345388471666028048, - "Data4": -4623460887778704176 + "Data1": 5840361579377208665, + "Data2": -7639274072757300969 }, "Flags": 0, "Kind": 0, @@ -111797,10 +109039,8 @@ }, { "__Checksum": { - "Data1": 7157656809828352558, - "Data2": -216130379412681087, - "Data3": -5536866363399924799, - "Data4": -7242093521486819309 + "Data1": -283158170504232657, + "Data2": -4300429034974550419 }, "Flags": 0, "Kind": 0, @@ -111845,10 +109085,8 @@ }, { "__Checksum": { - "Data1": -2241756137801854565, - "Data2": 7271868528899127637, - "Data3": -4786576865981678491, - "Data4": 3425553653636025880 + "Data1": 3903498901175385306, + "Data2": -5584281217026526121 }, "Flags": 0, "Kind": 0, @@ -111872,10 +109110,8 @@ }, { "__Checksum": { - "Data1": -6977192959057145502, - "Data2": 4996008852559949608, - "Data3": 1614204648066942687, - "Data4": -3750942193738429812 + "Data1": -4903725968985237797, + "Data2": -8104292559503303520 }, "Flags": 0, "Kind": 0, @@ -111906,10 +109142,8 @@ }, { "__Checksum": { - "Data1": 1412185854149866380, - "Data2": -7731889789922808509, - "Data3": 5599966680971007587, - "Data4": 7595825897651867412 + "Data1": 5078528077915386541, + "Data2": -2094999457038832619 }, "Flags": 0, "Kind": 0, @@ -112102,10 +109336,8 @@ }, { "__Checksum": { - "Data1": -4448536848835733611, - "Data2": 4138512975928906124, - "Data3": 4592169939457369770, - "Data4": 1947885668455158194 + "Data1": -8072778864979458665, + "Data2": -1593823013408035308 }, "Flags": 0, "Kind": 0, @@ -112145,10 +109377,8 @@ }, { "__Checksum": { - "Data1": -8840689525288475667, - "Data2": -6920579585305772251, - "Data3": -7898366205610160636, - "Data4": 2067409001904697749 + "Data1": 8859354254895669413, + "Data2": 8057628910997187273 }, "Flags": 0, "Kind": 0, @@ -112291,10 +109521,8 @@ }, { "__Checksum": { - "Data1": -3893384707083736666, - "Data2": 4392710547575142816, - "Data3": 4522436571428376778, - "Data4": -4952664003211421636 + "Data1": 8289449300663749323, + "Data2": -930023040618680062 }, "Flags": 0, "Kind": 0, @@ -112362,10 +109590,8 @@ }, { "__Checksum": { - "Data1": 5114371898709562093, - "Data2": -6498407570511341410, - "Data3": -4965998181120416314, - "Data4": -4085276829926156854 + "Data1": -7243042431905208987, + "Data2": 8045159260513344904 }, "Flags": 0, "Kind": 0, @@ -112395,10 +109621,8 @@ }, { "__Checksum": { - "Data1": 2783896034495235453, - "Data2": 3598389084990104478, - "Data3": -8058560253932008221, - "Data4": -7537808556409158362 + "Data1": 5707177240085246879, + "Data2": -1028352935034285031 }, "Flags": 0, "Kind": 0, @@ -112466,10 +109690,8 @@ }, { "__Checksum": { - "Data1": -944891854326790465, - "Data2": -3774884138711172150, - "Data3": -8357037022219929954, - "Data4": 7463886430632650292 + "Data1": 6439097681649702730, + "Data2": -1213711676497675987 }, "Flags": 0, "Kind": 0, @@ -112499,10 +109721,8 @@ }, { "__Checksum": { - "Data1": -6084403106896952735, - "Data2": -6776244295748703764, - "Data3": -877703207289692923, - "Data4": 4315388637569906571 + "Data1": 2138650676927230765, + "Data2": -1683410603491908253 }, "Flags": 0, "Kind": 0, @@ -112591,10 +109811,8 @@ }, { "__Checksum": { - "Data1": 3589978296116307996, - "Data2": 393559784017312509, - "Data3": -2594613352943528457, - "Data4": -2578180829794000459 + "Data1": 1420603255543271862, + "Data2": 1165097714407404374 }, "Flags": 0, "Kind": 0, @@ -112634,10 +109852,8 @@ }, { "__Checksum": { - "Data1": 863069165485493087, - "Data2": -6547744139760514436, - "Data3": 5213476075215134562, - "Data4": -8302274044619602805 + "Data1": -1455338807768564804, + "Data2": 6235905817609167844 }, "Flags": 0, "Kind": 0, @@ -112688,10 +109904,8 @@ }, { "__Checksum": { - "Data1": -7244942165697822014, - "Data2": -832738125529518230, - "Data3": 1348766871303819862, - "Data4": -8771597552875748014 + "Data1": -8444003653431335282, + "Data2": 7586628127872649116 }, "Flags": 0, "Kind": 0, @@ -112766,10 +109980,8 @@ }, { "__Checksum": { - "Data1": 4234991691023576738, - "Data2": 5263013019828959116, - "Data3": -7842032383035289867, - "Data4": 5145951471234518948 + "Data1": 3385030191403378674, + "Data2": 262423670613195804 }, "Flags": 0, "Kind": 0, @@ -112799,10 +110011,8 @@ }, { "__Checksum": { - "Data1": -306164517852711442, - "Data2": -1039896795527022865, - "Data3": 4471652606536862059, - "Data4": 3029630014958783254 + "Data1": -3202845686512002392, + "Data2": 11792785464656610 }, "Flags": 0, "Kind": 0, @@ -112875,10 +110085,8 @@ }, { "__Checksum": { - "Data1": 952201844640568547, - "Data2": -7026284050625902607, - "Data3": 7142256380371173184, - "Data4": 8689523299835365186 + "Data1": 7630852732297755720, + "Data2": 6725672395488311566 }, "Flags": 0, "Kind": 0, @@ -113044,10 +110252,8 @@ }, { "__Checksum": { - "Data1": 6190885829187419819, - "Data2": -2513943499368401273, - "Data3": -1794886027881969548, - "Data4": -6564473290760913904 + "Data1": 6735612507266253295, + "Data2": 1633141076480015956 }, "Flags": 0, "Kind": 0, @@ -113122,10 +110328,8 @@ }, { "__Checksum": { - "Data1": 9156969188096158821, - "Data2": -8234416237247278149, - "Data3": -7681832024751431232, - "Data4": 5684538472602834172 + "Data1": 3788100314240062347, + "Data2": -6694826325067918631 }, "Flags": 0, "Kind": 0, @@ -113155,10 +110359,8 @@ }, { "__Checksum": { - "Data1": 231546689145090562, - "Data2": -1521054916011852910, - "Data3": -9149424761150996074, - "Data4": 5774282220159968457 + "Data1": 2833213835505759258, + "Data2": -3500168282131518458 }, "Flags": 0, "Kind": 0, @@ -113254,10 +110456,8 @@ }, { "__Checksum": { - "Data1": -1643611272151246611, - "Data2": -8065766504079763293, - "Data3": -1060499981953458807, - "Data4": -2771619169237751158 + "Data1": 281347468725030851, + "Data2": 3525457390547088836 }, "Flags": 0, "Kind": 0, @@ -113353,10 +110553,8 @@ }, { "__Checksum": { - "Data1": 742458277226671100, - "Data2": -618111745738052697, - "Data3": -2951355918792121097, - "Data4": 6448188447057210874 + "Data1": -721366392418217462, + "Data2": -2209252326160607720 }, "Flags": 0, "Kind": 0, @@ -113386,10 +110584,8 @@ }, { "__Checksum": { - "Data1": -8198147591925323982, - "Data2": -3330477460574495988, - "Data3": 2741862313467004810, - "Data4": -6321170321164879193 + "Data1": 7192760826553705010, + "Data2": -393709855797628165 }, "Flags": 0, "Kind": 0, @@ -113712,10 +110908,8 @@ }, { "__Checksum": { - "Data1": 4782163439477982009, - "Data2": -302388594056133397, - "Data3": 615084223475645663, - "Data4": -6239614851916119829 + "Data1": 8932073502537197295, + "Data2": 2569440879989900700 }, "Flags": 0, "Kind": 0, @@ -113897,10 +111091,8 @@ }, { "__Checksum": { - "Data1": 6240450193633124491, - "Data2": 7577646630012601452, - "Data3": 8818436363946010557, - "Data4": -6658782348175654027 + "Data1": 5305591553112386794, + "Data2": 6754371388225777700 }, "Flags": 0, "Kind": 0, @@ -113930,10 +111122,8 @@ }, { "__Checksum": { - "Data1": -6766792276461526503, - "Data2": 6759314591098442290, - "Data3": 48691154967415785, - "Data4": 7615876651381608867 + "Data1": -3382082028364440085, + "Data2": -1351830247968732915 }, "Flags": 0, "Kind": 0, @@ -113973,10 +111163,8 @@ }, { "__Checksum": { - "Data1": 4355778481298794608, - "Data2": -5684125402062824684, - "Data3": -4579545533879804007, - "Data4": 2974595205503873141 + "Data1": -8571176402535135618, + "Data2": -6649628470672866647 }, "Flags": 0, "Kind": 0, @@ -114029,10 +111217,8 @@ }, { "__Checksum": { - "Data1": -2568202658990039317, - "Data2": 1155590609131044666, - "Data3": -7378448161955530075, - "Data4": -6087059594112231107 + "Data1": -262327925389404479, + "Data2": -4103680495487739410 }, "Flags": 0, "Kind": 0, @@ -114201,10 +111387,8 @@ }, { "__Checksum": { - "Data1": -515471250814348360, - "Data2": -5528727766296595578, - "Data3": 2881701201978269484, - "Data4": 8980670115910215502 + "Data1": -1806241203256796359, + "Data2": -4113370512648673859 }, "Flags": 0, "Kind": 0, @@ -114257,10 +111441,8 @@ }, { "__Checksum": { - "Data1": 9206922593471829676, - "Data2": 5572792220347396388, - "Data3": 2455317645222493927, - "Data4": -8602817304271507630 + "Data1": -6665798557814022755, + "Data2": 226136763606751446 }, "Flags": 0, "Kind": 0, @@ -114389,10 +111571,8 @@ }, { "__Checksum": { - "Data1": 7090458880487196779, - "Data2": 2536731522836828485, - "Data3": -8827817919728419401, - "Data4": -4387320815339562473 + "Data1": 8173512946195432375, + "Data2": 8172044551273901667 }, "Flags": 0, "Kind": 0, @@ -114453,10 +111633,8 @@ }, { "__Checksum": { - "Data1": 3809935978875465689, - "Data2": 6536054917035367263, - "Data3": -5713030166226905325, - "Data4": -8257213542977496433 + "Data1": 688487429159640472, + "Data2": -1468015882033956800 }, "Flags": 0, "Kind": 0, @@ -114531,10 +111709,8 @@ }, { "__Checksum": { - "Data1": 102261352989700091, - "Data2": 5863813728983032218, - "Data3": -2235569472356388838, - "Data4": 5330569342821248810 + "Data1": 7017921667482466886, + "Data2": 1585025173415965420 }, "Flags": 0, "Kind": 0, @@ -114564,10 +111740,8 @@ }, { "__Checksum": { - "Data1": -593368132127871835, - "Data2": 4517248199409122035, - "Data3": 748638944747906503, - "Data4": -745322424253033607 + "Data1": 892482807149845674, + "Data2": -2095668763348837402 }, "Flags": 0, "Kind": 0, @@ -114607,10 +111781,8 @@ }, { "__Checksum": { - "Data1": -210690359520354669, - "Data2": 6848177449096090798, - "Data3": -6390687382892900191, - "Data4": 1218261100512381660 + "Data1": -2602904123909241171, + "Data2": -2976490205852648917 }, "Flags": 0, "Kind": 0, @@ -114744,10 +111916,8 @@ }, { "__Checksum": { - "Data1": 9085773908936248358, - "Data2": 2384255638769468472, - "Data3": -3860154280587635522, - "Data4": 7097178751536976050 + "Data1": 6567865068356440144, + "Data2": 2366644294605415172 }, "Flags": 0, "Kind": 0, @@ -114808,10 +111978,8 @@ }, { "__Checksum": { - "Data1": -8260229969855097330, - "Data2": -518436508247870994, - "Data3": 9008670252888697839, - "Data4": -3125870293174213999 + "Data1": -2562151227069686523, + "Data2": -7989790813658435299 }, "Flags": 0, "Kind": 0, @@ -114846,10 +112014,8 @@ }, { "__Checksum": { - "Data1": -1741509115117638294, - "Data2": -5589278090892227882, - "Data3": -2487573005490030584, - "Data4": 6901695981712847780 + "Data1": 6995745161958292727, + "Data2": -1671912062378646523 }, "Flags": 0, "Kind": 0, @@ -114930,10 +112096,8 @@ }, { "__Checksum": { - "Data1": -2379722745872955281, - "Data2": 7803447224935342470, - "Data3": 6957286529033880263, - "Data4": 5811655066760502142 + "Data1": -8684710151600010726, + "Data2": -7401098075341378286 }, "Flags": 0, "Kind": 0, @@ -114973,10 +112137,8 @@ }, { "__Checksum": { - "Data1": 10227924455806956, - "Data2": -5797372421140553003, - "Data3": 3615978776105110681, - "Data4": -2181616564164753634 + "Data1": -2687445293805403565, + "Data2": -5587898213758393228 }, "Flags": 0, "Kind": 0, @@ -115011,10 +112173,8 @@ }, { "__Checksum": { - "Data1": -6502002260366598250, - "Data2": 6290564072982527529, - "Data3": 5543964362348192636, - "Data4": -5748450359094345759 + "Data1": 3556802564770782688, + "Data2": -6342495656208943563 }, "Flags": 0, "Kind": 0, @@ -115165,10 +112325,8 @@ }, { "__Checksum": { - "Data1": -2298527977122457371, - "Data2": 1542362339419216278, - "Data3": 2464741469592571060, - "Data4": -3550816859304116557 + "Data1": 2146912325186197753, + "Data2": 5129216679216358192 }, "Flags": 0, "Kind": 0, @@ -115416,10 +112574,8 @@ }, { "__Checksum": { - "Data1": 1995472397332089316, - "Data2": -7893454610420393887, - "Data3": -5877109159693129164, - "Data4": -5962524136434491792 + "Data1": -2159374832426154224, + "Data2": -4766015666953503793 }, "Flags": 0, "Kind": 0, @@ -115466,10 +112622,8 @@ }, { "__Checksum": { - "Data1": 5062104187104131173, - "Data2": -8795300153436741217, - "Data3": 451034179702845683, - "Data4": 3650967356321586809 + "Data1": 2106638746666597342, + "Data2": 272801441082481264 }, "Flags": 0, "Kind": 0, @@ -115551,10 +112705,8 @@ }, { "__Checksum": { - "Data1": 1530161073001790496, - "Data2": -5877368021738694583, - "Data3": 3972173025747579922, - "Data4": -7189495401382591600 + "Data1": 5941886177172801447, + "Data2": 5079935389310916601 }, "Flags": 0, "Kind": 0, @@ -115629,10 +112781,8 @@ }, { "__Checksum": { - "Data1": -6106564977228241165, - "Data2": -5908438207033260072, - "Data3": -8975505673110761240, - "Data4": -6069077260973169172 + "Data1": 4663358846088898232, + "Data2": -8322956532853940559 }, "Flags": 0, "Kind": 0, @@ -115685,10 +112835,8 @@ }, { "__Checksum": { - "Data1": 8328873668574223917, - "Data2": 8854336518655205758, - "Data3": 2135771141288515587, - "Data4": 6408732645109712533 + "Data1": -8983867347038642950, + "Data2": -8844570692471095199 }, "Flags": 0, "Kind": 0, @@ -115865,10 +113013,8 @@ }, { "__Checksum": { - "Data1": -5447120628363132284, - "Data2": 6728299460237991061, - "Data3": 4882169995242226149, - "Data4": 2282753838878784018 + "Data1": -2012280253193176647, + "Data2": 1958874019535393768 }, "Flags": 0, "Kind": 0, @@ -116007,10 +113153,8 @@ }, { "__Checksum": { - "Data1": -5584662352397153921, - "Data2": -7820868501842816366, - "Data3": -2605385350847544524, - "Data4": 92898407967175674 + "Data1": -3441263047186260277, + "Data2": -5265297538272309623 }, "Flags": 0, "Kind": 0, @@ -116040,10 +113184,8 @@ }, { "__Checksum": { - "Data1": 6795807472080942879, - "Data2": 7353330522909965776, - "Data3": -6897966846198870771, - "Data4": 3903198775246906792 + "Data1": 1413947333345784446, + "Data2": -7726177148181415439 }, "Flags": 0, "Kind": 0, @@ -116133,10 +113275,8 @@ }, { "__Checksum": { - "Data1": -6457639101544789409, - "Data2": 8178770962198407090, - "Data3": -3859807439425541677, - "Data4": 6388681479585416396 + "Data1": -8123171144021859602, + "Data2": 7322991622991879282 }, "Flags": 0, "Kind": 0, @@ -116166,10 +113306,8 @@ }, { "__Checksum": { - "Data1": 5137921716318505582, - "Data2": 4681991371449230287, - "Data3": 1219558203173692897, - "Data4": -8146483497155959984 + "Data1": -1468550122356787881, + "Data2": -8754036630695064334 }, "Flags": 0, "Kind": 0, @@ -116397,10 +113535,8 @@ }, { "__Checksum": { - "Data1": -5778700698314740595, - "Data2": -2870130208536267173, - "Data3": 2241062030640312334, - "Data4": 377417914648766999 + "Data1": -864192222484151908, + "Data2": 4502425529420487836 }, "Flags": 0, "Kind": 0, @@ -116430,10 +113566,8 @@ }, { "__Checksum": { - "Data1": -6298109744246260071, - "Data2": -2261668864149351459, - "Data3": -7830157629620933633, - "Data4": -8101600569275599001 + "Data1": -8904320069032996192, + "Data2": -949846640504522142 }, "Flags": 0, "Kind": 0, @@ -116549,10 +113683,8 @@ }, { "__Checksum": { - "Data1": -3048583527832300350, - "Data2": -6224419332143389380, - "Data3": -3120041803618495457, - "Data4": -5381780661270562807 + "Data1": 5098624072292885845, + "Data2": 8291854839696608401 }, "Flags": 0, "Kind": 0, @@ -116599,10 +113731,8 @@ }, { "__Checksum": { - "Data1": 5642429249913841937, - "Data2": 6923955049922167242, - "Data3": 2883301843794737539, - "Data4": 8094119822474435167 + "Data1": -3793602372205339495, + "Data2": -747429432928170016 }, "Flags": 0, "Kind": 0, @@ -116649,10 +113779,8 @@ }, { "__Checksum": { - "Data1": -7089614135904488812, - "Data2": 5107105294574846332, - "Data3": -5837065225554326911, - "Data4": 7920301082054731352 + "Data1": -7807069510841702595, + "Data2": 8569425220971357576 }, "Flags": 0, "Kind": 0, @@ -116703,10 +113831,8 @@ }, { "__Checksum": { - "Data1": -5012293591249068615, - "Data2": 7031033410375209441, - "Data3": 2984667442970190223, - "Data4": -6084047600243863729 + "Data1": -4780304835206555856, + "Data2": -8526324981007749982 }, "Flags": 0, "Kind": 0, @@ -116906,10 +114032,8 @@ }, { "__Checksum": { - "Data1": 8064810988815604843, - "Data2": 4643088454583255938, - "Data3": -78346063039213504, - "Data4": -3185633822544628248 + "Data1": 1160154608327062426, + "Data2": 8399145065308774311 }, "Flags": 0, "Kind": 0, @@ -116970,10 +114094,8 @@ }, { "__Checksum": { - "Data1": -2209355770950460113, - "Data2": -5836941623286799961, - "Data3": -2302226869165818837, - "Data4": 6345775989810875745 + "Data1": -7740276602472224318, + "Data2": 5661550493955715454 }, "Flags": 0, "Kind": 0, @@ -117003,10 +114125,8 @@ }, { "__Checksum": { - "Data1": 1699425413727969854, - "Data2": 2331723063379149155, - "Data3": 1541886615703496656, - "Data4": -3203936253997015076 + "Data1": -6121661254746420042, + "Data2": 624731233111375015 }, "Flags": 0, "Kind": 0, @@ -117072,10 +114192,8 @@ }, { "__Checksum": { - "Data1": 8736552409577208190, - "Data2": -5619026453828225626, - "Data3": 4303412102615885316, - "Data4": 6114072779949951740 + "Data1": 4709380777075162312, + "Data2": -8306617838258942528 }, "Flags": 0, "Kind": 0, @@ -117150,10 +114268,8 @@ }, { "__Checksum": { - "Data1": 4299724152889836709, - "Data2": -4491967922558062987, - "Data3": 6147862000317319793, - "Data4": -7327437657093174827 + "Data1": 6730868378332850112, + "Data2": 4878255397310468269 }, "Flags": 0, "Kind": 0, @@ -117214,10 +114330,8 @@ }, { "__Checksum": { - "Data1": 2931727481321269281, - "Data2": -1316745861182688024, - "Data3": 4376759017804918503, - "Data4": 9219562952932079561 + "Data1": -3060618097975408959, + "Data2": -8892802631197220127 }, "Flags": 0, "Kind": 0, @@ -117257,10 +114371,8 @@ }, { "__Checksum": { - "Data1": 8766188874124121040, - "Data2": 627069210454559785, - "Data3": -3838937926181812512, - "Data4": -8230511217925169377 + "Data1": -1311905515647135398, + "Data2": 6734927178514718025 }, "Flags": 0, "Kind": 0, @@ -117529,10 +114641,8 @@ }, { "__Checksum": { - "Data1": -4365537405190566603, - "Data2": -7879565500719249568, - "Data3": 1161715400166556211, - "Data4": 838829922320283339 + "Data1": -9009257896966127546, + "Data2": -99871989684879940 }, "Flags": 0, "Kind": 0, @@ -117562,10 +114672,8 @@ }, { "__Checksum": { - "Data1": 8232264008382940168, - "Data2": -8037525786169312231, - "Data3": -6385564947761523562, - "Data4": 3759939311253855306 + "Data1": -6425952106250738534, + "Data2": 1850929424732129588 }, "Flags": 0, "Kind": 0, @@ -117605,10 +114713,8 @@ }, { "__Checksum": { - "Data1": 2968156160959977270, - "Data2": 5554106022564694432, - "Data3": 1739439397631014854, - "Data4": -9180406499211740684 + "Data1": 13252434110022135, + "Data2": -5845351103418393012 }, "Flags": 0, "Kind": 0, @@ -117676,10 +114782,8 @@ }, { "__Checksum": { - "Data1": 4218836103673510765, - "Data2": 2667858072929447816, - "Data3": -7437066797167442356, - "Data4": -3793767818753248346 + "Data1": -1550997411757849220, + "Data2": 6829768655090812731 }, "Flags": 0, "Kind": 0, @@ -117740,10 +114844,8 @@ }, { "__Checksum": { - "Data1": -5459023038693007884, - "Data2": 4142928740221107821, - "Data3": -6843387052645904813, - "Data4": -4452056164835692795 + "Data1": -3455940090358340802, + "Data2": -1884496582898305619 }, "Flags": 0, "Kind": 0, @@ -117825,10 +114927,8 @@ }, { "__Checksum": { - "Data1": -3230766500660718569, - "Data2": -6502681512389429634, - "Data3": -8448638626515578619, - "Data4": -2650885118283648719 + "Data1": 4496574427890705107, + "Data2": -4098505461037654875 }, "Flags": 0, "Kind": 0, @@ -117910,10 +115010,8 @@ }, { "__Checksum": { - "Data1": 5635852167976713920, - "Data2": 7499582926547104648, - "Data3": 2457619188072854522, - "Data4": 1174562651753624938 + "Data1": 975688223303109857, + "Data2": 6353782408269722950 }, "Flags": 0, "Kind": 0, @@ -117995,10 +115093,8 @@ }, { "__Checksum": { - "Data1": -4685041892922343494, - "Data2": -4334997098408910047, - "Data3": 8080907989605799275, - "Data4": -3978572607433536725 + "Data1": 6869913045050106137, + "Data2": -4718037547805258324 }, "Flags": 0, "Kind": 0, @@ -118039,10 +115135,8 @@ }, { "__Checksum": { - "Data1": -409225161597850758, - "Data2": -294457814727412873, - "Data3": -7782151053887331499, - "Data4": -6349134533640608086 + "Data1": -3186193861212947828, + "Data2": 8649787658184961408 }, "Flags": 0, "Kind": 0, @@ -118138,10 +115232,8 @@ }, { "__Checksum": { - "Data1": -2079027868331407182, - "Data2": -3806206923606314833, - "Data3": 6606403922797220339, - "Data4": 7596422237811733832 + "Data1": 369013821653809936, + "Data2": -2804251934436590903 }, "Flags": 0, "Kind": 0, @@ -118200,10 +115292,8 @@ }, { "__Checksum": { - "Data1": -8448322551484894386, - "Data2": 8996027154787386027, - "Data3": 2703832059296828143, - "Data4": -1157929281965437421 + "Data1": -3110028479311907236, + "Data2": 3352789149250437900 }, "Flags": 0, "Kind": 0, @@ -118306,10 +115396,8 @@ }, { "__Checksum": { - "Data1": 3597079530790671126, - "Data2": 7461581902378742052, - "Data3": -8833595339016638343, - "Data4": -5342929668139782980 + "Data1": -9149368414676586086, + "Data2": -737623075502963652 }, "Flags": 0, "Kind": 0, @@ -118370,10 +115458,8 @@ }, { "__Checksum": { - "Data1": -7416239566172023337, - "Data2": -4366028626070558781, - "Data3": -9133928881812975944, - "Data4": -2271494172642454037 + "Data1": 3013335858624810736, + "Data2": -885827294633566083 }, "Flags": 0, "Kind": 0, @@ -118403,10 +115489,8 @@ }, { "__Checksum": { - "Data1": 5436027853584480440, - "Data2": -37446193167327252, - "Data3": -1151745076245191782, - "Data4": -5806528204367026139 + "Data1": 2989751054813764084, + "Data2": 1240564091620435034 }, "Flags": 0, "Kind": 0, @@ -118509,10 +115593,8 @@ }, { "__Checksum": { - "Data1": -7898135630577757296, - "Data2": 3656092035358294355, - "Data3": -8996772969138593871, - "Data4": -2616591144672475331 + "Data1": -6673551323133927617, + "Data2": -3946773847184227632 }, "Flags": 0, "Kind": 0, @@ -118629,10 +115711,8 @@ }, { "__Checksum": { - "Data1": 8203978587540130899, - "Data2": -2012143760799064851, - "Data3": 4167841631827165812, - "Data4": -2059583623209241514 + "Data1": 6480626343392016440, + "Data2": 2182351871441628272 }, "Flags": 0, "Kind": 0, @@ -118686,10 +115766,8 @@ }, { "__Checksum": { - "Data1": 3363932405638797825, - "Data2": -6866605313355280320, - "Data3": -4592479383367325089, - "Data4": 243941118758191213 + "Data1": -7979700322486260865, + "Data2": 7610096118506833762 }, "Flags": 0, "Kind": 0, @@ -118841,10 +115919,8 @@ }, { "__Checksum": { - "Data1": -4018380796586772543, - "Data2": -8676685934027056194, - "Data3": -6855850005915423241, - "Data4": -3297871848626571284 + "Data1": -7229338186227089788, + "Data2": -1877477598021931191 }, "Flags": 0, "Kind": 0, @@ -118877,10 +115953,8 @@ }, { "__Checksum": { - "Data1": -2593661893135345786, - "Data2": -8983910900365205913, - "Data3": -5611006088400710545, - "Data4": -392084349930403933 + "Data1": 7699415110765569464, + "Data2": -8689998884511732111 }, "Flags": 0, "Kind": 0, @@ -118927,10 +116001,8 @@ }, { "__Checksum": { - "Data1": 6515208736822387287, - "Data2": -3674384844891812938, - "Data3": -7146402073852253801, - "Data4": 6343400083057715576 + "Data1": -2155878342007342885, + "Data2": -6328439189792520369 }, "Flags": 0, "Kind": 0, @@ -119352,10 +116424,8 @@ }, { "__Checksum": { - "Data1": 4986490317653419830, - "Data2": 2250255512320766964, - "Data3": 8012062806858945326, - "Data4": 6110904602635364045 + "Data1": 9093853207185171151, + "Data2": 3911195839584516870 }, "Flags": 0, "Kind": 0, @@ -119409,10 +116479,8 @@ }, { "__Checksum": { - "Data1": -4080649397932869869, - "Data2": 1629845634081343658, - "Data3": -931241299736232743, - "Data4": 3638218319256599959 + "Data1": -8496393713162508811, + "Data2": -9064060447332687507 }, "Flags": 0, "Kind": 0, @@ -119442,10 +116510,8 @@ }, { "__Checksum": { - "Data1": -6447667631626323023, - "Data2": -3263822769063457854, - "Data3": 8678359667003393613, - "Data4": -4825203981023736827 + "Data1": 5507392672671005946, + "Data2": -6238541853053818667 }, "Flags": 0, "Kind": 0, @@ -119499,10 +116565,8 @@ }, { "__Checksum": { - "Data1": -242015595585633326, - "Data2": -2532300957164262375, - "Data3": -3514897683293691148, - "Data4": -3539728788856638654 + "Data1": 934112524818245199, + "Data2": 6542349219511530770 }, "Flags": 0, "Kind": 0, @@ -119632,10 +116696,8 @@ }, { "__Checksum": { - "Data1": 899611867512171029, - "Data2": -4624455793943328734, - "Data3": -4599231691053010503, - "Data4": 5437267939745043305 + "Data1": 4947677443777259982, + "Data2": -4660880963465443385 }, "Flags": 0, "Kind": 0, @@ -119885,10 +116947,8 @@ }, { "__Checksum": { - "Data1": 7607371200409316380, - "Data2": -1982877730029834540, - "Data3": 2543082963532543234, - "Data4": -3555654353783282878 + "Data1": 1745079712341516657, + "Data2": -4093051416579956717 }, "Flags": 0, "Kind": 0, @@ -120052,10 +117112,8 @@ }, { "__Checksum": { - "Data1": -6355300002215573867, - "Data2": -6642336288920031988, - "Data3": -3657973082851724745, - "Data4": 4441794052828166876 + "Data1": 3129768229267066077, + "Data2": 924560137200339381 }, "Flags": 0, "Kind": 0, @@ -120114,10 +117172,8 @@ }, { "__Checksum": { - "Data1": -324189471634839130, - "Data2": 738178334139613873, - "Data3": -6389383441018566133, - "Data4": -5937007066233305660 + "Data1": 6734094071198535542, + "Data2": 7496699552196806760 }, "Flags": 0, "Kind": 0, @@ -120192,10 +117248,8 @@ }, { "__Checksum": { - "Data1": 6579290909815276098, - "Data2": -5786764862408862989, - "Data3": -223974500070862109, - "Data4": -8024705581969120173 + "Data1": 7598052764613469356, + "Data2": 7607451950169735931 }, "Flags": 0, "Kind": 0, @@ -120291,10 +117345,8 @@ }, { "__Checksum": { - "Data1": -8867534807447642614, - "Data2": -4282795529733840161, - "Data3": -4635615492145646672, - "Data4": -8195911472830248096 + "Data1": -7260797332835781380, + "Data2": -9221274584805839195 }, "Flags": 0, "Kind": 0, @@ -120324,10 +117376,8 @@ }, { "__Checksum": { - "Data1": 2055651399922282634, - "Data2": -6814724332078412608, - "Data3": -4455488790470296996, - "Data4": -1886259397078689711 + "Data1": -6608873196057053161, + "Data2": -2389098358862496266 }, "Flags": 0, "Kind": 0, @@ -120374,10 +117424,8 @@ }, { "__Checksum": { - "Data1": -783575063737605723, - "Data2": -4737122988413836642, - "Data3": -7391718704589048748, - "Data4": 7312971484644794326 + "Data1": -7475996256863006568, + "Data2": -7082523870322255979 }, "Flags": 0, "Kind": 0, @@ -120407,10 +117455,8 @@ }, { "__Checksum": { - "Data1": -8423331370337892124, - "Data2": 8607476731006155165, - "Data3": 7825986663753835046, - "Data4": -1326133542033694308 + "Data1": 1774779962166010577, + "Data2": 2943637722827542163 }, "Flags": 0, "Kind": 0, @@ -120686,10 +117732,8 @@ }, { "__Checksum": { - "Data1": -2268799541887309103, - "Data2": -668615304369281891, - "Data3": 7988170111111088687, - "Data4": -5765829378452645265 + "Data1": 3311294867888907380, + "Data2": 5753410381025474119 }, "Flags": 0, "Kind": 0, @@ -120806,10 +117850,8 @@ }, { "__Checksum": { - "Data1": 4616720039763893687, - "Data2": 5808876632879653911, - "Data3": -1065888359537067629, - "Data4": -2435685151728620991 + "Data1": 3434243883024616255, + "Data2": 1941200980358305574 }, "Flags": 0, "Kind": 0, @@ -120856,10 +117898,8 @@ }, { "__Checksum": { - "Data1": -3397824799546625955, - "Data2": 95453516525334837, - "Data3": -3260615537290027463, - "Data4": 7111788007408675375 + "Data1": -1928269758607805083, + "Data2": 8649736962830360354 }, "Flags": 0, "Kind": 0, @@ -120882,10 +117922,8 @@ }, { "__Checksum": { - "Data1": 4837051917780599729, - "Data2": 5053165941570701999, - "Data3": 6003586571519475842, - "Data4": -6761062790223405511 + "Data1": 2939576670624860802, + "Data2": 751196928023784388 }, "Flags": 0, "Kind": 0, @@ -121044,10 +118082,8 @@ }, { "__Checksum": { - "Data1": -2825625751485158550, - "Data2": -8951478464814054242, - "Data3": 5360712111422486356, - "Data4": -6823174351154519447 + "Data1": -1060423751967728383, + "Data2": -7676984597372165546 }, "Flags": 0, "Kind": 0, @@ -121269,10 +118305,8 @@ }, { "__Checksum": { - "Data1": 5304550624403384242, - "Data2": -5757024202355786823, - "Data3": 8643042856019946064, - "Data4": -5078077064770076685 + "Data1": 2744842580325011296, + "Data2": -6385516755127263655 }, "Flags": 0, "Kind": 0, @@ -121319,10 +118353,8 @@ }, { "__Checksum": { - "Data1": 8813118713798802730, - "Data2": 3111421505567381794, - "Data3": 7308009671379773460, - "Data4": 4615501719801401025 + "Data1": -1590444281766377840, + "Data2": 6247239611866780678 }, "Flags": 0, "Kind": 0, @@ -121443,10 +118475,8 @@ }, { "__Checksum": { - "Data1": 3654898954294160951, - "Data2": 2266405322193606728, - "Data3": 5400563069777141128, - "Data4": -7562869689290775340 + "Data1": 6857269024888280636, + "Data2": 6416585809422941284 }, "Flags": 0, "Kind": 0, @@ -121506,10 +118536,8 @@ }, { "__Checksum": { - "Data1": -5811167680428264316, - "Data2": 105144032448403338, - "Data3": 8530035611792725563, - "Data4": 4044134331271406771 + "Data1": -844307179274196398, + "Data2": -1366127723790698936 }, "Flags": 0, "Kind": 0, @@ -121555,10 +118583,8 @@ }, { "__Checksum": { - "Data1": -2457555725703393757, - "Data2": -447044426694863885, - "Data3": 5963770687743965827, - "Data4": 3526880835431422118 + "Data1": -7022765591269317462, + "Data2": -791593752699799468 }, "Flags": 0, "Kind": 0, @@ -121605,10 +118631,8 @@ }, { "__Checksum": { - "Data1": -8318092702215005576, - "Data2": 1166975836627013422, - "Data3": 1977761050442325733, - "Data4": 2068834247930104095 + "Data1": -2269077176507420016, + "Data2": -3721622384290320083 }, "Flags": 0, "Kind": 0, @@ -121655,10 +118679,8 @@ }, { "__Checksum": { - "Data1": 1044222473754506773, - "Data2": -2098635606892015939, - "Data3": -2228805133736317010, - "Data4": -2225408200399055669 + "Data1": -353313248048889768, + "Data2": 3774879919170962800 }, "Flags": 0, "Kind": 0, @@ -121709,10 +118731,8 @@ }, { "__Checksum": { - "Data1": 8298292010862954195, - "Data2": -6452131929705822801, - "Data3": -7134566091987459954, - "Data4": 166022515573277994 + "Data1": 4899442396854783979, + "Data2": -2682317158340921019 }, "Flags": 0, "Kind": 0, @@ -122028,10 +119048,8 @@ }, { "__Checksum": { - "Data1": 1415513549608202619, - "Data2": 7262354241668650742, - "Data3": -2387423681060068224, - "Data4": 5904739011134664302 + "Data1": -3632761981123121688, + "Data2": 8482639729461251251 }, "Flags": 0, "Kind": 0, @@ -122084,10 +119102,8 @@ }, { "__Checksum": { - "Data1": 1751940906615724931, - "Data2": -1575919742726299120, - "Data3": -7215653635185667453, - "Data4": -5735568122911297362 + "Data1": 6897285493576536306, + "Data2": 4696277682246522020 }, "Flags": 0, "Kind": 0, @@ -122155,10 +119171,8 @@ }, { "__Checksum": { - "Data1": 8653035414084213231, - "Data2": 2564212518522508993, - "Data3": -8280918236984447019, - "Data4": 3019511755706696719 + "Data1": -2586835754383711651, + "Data2": -4331514645808111828 }, "Flags": 0, "Kind": 0, @@ -122219,10 +119233,8 @@ }, { "__Checksum": { - "Data1": -533026722483522440, - "Data2": -3446999082842381959, - "Data3": -5078937376413946249, - "Data4": -97901690154634529 + "Data1": -1352139647443244513, + "Data2": -69728816474676460 }, "Flags": 0, "Kind": 0, @@ -122252,10 +119264,8 @@ }, { "__Checksum": { - "Data1": -8722134114817660871, - "Data2": 285160686329281860, - "Data3": -7628888178379054062, - "Data4": 4893392558521626434 + "Data1": 843743695953646097, + "Data2": 1636114930259390314 }, "Flags": 0, "Kind": 0, @@ -122278,10 +119288,8 @@ }, { "__Checksum": { - "Data1": 7645732095941153921, - "Data2": 2006043116496783748, - "Data3": 2721434041488755974, - "Data4": 1502512813668324742 + "Data1": -513863136095933147, + "Data2": 8159335768562144703 }, "Flags": 0, "Kind": 0, @@ -122328,10 +119336,8 @@ }, { "__Checksum": { - "Data1": -7751980444337371959, - "Data2": -3713363541770772082, - "Data3": 594873897184726572, - "Data4": 8205274252771473662 + "Data1": 5392373859184093239, + "Data2": 1696309909253248399 }, "Flags": 0, "Kind": 0, @@ -122451,10 +119457,8 @@ }, { "__Checksum": { - "Data1": -5062145086580971867, - "Data2": 3573305267323117294, - "Data3": 5814973781924060755, - "Data4": 9061574805665332737 + "Data1": -426994266524495156, + "Data2": -3800377045937866074 }, "Flags": 0, "Kind": 0, @@ -122484,10 +119488,8 @@ }, { "__Checksum": { - "Data1": -7900887348794687944, - "Data2": 788033211890135901, - "Data3": -1216783503851981722, - "Data4": -6598905042096115950 + "Data1": -5476364044272624689, + "Data2": -3793498162127638816 }, "Flags": 0, "Kind": 0, @@ -122640,10 +119642,8 @@ }, { "__Checksum": { - "Data1": -2211402915968872075, - "Data2": 9177012329480712191, - "Data3": 7101138547889236056, - "Data4": -7735821796682113947 + "Data1": -3163945886231246380, + "Data2": 6395296317227663044 }, "Flags": 0, "Kind": 0, @@ -122683,10 +119683,8 @@ }, { "__Checksum": { - "Data1": 8320071705980551447, - "Data2": -7621089228921924262, - "Data3": -7700818432625085674, - "Data4": -3414160519774345262 + "Data1": -1871924007324541164, + "Data2": -1058408952784275229 }, "Flags": 0, "Kind": 0, @@ -122900,10 +119898,8 @@ }, { "__Checksum": { - "Data1": 7722441086628972197, - "Data2": -5198533887374622813, - "Data3": -1943087658807053691, - "Data4": 5730006104632739246 + "Data1": -1451538971183231217, + "Data2": 6124826854861157010 }, "Flags": 0, "Kind": 0, @@ -123024,10 +120020,8 @@ }, { "__Checksum": { - "Data1": 5849421804075993773, - "Data2": -8183795674294729798, - "Data3": 1848242679840987201, - "Data4": 2663817720859527035 + "Data1": 7181767607730492214, + "Data2": -3088411739039462736 }, "Flags": 0, "Kind": 0, @@ -123085,10 +120079,8 @@ }, { "__Checksum": { - "Data1": 6382833008399476322, - "Data2": -8864929838010984255, - "Data3": 896442390122040549, - "Data4": 6814683429554919848 + "Data1": -5497580604680870128, + "Data2": -1909961576670929017 }, "Flags": 0, "Kind": 0, @@ -123215,10 +120207,8 @@ }, { "__Checksum": { - "Data1": -659093531722590187, - "Data2": 571484743044840002, - "Data3": 6293539017400838968, - "Data4": -637889721123008118 + "Data1": -3067056154658687826, + "Data2": 1721562915420270291 }, "Flags": 0, "Kind": 0, @@ -123267,10 +120257,8 @@ }, { "__Checksum": { - "Data1": 7657536613150264983, - "Data2": 1722152589363101495, - "Data3": 1704810975300284583, - "Data4": -4200602275821037557 + "Data1": 2891336507616117781, + "Data2": 3479209432438949737 }, "Flags": 0, "Kind": 0, @@ -123756,10 +120744,8 @@ }, { "__Checksum": { - "Data1": -5973867561462067939, - "Data2": -3117031851406302616, - "Data3": -341758834662112457, - "Data4": -6428390271876756620 + "Data1": 9169364826070594807, + "Data2": 889963421963101145 }, "Flags": 0, "Kind": 0, @@ -123858,10 +120844,8 @@ }, { "__Checksum": { - "Data1": -1991820770455400224, - "Data2": 1693373578302751869, - "Data3": -360825897901459990, - "Data4": -5149907753256862086 + "Data1": 4202298415526745367, + "Data2": 1477804035336377432 }, "Flags": 0, "Kind": 0, @@ -123913,10 +120897,8 @@ }, { "__Checksum": { - "Data1": 4536774483273600626, - "Data2": 963298915559212004, - "Data3": 2698677160200197787, - "Data4": -2522570048806138539 + "Data1": 8088349884937812382, + "Data2": -7462285816645188046 }, "Flags": 0, "Kind": 0, @@ -123988,10 +120970,8 @@ }, { "__Checksum": { - "Data1": -2503889042138534596, - "Data2": 5944672697998675577, - "Data3": -5953846837666489517, - "Data4": 967772668312038300 + "Data1": -923404022241533958, + "Data2": 4050550153902639182 }, "Flags": 0, "Kind": 0, @@ -124030,10 +121010,8 @@ }, { "__Checksum": { - "Data1": 6090551099408577597, - "Data2": 3891428188037487008, - "Data3": -5935797078672788554, - "Data4": 6668626974297504927 + "Data1": -3178774400958581986, + "Data2": 484145839025009376 }, "Flags": 0, "Kind": 0, @@ -124241,10 +121219,8 @@ }, { "__Checksum": { - "Data1": 986217379012934747, - "Data2": 4934076972075350013, - "Data3": -7927241970112712210, - "Data4": 828025559258905323 + "Data1": 6590126873475903708, + "Data2": 5920759079050954143 }, "Flags": 0, "Kind": 0, @@ -124277,10 +121253,8 @@ }, { "__Checksum": { - "Data1": 6647718174025966504, - "Data2": -6858173052259829391, - "Data3": 5191654462711583706, - "Data4": -5507238455884311850 + "Data1": 4927999799334504861, + "Data2": 2014498193810702946 }, "Flags": 0, "Kind": 0, @@ -124362,10 +121336,8 @@ }, { "__Checksum": { - "Data1": -4778680818360411598, - "Data2": 7583490790619290561, - "Data3": -1256793052882205749, - "Data4": 6563475770423382561 + "Data1": -1957651689492920886, + "Data2": 6564484724898317732 }, "Flags": 0, "Kind": 0, @@ -124399,10 +121371,8 @@ }, { "__Checksum": { - "Data1": -4944959893693472243, - "Data2": 8606253676449854177, - "Data3": 7027768814830126563, - "Data4": -2974676248973212066 + "Data1": 2907695594486775183, + "Data2": 7663470950256857599 }, "Flags": 0, "Kind": 0, @@ -124565,10 +121535,8 @@ }, { "__Checksum": { - "Data1": -1941626977083685035, - "Data2": -3966489185182592270, - "Data3": 7334571819713464294, - "Data4": 3603053544690182891 + "Data1": -7654089768008283733, + "Data2": -5985713407099371580 }, "Flags": 0, "Kind": 0, @@ -124633,10 +121601,8 @@ }, { "__Checksum": { - "Data1": 6005745375154449827, - "Data2": 3912718425664221739, - "Data3": -3179418185571089274, - "Data4": -2530797752364063199 + "Data1": -3106187743852661898, + "Data2": -1650092648248609538 }, "Flags": 0, "Kind": 0, @@ -124683,10 +121649,8 @@ }, { "__Checksum": { - "Data1": 525919373611745134, - "Data2": 2570870106687064583, - "Data3": -70329411796643411, - "Data4": 974073049878858269 + "Data1": 2965799670765488966, + "Data2": -3121358626247262196 }, "Flags": 0, "Kind": 0, @@ -124725,10 +121689,8 @@ }, { "__Checksum": { - "Data1": -1841187464556117518, - "Data2": 4064203487530938593, - "Data3": -69088997189265799, - "Data4": 7027451419955023129 + "Data1": -4222333357259271403, + "Data2": 1154581422269512988 }, "Flags": 0, "Kind": 0, @@ -124767,10 +121729,8 @@ }, { "__Checksum": { - "Data1": -3336685128183816073, - "Data2": 5177296417080891816, - "Data3": 2529517154045766195, - "Data4": -4889761765920485026 + "Data1": 2589487112133034240, + "Data2": -3267973929636399844 }, "Flags": 0, "Kind": 0, @@ -125148,10 +122108,8 @@ }, { "__Checksum": { - "Data1": -2208015513117142479, - "Data2": 8309379313477476810, - "Data3": 6767646123711685240, - "Data4": 7365054710633764131 + "Data1": 8280796860566111118, + "Data2": 8911350829329286611 }, "Flags": 5, "Kind": 5, @@ -125259,10 +122217,8 @@ }, { "__Checksum": { - "Data1": -4000033812635003167, - "Data2": -5950730445079187117, - "Data3": 4440922502184172901, - "Data4": 5202116158425997210 + "Data1": -5423395916693287393, + "Data2": -223906786504769138 }, "Flags": 5, "Kind": 5, @@ -125406,10 +122362,8 @@ }, { "__Checksum": { - "Data1": 3153007695218557304, - "Data2": 3922371191413434175, - "Data3": -5537468964553353012, - "Data4": 7390546894408728063 + "Data1": -8512531860322756466, + "Data2": 565535160638094242 }, "Flags": 5, "Kind": 5, @@ -125553,10 +122507,8 @@ }, { "__Checksum": { - "Data1": -7754745902619689175, - "Data2": -5134359080145857084, - "Data3": 4993529276979856248, - "Data4": -67383822311107497 + "Data1": -695186701189546795, + "Data2": 1713334652791315187 }, "Flags": 5, "Kind": 5, @@ -125713,10 +122665,8 @@ }, { "__Checksum": { - "Data1": 2568796741216897321, - "Data2": 1413523657933050761, - "Data3": 4759835387453048916, - "Data4": -7623413400349879011 + "Data1": -2189233830613740028, + "Data2": -3210546244466637264 }, "Flags": 5, "Kind": 5, @@ -125873,10 +122823,8 @@ }, { "__Checksum": { - "Data1": -3922423643600660840, - "Data2": 1861113121450198758, - "Data3": 4114726168194688327, - "Data4": -1128320206279884167 + "Data1": 4034581693026318237, + "Data2": 7175828996455085219 }, "Flags": 5, "Kind": 5, @@ -126033,10 +122981,8 @@ }, { "__Checksum": { - "Data1": -8775714726872022466, - "Data2": -545438209170010572, - "Data3": 6142391857546000887, - "Data4": 1982926167796330405 + "Data1": 132277126486428129, + "Data2": 406818806483413659 }, "Flags": 5, "Kind": 5, @@ -126193,10 +123139,8 @@ }, { "__Checksum": { - "Data1": 3050284125002467956, - "Data2": -8270852016883610587, - "Data3": 2582721202430644873, - "Data4": 1154486349124859276 + "Data1": -4699857774662552742, + "Data2": -7782941452454115360 }, "Flags": 5, "Kind": 5, @@ -126354,10 +123298,8 @@ }, { "__Checksum": { - "Data1": 4616190305368319910, - "Data2": 7447413165979947456, - "Data3": 1857369996590421839, - "Data4": 2325536753523476745 + "Data1": 3197114350085129281, + "Data2": 7535234814492069881 }, "Flags": 5, "Kind": 5, @@ -126515,10 +123457,8 @@ }, { "__Checksum": { - "Data1": 753566246165150567, - "Data2": -1484971089153632929, - "Data3": 753675216011997655, - "Data4": -2481015609383310033 + "Data1": 8552959263236561234, + "Data2": -963794937922758715 }, "Flags": 5, "Kind": 5, @@ -126676,10 +123616,8 @@ }, { "__Checksum": { - "Data1": 5982967440196202155, - "Data2": 8048742928898031017, - "Data3": 3737927635774825099, - "Data4": 7444377561005614462 + "Data1": 250683712170732012, + "Data2": 4608469616229978738 }, "Flags": 5, "Kind": 5, @@ -126837,10 +123775,8 @@ }, { "__Checksum": { - "Data1": -4423926610981284417, - "Data2": 6070813422952678817, - "Data3": 5467455227064425451, - "Data4": 5966057608582521435 + "Data1": 7943515544967438626, + "Data2": -6614915983299440337 }, "Flags": 5, "Kind": 5, @@ -126998,10 +123934,8 @@ }, { "__Checksum": { - "Data1": -8455680585630668266, - "Data2": -5249960128181441430, - "Data3": 6686758106941912323, - "Data4": -4808107875424454964 + "Data1": -3202898848456684823, + "Data2": 4441546661251474949 }, "Flags": 5, "Kind": 5, @@ -127159,10 +124093,8 @@ }, { "__Checksum": { - "Data1": 1424482053211315178, - "Data2": -3480568651311473287, - "Data3": -7888922457280522718, - "Data4": 7819848324246668642 + "Data1": 426207939972881254, + "Data2": 2278015698032139590 }, "Flags": 5, "Kind": 5, @@ -127320,10 +124252,8 @@ }, { "__Checksum": { - "Data1": -180827266690848425, - "Data2": 3093966056846658133, - "Data3": 5306032406616840726, - "Data4": 5925582501092149126 + "Data1": -4716617646748604688, + "Data2": 5078365839479461446 }, "Flags": 5, "Kind": 5, @@ -127481,10 +124411,8 @@ }, { "__Checksum": { - "Data1": 287945293919679924, - "Data2": -1848234636503790991, - "Data3": -6742909762419937277, - "Data4": -8593746758049323671 + "Data1": -3171029615981592633, + "Data2": -4873245902345257556 }, "Flags": 5, "Kind": 5, @@ -127628,10 +124556,8 @@ }, { "__Checksum": { - "Data1": -1370681849317955160, - "Data2": 5025759780459838645, - "Data3": 4532678055048649905, - "Data4": 3128789849970658225 + "Data1": 5266921814875941134, + "Data2": -1723987889949832252 }, "Flags": 5, "Kind": 5, @@ -127775,10 +124701,8 @@ }, { "__Checksum": { - "Data1": -8191073887387216009, - "Data2": -8252242229914814577, - "Data3": 407251635243716010, - "Data4": 4991382464013523462 + "Data1": 186676241108503817, + "Data2": 3535809253543099556 }, "Flags": 1, "Kind": 5, @@ -127876,10 +124800,8 @@ }, { "__Checksum": { - "Data1": -6692162820499350808, - "Data2": -7974253486706706353, - "Data3": -1873988677266008719, - "Data4": 6048255975166244398 + "Data1": -7368435224478696626, + "Data2": -8975450964490342878 }, "Flags": 3, "Kind": 5, @@ -127977,10 +124899,8 @@ }, { "__Checksum": { - "Data1": 970671822292712910, - "Data2": -1966831204505888063, - "Data3": -7724097183119675308, - "Data4": 5695577131580742068 + "Data1": -4611989471512184310, + "Data2": 2452883247346742866 }, "Flags": 1, "Kind": 5, @@ -128078,10 +124998,8 @@ }, { "__Checksum": { - "Data1": -8687713839042639128, - "Data2": 4209522885203462869, - "Data3": 6889413900290366404, - "Data4": -1911803412843107253 + "Data1": -7247637184667484428, + "Data2": 7214582437796182274 }, "Flags": 3, "Kind": 5, @@ -128179,10 +125097,8 @@ }, { "__Checksum": { - "Data1": 4901877077323870494, - "Data2": 3132105134707831167, - "Data3": 2930775666452184044, - "Data4": 1733629103907723867 + "Data1": 4869610556744405561, + "Data2": 7444860346095303511 }, "Flags": 1, "Kind": 5, @@ -128280,10 +125196,8 @@ }, { "__Checksum": { - "Data1": -5441527865553038936, - "Data2": 8249954223863785732, - "Data3": -1680070192287393176, - "Data4": 1021365094066695165 + "Data1": 3610714253495269450, + "Data2": 3832126896816967501 }, "Flags": 3, "Kind": 5, @@ -128381,10 +125295,8 @@ }, { "__Checksum": { - "Data1": 529336937853122963, - "Data2": -5974738061924800905, - "Data3": 8401592041848705634, - "Data4": -4810382036802378836 + "Data1": 4914381257188030878, + "Data2": -6776255457534492882 }, "Flags": 1, "Kind": 5, @@ -128482,10 +125394,8 @@ }, { "__Checksum": { - "Data1": 4684810500090083694, - "Data2": -4473915508101925580, - "Data3": 8372589347426950587, - "Data4": -7756037544956959828 + "Data1": 6220639181941488053, + "Data2": 4006370140578171650 }, "Flags": 3, "Kind": 5, @@ -128583,10 +125493,8 @@ }, { "__Checksum": { - "Data1": 4737033454769325478, - "Data2": -2090513954301140439, - "Data3": -807394041938419228, - "Data4": 3432233367385273942 + "Data1": 6765683905916178088, + "Data2": -6308010928379900817 }, "Flags": 1, "Kind": 5, @@ -128684,10 +125592,8 @@ }, { "__Checksum": { - "Data1": 8382635859535504499, - "Data2": -5824930526558211795, - "Data3": 8725434172378658978, - "Data4": -5907921743279659378 + "Data1": -969835745530965603, + "Data2": -2617888354289607659 }, "Flags": 3, "Kind": 5, @@ -128785,10 +125691,8 @@ }, { "__Checksum": { - "Data1": -5236124357581862597, - "Data2": 3855549514483631212, - "Data3": -8825105558650251111, - "Data4": 5893003190461767728 + "Data1": 7734030393075704645, + "Data2": -5559686494540786034 }, "Flags": 1, "Kind": 5, @@ -128886,10 +125790,8 @@ }, { "__Checksum": { - "Data1": 6874030420434042522, - "Data2": 3821059563686605518, - "Data3": -3336159978914356430, - "Data4": 7031972648351423414 + "Data1": 3140440923854350904, + "Data2": 5993610107683181528 }, "Flags": 3, "Kind": 5, @@ -128987,10 +125889,8 @@ }, { "__Checksum": { - "Data1": -5756319630115205171, - "Data2": 193597238803561630, - "Data3": 8100163357540844883, - "Data4": -7812478771628745792 + "Data1": -8836510472282925284, + "Data2": 277017648264922211 }, "Flags": 1, "Kind": 5, @@ -129088,10 +125988,8 @@ }, { "__Checksum": { - "Data1": -3636980096896999025, - "Data2": -2335904188467381676, - "Data3": 8229041675281148498, - "Data4": 1990870718024586924 + "Data1": -5315396747994042711, + "Data2": 6876462668790453058 }, "Flags": 3, "Kind": 5, @@ -129189,10 +126087,8 @@ }, { "__Checksum": { - "Data1": -4789415803525893115, - "Data2": -5620185862145100922, - "Data3": 2055024854313118396, - "Data4": -9194913527402574483 + "Data1": 5785117795290010483, + "Data2": 8787894690430808177 }, "Flags": 5, "Kind": 7, @@ -129226,10 +126122,8 @@ }, { "__Checksum": { - "Data1": 4072456247900910599, - "Data2": 6684783366291711703, - "Data3": -3478156761428997743, - "Data4": 7756048347756860073 + "Data1": 98029552728942696, + "Data2": 5073204014138796323 }, "Flags": 5, "Kind": 6, diff --git a/src/Shared/files/Tooling/Telerik/Kendo.Mvc.Examples.taghelpers.json b/src/Shared/files/Tooling/Telerik/Kendo.Mvc.Examples.taghelpers.json index f3173e00bf8..0847bb6b026 100644 --- a/src/Shared/files/Tooling/Telerik/Kendo.Mvc.Examples.taghelpers.json +++ b/src/Shared/files/Tooling/Telerik/Kendo.Mvc.Examples.taghelpers.json @@ -1,10 +1,8 @@ [ { "__Checksum": { - "Data1": -3206630733188996242, - "Data2": 8357460917934969767, - "Data3": -4252591313314899428, - "Data4": 7206917258543938185 + "Data1": 7797026082698329757, + "Data2": 3690201877388609652 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -100,10 +98,8 @@ }, { "__Checksum": { - "Data1": -5566581092860309171, - "Data2": 8778169394430788402, - "Data3": -742159610968472449, - "Data4": 2521833885339232453 + "Data1": 4926667238362123395, + "Data2": 4234913057389196271 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -199,10 +195,8 @@ }, { "__Checksum": { - "Data1": 4930041651603740922, - "Data2": -1131435785158517922, - "Data3": -3086759804211547301, - "Data4": 8039745058838873433 + "Data1": -6170869053616268768, + "Data2": -8167038815822842516 }, "Flags": 1, "Kind": 3, @@ -241,10 +235,8 @@ }, { "__Checksum": { - "Data1": -3841540589375924122, - "Data2": 5707193656339180370, - "Data3": -5603733563700533148, - "Data4": -8564212220425136679 + "Data1": -5254430524587877655, + "Data2": -8158472740492044958 }, "Flags": 3, "Kind": 3, @@ -283,10 +275,8 @@ }, { "__Checksum": { - "Data1": 8505177104787030733, - "Data2": -284985845404668852, - "Data3": -4958805730255777912, - "Data4": 8338996988626093747 + "Data1": 1485724636681179776, + "Data2": 4457694576996447331 }, "Flags": 1, "Kind": 3, @@ -309,10 +299,8 @@ }, { "__Checksum": { - "Data1": -4289854432041895832, - "Data2": 2152645570849032885, - "Data3": 7054280334332964819, - "Data4": 3423643953430331425 + "Data1": -7108528587728066839, + "Data2": 325751887706851842 }, "Flags": 3, "Kind": 3, @@ -335,10 +323,8 @@ }, { "__Checksum": { - "Data1": 2145233970298667666, - "Data2": 322529678187344706, - "Data3": 457920824386375491, - "Data4": 5218404900558243367 + "Data1": -3270503164572345556, + "Data2": -5234319517993826978 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -460,10 +446,8 @@ }, { "__Checksum": { - "Data1": 8267711055252645201, - "Data2": 5030691127684715765, - "Data3": -2193379745506423464, - "Data4": 5473929663185401584 + "Data1": 5836704759973159924, + "Data2": 2042743095548668492 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -585,10 +569,8 @@ }, { "__Checksum": { - "Data1": -407575911507465286, - "Data2": 3793148429565617541, - "Data3": 6580689837178914583, - "Data4": 818213719812458618 + "Data1": 6698719116033855183, + "Data2": -441041995610521826 }, "Flags": 1, "Kind": 3, @@ -627,10 +609,8 @@ }, { "__Checksum": { - "Data1": -6929637574097414973, - "Data2": 7360089145593565334, - "Data3": -2261106012346266610, - "Data4": 488138844106542431 + "Data1": -2911843784829325436, + "Data2": -6319786036245506996 }, "Flags": 3, "Kind": 3, @@ -669,10 +649,8 @@ }, { "__Checksum": { - "Data1": -941568207605026252, - "Data2": 6644785968447255023, - "Data3": -11101360015202990, - "Data4": 5142231969231976079 + "Data1": 8469227219072337679, + "Data2": 2013997054376952751 }, "Flags": 1, "Kind": 3, @@ -711,10 +689,8 @@ }, { "__Checksum": { - "Data1": -4740772574032195288, - "Data2": -4489649865303299107, - "Data3": 669241300029607986, - "Data4": -5535595758299121168 + "Data1": 518877941855456580, + "Data2": -5871294866789008204 }, "Flags": 3, "Kind": 3, @@ -753,10 +729,8 @@ }, { "__Checksum": { - "Data1": -8942807039917611375, - "Data2": -2951669729003543986, - "Data3": 9074844031729657942, - "Data4": 6723866676321658250 + "Data1": -6036001828814458330, + "Data2": 5302504473525684148 }, "Flags": 1, "Kind": 3, @@ -795,10 +769,8 @@ }, { "__Checksum": { - "Data1": 934220185637193349, - "Data2": -292742512178808877, - "Data3": 4451946791480677404, - "Data4": -5438762718606928608 + "Data1": -7662471422811394851, + "Data2": -2180176246042572463 }, "Flags": 3, "Kind": 3, @@ -837,10 +809,8 @@ }, { "__Checksum": { - "Data1": 752710759961871956, - "Data2": -4618206618809477114, - "Data3": 855140587917687688, - "Data4": -5986813842976185002 + "Data1": -6968539277833652683, + "Data2": 5832967399512376451 }, "Flags": 1, "Kind": 3, @@ -863,10 +833,8 @@ }, { "__Checksum": { - "Data1": 663373971323738936, - "Data2": -2067570348009246156, - "Data3": 563906863450806484, - "Data4": 4264391830596629321 + "Data1": -171823818384442361, + "Data2": -3806509227642408634 }, "Flags": 3, "Kind": 3, @@ -889,10 +857,8 @@ }, { "__Checksum": { - "Data1": -8772896747709157474, - "Data2": -9068071353245128965, - "Data3": -5383436085625490440, - "Data4": 3980681423356524699 + "Data1": -8570439114810334067, + "Data2": -712698792369100491 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -927,10 +893,8 @@ }, { "__Checksum": { - "Data1": 3143669605929054240, - "Data2": 6185313568827516694, - "Data3": -8449311990909094491, - "Data4": 2417732563197934256 + "Data1": 4880950719331803254, + "Data2": -1736382581417551436 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -965,10 +929,8 @@ }, { "__Checksum": { - "Data1": 738648772295242988, - "Data2": 5145516115432919439, - "Data3": 7336962712105705753, - "Data4": 7899720636442920152 + "Data1": 6488046190713595732, + "Data2": 307626256560635888 }, "Flags": 1, "Kind": 3, @@ -991,10 +953,8 @@ }, { "__Checksum": { - "Data1": 2519435554266668390, - "Data2": -8280828652630706396, - "Data3": -7690087104705682085, - "Data4": -282139168271897244 + "Data1": -5985383523299739255, + "Data2": -1993649736422733038 }, "Flags": 3, "Kind": 3, @@ -1017,10 +977,8 @@ }, { "__Checksum": { - "Data1": 6761997121030723474, - "Data2": -5679143177423553846, - "Data3": 4695628758466062569, - "Data4": 3399430491766322036 + "Data1": 2187045305938273776, + "Data2": -2570501246693306390 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -1111,10 +1069,8 @@ }, { "__Checksum": { - "Data1": 1411860109198361766, - "Data2": 2728788834011003213, - "Data3": -3855925001332350458, - "Data4": -4756260148028826019 + "Data1": 2433905641730083649, + "Data2": -6949336250008025111 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -1205,10 +1161,8 @@ }, { "__Checksum": { - "Data1": 4849886575369874874, - "Data2": 4889916424629579556, - "Data3": -4136180796273259582, - "Data4": 6549205639564303725 + "Data1": 5397896856852084391, + "Data2": -5739275324003106423 }, "Flags": 1, "Kind": 3, @@ -1231,10 +1185,8 @@ }, { "__Checksum": { - "Data1": 8505458575644988328, - "Data2": 4537325872604122958, - "Data3": 3140667787881970683, - "Data4": -3916641521546367542 + "Data1": -5297088290257981628, + "Data2": 8012603118799319838 }, "Flags": 3, "Kind": 3, @@ -1257,10 +1209,8 @@ }, { "__Checksum": { - "Data1": -6131256332102995710, - "Data2": -3069043794292942177, - "Data3": -4307749538882593018, - "Data4": -8591979749668941378 + "Data1": 1788793903094130664, + "Data2": 3744315316245942211 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.DynamicComponent", @@ -1307,10 +1257,8 @@ }, { "__Checksum": { - "Data1": -2578972863684358618, - "Data2": 6763022731297441616, - "Data3": -674004338877933061, - "Data4": 5602770616024980948 + "Data1": -5362506210041258261, + "Data2": 5348261415394195923 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.DynamicComponent", @@ -1357,10 +1305,8 @@ }, { "__Checksum": { - "Data1": -6125076534827203771, - "Data2": -4251888664095035202, - "Data3": -3678417462630865437, - "Data4": 5286376558756151725 + "Data1": -5777460138682365483, + "Data2": 1952483347864270418 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -1408,10 +1354,8 @@ }, { "__Checksum": { - "Data1": 8943434850085049290, - "Data2": -4552342351326901576, - "Data3": -8111878333720766210, - "Data4": -3127495789568786019 + "Data1": -7852628131581236611, + "Data2": -4717378496137316230 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -1459,10 +1403,8 @@ }, { "__Checksum": { - "Data1": 6747256102099010090, - "Data2": -7061820148962748950, - "Data3": 2694081397575314532, - "Data4": -6994995620605775222 + "Data1": 4302935512397455954, + "Data2": 5185911745023879289 }, "Flags": 1, "Kind": 3, @@ -1485,10 +1427,8 @@ }, { "__Checksum": { - "Data1": 111643164421853596, - "Data2": -1689433293473952521, - "Data3": -5480543476110081918, - "Data4": -6203237545167305374 + "Data1": -4493212034722291803, + "Data2": 4737697892338068057 }, "Flags": 3, "Kind": 3, @@ -1511,10 +1451,8 @@ }, { "__Checksum": { - "Data1": -7566045065921141540, - "Data2": -1149438145018316058, - "Data3": 6828138461945914220, - "Data4": -7609590661007018040 + "Data1": 6705497867820935977, + "Data2": -8208476660512327593 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -1561,10 +1499,8 @@ }, { "__Checksum": { - "Data1": 2713833175152956351, - "Data2": 4988891089601089866, - "Data3": -6203797350287043894, - "Data4": 5805111489945366089 + "Data1": 4086042310747817088, + "Data2": 2192004873198815636 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -1611,10 +1547,8 @@ }, { "__Checksum": { - "Data1": 3545495332943592409, - "Data2": -2865238208649140541, - "Data3": -2081487446913417982, - "Data4": -1872426113897896738 + "Data1": -3037846143497359872, + "Data2": -9073982560453033198 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -1736,10 +1670,8 @@ }, { "__Checksum": { - "Data1": 9052035631031367822, - "Data2": 1835614808570947343, - "Data3": 550046152296424981, - "Data4": -5044085326903649402 + "Data1": -6889831476703473769, + "Data2": 7166817355276495619 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -1861,10 +1793,8 @@ }, { "__Checksum": { - "Data1": 8583775132861681989, - "Data2": 5439463580495863089, - "Data3": 3547304272288097361, - "Data4": 9195593298753975651 + "Data1": -7692669234801883104, + "Data2": -7119662165073117894 }, "Flags": 1, "Kind": 3, @@ -1887,10 +1817,8 @@ }, { "__Checksum": { - "Data1": -1904660506772394100, - "Data2": -6248150288593258690, - "Data3": -6767607126822914026, - "Data4": 4150770401416903999 + "Data1": 5564972683372825552, + "Data2": -5091664131990937047 }, "Flags": 3, "Kind": 3, @@ -1913,10 +1841,8 @@ }, { "__Checksum": { - "Data1": 7840483017144318047, - "Data2": 6742944780045466347, - "Data3": -1906439148982061283, - "Data4": 4215763046944315136 + "Data1": -8233269186047007973, + "Data2": 5976719934745352206 }, "Flags": 1, "Kind": 3, @@ -1955,10 +1881,8 @@ }, { "__Checksum": { - "Data1": 6777877481433542986, - "Data2": 5967345423297792015, - "Data3": -517505527294662920, - "Data4": -6926589346969475326 + "Data1": 7114827079399109699, + "Data2": 4084339282821650644 }, "Flags": 3, "Kind": 3, @@ -1997,10 +1921,8 @@ }, { "__Checksum": { - "Data1": -6036234111528561375, - "Data2": -2143730386637616308, - "Data3": -1650963123900260366, - "Data4": -5155546115533706319 + "Data1": 1555348321007130422, + "Data2": -1732921891145813821 }, "Flags": 1, "Kind": 3, @@ -2023,10 +1945,8 @@ }, { "__Checksum": { - "Data1": -7452048426478299168, - "Data2": -4530716866676664776, - "Data3": -7331212533770056081, - "Data4": -8329436836337726873 + "Data1": -2509164420084162936, + "Data2": 5082062649460048734 }, "Flags": 3, "Kind": 3, @@ -2049,10 +1969,8 @@ }, { "__Checksum": { - "Data1": -1123307733518896018, - "Data2": -5456308174768297222, - "Data3": -417451908816469804, - "Data4": -8729332223776598725 + "Data1": -3255220863960548148, + "Data2": 3106106120644040224 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -2073,10 +1991,8 @@ }, { "__Checksum": { - "Data1": -5165292238782982638, - "Data2": 4177278560009837783, - "Data3": -5475970862606909811, - "Data4": 131463940935458465 + "Data1": 6298925819166215449, + "Data2": -7139660982829572944 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -2097,10 +2013,8 @@ }, { "__Checksum": { - "Data1": -2310847341529886441, - "Data2": 6863543708223593969, - "Data3": 1978495174215711021, - "Data4": 6006357468116003447 + "Data1": -3189652441237983124, + "Data2": -6703237589590121206 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -2222,10 +2136,8 @@ }, { "__Checksum": { - "Data1": 6302258179207961261, - "Data2": -5541580875653111315, - "Data3": 829454100962720164, - "Data4": 1748501664498929011 + "Data1": 3786349607998375841, + "Data2": 754934040197895508 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -2347,10 +2259,8 @@ }, { "__Checksum": { - "Data1": 2611077318490395801, - "Data2": -3196589382572038172, - "Data3": -3920239710080856654, - "Data4": 1967251448787226790 + "Data1": 4655928664758658212, + "Data2": 7062885489576443957 }, "Flags": 1, "Kind": 3, @@ -2389,10 +2299,8 @@ }, { "__Checksum": { - "Data1": -5713847307469012383, - "Data2": -7633688427483062557, - "Data3": 2778258375588096682, - "Data4": -6737193802265358511 + "Data1": 8701126525115212609, + "Data2": -2455922085345217282 }, "Flags": 3, "Kind": 3, @@ -2431,10 +2339,8 @@ }, { "__Checksum": { - "Data1": 7216177543310595179, - "Data2": -2578433538285688095, - "Data3": 7985579475460371061, - "Data4": -5735929841817483599 + "Data1": 8845440994095538742, + "Data2": -7307021473322603872 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -2518,10 +2424,8 @@ }, { "__Checksum": { - "Data1": 5642893276402099907, - "Data2": 2922514397278029305, - "Data3": -5639831424261485131, - "Data4": 3765267422528979485 + "Data1": -5194248249653633974, + "Data2": 7927403111783914182 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -2605,10 +2509,8 @@ }, { "__Checksum": { - "Data1": 3486803452858140432, - "Data2": -5860314831143379205, - "Data3": 4505168284610036217, - "Data4": -8149015023532229435 + "Data1": -4424174965456880514, + "Data2": -4933624773774214613 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -2737,10 +2639,8 @@ }, { "__Checksum": { - "Data1": -5587988205258577083, - "Data2": -306427709182554944, - "Data3": 2701851069607281168, - "Data4": -5007884644248028187 + "Data1": -9108542244962694970, + "Data2": -1096781107982128575 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -2869,10 +2769,8 @@ }, { "__Checksum": { - "Data1": -3909307678130414290, - "Data2": -6772512692010547741, - "Data3": -2917616355291112522, - "Data4": -3702458998650436060 + "Data1": -751659190080684045, + "Data2": 9162226254179085517 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", @@ -2920,10 +2818,8 @@ }, { "__Checksum": { - "Data1": -1696611427785082114, - "Data2": 5334639298087308727, - "Data3": -8976838480079893436, - "Data4": -5024603100248776858 + "Data1": -5487950774596902971, + "Data2": -3901392736725918889 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", @@ -2971,10 +2867,8 @@ }, { "__Checksum": { - "Data1": -514006375458848613, - "Data2": -5335193242652658200, - "Data3": 889516890153922553, - "Data4": -2651739197325621193 + "Data1": -5612517424848971816, + "Data2": -3030575879944635485 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -3091,10 +2985,8 @@ }, { "__Checksum": { - "Data1": 6574937049293430459, - "Data2": 3740609988862490391, - "Data3": 3198359905897237012, - "Data4": -2063885276769551731 + "Data1": 1396828519166927951, + "Data2": 2634843222654959070 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -3211,10 +3103,8 @@ }, { "__Checksum": { - "Data1": -6542253735773717140, - "Data2": -4586315779635184745, - "Data3": 8384973787877704864, - "Data4": -7083567861681540411 + "Data1": 5622431187222023846, + "Data2": -5471692655746244651 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", @@ -3292,10 +3182,8 @@ }, { "__Checksum": { - "Data1": 7003849187030022778, - "Data2": -3711668298310819247, - "Data3": -1328921588537032958, - "Data4": 6270100307648216899 + "Data1": 4064166792066507817, + "Data2": -5719931316532595980 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", @@ -3373,10 +3261,8 @@ }, { "__Checksum": { - "Data1": 8667332372128554682, - "Data2": 3992576111695036455, - "Data3": -315046125608686322, - "Data4": 4796760478048840724 + "Data1": 255729113326055280, + "Data2": -7520697551848893142 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", @@ -3506,10 +3392,8 @@ }, { "__Checksum": { - "Data1": -5072897040128506155, - "Data2": -7166987644272463642, - "Data3": 4678581004686283725, - "Data4": 11583159769846217 + "Data1": 4063368498199389020, + "Data2": 4280957149931095369 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", @@ -3639,10 +3523,8 @@ }, { "__Checksum": { - "Data1": -4781284810406737761, - "Data2": -7591991474954936731, - "Data3": 994592369531403456, - "Data4": 1761428867147444400 + "Data1": -8841980750978813076, + "Data2": 6444455319670145289 }, "Flags": 1, "Kind": 3, @@ -3665,10 +3547,8 @@ }, { "__Checksum": { - "Data1": -1372956736404853202, - "Data2": 5348055934600143823, - "Data3": -7852017170635964781, - "Data4": 3500813823803174865 + "Data1": -8640507686543268351, + "Data2": 7467977046836679830 }, "Flags": 3, "Kind": 3, @@ -3691,10 +3571,8 @@ }, { "__Checksum": { - "Data1": -8636229947299522184, - "Data2": -8881559371815326954, - "Data3": -5549012838690168473, - "Data4": 17824152099409014 + "Data1": 1489261044726692613, + "Data2": -3992953055238405339 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -3812,10 +3690,8 @@ }, { "__Checksum": { - "Data1": 1005531732039773040, - "Data2": 1153210776274766402, - "Data3": -7462410836512263166, - "Data4": -7388350346678040011 + "Data1": -4421292422253239793, + "Data2": 7500566405165723364 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -3933,10 +3809,8 @@ }, { "__Checksum": { - "Data1": -4064941096794280062, - "Data2": 2137091070084871354, - "Data3": 110230551014444529, - "Data4": -2579942202369914131 + "Data1": -7770383423146008629, + "Data2": -913483525602206477 }, "Flags": 1, "Kind": 3, @@ -3959,10 +3833,8 @@ }, { "__Checksum": { - "Data1": -2052791935872294990, - "Data2": 5385183117308296917, - "Data3": 2252573235543933229, - "Data4": -4965422803951440602 + "Data1": 2081905570157670380, + "Data2": -2663920933113778601 }, "Flags": 3, "Kind": 3, @@ -3985,10 +3857,8 @@ }, { "__Checksum": { - "Data1": 4808397981156302305, - "Data2": 5094427473332376264, - "Data3": -6595776324775958439, - "Data4": 8831061924218662422 + "Data1": -6889801753478084228, + "Data2": 6491354219329640131 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -4072,10 +3942,8 @@ }, { "__Checksum": { - "Data1": 6850858188121458131, - "Data2": 4008324321100753243, - "Data3": 6198364315278746162, - "Data4": 2039840070916656396 + "Data1": 3205832943330367599, + "Data2": 9135688030954228968 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -4159,10 +4027,8 @@ }, { "__Checksum": { - "Data1": -4143766228824851612, - "Data2": 2711081044747266130, - "Data3": -8521304118634583631, - "Data4": 606477692892967153 + "Data1": -2988936362147671988, + "Data2": 1508497263552382497 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -4246,10 +4112,8 @@ }, { "__Checksum": { - "Data1": 4332756002050726764, - "Data2": -4685821472245174582, - "Data3": -8767944829384093583, - "Data4": 2672322889655707559 + "Data1": 4773673735621715435, + "Data2": -5415193873778515843 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -4333,10 +4197,8 @@ }, { "__Checksum": { - "Data1": -7772683331127480392, - "Data2": 8581423998163796332, - "Data3": -663886333442863846, - "Data4": -8477677897083375970 + "Data1": -7663559305837638307, + "Data2": 387942152080416865 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -4402,10 +4264,8 @@ }, { "__Checksum": { - "Data1": 765864723033255859, - "Data2": -6872611534740150459, - "Data3": 8432730024953112715, - "Data4": -4080166756659577821 + "Data1": -4736616839916153820, + "Data2": -4765098070595376979 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -4471,10 +4331,8 @@ }, { "__Checksum": { - "Data1": 6738898566712768803, - "Data2": 6384441364283431785, - "Data3": 746520592373070502, - "Data4": -3295394932361551848 + "Data1": -8753650447919604408, + "Data2": 4425582878120944050 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -4521,10 +4379,8 @@ }, { "__Checksum": { - "Data1": -3978601925595006203, - "Data2": -3139313593325549090, - "Data3": 353357918071702897, - "Data4": 5568586844489636405 + "Data1": -5459476267859235335, + "Data2": -514509262654303737 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -4571,10 +4427,8 @@ }, { "__Checksum": { - "Data1": 2571001050911667580, - "Data2": 4952371933228710471, - "Data3": -1977017388038189979, - "Data4": -3329432456167621142 + "Data1": 352330126814374125, + "Data2": -2521833504300792416 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", @@ -4621,10 +4475,8 @@ }, { "__Checksum": { - "Data1": 1151366026373653655, - "Data2": -4176601818622381310, - "Data3": -4342050954290947632, - "Data4": 3529954911832915197 + "Data1": -4143786666164395650, + "Data2": -5786416472151336325 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", @@ -4671,10 +4523,8 @@ }, { "__Checksum": { - "Data1": -1032746361547875465, - "Data2": -6595946586728192853, - "Data3": 8046454569091987588, - "Data4": -5066172967311223243 + "Data1": 8177284002573331653, + "Data2": -194789921200134303 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.NavigationLock", @@ -4722,10 +4572,8 @@ }, { "__Checksum": { - "Data1": 5346278316869859465, - "Data2": 5552485671978551858, - "Data3": -540701767061042918, - "Data4": 4957304761647425837 + "Data1": 1446630921979530084, + "Data2": 8995786770410672093 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.NavigationLock", @@ -4773,10 +4621,8 @@ }, { "__Checksum": { - "Data1": 1406389429900053801, - "Data2": -7003270362588110942, - "Data3": -3627251281975762765, - "Data4": -5169275720232364387 + "Data1": 5734382158522380841, + "Data2": 5150747061494260181 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -4848,10 +4694,8 @@ }, { "__Checksum": { - "Data1": -8367849044821322345, - "Data2": -7202494523821086186, - "Data3": 3242299275059751766, - "Data4": 8012702420283693704 + "Data1": 5746279174262600374, + "Data2": 1598960394464893436 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -4923,10 +4767,8 @@ }, { "__Checksum": { - "Data1": 7007823598322637618, - "Data2": -6573966562404276772, - "Data3": -7676631747611533459, - "Data4": -3625297780408061014 + "Data1": -501306229863032872, + "Data2": 3169050851630732767 }, "Flags": 1, "Kind": 3, @@ -4949,10 +4791,8 @@ }, { "__Checksum": { - "Data1": 6960001036176066391, - "Data2": 6743346627927609994, - "Data3": 13750227206502613, - "Data4": -4941409341996862401 + "Data1": -1101479853709910721, + "Data2": -774774707787052977 }, "Flags": 3, "Kind": 3, @@ -4975,10 +4815,8 @@ }, { "__Checksum": { - "Data1": -7487935317284963687, - "Data2": -611132187535896357, - "Data3": 5690863865031973471, - "Data4": 1940032901750163072 + "Data1": -2761674384481804437, + "Data2": -5435226596879227918 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", @@ -5014,10 +4852,8 @@ }, { "__Checksum": { - "Data1": 6961902166023597294, - "Data2": -2332984844533148618, - "Data3": 5457932977014102175, - "Data4": -7793128925127225427 + "Data1": 1871499095546031324, + "Data2": 5229180298100412661 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", @@ -5053,10 +4889,8 @@ }, { "__Checksum": { - "Data1": -8968560598506729284, - "Data2": 1578578508930914496, - "Data3": 8380508763847733455, - "Data4": 8740543911091400816 + "Data1": -6812019841187022576, + "Data2": 5163489924420492193 }, "Flags": 1, "Kind": 3, @@ -5079,10 +4913,8 @@ }, { "__Checksum": { - "Data1": 125924534683576601, - "Data2": -4092189392523004262, - "Data3": -7011819113043057908, - "Data4": -7678261985285546728 + "Data1": 5022896133232646319, + "Data2": 1457338516441246800 }, "Flags": 3, "Kind": 3, @@ -5105,10 +4937,8 @@ }, { "__Checksum": { - "Data1": 6738521298204921345, - "Data2": -3282049337033980809, - "Data3": 3506885591753711350, - "Data4": 782486452289768014 + "Data1": -8523614908629580236, + "Data2": 2156222640223886211 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", @@ -5129,10 +4959,8 @@ }, { "__Checksum": { - "Data1": -2510985758199002361, - "Data2": -5540644847017751974, - "Data3": -3319073043595439711, - "Data4": 4585602083954494087 + "Data1": 5152850430566646256, + "Data2": 258178677394725563 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", @@ -5153,10 +4981,8 @@ }, { "__Checksum": { - "Data1": -8830623684136587817, - "Data2": 7597384519783604187, - "Data3": -3663123865665823257, - "Data4": -5189880941756688316 + "Data1": -7289042576373224621, + "Data2": -8243959067472407917 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", @@ -5192,10 +5018,8 @@ }, { "__Checksum": { - "Data1": -1657043457718608470, - "Data2": 3817949504195820598, - "Data3": -5181876522600621025, - "Data4": -4749856528046161704 + "Data1": 8299082185897128040, + "Data2": 5781265086357945165 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", @@ -5231,10 +5055,8 @@ }, { "__Checksum": { - "Data1": 6665276223581251727, - "Data2": 5083508174034868114, - "Data3": 4641152077771228412, - "Data4": 2644324858909347510 + "Data1": 212454570086082950, + "Data2": -1280063084362070722 }, "Flags": 1, "Kind": 3, @@ -5257,10 +5079,8 @@ }, { "__Checksum": { - "Data1": -5660628593859323350, - "Data2": -6045768099369040825, - "Data3": -3689333212292646483, - "Data4": 2596005245494486339 + "Data1": -931689916486355979, + "Data2": 7052605733296554679 }, "Flags": 3, "Kind": 3, @@ -5283,10 +5103,8 @@ }, { "__Checksum": { - "Data1": -2312170607471079453, - "Data2": -1247924497700889607, - "Data3": 1185257195722234189, - "Data4": 4256808502715447703 + "Data1": 2508016513126333572, + "Data2": -4412426481065466728 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", @@ -5358,10 +5176,8 @@ }, { "__Checksum": { - "Data1": -8794796849312803632, - "Data2": -1163658095354856824, - "Data3": -307725195598382271, - "Data4": -6507884536742653853 + "Data1": 4401060932625923012, + "Data2": -3115664537867122066 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", @@ -5433,10 +5249,8 @@ }, { "__Checksum": { - "Data1": -4251685196901957127, - "Data2": -4123723115561447708, - "Data3": -1266058646955163157, - "Data4": -8191670329070908451 + "Data1": 4893608393684151368, + "Data2": 7247255103991087448 }, "Flags": 1, "Kind": 3, @@ -5459,10 +5273,8 @@ }, { "__Checksum": { - "Data1": 134709720164553489, - "Data2": -743560574020591932, - "Data3": -6195057519060912100, - "Data4": -81279624416649508 + "Data1": -5095043554270818909, + "Data2": -6113196799272469165 }, "Flags": 3, "Kind": 3, @@ -5485,10 +5297,8 @@ }, { "__Checksum": { - "Data1": -1749845923197916195, - "Data2": 508501511275690630, - "Data3": 3069970790180019694, - "Data4": 526456237997457669 + "Data1": 35326966433526912, + "Data2": 2456709477038557644 }, "Flags": 1, "Kind": 3, @@ -5527,10 +5337,8 @@ }, { "__Checksum": { - "Data1": 3555027092893349100, - "Data2": -8383322619674485755, - "Data3": -4822569674973831835, - "Data4": -632289520155282236 + "Data1": -6174702157399237511, + "Data2": 2154901292037686240 }, "Flags": 3, "Kind": 3, @@ -5569,10 +5377,8 @@ }, { "__Checksum": { - "Data1": 6897623579647992910, - "Data2": -3349493767528185140, - "Data3": -3442056731585750691, - "Data4": -3755315571009971182 + "Data1": -569838190382263201, + "Data2": -1130082640348689864 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", @@ -5729,10 +5535,8 @@ }, { "__Checksum": { - "Data1": 965148913458899846, - "Data2": 1783205232657012981, - "Data3": 334027341929712985, - "Data4": 8417496202572730098 + "Data1": -2409530692647299771, + "Data2": 2969336969960466013 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", @@ -5889,10 +5693,8 @@ }, { "__Checksum": { - "Data1": 4123139698346296553, - "Data2": -7346832158935654368, - "Data3": -5385567570855385916, - "Data4": 2510382193103946371 + "Data1": 8971518869784650973, + "Data2": 2758781384795083852 }, "Flags": 1, "Kind": 3, @@ -5931,10 +5733,8 @@ }, { "__Checksum": { - "Data1": -5300260007351452923, - "Data2": 2822842080574861089, - "Data3": 4077833142492363556, - "Data4": -724536696686197775 + "Data1": -9131022541668067060, + "Data2": 1404967748286691265 }, "Flags": 3, "Kind": 3, @@ -5973,10 +5773,8 @@ }, { "__Checksum": { - "Data1": 2750588074491037665, - "Data2": -4914913301748818664, - "Data3": 974773806481982846, - "Data4": -6142925231906394593 + "Data1": -4694049844594204378, + "Data2": -3517981146822377360 }, "Flags": 1, "Kind": 3, @@ -6015,10 +5813,8 @@ }, { "__Checksum": { - "Data1": 8369808075639429763, - "Data2": -5982530866819406650, - "Data3": -6555540140645078096, - "Data4": -7390140071660987877 + "Data1": -3477324260192132402, + "Data2": -4765405911869084686 }, "Flags": 3, "Kind": 3, @@ -6057,10 +5853,8 @@ }, { "__Checksum": { - "Data1": -4951710079166950206, - "Data2": 5822756182912359800, - "Data3": 6479738311328994151, - "Data4": 4743627570543507883 + "Data1": 3643583309377446796, + "Data2": -3815614980401766121 }, "Flags": 1, "Kind": 3, @@ -6099,10 +5893,8 @@ }, { "__Checksum": { - "Data1": 4456363850341656494, - "Data2": -8970759199492517543, - "Data3": -6514648254996980474, - "Data4": -5283854966093993036 + "Data1": 5137151342473710173, + "Data2": -6277109623848591195 }, "Flags": 3, "Kind": 3, @@ -6141,10 +5933,8 @@ }, { "__Checksum": { - "Data1": 6442596985623295615, - "Data2": -8758155732033467580, - "Data3": -1799116800173656963, - "Data4": 8358220090684188399 + "Data1": -4901795600343411526, + "Data2": 7833375506880185639 }, "Flags": 5, "Kind": 4, @@ -6242,10 +6032,8 @@ }, { "__Checksum": { - "Data1": 7357713610560366769, - "Data2": -2541076200177569426, - "Data3": -6259379755475019571, - "Data4": -2361496819793211110 + "Data1": 3228229827059843529, + "Data2": -5451110826238297291 }, "Flags": 5, "Kind": 4, @@ -6343,10 +6131,8 @@ }, { "__Checksum": { - "Data1": 4348682985664795635, - "Data2": 7454292815286163554, - "Data3": 915066830333812995, - "Data4": -14211680434964443 + "Data1": -4746661947067743744, + "Data2": 2832125953733708097 }, "Flags": 5, "Kind": 4, @@ -6444,10 +6230,8 @@ }, { "__Checksum": { - "Data1": 4565701286530876402, - "Data2": 8434470850653723189, - "Data3": -7906166322783008212, - "Data4": 3853962445382395440 + "Data1": 5860257438878601974, + "Data2": -7113979754600473816 }, "Flags": 5, "Kind": 4, @@ -6545,10 +6329,8 @@ }, { "__Checksum": { - "Data1": -7047854059270496120, - "Data2": 4440799891250646664, - "Data3": 2700719288329807470, - "Data4": -4201531673428371183 + "Data1": -4016285788661823572, + "Data2": -6362211464971703684 }, "Flags": 5, "Kind": 4, @@ -6646,10 +6428,8 @@ }, { "__Checksum": { - "Data1": 2671921859741262580, - "Data2": 78205006404842252, - "Data3": -8001642903914956828, - "Data4": -3484726797421117152 + "Data1": 5329396975995397948, + "Data2": 7215261105583698488 }, "Flags": 5, "Kind": 4, @@ -6747,10 +6527,8 @@ }, { "__Checksum": { - "Data1": -5925823988267930528, - "Data2": -4671098150387069029, - "Data3": 6016001733919481364, - "Data4": -621226201008185121 + "Data1": -1439527826414570225, + "Data2": -1460681506742658806 }, "Flags": 5, "Kind": 4, @@ -6848,10 +6626,8 @@ }, { "__Checksum": { - "Data1": 8093840550599337013, - "Data2": -8120100906893499094, - "Data3": -8857791865593458126, - "Data4": 7402457867965475040 + "Data1": 2282716087208774597, + "Data2": -4018091295292311664 }, "Flags": 5, "Kind": 4, @@ -6949,10 +6725,8 @@ }, { "__Checksum": { - "Data1": 8068426635599973556, - "Data2": 7575112244665947050, - "Data3": 274172997920110370, - "Data4": 6191299558665531711 + "Data1": -7230310292480493495, + "Data2": 2311160843507083431 }, "Flags": 5, "Kind": 4, @@ -7050,10 +6824,8 @@ }, { "__Checksum": { - "Data1": 7976161858806967545, - "Data2": -4358352868262883845, - "Data3": -6706235780465603701, - "Data4": 5468236797802138746 + "Data1": 7102071247401581390, + "Data2": 7302405453812267664 }, "Flags": 5, "Kind": 4, @@ -7151,10 +6923,8 @@ }, { "__Checksum": { - "Data1": 8344101087535981889, - "Data2": 6734664541979892418, - "Data3": 798555191014190233, - "Data4": 1268925305393105157 + "Data1": -7812909839331251106, + "Data2": -4376430170203276808 }, "Flags": 5, "Kind": 4, @@ -7252,10 +7022,8 @@ }, { "__Checksum": { - "Data1": 4226667840194940641, - "Data2": -7337499199013057869, - "Data3": -649439597310222364, - "Data4": -6737161111924751636 + "Data1": -2779630523264752808, + "Data2": -5459904189395512136 }, "Flags": 5, "Kind": 4, @@ -7353,10 +7121,8 @@ }, { "__Checksum": { - "Data1": 579803141054022746, - "Data2": 8075160135927879971, - "Data3": 4921355309732204143, - "Data4": 645562632838187505 + "Data1": 6729302036576874124, + "Data2": -8746776444323031295 }, "Flags": 5, "Kind": 4, @@ -7454,10 +7220,8 @@ }, { "__Checksum": { - "Data1": -6066664588443682712, - "Data2": -8867623960858612369, - "Data3": -1889368991223165760, - "Data4": 2920107278767561890 + "Data1": 8425397499121976690, + "Data2": 5634942009578915712 }, "Flags": 5, "Kind": 4, @@ -7555,10 +7319,8 @@ }, { "__Checksum": { - "Data1": 8139034440661483139, - "Data2": 8640225834827265153, - "Data3": 1108071153596841396, - "Data4": -2623463857158809622 + "Data1": 5633534749089118000, + "Data2": -1681187186149086381 }, "Flags": 5, "Kind": 4, @@ -7656,10 +7418,8 @@ }, { "__Checksum": { - "Data1": -4185994438010798203, - "Data2": -2339861670574575809, - "Data3": 9180859484269109158, - "Data4": 1663733722132074718 + "Data1": -1819030401047021200, + "Data2": -8043982831269089875 }, "Flags": 5, "Kind": 4, @@ -7757,10 +7517,8 @@ }, { "__Checksum": { - "Data1": -5343794843892554413, - "Data2": -8560379697433173443, - "Data3": -6559080555327611132, - "Data4": 7078108971999181490 + "Data1": 6666584595203201462, + "Data2": -533183852743860633 }, "Flags": 5, "Kind": 4, @@ -7858,10 +7616,8 @@ }, { "__Checksum": { - "Data1": -8938006281885297322, - "Data2": -7110964047785652501, - "Data3": -3129917814464184900, - "Data4": 3552543887332866475 + "Data1": 5018208241751799302, + "Data2": 6891858176526403389 }, "Flags": 5, "Kind": 4, @@ -7959,10 +7715,8 @@ }, { "__Checksum": { - "Data1": -7370909931528702155, - "Data2": -6533091605138259344, - "Data3": -6131909135983462149, - "Data4": -8366474410336038576 + "Data1": -4466209808196092543, + "Data2": -8517390699600572972 }, "Flags": 5, "Kind": 4, @@ -8060,10 +7814,8 @@ }, { "__Checksum": { - "Data1": 4366908351976944892, - "Data2": 7228530192837514965, - "Data3": 1334750702403640381, - "Data4": 7465972912409996749 + "Data1": -2533299238850707768, + "Data2": -6478287320877149588 }, "Flags": 5, "Kind": 4, @@ -8161,10 +7913,8 @@ }, { "__Checksum": { - "Data1": 6454068438614268589, - "Data2": -1932233423544723923, - "Data3": 730332999004070697, - "Data4": 3873463094522618293 + "Data1": 7910860184462870715, + "Data2": -749307425230839947 }, "Flags": 5, "Kind": 4, @@ -8262,10 +8012,8 @@ }, { "__Checksum": { - "Data1": 6617346144073252542, - "Data2": -3914213721834893589, - "Data3": 2954643589261777021, - "Data4": -5622391109201465617 + "Data1": -2045005354608378461, + "Data2": 1828001783924508721 }, "Flags": 5, "Kind": 4, @@ -8363,10 +8111,8 @@ }, { "__Checksum": { - "Data1": 5481761552618462603, - "Data2": -1660555888033264556, - "Data3": -8556140100057615493, - "Data4": 6855587221768659914 + "Data1": -702392753995870505, + "Data2": -2264262331664083538 }, "Flags": 5, "Kind": 4, @@ -8464,10 +8210,8 @@ }, { "__Checksum": { - "Data1": 30462123676731693, - "Data2": -7270902022667079013, - "Data3": 2794160027404390388, - "Data4": 7943431654365522856 + "Data1": 2757702048089695897, + "Data2": -7286884601878251255 }, "Flags": 5, "Kind": 4, @@ -8565,10 +8309,8 @@ }, { "__Checksum": { - "Data1": 3822225259754079052, - "Data2": 6600979083722208484, - "Data3": 2811867230002921696, - "Data4": -5977281891564676648 + "Data1": -2055819855381693015, + "Data2": -9005040171877836570 }, "Flags": 5, "Kind": 4, @@ -8666,10 +8408,8 @@ }, { "__Checksum": { - "Data1": 5341328065396407838, - "Data2": 7194448710348225459, - "Data3": 4485947891463728347, - "Data4": 9222927179548940741 + "Data1": -5582370035884330348, + "Data2": 5049660495452454095 }, "Flags": 5, "Kind": 4, @@ -8767,10 +8507,8 @@ }, { "__Checksum": { - "Data1": -1021071440094572203, - "Data2": 4692442239366044412, - "Data3": -3400241796688667207, - "Data4": 5730676513316371661 + "Data1": 6734579907795411394, + "Data2": -375691458832699251 }, "Flags": 5, "Kind": 4, @@ -8868,10 +8606,8 @@ }, { "__Checksum": { - "Data1": -1329278909085463011, - "Data2": -6285876867414352245, - "Data3": 1982168048898939756, - "Data4": -7947181385185546357 + "Data1": -1870674962003193690, + "Data2": -1211652329794247828 }, "Flags": 5, "Kind": 4, @@ -8969,10 +8705,8 @@ }, { "__Checksum": { - "Data1": 1358739260833818788, - "Data2": -4035700658384597410, - "Data3": -5139481840556563374, - "Data4": -8982296339924886442 + "Data1": -4206289927154628991, + "Data2": -2464077634093630134 }, "Flags": 5, "Kind": 4, @@ -9070,10 +8804,8 @@ }, { "__Checksum": { - "Data1": 720918172334986003, - "Data2": 1519615983698175760, - "Data3": -3518239596312361255, - "Data4": 3058363334485451289 + "Data1": 4035491724217289851, + "Data2": 3584770819956913357 }, "Flags": 5, "Kind": 4, @@ -9171,10 +8903,8 @@ }, { "__Checksum": { - "Data1": -1089608892609067463, - "Data2": 722228895904579192, - "Data3": 1806948199816803797, - "Data4": -780036581070809315 + "Data1": 2187002113964670846, + "Data2": -6737715288174239157 }, "Flags": 5, "Kind": 4, @@ -9272,10 +9002,8 @@ }, { "__Checksum": { - "Data1": -8353791768217611826, - "Data2": -3268910213806358488, - "Data3": -4556468829597852218, - "Data4": -70795082699606162 + "Data1": 2113442187417146352, + "Data2": 4614263358490471815 }, "Flags": 5, "Kind": 4, @@ -9373,10 +9101,8 @@ }, { "__Checksum": { - "Data1": 4629675740800963204, - "Data2": -8284607395432541287, - "Data3": -1223910061187788495, - "Data4": -5053990601876919964 + "Data1": -6746063881581183891, + "Data2": 3643842464326423559 }, "Flags": 5, "Kind": 4, @@ -9474,10 +9200,8 @@ }, { "__Checksum": { - "Data1": -3653211084274535451, - "Data2": 6447440550756373374, - "Data3": 4013484855738062386, - "Data4": 7776277374563554337 + "Data1": -9156481817802002624, + "Data2": 7853988747118500197 }, "Flags": 5, "Kind": 4, @@ -9575,10 +9299,8 @@ }, { "__Checksum": { - "Data1": 5779628562798383668, - "Data2": 4684382324708592349, - "Data3": 592048645904159870, - "Data4": 7026609108778355431 + "Data1": -7809508892447688228, + "Data2": 7736762784216852350 }, "Flags": 5, "Kind": 4, @@ -9676,10 +9398,8 @@ }, { "__Checksum": { - "Data1": 3863348798030072724, - "Data2": 5321812776408565170, - "Data3": 5963765359214704441, - "Data4": -7221642578155297654 + "Data1": 6421203457685063180, + "Data2": 5153103010564342429 }, "Flags": 5, "Kind": 4, @@ -9777,10 +9497,8 @@ }, { "__Checksum": { - "Data1": 2054267770945785122, - "Data2": -4211153835300702364, - "Data3": 3971013967397053421, - "Data4": 7265573801164562336 + "Data1": 4023375897286424800, + "Data2": 4059590905268112434 }, "Flags": 5, "Kind": 4, @@ -9878,10 +9596,8 @@ }, { "__Checksum": { - "Data1": 7780868389644421752, - "Data2": 8440957482832809377, - "Data3": 2104347768341200896, - "Data4": 855144259116775763 + "Data1": 2811658188094753831, + "Data2": 9210041680120133663 }, "Flags": 5, "Kind": 4, @@ -9979,10 +9695,8 @@ }, { "__Checksum": { - "Data1": -8789661627828909884, - "Data2": 7540738373833062207, - "Data3": 725384944564871593, - "Data4": -5155598588948275548 + "Data1": -56302601481808418, + "Data2": 5884909531684199580 }, "Flags": 5, "Kind": 4, @@ -10080,10 +9794,8 @@ }, { "__Checksum": { - "Data1": 3962550855224612806, - "Data2": 7748411800165110594, - "Data3": 2849728876275009930, - "Data4": -4754191254041248776 + "Data1": 8463534974547648194, + "Data2": 3904293997364822361 }, "Flags": 5, "Kind": 4, @@ -10181,10 +9893,8 @@ }, { "__Checksum": { - "Data1": -8580711467466116115, - "Data2": -6578157534913103182, - "Data3": 1538007285222953567, - "Data4": 3351007117975270655 + "Data1": 8539864678896303039, + "Data2": -1529749420030311477 }, "Flags": 5, "Kind": 4, @@ -10282,10 +9992,8 @@ }, { "__Checksum": { - "Data1": -1746468424594889597, - "Data2": 1349980794556158085, - "Data3": -7409408126103331437, - "Data4": 2863375884064563813 + "Data1": 988611414133406401, + "Data2": 2240525536934543160 }, "Flags": 5, "Kind": 4, @@ -10383,10 +10091,8 @@ }, { "__Checksum": { - "Data1": 2139423826763604204, - "Data2": -4607667456705569636, - "Data3": 5335068056236896463, - "Data4": 6105203112933064906 + "Data1": -1411946501348142281, + "Data2": 4597340183593052206 }, "Flags": 5, "Kind": 4, @@ -10484,10 +10190,8 @@ }, { "__Checksum": { - "Data1": -5703666014157534600, - "Data2": 3628125978420718532, - "Data3": -4567513449331530735, - "Data4": 302793633031341824 + "Data1": 6450435270449183886, + "Data2": 3005881458330076301 }, "Flags": 5, "Kind": 4, @@ -10585,10 +10289,8 @@ }, { "__Checksum": { - "Data1": 1744051083797696685, - "Data2": 2007019530463223247, - "Data3": -5143124544057932022, - "Data4": -5537455830128031076 + "Data1": -3334346261402251954, + "Data2": 4519604714279441493 }, "Flags": 5, "Kind": 4, @@ -10686,10 +10388,8 @@ }, { "__Checksum": { - "Data1": 4766149430428447012, - "Data2": 6232105082782460345, - "Data3": 968499277886257178, - "Data4": -549289692114900400 + "Data1": -64629481884934504, + "Data2": 8520631876677443438 }, "Flags": 5, "Kind": 4, @@ -10787,10 +10487,8 @@ }, { "__Checksum": { - "Data1": -3369976433174161798, - "Data2": 2246084962122221781, - "Data3": 84647650191043130, - "Data4": -436070590192598356 + "Data1": 7286268472346450045, + "Data2": -2441844866477765735 }, "Flags": 5, "Kind": 4, @@ -10888,10 +10586,8 @@ }, { "__Checksum": { - "Data1": -3609106657972416148, - "Data2": -2836977041674635221, - "Data3": 2379532596739396461, - "Data4": 366244263682976671 + "Data1": 1864328502047062529, + "Data2": 8105270061648131265 }, "Flags": 5, "Kind": 4, @@ -10989,10 +10685,8 @@ }, { "__Checksum": { - "Data1": -3430509634844208188, - "Data2": -1453429586116177226, - "Data3": -1451519009793529183, - "Data4": 5139074362423295786 + "Data1": -6272413156862106805, + "Data2": 3227971818586227359 }, "Flags": 5, "Kind": 4, @@ -11090,10 +10784,8 @@ }, { "__Checksum": { - "Data1": -7424229497794634145, - "Data2": 9194348720783026846, - "Data3": -8126771500528132617, - "Data4": -4906637585128413921 + "Data1": 3315832444216705179, + "Data2": 3724370212366058568 }, "Flags": 5, "Kind": 4, @@ -11191,10 +10883,8 @@ }, { "__Checksum": { - "Data1": -2452361875971853921, - "Data2": 1158437626976135113, - "Data3": -5521859850580262391, - "Data4": 230731955134506799 + "Data1": 2518791231304910311, + "Data2": 7105158076379682199 }, "Flags": 5, "Kind": 4, @@ -11292,10 +10982,8 @@ }, { "__Checksum": { - "Data1": 7703858523607768311, - "Data2": -9096483495310701687, - "Data3": 1488134476170654421, - "Data4": 2036324809990247995 + "Data1": 2508361083765992682, + "Data2": -4565982926563238338 }, "Flags": 5, "Kind": 4, @@ -11393,10 +11081,8 @@ }, { "__Checksum": { - "Data1": -7550336887997977840, - "Data2": -3881402460043660008, - "Data3": -3315045093367678314, - "Data4": 7894604137923486793 + "Data1": 3606365890850459076, + "Data2": 4494205998638774013 }, "Flags": 5, "Kind": 4, @@ -11494,10 +11180,8 @@ }, { "__Checksum": { - "Data1": -5058964306243853584, - "Data2": 6933092591744244510, - "Data3": -3139296352905935550, - "Data4": -3032736429063214355 + "Data1": -5461748835941697212, + "Data2": -5988168764195769571 }, "Flags": 5, "Kind": 4, @@ -11595,10 +11279,8 @@ }, { "__Checksum": { - "Data1": -3129364064576830115, - "Data2": 2104511400991904298, - "Data3": 1488282595125852563, - "Data4": -8782229450786916225 + "Data1": 3175507590079145101, + "Data2": 982435079821607325 }, "Flags": 5, "Kind": 4, @@ -11696,10 +11378,8 @@ }, { "__Checksum": { - "Data1": 8514767228735950986, - "Data2": 48524432140885671, - "Data3": -3144235257540162096, - "Data4": 3677266619412530375 + "Data1": -1664073311958579160, + "Data2": -2845913207904786538 }, "Flags": 5, "Kind": 4, @@ -11797,10 +11477,8 @@ }, { "__Checksum": { - "Data1": 4094477761572464737, - "Data2": -6382718740404396778, - "Data3": -1963450817555852422, - "Data4": -8568384580801099934 + "Data1": -7279306295188827229, + "Data2": -8108201258463575855 }, "Flags": 5, "Kind": 4, @@ -11898,10 +11576,8 @@ }, { "__Checksum": { - "Data1": -4066620052608546381, - "Data2": 3314054997768015706, - "Data3": -2548416033384416225, - "Data4": 5432449595615205949 + "Data1": -5066023834612009949, + "Data2": -3136424341288518598 }, "Flags": 5, "Kind": 4, @@ -11999,10 +11675,8 @@ }, { "__Checksum": { - "Data1": 5295482654870022528, - "Data2": -3650566035311225628, - "Data3": 5607066195946123339, - "Data4": -4462463665785036847 + "Data1": -5877769434453459995, + "Data2": -7787298244067751298 }, "Flags": 5, "Kind": 4, @@ -12100,10 +11774,8 @@ }, { "__Checksum": { - "Data1": 7423399680568052692, - "Data2": 5297352485603892672, - "Data3": -542338961600919594, - "Data4": -8479056169427304132 + "Data1": 1141899914344112620, + "Data2": 2338054354294405123 }, "Flags": 5, "Kind": 4, @@ -12201,10 +11873,8 @@ }, { "__Checksum": { - "Data1": -2040864249560837896, - "Data2": -7134686391348297590, - "Data3": 7050280374567222666, - "Data4": 5174834065771900271 + "Data1": 5280044030228095501, + "Data2": 7443953975959055360 }, "Flags": 5, "Kind": 4, @@ -12302,10 +11972,8 @@ }, { "__Checksum": { - "Data1": 511475388554011291, - "Data2": -668421176054711968, - "Data3": 842004359130922105, - "Data4": -5376726946319068681 + "Data1": -8743591976428431816, + "Data2": -6220275094625959259 }, "Flags": 5, "Kind": 4, @@ -12403,10 +12071,8 @@ }, { "__Checksum": { - "Data1": 5044378892066112672, - "Data2": 1729676385378958233, - "Data3": 7238943626946691819, - "Data4": 5111286766339779678 + "Data1": -1281723622838257220, + "Data2": -6022345013312785647 }, "Flags": 5, "Kind": 4, @@ -12504,10 +12170,8 @@ }, { "__Checksum": { - "Data1": -9006957563405114687, - "Data2": 1877874376899603019, - "Data3": -7195640247851173431, - "Data4": 5350095556257650260 + "Data1": 8952482313679459850, + "Data2": -8397859043508880339 }, "Flags": 5, "Kind": 4, @@ -12605,10 +12269,8 @@ }, { "__Checksum": { - "Data1": 8714713055182366883, - "Data2": 3918353297568394685, - "Data3": -5884554283081161354, - "Data4": -7294809679891941470 + "Data1": 1925601974224695689, + "Data2": -3711610617007021320 }, "Flags": 5, "Kind": 4, @@ -12706,10 +12368,8 @@ }, { "__Checksum": { - "Data1": -2566376084502795704, - "Data2": 5929343355189381831, - "Data3": -4599107905192022557, - "Data4": 164879100742615383 + "Data1": -8787948240307889369, + "Data2": 4693754772985155446 }, "Flags": 5, "Kind": 4, @@ -12807,10 +12467,8 @@ }, { "__Checksum": { - "Data1": -2396694587537260781, - "Data2": 8531111065956137769, - "Data3": -6131164549983283492, - "Data4": -7668038010154095748 + "Data1": -6387404133288944312, + "Data2": -1419393820064887449 }, "Flags": 5, "Kind": 4, @@ -12908,10 +12566,8 @@ }, { "__Checksum": { - "Data1": 59547025245104515, - "Data2": 8815148451919017776, - "Data3": 8438341047439695458, - "Data4": 5966440587717502913 + "Data1": -2480641417358472540, + "Data2": 2585322252315469989 }, "Flags": 5, "Kind": 4, @@ -13009,10 +12665,8 @@ }, { "__Checksum": { - "Data1": -4315976109508793632, - "Data2": -7288591629823562242, - "Data3": -7326816754560727461, - "Data4": 8988956521685040708 + "Data1": 6315505078895481899, + "Data2": 7117004558964915310 }, "Flags": 5, "Kind": 4, @@ -13110,10 +12764,8 @@ }, { "__Checksum": { - "Data1": -2069695296566471063, - "Data2": 4234549822948706195, - "Data3": 4447140006853761857, - "Data4": -1679092435805393782 + "Data1": -6685346108550908976, + "Data2": -1321788107507403576 }, "Flags": 5, "Kind": 4, @@ -13211,10 +12863,8 @@ }, { "__Checksum": { - "Data1": 7915073505832433950, - "Data2": 3536623701585597510, - "Data3": 4026429836787089705, - "Data4": -9103626333025540657 + "Data1": 5358460964165483005, + "Data2": 8299152887137595586 }, "Flags": 5, "Kind": 4, @@ -13312,10 +12962,8 @@ }, { "__Checksum": { - "Data1": 1224467651208650393, - "Data2": 8622877678971671711, - "Data3": -4089642782292467571, - "Data4": 8482479219713050062 + "Data1": 7775643746932725589, + "Data2": 1392883185336064728 }, "Flags": 5, "Kind": 4, @@ -13413,10 +13061,8 @@ }, { "__Checksum": { - "Data1": -4598303873192171532, - "Data2": -7838101605085008382, - "Data3": -5075450097138815829, - "Data4": -2954598859591783513 + "Data1": 768334052538123035, + "Data2": 320769454992901535 }, "Flags": 5, "Kind": 4, @@ -13514,10 +13160,8 @@ }, { "__Checksum": { - "Data1": -1540261735980052978, - "Data2": -9147956405661129836, - "Data3": -3616753714336438880, - "Data4": -630636648070150035 + "Data1": -3336760423546984242, + "Data2": -9194394427987756266 }, "Flags": 5, "Kind": 4, @@ -13615,10 +13259,8 @@ }, { "__Checksum": { - "Data1": -1782457299723888950, - "Data2": -7911177165840435108, - "Data3": -4340620100575106125, - "Data4": -4569229334554808420 + "Data1": -6807445774947076238, + "Data2": 3572748691312902886 }, "Flags": 5, "Kind": 4, @@ -13716,10 +13358,8 @@ }, { "__Checksum": { - "Data1": 6935887840393238911, - "Data2": 7013660388232414584, - "Data3": -1840901162040040911, - "Data4": -9127487483550433196 + "Data1": 2630845707094734711, + "Data2": -6452227201219639221 }, "Flags": 5, "Kind": 4, @@ -13817,10 +13457,8 @@ }, { "__Checksum": { - "Data1": 7034106118771929932, - "Data2": 3416667845952526735, - "Data3": 2980703467543628968, - "Data4": 8669330822860437413 + "Data1": -3082530260472701123, + "Data2": 8110662920478504505 }, "Flags": 5, "Kind": 4, @@ -13918,10 +13556,8 @@ }, { "__Checksum": { - "Data1": 600136993399585236, - "Data2": 1210877284947336046, - "Data3": -6449401044271821484, - "Data4": 1191511072431749116 + "Data1": 76549488304141629, + "Data2": 5933742443864533003 }, "Flags": 5, "Kind": 4, @@ -14019,10 +13655,8 @@ }, { "__Checksum": { - "Data1": -5573498153060579347, - "Data2": 8135370288187279748, - "Data3": -7113249105414572028, - "Data4": 2999421975961564546 + "Data1": 1230321638138191175, + "Data2": -8547618842017047312 }, "Flags": 5, "Kind": 4, @@ -14120,10 +13754,8 @@ }, { "__Checksum": { - "Data1": -4329051355715303605, - "Data2": 3955623575332919892, - "Data3": 6259774984846526464, - "Data4": -6800312027906067779 + "Data1": 8758288142973023616, + "Data2": -6353163368202708457 }, "Flags": 5, "Kind": 4, @@ -14221,10 +13853,8 @@ }, { "__Checksum": { - "Data1": 3992765514368773227, - "Data2": 712641669578973168, - "Data3": -3329211757490121545, - "Data4": 5962150082167093768 + "Data1": 126534683665358926, + "Data2": 201123528824816726 }, "Flags": 5, "Kind": 4, @@ -14322,10 +13952,8 @@ }, { "__Checksum": { - "Data1": 6714896013107681460, - "Data2": 7349248810078908157, - "Data3": 6259978925659348456, - "Data4": 8452156780865621248 + "Data1": -8762410813253593460, + "Data2": -3752370453060490260 }, "Flags": 5, "Kind": 4, @@ -14423,10 +14051,8 @@ }, { "__Checksum": { - "Data1": -8129753027300106065, - "Data2": 6803101048313929096, - "Data3": 2064429817254476022, - "Data4": -4031117533659337171 + "Data1": -982680018511413294, + "Data2": 2878983291702196905 }, "Flags": 5, "Kind": 4, @@ -14524,10 +14150,8 @@ }, { "__Checksum": { - "Data1": 1705196438689950506, - "Data2": 6582715361547788785, - "Data3": -4267350945778366115, - "Data4": 290601703112511537 + "Data1": 3590610975909435635, + "Data2": 4923743178350068476 }, "Flags": 5, "Kind": 4, @@ -14625,10 +14249,8 @@ }, { "__Checksum": { - "Data1": 6281433957991871957, - "Data2": -3213098429910391320, - "Data3": -7596133238842809641, - "Data4": 3463158101645518394 + "Data1": 5895572044455372317, + "Data2": -655559570194815600 }, "Flags": 5, "Kind": 4, @@ -14726,10 +14348,8 @@ }, { "__Checksum": { - "Data1": 2953345159606607792, - "Data2": -9105905134951745728, - "Data3": 4913029939639537940, - "Data4": 651176735460662163 + "Data1": 5735646289499511577, + "Data2": -4751846977832473690 }, "Flags": 5, "Kind": 4, @@ -14827,10 +14447,8 @@ }, { "__Checksum": { - "Data1": 2808495366912459532, - "Data2": 831933088497009102, - "Data3": 2210262347409378146, - "Data4": -7982165846050342605 + "Data1": -497823139067436785, + "Data2": 2338085920219026941 }, "Flags": 5, "Kind": 4, @@ -14928,10 +14546,8 @@ }, { "__Checksum": { - "Data1": -3238977062072772602, - "Data2": -8011372546635066226, - "Data3": -6206629709863800231, - "Data4": 3746054792319783403 + "Data1": -3930994529060056906, + "Data2": -5365271980323109943 }, "Flags": 5, "Kind": 4, @@ -15029,10 +14645,8 @@ }, { "__Checksum": { - "Data1": 8969920576165328943, - "Data2": -1112478264648760277, - "Data3": -2964159706602096502, - "Data4": 3277746102478860778 + "Data1": 325267014829487523, + "Data2": 2399850168392193179 }, "Flags": 5, "Kind": 4, @@ -15130,10 +14744,8 @@ }, { "__Checksum": { - "Data1": 7144937928133876024, - "Data2": -1967630456896294674, - "Data3": 7319663861393549842, - "Data4": 3635841637750737264 + "Data1": 1318869102094899459, + "Data2": -3793938845246552046 }, "Flags": 5, "Kind": 4, @@ -15231,10 +14843,8 @@ }, { "__Checksum": { - "Data1": -4511640894374702585, - "Data2": -202618793419057199, - "Data3": 8576468811585038931, - "Data4": 1204929980706507397 + "Data1": -3903046262960765723, + "Data2": -8437830507529713506 }, "Flags": 5, "Kind": 4, @@ -15332,10 +14942,8 @@ }, { "__Checksum": { - "Data1": 4660596162376775820, - "Data2": 4716473584448363268, - "Data3": 275952968705596907, - "Data4": -8623223615071202054 + "Data1": 1183786382875382798, + "Data2": 7848296092779037948 }, "Flags": 5, "Kind": 4, @@ -15433,10 +15041,8 @@ }, { "__Checksum": { - "Data1": -2490655987380912642, - "Data2": -4228065942301793822, - "Data3": -6055975435523410928, - "Data4": 406281525535892535 + "Data1": -1857232882165059864, + "Data2": -7063420490778249664 }, "Flags": 5, "Kind": 4, @@ -15534,10 +15140,8 @@ }, { "__Checksum": { - "Data1": -6176134446642694781, - "Data2": -8311691887658401280, - "Data3": 6293411010203555615, - "Data4": -8198125727126654490 + "Data1": 3883439516944597872, + "Data2": -2377805633189949861 }, "Flags": 5, "Kind": 4, @@ -15635,10 +15239,8 @@ }, { "__Checksum": { - "Data1": 5852174426714082352, - "Data2": 7645945726014091627, - "Data3": 275158531558947409, - "Data4": -3585076626147664026 + "Data1": -4597482657666382994, + "Data2": 7677262078046780951 }, "Flags": 5, "Kind": 8, @@ -15676,10 +15278,8 @@ }, { "__Checksum": { - "Data1": 7111257143471345004, - "Data2": -7368005426060992817, - "Data3": 8561403286818612234, - "Data4": 1155203437705440457 + "Data1": 6270467077199519879, + "Data2": 5436433919870108061 }, "Flags": 0, "Kind": 0, @@ -15761,10 +15361,8 @@ }, { "__Checksum": { - "Data1": -5202317581874141306, - "Data2": 7153719770723570118, - "Data3": -192280685818111630, - "Data4": -2871866187828849306 + "Data1": -5333220865028037292, + "Data2": 4187095657921170928 }, "Flags": 0, "Kind": 0, @@ -15794,10 +15392,8 @@ }, { "__Checksum": { - "Data1": 800145779148602690, - "Data2": -5519044733477542678, - "Data3": 3396797777611803766, - "Data4": 8155749636680384167 + "Data1": -195535995045211750, + "Data2": 4286730414041409569 }, "Flags": 0, "Kind": 0, @@ -15877,10 +15473,8 @@ }, { "__Checksum": { - "Data1": 8802937607804745674, - "Data2": 3510748622487356340, - "Data3": 8910466736838084068, - "Data4": -9214632590428027095 + "Data1": 5520854580336914339, + "Data2": -5487605090297695415 }, "Flags": 0, "Kind": 0, @@ -15955,10 +15549,8 @@ }, { "__Checksum": { - "Data1": -321430033406151831, - "Data2": 3854704093735503243, - "Data3": -7244292898294173765, - "Data4": 6426755274474175780 + "Data1": 7756696850093331139, + "Data2": -2428860665210870998 }, "Flags": 0, "Kind": 0, @@ -15988,10 +15580,8 @@ }, { "__Checksum": { - "Data1": 6222689879552679472, - "Data2": -6609422787227356830, - "Data3": -6067222566413183790, - "Data4": -7368323585199767494 + "Data1": 2629346708968669875, + "Data2": -2823582289670200573 }, "Flags": 0, "Kind": 0, @@ -16078,10 +15668,8 @@ }, { "__Checksum": { - "Data1": 13404850317431428, - "Data2": -3147748115280410806, - "Data3": -7566569171144864365, - "Data4": -8195840533837672018 + "Data1": -3242788691228023760, + "Data2": -1635270236015363021 }, "Flags": 0, "Kind": 0, @@ -16128,10 +15716,8 @@ }, { "__Checksum": { - "Data1": -2811856340009938182, - "Data2": 6384557261860365945, - "Data3": -5532977556231447595, - "Data4": 3549094012977503992 + "Data1": -6852729901914527739, + "Data2": 3270872555568006050 }, "Flags": 0, "Kind": 0, @@ -16161,10 +15747,8 @@ }, { "__Checksum": { - "Data1": 1933358610641671538, - "Data2": 5156401549053863096, - "Data3": 1918600565505302852, - "Data4": -787127714608661327 + "Data1": 2553559218468959463, + "Data2": 1503382618557205338 }, "Flags": 0, "Kind": 0, @@ -16218,10 +15802,8 @@ }, { "__Checksum": { - "Data1": 6186204511038121772, - "Data2": 5436037003485061458, - "Data3": -7325583263495126408, - "Data4": -3879585461794459330 + "Data1": 5910033445404538263, + "Data2": -2646730301798744319 }, "Flags": 0, "Kind": 0, @@ -16275,10 +15857,8 @@ }, { "__Checksum": { - "Data1": -6881181760690369304, - "Data2": -6723546205903919585, - "Data3": -2871668405074924365, - "Data4": -6595201330771037701 + "Data1": 10789589190507960, + "Data2": 7998225417953104157 }, "Flags": 0, "Kind": 0, @@ -16337,10 +15917,8 @@ }, { "__Checksum": { - "Data1": 268770953137608595, - "Data2": -7425651345797325116, - "Data3": -1258262681205172023, - "Data4": -2027082796881988317 + "Data1": 4275755887006437688, + "Data2": 3087965641086496630 }, "Flags": 0, "Kind": 0, @@ -16394,10 +15972,8 @@ }, { "__Checksum": { - "Data1": -8559160646337436616, - "Data2": 6328308714299132131, - "Data3": -3404551828655607631, - "Data4": 7772661860957787963 + "Data1": -7578671169645125385, + "Data2": 7742435022418562012 }, "Flags": 0, "Kind": 0, @@ -16451,10 +16027,8 @@ }, { "__Checksum": { - "Data1": 218100508814205090, - "Data2": 4707395721846489908, - "Data3": -1687092962580828916, - "Data4": 6992027604292993043 + "Data1": 5395770361097373511, + "Data2": 8865803058132394620 }, "Flags": 0, "Kind": 0, @@ -16508,10 +16082,8 @@ }, { "__Checksum": { - "Data1": -3887391553969973481, - "Data2": 5875438449707953287, - "Data3": 8715626038667973161, - "Data4": -2473201514447975534 + "Data1": 2336288128016282517, + "Data2": -1099123486509055069 }, "Flags": 0, "Kind": 0, @@ -16624,10 +16196,8 @@ }, { "__Checksum": { - "Data1": 1223075032570478283, - "Data2": 7985785809181034943, - "Data3": -725278812362600683, - "Data4": 909636113806676442 + "Data1": 3788663177289060764, + "Data2": 5832533073800337166 }, "Flags": 0, "Kind": 0, @@ -16681,10 +16251,8 @@ }, { "__Checksum": { - "Data1": -4457980582830921680, - "Data2": 4605128451757153176, - "Data3": 6323727449796091399, - "Data4": -110328916864396903 + "Data1": 5233493467131027895, + "Data2": 3653153209739206505 }, "Flags": 0, "Kind": 0, @@ -16738,10 +16306,8 @@ }, { "__Checksum": { - "Data1": -6522390343000837926, - "Data2": 7243153741614358032, - "Data3": -6316480788470983115, - "Data4": -6294935332895219954 + "Data1": -3620356997498272707, + "Data2": -4366927537049222448 }, "Flags": 0, "Kind": 0, @@ -16861,10 +16427,8 @@ }, { "__Checksum": { - "Data1": -7898139362512157618, - "Data2": 8244124631498224310, - "Data3": -333293058558666410, - "Data4": -3885524811232885873 + "Data1": -5783904617173450666, + "Data2": -9042329930025954222 }, "Flags": 0, "Kind": 0, @@ -17003,10 +16567,8 @@ }, { "__Checksum": { - "Data1": -5320367338475888969, - "Data2": -1627200452751741625, - "Data3": 4350905429646023472, - "Data4": -702129066726913504 + "Data1": 7364554597664108736, + "Data2": -5271379892142990168 }, "Flags": 0, "Kind": 0, @@ -17057,10 +16619,8 @@ }, { "__Checksum": { - "Data1": -7225731527971490381, - "Data2": -8525934964373994166, - "Data3": 2396527598494756308, - "Data4": 5239696375364710759 + "Data1": 4043158308720128035, + "Data2": 6234755872259425917 }, "Flags": 0, "Kind": 0, @@ -17107,10 +16667,8 @@ }, { "__Checksum": { - "Data1": 9157070855638627739, - "Data2": 2608206762232255482, - "Data3": 8939926568152312749, - "Data4": -3696547507422135350 + "Data1": -3233888748415756697, + "Data2": -2713850309973974875 }, "Flags": 0, "Kind": 0, @@ -17156,10 +16714,8 @@ }, { "__Checksum": { - "Data1": -3034588467567658249, - "Data2": -2764781644304958455, - "Data3": -1822273843097190371, - "Data4": -7353036640693475975 + "Data1": 7382754467299210202, + "Data2": 5903754543506572040 }, "Flags": 0, "Kind": 0, @@ -17254,10 +16810,8 @@ }, { "__Checksum": { - "Data1": -6212444251185450303, - "Data2": 6968614902014737847, - "Data3": 7792465343350850062, - "Data4": -1285414274430335056 + "Data1": 3593764775405513595, + "Data2": 8546138191138881112 }, "Flags": 0, "Kind": 0, @@ -17711,10 +17265,8 @@ }, { "__Checksum": { - "Data1": 6273444526279011736, - "Data2": -4548218127565157028, - "Data3": 7251088026410311986, - "Data4": 8904793659947262666 + "Data1": 3744304902684769131, + "Data2": 371537428611130071 }, "Flags": 0, "Kind": 0, @@ -17774,10 +17326,8 @@ }, { "__Checksum": { - "Data1": 5924604446885100544, - "Data2": 1716144632390678480, - "Data3": 5308111035918994922, - "Data4": 3998629358820207942 + "Data1": -3485935424555942306, + "Data2": 8796210904389244069 }, "Flags": 0, "Kind": 0, @@ -17915,10 +17465,8 @@ }, { "__Checksum": { - "Data1": -4853465430742037137, - "Data2": 6275749454847279743, - "Data3": 6434541506454993817, - "Data4": -1786946992905682432 + "Data1": -1332838943410657516, + "Data2": 5114908613674645966 }, "Flags": 0, "Kind": 0, @@ -18075,10 +17623,8 @@ }, { "__Checksum": { - "Data1": 4870467189018129497, - "Data2": 4781129063476417760, - "Data3": 2479356082350666956, - "Data4": 8711737039434484411 + "Data1": -5089267758009700289, + "Data2": 2442389771089049457 }, "Flags": 0, "Kind": 0, @@ -18125,10 +17671,8 @@ }, { "__Checksum": { - "Data1": 5581238020677498050, - "Data2": 6994084782641780089, - "Data3": 9048925667853730768, - "Data4": 3055241233733542122 + "Data1": -8369865712850384346, + "Data2": -3895122275825236596 }, "Flags": 0, "Kind": 0, @@ -18182,10 +17726,8 @@ }, { "__Checksum": { - "Data1": 8621211613522046809, - "Data2": -2779130344706104544, - "Data3": -8000885105050412337, - "Data4": 5790582114498891408 + "Data1": -7449216875981970817, + "Data2": -2296789638976302848 }, "Flags": 0, "Kind": 0, @@ -18310,10 +17852,8 @@ }, { "__Checksum": { - "Data1": 711901316677234202, - "Data2": 638459636323503151, - "Data3": 4537801910510622667, - "Data4": 7067183938978855876 + "Data1": 4283915737581180713, + "Data2": 8133129207726611322 }, "Flags": 0, "Kind": 0, @@ -18367,10 +17907,8 @@ }, { "__Checksum": { - "Data1": -1633022390707593310, - "Data2": 7185697464429773083, - "Data3": -4761408131528371400, - "Data4": 821091753501252125 + "Data1": 3881040700292602473, + "Data2": 6672623084129762296 }, "Flags": 0, "Kind": 0, @@ -18424,10 +17962,8 @@ }, { "__Checksum": { - "Data1": 6219014754306899515, - "Data2": -5103008498276210763, - "Data3": -5092158933856892653, - "Data4": 3529070139671510282 + "Data1": 8085138338635262988, + "Data2": -4981801590797023291 }, "Flags": 0, "Kind": 0, @@ -18551,10 +18087,8 @@ }, { "__Checksum": { - "Data1": 3673530515098912541, - "Data2": -448772150118781098, - "Data3": -1561076410203969649, - "Data4": 2390562608299979211 + "Data1": -8742932095581510073, + "Data2": 6572810591982313833 }, "Flags": 0, "Kind": 0, @@ -18584,10 +18118,8 @@ }, { "__Checksum": { - "Data1": -4626122554884254615, - "Data2": 3225481705702236422, - "Data3": 2034415947687817435, - "Data4": 1293921963591524464 + "Data1": 5003705107002649602, + "Data2": -3639117663262742864 }, "Flags": 0, "Kind": 0, @@ -18723,10 +18255,8 @@ }, { "__Checksum": { - "Data1": 152629735917237927, - "Data2": 2344514189352337112, - "Data3": 8052418113521476256, - "Data4": 935127514295283178 + "Data1": 2832263097256609185, + "Data2": -7158399789813840947 }, "Flags": 0, "Kind": 0, @@ -18815,10 +18345,8 @@ }, { "__Checksum": { - "Data1": 2181236722705079762, - "Data2": 7040012114089229151, - "Data3": -5711251196166596533, - "Data4": -7852793728535162170 + "Data1": -4457808114110304066, + "Data2": 6072963520292266150 }, "Flags": 0, "Kind": 0, @@ -18848,10 +18376,8 @@ }, { "__Checksum": { - "Data1": 1267757490609121516, - "Data2": -6634705929177991217, - "Data3": 9030824630870977144, - "Data4": 7891935294136308133 + "Data1": 7846512540775151055, + "Data2": -1720249495523466737 }, "Flags": 0, "Kind": 0, @@ -18884,10 +18410,8 @@ }, { "__Checksum": { - "Data1": 5274745441488702153, - "Data2": -147650005996684419, - "Data3": -7684094553803921069, - "Data4": 1570456728090188405 + "Data1": -7303945012410171566, + "Data2": -4566587783305935057 }, "Flags": 0, "Kind": 0, @@ -19021,10 +18545,8 @@ }, { "__Checksum": { - "Data1": -5364899641504460655, - "Data2": 4764317890266507149, - "Data3": 6721203681913965720, - "Data4": -1531886761392823782 + "Data1": -2066586671456843125, + "Data2": 2028049228600157861 }, "Flags": 0, "Kind": 0, @@ -19162,10 +18684,8 @@ }, { "__Checksum": { - "Data1": 5577165608097679256, - "Data2": 6911845832102902686, - "Data3": -4417131476212384460, - "Data4": 2374988073933342349 + "Data1": -5979020171185944874, + "Data2": 8499565838180598747 }, "Flags": 0, "Kind": 0, @@ -19295,10 +18815,8 @@ }, { "__Checksum": { - "Data1": 5646450225209122364, - "Data2": -2795351989738218313, - "Data3": 3641129799102725501, - "Data4": 7417278630720646392 + "Data1": -5161560935417216372, + "Data2": 4787839166437078461 }, "Flags": 0, "Kind": 0, @@ -19436,10 +18954,8 @@ }, { "__Checksum": { - "Data1": -9140565232962298136, - "Data2": -3448334486613222290, - "Data3": 1602707603562462806, - "Data4": 2125730322623527492 + "Data1": -2578102511954748589, + "Data2": 290978375392882188 }, "Flags": 0, "Kind": 0, @@ -19523,10 +19039,8 @@ }, { "__Checksum": { - "Data1": -4952844906423203115, - "Data2": -4807637235587121384, - "Data3": 227720720305710389, - "Data4": 2607638774025325035 + "Data1": 5540887050848239871, + "Data2": 6891669521697531361 }, "Flags": 0, "Kind": 0, @@ -19556,10 +19070,8 @@ }, { "__Checksum": { - "Data1": 6024546322894904447, - "Data2": -8481740356688878725, - "Data3": -6620809497539773118, - "Data4": 8845605702165764449 + "Data1": -1444900290438270250, + "Data2": -2936043647167618020 }, "Flags": 0, "Kind": 0, @@ -19647,10 +19159,8 @@ }, { "__Checksum": { - "Data1": -7646814193378765886, - "Data2": -9191192861078758120, - "Data3": -4920497920516093865, - "Data4": 1804423561022950619 + "Data1": -2085353458980109880, + "Data2": -3338947499350416525 }, "Flags": 0, "Kind": 0, @@ -19709,10 +19219,8 @@ }, { "__Checksum": { - "Data1": -7566264095730061905, - "Data2": -6990254044301208120, - "Data3": 2836315077509033568, - "Data4": 612545240091128016 + "Data1": 7304896722013752440, + "Data2": -4299361158739693835 }, "Flags": 0, "Kind": 0, @@ -19759,10 +19267,8 @@ }, { "__Checksum": { - "Data1": 647459563645317206, - "Data2": 3254465148168218438, - "Data3": 5320322154250841306, - "Data4": 8951496602957750052 + "Data1": -628126597364668328, + "Data2": -1854819843195063813 }, "Flags": 0, "Kind": 0, @@ -19816,10 +19322,8 @@ }, { "__Checksum": { - "Data1": -9119629949993490240, - "Data2": -3659335129706878281, - "Data3": 6538803913390179205, - "Data4": 1090861479121084014 + "Data1": 8931709779894519918, + "Data2": 7527916603367299649 }, "Flags": 0, "Kind": 0, @@ -19866,10 +19370,8 @@ }, { "__Checksum": { - "Data1": -6500020958537915302, - "Data2": 3606692933451190253, - "Data3": -6020637620918481362, - "Data4": 7946980568323211729 + "Data1": 8839085297513637177, + "Data2": 5054888731807304886 }, "Flags": 0, "Kind": 0, @@ -20059,10 +19561,8 @@ }, { "__Checksum": { - "Data1": 4224542196797236940, - "Data2": -3919879895378786400, - "Data3": 7193629402584298102, - "Data4": -4727790656753752554 + "Data1": 3345811476273544479, + "Data2": 8477379610652048586 }, "Flags": 0, "Kind": 0, @@ -20152,10 +19652,8 @@ }, { "__Checksum": { - "Data1": -1758408328236062316, - "Data2": -486419675528812468, - "Data3": -7737697237251570400, - "Data4": 8597540217923103759 + "Data1": 4869643752850211590, + "Data2": -7917642543766378222 }, "Flags": 0, "Kind": 0, @@ -20237,10 +19735,8 @@ }, { "__Checksum": { - "Data1": -6617037737461879868, - "Data2": -2113560975375483172, - "Data3": 182965841994589040, - "Data4": 125827646827015139 + "Data1": -2191028018933342168, + "Data2": -2080839777781124650 }, "Flags": 0, "Kind": 0, @@ -20330,10 +19826,8 @@ }, { "__Checksum": { - "Data1": 2567730962270646348, - "Data2": 1873271305104352480, - "Data3": 8443357163461968591, - "Data4": 274236633296277471 + "Data1": -2142748436251947606, + "Data2": 1931609551015828781 }, "Flags": 0, "Kind": 0, @@ -20393,10 +19887,8 @@ }, { "__Checksum": { - "Data1": 3583906527340670918, - "Data2": -3445540743772801673, - "Data3": 6066152997169569978, - "Data4": 3897638805687321712 + "Data1": 3946657269476064980, + "Data2": 5921145626574895991 }, "Flags": 0, "Kind": 0, @@ -20568,10 +20060,8 @@ }, { "__Checksum": { - "Data1": 5221451861912447169, - "Data2": -2307824317306885128, - "Data3": 719172212331335420, - "Data4": -3661112911984540248 + "Data1": -2705140262457152302, + "Data2": 4230081617762312206 }, "Flags": 0, "Kind": 0, @@ -20661,10 +20151,8 @@ }, { "__Checksum": { - "Data1": -6012834211247805114, - "Data2": -2043117952686556527, - "Data3": 8853337808203135672, - "Data4": 8136855089324400882 + "Data1": -2836200231587536645, + "Data2": -607861160301887923 }, "Flags": 0, "Kind": 0, @@ -20732,10 +20220,8 @@ }, { "__Checksum": { - "Data1": 7956960486775568274, - "Data2": 4509427542212899330, - "Data3": -3293799242357917053, - "Data4": 7043232219153152452 + "Data1": -1549800219388398783, + "Data2": 8563960884527529873 }, "Flags": 0, "Kind": 0, @@ -20782,10 +20268,8 @@ }, { "__Checksum": { - "Data1": -7820507385360378495, - "Data2": 419282184943790058, - "Data3": -2482702957871598666, - "Data4": 7356083036356565654 + "Data1": -1908914557278440764, + "Data2": 1496194287162382518 }, "Flags": 0, "Kind": 0, @@ -20839,10 +20323,8 @@ }, { "__Checksum": { - "Data1": -5393913606346998838, - "Data2": -8749609558442066766, - "Data3": -541031120579221193, - "Data4": 7650234405197915992 + "Data1": -3241721563858366604, + "Data2": 1195961167459520763 }, "Flags": 0, "Kind": 0, @@ -20943,10 +20425,8 @@ }, { "__Checksum": { - "Data1": -4950891619711705813, - "Data2": 7855355811649607973, - "Data3": -8921758193315373074, - "Data4": -5472128593607818124 + "Data1": 8137964464184652589, + "Data2": -6789174441139211840 }, "Flags": 0, "Kind": 0, @@ -21000,10 +20480,8 @@ }, { "__Checksum": { - "Data1": 2692338158620160172, - "Data2": -1348123350798656263, - "Data3": 5118503610952405832, - "Data4": 6574936741978069171 + "Data1": 5751076891200700454, + "Data2": -7494874043898873875 }, "Flags": 0, "Kind": 0, @@ -21057,10 +20535,8 @@ }, { "__Checksum": { - "Data1": -539227078256878706, - "Data2": -5321852144518444900, - "Data3": 5350477644049988204, - "Data4": 1295097721448027110 + "Data1": 7793535077027501198, + "Data2": 7715745682278892240 }, "Flags": 0, "Kind": 0, @@ -21100,10 +20576,8 @@ }, { "__Checksum": { - "Data1": 922703027896659803, - "Data2": 3242940863139758587, - "Data3": -8940119893972862088, - "Data4": 7456468120908654053 + "Data1": -5568995535444791142, + "Data2": -1938578509631998974 }, "Flags": 0, "Kind": 0, @@ -21223,10 +20697,8 @@ }, { "__Checksum": { - "Data1": -2675061525329669468, - "Data2": 2790641418296272062, - "Data3": 6554556571989676379, - "Data4": 7515889216067946354 + "Data1": -5765867837169970218, + "Data2": 8190955905591479230 }, "Flags": 0, "Kind": 0, @@ -21280,10 +20752,8 @@ }, { "__Checksum": { - "Data1": -4890129648930629378, - "Data2": -6058696747040440057, - "Data3": 1330103245247828882, - "Data4": -8296800928495089870 + "Data1": -7789899685532939821, + "Data2": -9150143776627439155 }, "Flags": 0, "Kind": 0, @@ -21351,10 +20821,8 @@ }, { "__Checksum": { - "Data1": -2908283684343467191, - "Data2": 394606266063567240, - "Data3": -4675688660018681247, - "Data4": 5139664994184714985 + "Data1": -3227278563013033598, + "Data2": -4050531391041309142 }, "Flags": 0, "Kind": 0, @@ -21422,10 +20890,8 @@ }, { "__Checksum": { - "Data1": -7638007670644146151, - "Data2": -2590011861875146972, - "Data3": 1784877029133290880, - "Data4": 453254262866308860 + "Data1": 1732856291218628692, + "Data2": 8732208959271662791 }, "Flags": 0, "Kind": 0, @@ -21493,10 +20959,8 @@ }, { "__Checksum": { - "Data1": -2679388009181869695, - "Data2": -6363387446118189349, - "Data3": 4877214905492412717, - "Data4": 6389893385271039456 + "Data1": 328355629168624087, + "Data2": -5738595934011070540 }, "Flags": 0, "Kind": 0, @@ -21564,10 +21028,8 @@ }, { "__Checksum": { - "Data1": 503465486749511880, - "Data2": 2857303332232817891, - "Data3": -4904297874512603529, - "Data4": -6734266265999033732 + "Data1": 7939571107657263454, + "Data2": 4531520989503940604 }, "Flags": 0, "Kind": 0, @@ -21621,10 +21083,8 @@ }, { "__Checksum": { - "Data1": -148600020117555950, - "Data2": 6683379577064265863, - "Data3": 333553543077637388, - "Data4": 1315034141000254629 + "Data1": 3570508515253993102, + "Data2": -7902130786345688479 }, "Flags": 0, "Kind": 0, @@ -21654,10 +21114,8 @@ }, { "__Checksum": { - "Data1": 8112707653413001509, - "Data2": -4144662807058606519, - "Data3": 8809367713835930987, - "Data4": -2636239948069751185 + "Data1": -3491029122743833126, + "Data2": 1782445722874792545 }, "Flags": 0, "Kind": 0, @@ -21791,10 +21249,8 @@ }, { "__Checksum": { - "Data1": -212895588000082511, - "Data2": 1568550122789994024, - "Data3": 4310981824933063485, - "Data4": 6059171796747893907 + "Data1": -8523636118137331815, + "Data2": 3760828651798964703 }, "Flags": 0, "Kind": 0, @@ -21841,10 +21297,8 @@ }, { "__Checksum": { - "Data1": 21341986506808760, - "Data2": 4165220743721674530, - "Data3": 6665431404240269683, - "Data4": -4094910219417202338 + "Data1": 6668261520660651051, + "Data2": -4364812401260865499 }, "Flags": 0, "Kind": 0, @@ -21898,10 +21352,8 @@ }, { "__Checksum": { - "Data1": -733971507602138394, - "Data2": -5083492806073039352, - "Data3": 9113590430602713198, - "Data4": 629203983695302833 + "Data1": 8155664887767679957, + "Data2": 628715943876994832 }, "Flags": 0, "Kind": 0, @@ -21955,10 +21407,8 @@ }, { "__Checksum": { - "Data1": 129659066695135267, - "Data2": -5746851557391599598, - "Data3": 4974184500604239182, - "Data4": -7785137943325446851 + "Data1": 838409875990041930, + "Data2": -5942969893369468306 }, "Flags": 0, "Kind": 0, @@ -22057,10 +21507,8 @@ }, { "__Checksum": { - "Data1": -3550528503114758869, - "Data2": -5409663076086348609, - "Data3": 1140759024322115675, - "Data4": -5875785240572455121 + "Data1": 3923405130981421545, + "Data2": -4442324143077394421 }, "Flags": 0, "Kind": 0, @@ -22142,10 +21590,8 @@ }, { "__Checksum": { - "Data1": 3769091630941643800, - "Data2": 7514662703697143206, - "Data3": -2330732602753918759, - "Data4": -8614058866396342268 + "Data1": -9109128975718529941, + "Data2": -2882339780628456741 }, "Flags": 0, "Kind": 0, @@ -22213,10 +21659,8 @@ }, { "__Checksum": { - "Data1": -2334823182612200259, - "Data2": -5095410215783015465, - "Data3": -9012777489083006520, - "Data4": -6742196409237774648 + "Data1": 1649359202384631792, + "Data2": 5155304842618096395 }, "Flags": 0, "Kind": 0, @@ -22263,10 +21707,8 @@ }, { "__Checksum": { - "Data1": 5801284980309305246, - "Data2": -7812998668956376044, - "Data3": -4302337669237539682, - "Data4": -5789055127352309184 + "Data1": -6758410325789919384, + "Data2": -1564733056821571784 }, "Flags": 0, "Kind": 0, @@ -22320,10 +21762,8 @@ }, { "__Checksum": { - "Data1": 5428479185097338395, - "Data2": -5319709618699634230, - "Data3": -1396394894894962268, - "Data4": 4567982593267231934 + "Data1": 8480450600277813852, + "Data2": -6994732145858868682 }, "Flags": 0, "Kind": 0, @@ -22431,10 +21871,8 @@ }, { "__Checksum": { - "Data1": -4683917506230294981, - "Data2": 4077345862486246434, - "Data3": 344679666126044994, - "Data4": -8963326723511055659 + "Data1": -7058426979796575236, + "Data2": -3379620549149760016 }, "Flags": 0, "Kind": 0, @@ -22481,10 +21919,8 @@ }, { "__Checksum": { - "Data1": -6239298320665730037, - "Data2": 8462458805835875395, - "Data3": 2905216255680571514, - "Data4": 8729471159814365929 + "Data1": 11428509622817066, + "Data2": 6711649738511788265 }, "Flags": 0, "Kind": 0, @@ -22545,10 +21981,8 @@ }, { "__Checksum": { - "Data1": -1842730227692955398, - "Data2": -1881029171174544624, - "Data3": -6222825632411300524, - "Data4": -3900889435719734656 + "Data1": 2090707678803055059, + "Data2": -8554805487421730400 }, "Flags": 0, "Kind": 0, @@ -22602,10 +22036,8 @@ }, { "__Checksum": { - "Data1": -898518556851495624, - "Data2": 8659035244040608259, - "Data3": -7607728576226741390, - "Data4": 4872146073819664070 + "Data1": 2735071528695877553, + "Data2": -1912742583628955659 }, "Flags": 0, "Kind": 0, @@ -22659,10 +22091,8 @@ }, { "__Checksum": { - "Data1": -4081675664913442053, - "Data2": -6483750596892050344, - "Data3": 855703670902756472, - "Data4": 430233660366198000 + "Data1": -1636819140904511674, + "Data2": -6010140653681879527 }, "Flags": 0, "Kind": 0, @@ -22702,10 +22132,8 @@ }, { "__Checksum": { - "Data1": 3788734173633262293, - "Data2": -7761009312992281291, - "Data3": -8214282998233156420, - "Data4": -6238525455048048595 + "Data1": 4962255652967885183, + "Data2": -8317899957155715157 }, "Flags": 0, "Kind": 0, @@ -22863,10 +22291,8 @@ }, { "__Checksum": { - "Data1": 4206516486436858815, - "Data2": -500747383373963380, - "Data3": -5546988346415529369, - "Data4": -8883225636681527536 + "Data1": 598381016640660714, + "Data2": -6374483675003564389 }, "Flags": 0, "Kind": 0, @@ -22920,10 +22346,8 @@ }, { "__Checksum": { - "Data1": -1376134513813947421, - "Data2": -6016175081454046510, - "Data3": 3423420151308410511, - "Data4": 2601889312210464257 + "Data1": 6464284380765557546, + "Data2": 1333899765964517176 }, "Flags": 0, "Kind": 0, @@ -22991,10 +22415,8 @@ }, { "__Checksum": { - "Data1": 907434740005201053, - "Data2": 1302660898969365403, - "Data3": 5970933478601699150, - "Data4": -8326015467289642764 + "Data1": -6795821764898958436, + "Data2": -4959599594946469576 }, "Flags": 0, "Kind": 0, @@ -23062,10 +22484,8 @@ }, { "__Checksum": { - "Data1": 2355752401813817633, - "Data2": 8846612964601587961, - "Data3": -1018031592959758267, - "Data4": -5031982490417487310 + "Data1": 6516664656447713944, + "Data2": -7210506029771670749 }, "Flags": 0, "Kind": 0, @@ -23133,10 +22553,8 @@ }, { "__Checksum": { - "Data1": -4315166097499438634, - "Data2": 4425878760891446854, - "Data3": 5101188090390939852, - "Data4": 4996257560796067407 + "Data1": 6206891246062890933, + "Data2": 2098749940260859026 }, "Flags": 0, "Kind": 0, @@ -23204,10 +22622,8 @@ }, { "__Checksum": { - "Data1": -7331879345855936511, - "Data2": -24928701010319323, - "Data3": -6087882146768813174, - "Data4": -7125163396360514758 + "Data1": -5701264311532602028, + "Data2": 3026598112884793279 }, "Flags": 0, "Kind": 0, @@ -23247,10 +22663,8 @@ }, { "__Checksum": { - "Data1": -4217145231061429363, - "Data2": -244160752848791528, - "Data3": -5436075718045375487, - "Data4": 2534369513075980274 + "Data1": 6921185629130607737, + "Data2": -3356897430858395275 }, "Flags": 0, "Kind": 0, @@ -23311,10 +22725,8 @@ }, { "__Checksum": { - "Data1": -3565336707331453467, - "Data2": 6292233393664840211, - "Data3": 4053558514680341006, - "Data4": 7294354308700647441 + "Data1": 8688181754092007507, + "Data2": -7624754959445062766 }, "Flags": 0, "Kind": 0, @@ -23361,10 +22773,8 @@ }, { "__Checksum": { - "Data1": -252634679889644581, - "Data2": -5140039610637144602, - "Data3": -812627308678368672, - "Data4": 7140431907555559485 + "Data1": 3890772348577636397, + "Data2": 1314839844551661852 }, "Flags": 0, "Kind": 0, @@ -23474,10 +22884,8 @@ }, { "__Checksum": { - "Data1": 179558927095162863, - "Data2": 1638231826300941133, - "Data3": 6564221080252839264, - "Data4": 6783765470698586082 + "Data1": -6755975591243787041, + "Data2": 6837277432411825158 }, "Flags": 0, "Kind": 0, @@ -23531,10 +22939,8 @@ }, { "__Checksum": { - "Data1": 5865904033907987087, - "Data2": 5718111124623041956, - "Data3": -5498970288784076772, - "Data4": -2755182810169141426 + "Data1": -8588462169791611918, + "Data2": -586225233406632303 }, "Flags": 0, "Kind": 0, @@ -23591,10 +22997,8 @@ }, { "__Checksum": { - "Data1": 6829606367911851775, - "Data2": -6412692058644028988, - "Data3": -6337842364311159159, - "Data4": -5098281728905215642 + "Data1": 4062460950586105320, + "Data2": -2267432369643045931 }, "Flags": 0, "Kind": 0, @@ -23641,10 +23045,8 @@ }, { "__Checksum": { - "Data1": 9144993265249748365, - "Data2": 5844644219793707550, - "Data3": 7242460564411645112, - "Data4": 1131085486131944732 + "Data1": 8145416297874858012, + "Data2": 1479296447059581917 }, "Flags": 0, "Kind": 0, @@ -23698,10 +23100,8 @@ }, { "__Checksum": { - "Data1": -1722806720188213967, - "Data2": 3435729784246929235, - "Data3": -4559328596491597837, - "Data4": 7960959974104258130 + "Data1": 5877134744296493502, + "Data2": 1089703037509561602 }, "Flags": 0, "Kind": 0, @@ -23755,10 +23155,8 @@ }, { "__Checksum": { - "Data1": -8022016458920572751, - "Data2": -7723364668364130997, - "Data3": -424172396492512141, - "Data4": 8199854292264045267 + "Data1": 5983390123940670765, + "Data2": -8499417091519245413 }, "Flags": 0, "Kind": 0, @@ -23864,10 +23262,8 @@ }, { "__Checksum": { - "Data1": -7117015032454682940, - "Data2": -5077643410061167990, - "Data3": -5979653079444799152, - "Data4": 2704021550052661151 + "Data1": 1857878582440225076, + "Data2": 6070894625445307042 }, "Flags": 0, "Kind": 0, @@ -23921,10 +23317,8 @@ }, { "__Checksum": { - "Data1": 2670907571168949205, - "Data2": -8965215716369637417, - "Data3": -6517024852455433769, - "Data4": -7691112360049864173 + "Data1": -3898488850182459723, + "Data2": -3265083790302408398 }, "Flags": 0, "Kind": 0, @@ -23954,10 +23348,8 @@ }, { "__Checksum": { - "Data1": 2919329276518686048, - "Data2": 4437195890710458938, - "Data3": -8784065578637792246, - "Data4": 5053393759435553038 + "Data1": 1349563168944534464, + "Data2": 631938934953564083 }, "Flags": 0, "Kind": 0, @@ -24004,10 +23396,8 @@ }, { "__Checksum": { - "Data1": -6556499570799349866, - "Data2": 6431984795065801483, - "Data3": -2074092163552581085, - "Data4": 5374794313096326979 + "Data1": 2652413487192029063, + "Data2": -1550307960906412096 }, "Flags": 0, "Kind": 0, @@ -24068,10 +23458,8 @@ }, { "__Checksum": { - "Data1": 8480892463330340453, - "Data2": 7539361439309001355, - "Data3": -1889736784295136073, - "Data4": -8996442795027141115 + "Data1": 4271676120578140089, + "Data2": -8608559732970679457 }, "Flags": 0, "Kind": 0, @@ -24125,10 +23513,8 @@ }, { "__Checksum": { - "Data1": -8135941702896074014, - "Data2": 8999969380573657113, - "Data3": 2045907905618934053, - "Data4": 6717843034411558419 + "Data1": -3174368567128229264, + "Data2": 692748738433010783 }, "Flags": 0, "Kind": 0, @@ -24182,10 +23568,8 @@ }, { "__Checksum": { - "Data1": -2621694615755267530, - "Data2": 341705381421966861, - "Data3": -422699105300404787, - "Data4": 8731868291470982014 + "Data1": -2266634554708951010, + "Data2": 6916966457398968999 }, "Flags": 0, "Kind": 0, @@ -24225,10 +23609,8 @@ }, { "__Checksum": { - "Data1": -6162728996201676664, - "Data2": 3801472848869971570, - "Data3": -4182369123932616468, - "Data4": 286091503915023568 + "Data1": -1275925811737366167, + "Data2": 2947522225051108373 }, "Flags": 0, "Kind": 0, @@ -24365,10 +23747,8 @@ }, { "__Checksum": { - "Data1": -8837202848120890584, - "Data2": 8875858793012002259, - "Data3": -8515919615408918898, - "Data4": 8286505710836760312 + "Data1": -4290309207973598313, + "Data2": -7557304027596081305 }, "Flags": 0, "Kind": 0, @@ -24408,10 +23788,8 @@ }, { "__Checksum": { - "Data1": -4344273393617992639, - "Data2": -4365259642870392699, - "Data3": -4184226916291414968, - "Data4": 5798967620710761720 + "Data1": 2879946300519954266, + "Data2": 5121566011148040724 }, "Flags": 0, "Kind": 0, @@ -24472,10 +23850,8 @@ }, { "__Checksum": { - "Data1": 1836519771424790389, - "Data2": -4872950344816983265, - "Data3": 6669436038991732510, - "Data4": -1468082979508555523 + "Data1": -4433437062292512153, + "Data2": 2160897615840510613 }, "Flags": 0, "Kind": 0, @@ -24708,10 +24084,8 @@ }, { "__Checksum": { - "Data1": 5199944838976006594, - "Data2": 4007101254810437803, - "Data3": 6090989587223971368, - "Data4": -648145136491896209 + "Data1": 3527827789938207212, + "Data2": -3214545690236973872 }, "Flags": 0, "Kind": 0, @@ -24751,10 +24125,8 @@ }, { "__Checksum": { - "Data1": 9036827718374445953, - "Data2": 550882059903026640, - "Data3": 4679100303019830484, - "Data4": 5062426073934406311 + "Data1": 3977675024952893510, + "Data2": 3252590283459799752 }, "Flags": 0, "Kind": 0, @@ -24801,10 +24173,8 @@ }, { "__Checksum": { - "Data1": 4606913599014821776, - "Data2": -1742580466127879314, - "Data3": -4756237616638585234, - "Data4": 8466701857401148533 + "Data1": -3888310247708387137, + "Data2": -3090543984299363061 }, "Flags": 0, "Kind": 0, @@ -24858,10 +24228,8 @@ }, { "__Checksum": { - "Data1": -3033616768030345393, - "Data2": -6681501218583113283, - "Data3": 2859523206310007378, - "Data4": 608653453084494183 + "Data1": -43760720197532707, + "Data2": 2610980388012948177 }, "Flags": 0, "Kind": 0, @@ -24915,10 +24283,8 @@ }, { "__Checksum": { - "Data1": 5457220036169869457, - "Data2": 6865721294083217037, - "Data3": 6925837508904067267, - "Data4": -2491323053902709249 + "Data1": 7311630847991261292, + "Data2": 5010395414048035545 }, "Flags": 0, "Kind": 0, @@ -25017,10 +24383,8 @@ }, { "__Checksum": { - "Data1": -4927773496492575072, - "Data2": -6313420468846258516, - "Data3": -6578641020063850558, - "Data4": 9101304332852262758 + "Data1": 263938476031170165, + "Data2": -3467281525468294257 }, "Flags": 0, "Kind": 0, @@ -25067,10 +24431,8 @@ }, { "__Checksum": { - "Data1": 2989492404611213261, - "Data2": 3177451639722040116, - "Data3": 1777470139070356163, - "Data4": 1225188841551547926 + "Data1": -59242010789758434, + "Data2": -907454513996183818 }, "Flags": 0, "Kind": 0, @@ -25124,10 +24486,8 @@ }, { "__Checksum": { - "Data1": -684505258434743781, - "Data2": 1219735490743514148, - "Data3": -2852386120539589960, - "Data4": -563608060710845057 + "Data1": -6411998509421484054, + "Data2": 3740197977209445458 }, "Flags": 0, "Kind": 0, @@ -25205,10 +24565,8 @@ }, { "__Checksum": { - "Data1": 8160981772147432145, - "Data2": 7248054433289348816, - "Data3": -8302089302759718711, - "Data4": 2859249487257443179 + "Data1": 8868320827110312182, + "Data2": -6806718679259071643 }, "Flags": 0, "Kind": 0, @@ -25255,10 +24613,8 @@ }, { "__Checksum": { - "Data1": -4290937599517485817, - "Data2": 1095437509972052315, - "Data3": 6527937612756834457, - "Data4": -7170005009433488494 + "Data1": 716374751707008051, + "Data2": -3110388735871225501 }, "Flags": 0, "Kind": 0, @@ -25326,10 +24682,8 @@ }, { "__Checksum": { - "Data1": 4675432417256970932, - "Data2": -3700087745127002662, - "Data3": -2212981019834482050, - "Data4": 666904672954914401 + "Data1": 6120996139269028408, + "Data2": -7489736762594476019 }, "Flags": 0, "Kind": 0, @@ -25360,10 +24714,8 @@ }, { "__Checksum": { - "Data1": -1711295869258706245, - "Data2": -3929603630825026516, - "Data3": 3390375438776470686, - "Data4": 6121195108790922398 + "Data1": -524824980430415785, + "Data2": 3943206152032442809 }, "Flags": 0, "Kind": 0, @@ -25403,10 +24755,8 @@ }, { "__Checksum": { - "Data1": 1900590456816054504, - "Data2": -8721434195936449827, - "Data3": 6327163693708368851, - "Data4": 6426616339021644465 + "Data1": -9201725326406018755, + "Data2": -5200672660548892500 }, "Flags": 0, "Kind": 0, @@ -25460,10 +24810,8 @@ }, { "__Checksum": { - "Data1": 7502185662520166230, - "Data2": 7097275745947847645, - "Data3": 7960956097365088178, - "Data4": 1396108873900057963 + "Data1": 7668900518177547074, + "Data2": -1645580294822596174 }, "Flags": 0, "Kind": 0, @@ -25517,10 +24865,8 @@ }, { "__Checksum": { - "Data1": -6153116986066933736, - "Data2": 694714473670978576, - "Data3": -4152281386879353043, - "Data4": 6499637438794482096 + "Data1": 3211394991120232750, + "Data2": 1360909087166936840 }, "Flags": 0, "Kind": 0, @@ -25600,10 +24946,8 @@ }, { "__Checksum": { - "Data1": 1406829107953876454, - "Data2": -5006924700224256365, - "Data3": -724562774864475570, - "Data4": 521434975771345056 + "Data1": 5484682907191465402, + "Data2": 6021956630134150151 }, "Flags": 0, "Kind": 0, @@ -25657,10 +25001,8 @@ }, { "__Checksum": { - "Data1": 5447055447847464787, - "Data2": 9200419255129071364, - "Data3": 2882522480077099264, - "Data4": -3519487258514970250 + "Data1": 2602388318187075574, + "Data2": -9081462017335789416 }, "Flags": 0, "Kind": 0, @@ -25714,10 +25056,8 @@ }, { "__Checksum": { - "Data1": 2439721346159474675, - "Data2": 4213161122423335609, - "Data3": 8757064700575163489, - "Data4": -4020815415300326720 + "Data1": 769481625830615201, + "Data2": -5605529713809839334 }, "Flags": 0, "Kind": 0, @@ -25869,10 +25209,8 @@ }, { "__Checksum": { - "Data1": -999743452259484654, - "Data2": 7379238362401494911, - "Data3": 4489339078824812238, - "Data4": 2790363727649779970 + "Data1": 8181007147024667451, + "Data2": -6176707266953811369 }, "Flags": 0, "Kind": 0, @@ -25919,10 +25257,8 @@ }, { "__Checksum": { - "Data1": -7925885201640646316, - "Data2": -3666940268196843964, - "Data3": -1201267986629746248, - "Data4": 8455646614673100891 + "Data1": -8150464661758078991, + "Data2": -910682451249657909 }, "Flags": 0, "Kind": 0, @@ -25976,10 +25312,8 @@ }, { "__Checksum": { - "Data1": 4321631731764782271, - "Data2": 7276180869775502509, - "Data3": 6641256494026526874, - "Data4": 396368591696743596 + "Data1": -3797045667743547540, + "Data2": 6334825143728560691 }, "Flags": 0, "Kind": 0, @@ -26033,10 +25367,8 @@ }, { "__Checksum": { - "Data1": 1233132227059032464, - "Data2": -9150234662464400494, - "Data3": 3472678495931205144, - "Data4": -2961927784433705227 + "Data1": 8811144268807365644, + "Data2": 4939194487737988173 }, "Flags": 0, "Kind": 0, @@ -26128,10 +25460,8 @@ }, { "__Checksum": { - "Data1": 5788953809447381636, - "Data2": 2262780182017894309, - "Data3": -8060206237547051946, - "Data4": 3048757207016619149 + "Data1": 113878718261753212, + "Data2": 6712266510407624448 }, "Flags": 0, "Kind": 0, @@ -26178,10 +25508,8 @@ }, { "__Checksum": { - "Data1": -807133923176775219, - "Data2": -3709770854040190136, - "Data3": -1113486634661904530, - "Data4": -660485010529351686 + "Data1": 794454084461587578, + "Data2": -6035771709293775195 }, "Flags": 0, "Kind": 0, @@ -26228,10 +25556,8 @@ }, { "__Checksum": { - "Data1": 9189385961570136274, - "Data2": 6077430782809013570, - "Data3": -4436232508577224241, - "Data4": 1316660875178492215 + "Data1": -1011030357191426234, + "Data2": -6294929179115357598 }, "Flags": 0, "Kind": 0, @@ -26285,10 +25611,8 @@ }, { "__Checksum": { - "Data1": 4184442113730396023, - "Data2": 6542883733110908316, - "Data3": -6132259478986170773, - "Data4": 5245641155998963912 + "Data1": -1813126612209199168, + "Data2": 2952342701286063078 }, "Flags": 0, "Kind": 0, @@ -26342,10 +25666,8 @@ }, { "__Checksum": { - "Data1": -1047464598932381636, - "Data2": 7919900364053566747, - "Data3": -2434732797783533532, - "Data4": 12210102830013523 + "Data1": -4507695328214393662, + "Data2": 2702340685960794590 }, "Flags": 0, "Kind": 0, @@ -26414,10 +25736,8 @@ }, { "__Checksum": { - "Data1": -6660618134935638909, - "Data2": 2145484325307272702, - "Data3": -9058171079359385825, - "Data4": 7976939339662875650 + "Data1": 2761466886716005457, + "Data2": -7644506716598854016 }, "Flags": 0, "Kind": 0, @@ -26464,10 +25784,8 @@ }, { "__Checksum": { - "Data1": -1534917228163120389, - "Data2": 7505206828768377036, - "Data3": 3492579137227475615, - "Data4": 2721399602680438444 + "Data1": 4864117926227799780, + "Data2": 6061398113641315408 }, "Flags": 0, "Kind": 0, @@ -26521,10 +25839,8 @@ }, { "__Checksum": { - "Data1": -4938908004884346136, - "Data2": -3181000119810379340, - "Data3": 4121701677267200947, - "Data4": -6639758466226673773 + "Data1": 891377798089754679, + "Data2": 217326483147441753 }, "Flags": 0, "Kind": 0, @@ -26597,10 +25913,8 @@ }, { "__Checksum": { - "Data1": -8052534733123264844, - "Data2": 2421221748115620276, - "Data3": 1567983363285158066, - "Data4": -682108522985380655 + "Data1": 5466182494415597768, + "Data2": -2749902862385151937 }, "Flags": 0, "Kind": 0, @@ -26654,10 +25968,8 @@ }, { "__Checksum": { - "Data1": 1289765902541212127, - "Data2": -4853925300119098072, - "Data3": 3802574055614682526, - "Data4": -9112427768414098061 + "Data1": -6630268742905813742, + "Data2": -8996733619601481853 }, "Flags": 0, "Kind": 0, @@ -26711,10 +26023,8 @@ }, { "__Checksum": { - "Data1": -4051648520735442222, - "Data2": 690021266917753054, - "Data3": 2683307446691125216, - "Data4": -853136510188294489 + "Data1": -5580796797698649655, + "Data2": -6456186541163566142 }, "Flags": 0, "Kind": 0, @@ -26790,10 +26100,8 @@ }, { "__Checksum": { - "Data1": 2096380579967747894, - "Data2": 8187658111288415026, - "Data3": 2930121106858020067, - "Data4": -2139122156758634125 + "Data1": 4264230326925668334, + "Data2": -6748594692995955228 }, "Flags": 0, "Kind": 0, @@ -26833,10 +26141,8 @@ }, { "__Checksum": { - "Data1": -1939670463428774265, - "Data2": -3300589750089020579, - "Data3": -6598111001488829074, - "Data4": 7467562019848587094 + "Data1": 7956761383407342807, + "Data2": 8042935570273787677 }, "Flags": 0, "Kind": 0, @@ -26883,10 +26189,8 @@ }, { "__Checksum": { - "Data1": 4161604439154499116, - "Data2": -8410178403157553681, - "Data3": 4713617215046447361, - "Data4": -1629405811775961235 + "Data1": -1503458347967583059, + "Data2": 8075566816872980620 }, "Flags": 0, "Kind": 0, @@ -26940,10 +26244,8 @@ }, { "__Checksum": { - "Data1": -7607251539224431679, - "Data2": 7216736650967235215, - "Data3": 8519043178957350424, - "Data4": -3215760700079867014 + "Data1": 1097315379212211707, + "Data2": 5095764668407639703 }, "Flags": 0, "Kind": 0, @@ -27030,10 +26332,8 @@ }, { "__Checksum": { - "Data1": 697147325878763050, - "Data2": 7355227298362736347, - "Data3": 205437038493267311, - "Data4": 5914865174615246875 + "Data1": -2448413976423586509, + "Data2": 8579023856900034115 }, "Flags": 0, "Kind": 0, @@ -27086,10 +26386,8 @@ }, { "__Checksum": { - "Data1": -7147333803771153372, - "Data2": -2906965796727472550, - "Data3": -4553542358721191473, - "Data4": 1749481262634397741 + "Data1": -2795413643146285278, + "Data2": -6676305508497550850 }, "Flags": 0, "Kind": 0, @@ -27143,10 +26441,8 @@ }, { "__Checksum": { - "Data1": -5542676160142017107, - "Data2": -532016820459574678, - "Data3": 7409385359676754520, - "Data4": -6141730927994192651 + "Data1": 6650981537568702253, + "Data2": 2793212161766708057 }, "Flags": 0, "Kind": 0, @@ -27296,10 +26592,8 @@ }, { "__Checksum": { - "Data1": 2427552626450740666, - "Data2": 5130482324341886130, - "Data3": 6288697345050015177, - "Data4": 3112301840744342328 + "Data1": -3654767900490075448, + "Data2": 5578622678380248455 }, "Flags": 0, "Kind": 0, @@ -27346,10 +26640,8 @@ }, { "__Checksum": { - "Data1": 7470186635954969071, - "Data2": 7159936552561215345, - "Data3": -5861268924435388193, - "Data4": -2563044430335535781 + "Data1": 6728750463167440785, + "Data2": 5175862697364202964 }, "Flags": 0, "Kind": 0, @@ -27403,10 +26695,8 @@ }, { "__Checksum": { - "Data1": -8453551354867037801, - "Data2": -2049788870099535281, - "Data3": 2762046691613022342, - "Data4": 3004081195624987472 + "Data1": 2198319240709863642, + "Data2": 7391807483711799460 }, "Flags": 0, "Kind": 0, @@ -27460,10 +26750,8 @@ }, { "__Checksum": { - "Data1": -8478344252035443397, - "Data2": 771250752477767758, - "Data3": -6893810981242027416, - "Data4": 5954366997899702141 + "Data1": -4703885130940437969, + "Data2": -4438580652592086650 }, "Flags": 0, "Kind": 0, @@ -27532,10 +26820,8 @@ }, { "__Checksum": { - "Data1": 2232261080440218941, - "Data2": -4548775614177719144, - "Data3": -5836101411586258275, - "Data4": -473778229722368344 + "Data1": 2245206577501580239, + "Data2": 2287936197806080319 }, "Flags": 0, "Kind": 0, @@ -27715,10 +27001,8 @@ }, { "__Checksum": { - "Data1": -6694131318274696869, - "Data2": -209101852656228662, - "Data3": 3542979193543630396, - "Data4": -4688812745718873650 + "Data1": -3993189535956229057, + "Data2": -3555666829929645239 }, "Flags": 0, "Kind": 0, @@ -27800,10 +27084,8 @@ }, { "__Checksum": { - "Data1": 2766864555253877379, - "Data2": 7381768866303364554, - "Data3": -5196547693431261633, - "Data4": 3802086305713518494 + "Data1": 2957809447686889652, + "Data2": -6228529517667789171 }, "Flags": 0, "Kind": 0, @@ -27857,10 +27139,8 @@ }, { "__Checksum": { - "Data1": -5493438840267590430, - "Data2": 5227326107205815774, - "Data3": 4198223578149930542, - "Data4": -5355225794814226013 + "Data1": 8012423124320127593, + "Data2": 7011349007449512205 }, "Flags": 0, "Kind": 0, @@ -27907,10 +27187,8 @@ }, { "__Checksum": { - "Data1": -7981667645644714247, - "Data2": 4958967511243136599, - "Data3": -2740710514134950240, - "Data4": 5900408264632742455 + "Data1": 3031632774279106378, + "Data2": -6636378817705238980 }, "Flags": 0, "Kind": 0, @@ -27957,10 +27235,8 @@ }, { "__Checksum": { - "Data1": -7429435717204249477, - "Data2": 7424543151935824698, - "Data3": 6190444155946720449, - "Data4": 3920965251070565859 + "Data1": 2275689468759371902, + "Data2": 3192139761196083779 }, "Flags": 0, "Kind": 0, @@ -28007,10 +27283,8 @@ }, { "__Checksum": { - "Data1": 709773686397454866, - "Data2": 5465550707804421895, - "Data3": 2154190167993288139, - "Data4": 5218124828263296626 + "Data1": -5910912273440360845, + "Data2": -1440195954995391685 }, "Flags": 0, "Kind": 0, @@ -28064,10 +27338,8 @@ }, { "__Checksum": { - "Data1": -5198782287006995482, - "Data2": 7161513569932383880, - "Data3": -7276443193241289255, - "Data4": -8935842322052566918 + "Data1": -8855629402575019040, + "Data2": -7433692408027430060 }, "Flags": 0, "Kind": 0, @@ -28121,10 +27393,8 @@ }, { "__Checksum": { - "Data1": -5243323863001722655, - "Data2": 342970255871516887, - "Data3": -2595444719067863231, - "Data4": -8357735088578040900 + "Data1": -5937373326081458078, + "Data2": -5754188502223043104 }, "Flags": 0, "Kind": 0, @@ -28230,10 +27500,8 @@ }, { "__Checksum": { - "Data1": -6487724932892527905, - "Data2": -5216303335032580095, - "Data3": 3337439451606954018, - "Data4": -5899761063237259789 + "Data1": 8662439491774873068, + "Data2": -872618194019220124 }, "Flags": 0, "Kind": 0, @@ -28287,10 +27555,8 @@ }, { "__Checksum": { - "Data1": -9043382036126424282, - "Data2": -8308373993069417457, - "Data3": -4227728009496392415, - "Data4": 5729898021251181449 + "Data1": -4062239428299957930, + "Data2": 6116652705957416072 }, "Flags": 0, "Kind": 0, @@ -28344,10 +27610,8 @@ }, { "__Checksum": { - "Data1": -3508411493090839208, - "Data2": -5832706784489185454, - "Data3": 6818931749535537197, - "Data4": -6616020970445444825 + "Data1": -3754434182982472471, + "Data2": 3944790558572542547 }, "Flags": 0, "Kind": 0, @@ -28491,10 +27755,8 @@ }, { "__Checksum": { - "Data1": 2977287613018123918, - "Data2": -7781319147847386248, - "Data3": -6471241217514018904, - "Data4": 7415224962241813426 + "Data1": -6214967483660568355, + "Data2": 7918329987344712237 }, "Flags": 0, "Kind": 0, @@ -28541,10 +27803,8 @@ }, { "__Checksum": { - "Data1": 2057796281459680260, - "Data2": -4049009749100921036, - "Data3": -2840296946468107240, - "Data4": 1915505270277473687 + "Data1": 429873530137335861, + "Data2": 6151801353805936735 }, "Flags": 0, "Kind": 0, @@ -28598,10 +27858,8 @@ }, { "__Checksum": { - "Data1": 4397056313689831239, - "Data2": -8097238476159982209, - "Data3": -5327891014181903924, - "Data4": 6858033710491573458 + "Data1": 1373555583334031039, + "Data2": -6604320408337393019 }, "Flags": 0, "Kind": 0, @@ -28655,10 +27913,8 @@ }, { "__Checksum": { - "Data1": 4331827604091980189, - "Data2": -8552584640030708472, - "Data3": -370269142830282348, - "Data4": 7685145754279246850 + "Data1": -7769893416858593238, + "Data2": -6599143220692061231 }, "Flags": 0, "Kind": 0, @@ -28764,10 +28020,8 @@ }, { "__Checksum": { - "Data1": 4766132985176090569, - "Data2": 1382066551783098865, - "Data3": 2247592641434126050, - "Data4": 2661216821758513756 + "Data1": -1507032228854767071, + "Data2": 4617212448040689485 }, "Flags": 0, "Kind": 0, @@ -28807,10 +28061,8 @@ }, { "__Checksum": { - "Data1": 1002761325193955868, - "Data2": 8097783783955615163, - "Data3": -1063501580409703322, - "Data4": -1585532886554957749 + "Data1": -1567695753753432603, + "Data2": 9005092917057194118 }, "Flags": 0, "Kind": 0, @@ -28871,10 +28123,8 @@ }, { "__Checksum": { - "Data1": 1254263254168049818, - "Data2": 7223871985471249702, - "Data3": -725967844455289636, - "Data4": -6733238390470176078 + "Data1": -7912400406428965071, + "Data2": 2446960659307876547 }, "Flags": 0, "Kind": 0, @@ -28921,10 +28171,8 @@ }, { "__Checksum": { - "Data1": 1575975570105601504, - "Data2": -935157227634565965, - "Data3": 5283126798392813652, - "Data4": 2191194706826366658 + "Data1": -744061604557102871, + "Data2": 263314798149297231 }, "Flags": 0, "Kind": 0, @@ -29034,10 +28282,8 @@ }, { "__Checksum": { - "Data1": -5316267780112667839, - "Data2": -1197767585988456675, - "Data3": 7733225545304851061, - "Data4": 4459410951043103662 + "Data1": -5278635562256550734, + "Data2": -4613080889035370095 }, "Flags": 0, "Kind": 0, @@ -29091,10 +28337,8 @@ }, { "__Checksum": { - "Data1": 642944078477886735, - "Data2": 2978312972547348799, - "Data3": 3355506522427742683, - "Data4": -4521278742601266510 + "Data1": -2997319391352926786, + "Data2": 4344922259600408720 }, "Flags": 0, "Kind": 0, @@ -29144,10 +28388,8 @@ }, { "__Checksum": { - "Data1": 7073240555486635248, - "Data2": 2670485384707486367, - "Data3": -821290397126750780, - "Data4": -496087342265540535 + "Data1": -3758033461427233224, + "Data2": -462898716971677181 }, "Flags": 0, "Kind": 0, @@ -29180,10 +28422,8 @@ }, { "__Checksum": { - "Data1": -796043812541522481, - "Data2": 42497269161056963, - "Data3": 2693463059366211492, - "Data4": -6618434100632596481 + "Data1": 3436629697469719401, + "Data2": 4661896343322173502 }, "Flags": 0, "Kind": 0, @@ -29293,10 +28533,8 @@ }, { "__Checksum": { - "Data1": -2132281567145382613, - "Data2": -2477979354505058251, - "Data3": 6278750875973946173, - "Data4": 2933996549545611702 + "Data1": 623892552277303937, + "Data2": 5692433577332506278 }, "Flags": 0, "Kind": 0, @@ -29336,10 +28574,8 @@ }, { "__Checksum": { - "Data1": 3405283898480954313, - "Data2": -4166479996268276734, - "Data3": -7302198951027801674, - "Data4": -1241391562256379911 + "Data1": 7421235030252001313, + "Data2": -5788365886111242802 }, "Flags": 0, "Kind": 0, @@ -29379,10 +28615,8 @@ }, { "__Checksum": { - "Data1": 7958191531367329879, - "Data2": 2211577985733345612, - "Data3": -7232870385580712214, - "Data4": 5792061769269933269 + "Data1": 3976198173629296480, + "Data2": -2155094813351438514 }, "Flags": 0, "Kind": 0, @@ -29436,10 +28670,8 @@ }, { "__Checksum": { - "Data1": -8367137276947703257, - "Data2": -3523216581143776780, - "Data3": 7396312718432287458, - "Data4": 6765320904569098371 + "Data1": 8189441154067314620, + "Data2": 2208613599119222005 }, "Flags": 0, "Kind": 0, @@ -29540,10 +28772,8 @@ }, { "__Checksum": { - "Data1": -454025158274166391, - "Data2": -540596969414902883, - "Data3": -3443638100855022933, - "Data4": -2383829679932074200 + "Data1": -4893344920409859909, + "Data2": 521403679743870409 }, "Flags": 0, "Kind": 0, @@ -29583,10 +28813,8 @@ }, { "__Checksum": { - "Data1": 3798740153514884810, - "Data2": 3508087497493555726, - "Data3": -7706494194788095100, - "Data4": -569925043394228784 + "Data1": -8551655860074109297, + "Data2": 9217036245569907210 }, "Flags": 0, "Kind": 0, @@ -29688,10 +28916,8 @@ }, { "__Checksum": { - "Data1": -5491138637815677447, - "Data2": 4141300292108893409, - "Data3": 6405689114335775569, - "Data4": 1422896904305076391 + "Data1": 9024263872105739535, + "Data2": 5587029316359216058 }, "Flags": 0, "Kind": 0, @@ -29745,10 +28971,8 @@ }, { "__Checksum": { - "Data1": -6166314189093334620, - "Data2": 4312301738016784551, - "Data3": -650849746036209525, - "Data4": -5781243871740745988 + "Data1": -2424938357250444086, + "Data2": -5694113924181546527 }, "Flags": 0, "Kind": 0, @@ -29837,10 +29061,8 @@ }, { "__Checksum": { - "Data1": -4358005406779752430, - "Data2": 3110119153644327530, - "Data3": -1847796986820000922, - "Data4": -7819890364460489954 + "Data1": -2411537592928138941, + "Data2": 5929497587267637160 }, "Flags": 0, "Kind": 0, @@ -29887,10 +29109,8 @@ }, { "__Checksum": { - "Data1": 8486079335018178878, - "Data2": -5274414207727177322, - "Data3": 7855392949262434314, - "Data4": 5715309389776310834 + "Data1": 3620240943372510719, + "Data2": -5506207992948987462 }, "Flags": 0, "Kind": 0, @@ -29944,10 +29164,8 @@ }, { "__Checksum": { - "Data1": 1568262309472297273, - "Data2": 6013282157645106993, - "Data3": 445942106976511180, - "Data4": -1968131466453964496 + "Data1": 7026190802742595405, + "Data2": -379434249285022594 }, "Flags": 0, "Kind": 0, @@ -30027,10 +29245,8 @@ }, { "__Checksum": { - "Data1": 8377089543934089997, - "Data2": -1177752778466951473, - "Data3": -814160072597036852, - "Data4": 3871416816690820513 + "Data1": 9020182619364508096, + "Data2": 1779847864631711501 }, "Flags": 0, "Kind": 0, @@ -30098,10 +29314,8 @@ }, { "__Checksum": { - "Data1": 9130538118939903064, - "Data2": 2460973431653072645, - "Data3": -4420617205976607977, - "Data4": -1106424927503558572 + "Data1": 8614756831853002575, + "Data2": 8503072358353463608 }, "Flags": 0, "Kind": 0, @@ -30169,10 +29383,8 @@ }, { "__Checksum": { - "Data1": 6099718399299791929, - "Data2": -4165128292587191315, - "Data3": -4981244501349660963, - "Data4": -185974452576176389 + "Data1": 8752900981017045314, + "Data2": -3378123278231165815 }, "Flags": 0, "Kind": 0, @@ -30226,10 +29438,8 @@ }, { "__Checksum": { - "Data1": 3462880151283267561, - "Data2": 5216897667545120491, - "Data3": -8714368066824064029, - "Data4": -9150428238720599035 + "Data1": 6958744665459482724, + "Data2": -8337545471752950324 }, "Flags": 0, "Kind": 0, @@ -30283,10 +29493,8 @@ }, { "__Checksum": { - "Data1": 8411348830325725868, - "Data2": -3931142245439203544, - "Data3": 4167181167179380772, - "Data4": 6909283963636856957 + "Data1": 5647993482881804971, + "Data2": -371628208428251004 }, "Flags": 0, "Kind": 0, @@ -30441,10 +29649,8 @@ }, { "__Checksum": { - "Data1": 1750823466961230440, - "Data2": 1149490573207425386, - "Data3": -3160128706504703859, - "Data4": 9005857397731445933 + "Data1": 8820289398260872141, + "Data2": 1429347664777386804 }, "Flags": 0, "Kind": 0, @@ -30498,10 +29704,8 @@ }, { "__Checksum": { - "Data1": -4119239266623305122, - "Data2": -9118737268599135060, - "Data3": 2005208383074922982, - "Data4": -2473939392878251441 + "Data1": 3349451068189366509, + "Data2": 4229967262410911108 }, "Flags": 0, "Kind": 0, @@ -30555,10 +29759,8 @@ }, { "__Checksum": { - "Data1": -3981761658948681991, - "Data2": 7155018226550956340, - "Data3": -4152390786699986867, - "Data4": -5043395578959200862 + "Data1": 9010102980535378987, + "Data2": -1431227198021087866 }, "Flags": 0, "Kind": 0, @@ -30751,10 +29953,8 @@ }, { "__Checksum": { - "Data1": -4501265489291157153, - "Data2": 1393705142941067847, - "Data3": 6394777395646678363, - "Data4": -5541851661579566815 + "Data1": 6131529133114629263, + "Data2": -8702285099967139364 }, "Flags": 0, "Kind": 0, @@ -30822,10 +30022,8 @@ }, { "__Checksum": { - "Data1": 8985499955345426510, - "Data2": -7943697483779306939, - "Data3": -8734214368510954306, - "Data4": 1833264434671123862 + "Data1": 2712589770066844710, + "Data2": -7840939150268413701 }, "Flags": 0, "Kind": 0, @@ -30879,10 +30077,8 @@ }, { "__Checksum": { - "Data1": 6309207251713304939, - "Data2": 5706588995251303339, - "Data3": 8079931379238761534, - "Data4": -2472352517839244159 + "Data1": -3623289656284254948, + "Data2": 6772464544336712979 }, "Flags": 0, "Kind": 0, @@ -30936,10 +30132,8 @@ }, { "__Checksum": { - "Data1": 7473485230551072832, - "Data2": 3905224702042286582, - "Data3": -2265515659528866798, - "Data4": 8063514983259211559 + "Data1": 6664198461993637333, + "Data2": 3250441863061976201 }, "Flags": 0, "Kind": 0, @@ -31087,10 +30281,8 @@ }, { "__Checksum": { - "Data1": -8462703092816629369, - "Data2": 2164452017034442897, - "Data3": 8992581760208884676, - "Data4": 7296507591503925006 + "Data1": 7781986121047052703, + "Data2": 7203740116332989985 }, "Flags": 0, "Kind": 0, @@ -31144,10 +30336,8 @@ }, { "__Checksum": { - "Data1": 9149890225191734406, - "Data2": 3409580729776703756, - "Data3": 7595678124624505290, - "Data4": -1043007871870818272 + "Data1": -1958305632534423371, + "Data2": -7306949451281144045 }, "Flags": 0, "Kind": 0, @@ -31201,10 +30391,8 @@ }, { "__Checksum": { - "Data1": 6948110172804488786, - "Data2": 8884036460326259805, - "Data3": 6847462989437572827, - "Data4": 4838057646277087954 + "Data1": -8499181844148750562, + "Data2": -3283383901959624793 }, "Flags": 0, "Kind": 0, @@ -31258,10 +30446,8 @@ }, { "__Checksum": { - "Data1": 7842298717845710416, - "Data2": 1949874887697781228, - "Data3": 5817793754098556297, - "Data4": -6462409339159933358 + "Data1": 2709757807324343939, + "Data2": 864853744004052373 }, "Flags": 0, "Kind": 0, @@ -31371,10 +30557,8 @@ }, { "__Checksum": { - "Data1": -562257009590113748, - "Data2": 2736809793536711912, - "Data3": 7816378708417263941, - "Data4": 5937741806325314702 + "Data1": 3053376461861343997, + "Data2": -545000259465458694 }, "Flags": 0, "Kind": 0, @@ -31515,10 +30699,8 @@ }, { "__Checksum": { - "Data1": 7485435876590726118, - "Data2": 8466661270806544285, - "Data3": -7728215618837792403, - "Data4": 3200349899481157903 + "Data1": 5835966179585092571, + "Data2": 8475026226441203113 }, "Flags": 0, "Kind": 0, @@ -31572,10 +30754,8 @@ }, { "__Checksum": { - "Data1": -2479935073419305275, - "Data2": -3617467839250469096, - "Data3": 2380094337993944590, - "Data4": 5755008858494789740 + "Data1": 1457291926255513976, + "Data2": 953352504645368654 }, "Flags": 0, "Kind": 0, @@ -31685,10 +30865,8 @@ }, { "__Checksum": { - "Data1": -5248954058131872853, - "Data2": 5777534277396008065, - "Data3": 5426507733913055568, - "Data4": -661500270370534462 + "Data1": -3272852791604087678, + "Data2": -5853126182934869515 }, "Flags": 0, "Kind": 0, @@ -31742,10 +30920,8 @@ }, { "__Checksum": { - "Data1": -6597802685847654077, - "Data2": -3673102020336783075, - "Data3": 2814049087242774552, - "Data4": 1103810500958164429 + "Data1": 184523620927621718, + "Data2": -7408739204569195991 }, "Flags": 0, "Kind": 0, @@ -31799,10 +30975,8 @@ }, { "__Checksum": { - "Data1": -5312673060240041927, - "Data2": 2950349264232714096, - "Data3": -183583296489026440, - "Data4": 5061562037541792132 + "Data1": -741994776153115415, + "Data2": -5837503230320254732 }, "Flags": 0, "Kind": 0, @@ -31842,10 +31016,8 @@ }, { "__Checksum": { - "Data1": 707093855251410691, - "Data2": 6699247347844727386, - "Data3": 8563124976141992879, - "Data4": 8443686902829579483 + "Data1": 1437727243589449702, + "Data2": -5777698323026926985 }, "Flags": 0, "Kind": 0, @@ -31885,10 +31057,8 @@ }, { "__Checksum": { - "Data1": 1960124321494429605, - "Data2": 3487912008285339863, - "Data3": -6720719646484953254, - "Data4": -4581205841579307548 + "Data1": 5792288735516067863, + "Data2": -7306597645853283520 }, "Flags": 0, "Kind": 0, @@ -31949,10 +31119,8 @@ }, { "__Checksum": { - "Data1": 4979609435558116430, - "Data2": -5577914025334365695, - "Data3": -2512007049661680318, - "Data4": -33955027484571960 + "Data1": -4909531022454975297, + "Data2": 113576980467727545 }, "Flags": 0, "Kind": 0, @@ -31999,10 +31167,8 @@ }, { "__Checksum": { - "Data1": 6671709974914967910, - "Data2": 755056304710024522, - "Data3": 6813905798381595862, - "Data4": -3053430095620440396 + "Data1": -3681522939575181105, + "Data2": 6970144669659784826 }, "Flags": 0, "Kind": 0, @@ -32112,10 +31278,8 @@ }, { "__Checksum": { - "Data1": 6579207881219832794, - "Data2": 750892557489795829, - "Data3": 8760090770078963424, - "Data4": 1010654062315622003 + "Data1": -5779610063065146149, + "Data2": 5442047472013531303 }, "Flags": 0, "Kind": 0, @@ -32169,10 +31333,8 @@ }, { "__Checksum": { - "Data1": -4585819998306094009, - "Data2": -7846164517624386317, - "Data3": 6699533863827590073, - "Data4": 2032082401619325394 + "Data1": 2903053184036770578, + "Data2": 4228111853684736559 }, "Flags": 0, "Kind": 0, @@ -32229,10 +31391,8 @@ }, { "__Checksum": { - "Data1": 5722133802931720195, - "Data2": -4270086195635431745, - "Data3": -2169739094402556666, - "Data4": 9060437804189200641 + "Data1": 4030279270351818931, + "Data2": 8802279535291503036 }, "Flags": 0, "Kind": 0, @@ -32286,10 +31446,8 @@ }, { "__Checksum": { - "Data1": -4228554948553578048, - "Data2": 25014495770690200, - "Data3": 8001349165849522089, - "Data4": -3044375769768802870 + "Data1": 8578959772120953423, + "Data2": 107183547449255951 }, "Flags": 0, "Kind": 0, @@ -32378,10 +31536,8 @@ }, { "__Checksum": { - "Data1": -65030532138900179, - "Data2": 95314330871014067, - "Data3": 1809109731502927281, - "Data4": -2108354397399163625 + "Data1": 4068604915547453096, + "Data2": -6463618434365534464 }, "Flags": 0, "Kind": 0, @@ -32414,10 +31570,8 @@ }, { "__Checksum": { - "Data1": 7087444872717724015, - "Data2": 7988952508225665312, - "Data3": -2145771035953367564, - "Data4": 7027274265181572405 + "Data1": -6074409988558679103, + "Data2": 5595496302829304777 }, "Flags": 0, "Kind": 0, @@ -32464,10 +31618,8 @@ }, { "__Checksum": { - "Data1": 1115880982975842423, - "Data2": -4950610626944498062, - "Data3": 5878544866674111964, - "Data4": 5626520888141445805 + "Data1": 2525582131257921421, + "Data2": 8740657280568166888 }, "Flags": 0, "Kind": 0, @@ -33069,10 +32221,8 @@ }, { "__Checksum": { - "Data1": 4355696146794945793, - "Data2": 8572277270405476446, - "Data3": -5901175682912615533, - "Data4": 7668641346935525040 + "Data1": 5961184063591630685, + "Data2": -8620934272363462793 }, "Flags": 0, "Kind": 0, @@ -33117,10 +32267,8 @@ }, { "__Checksum": { - "Data1": 5531542189665033857, - "Data2": 8293065857617649512, - "Data3": 2022807619573366001, - "Data4": -1635553207073990210 + "Data1": -748413105332439729, + "Data2": -6091481708662037970 }, "Flags": 0, "Kind": 0, @@ -33188,10 +32336,8 @@ }, { "__Checksum": { - "Data1": -8198266095456733728, - "Data2": 814602478398161541, - "Data3": -7333348096236426764, - "Data4": -6762986965088585087 + "Data1": -7222726977061317836, + "Data2": -1821392106625734285 }, "Flags": 0, "Kind": 0, @@ -33224,10 +32370,8 @@ }, { "__Checksum": { - "Data1": 742768774574413579, - "Data2": 2612307808209959970, - "Data3": -8484594436819071598, - "Data4": -7673503533688059403 + "Data1": -5501272945982216347, + "Data2": 4761706086165137616 }, "Flags": 0, "Kind": 0, @@ -33279,10 +32423,8 @@ }, { "__Checksum": { - "Data1": 8862147396612632671, - "Data2": 4330886826899830804, - "Data3": 8242977394324860704, - "Data4": -4248684948641413570 + "Data1": -5036986432588500792, + "Data2": -1393216263162999005 }, "Flags": 0, "Kind": 0, @@ -33322,10 +32464,8 @@ }, { "__Checksum": { - "Data1": -8361815956867032898, - "Data2": 8964591039024821629, - "Data3": 1976171722997630982, - "Data4": 909091630664293244 + "Data1": 6884236698276542073, + "Data2": -8674830448542838003 }, "Flags": 0, "Kind": 0, @@ -33379,10 +32519,8 @@ }, { "__Checksum": { - "Data1": -4382658627016848228, - "Data2": -3238228317074799426, - "Data3": -28458106527598061, - "Data4": 7842651957543971399 + "Data1": -6715197371077060064, + "Data2": -2212073236780110091 }, "Flags": 0, "Kind": 0, @@ -33483,10 +32621,8 @@ }, { "__Checksum": { - "Data1": -9020675667081378037, - "Data2": -7837917981903967712, - "Data3": -1323152345213347175, - "Data4": 5823520926460996342 + "Data1": 872795712631952948, + "Data2": -7073700981819106219 }, "Flags": 0, "Kind": 0, @@ -33540,10 +32676,8 @@ }, { "__Checksum": { - "Data1": -5247161581562618086, - "Data2": 146044543262221062, - "Data3": 4512032002979502916, - "Data4": -2862351182245804978 + "Data1": 4980769937370792884, + "Data2": 4707901693082148070 }, "Flags": 0, "Kind": 0, @@ -33590,10 +32724,8 @@ }, { "__Checksum": { - "Data1": -6174112732964357549, - "Data2": -7480577064648051602, - "Data3": -4160090305631487165, - "Data4": 5871610372545127612 + "Data1": 271703838264945719, + "Data2": -7886590597494851619 }, "Flags": 0, "Kind": 0, @@ -33647,10 +32779,8 @@ }, { "__Checksum": { - "Data1": -5535245183613361291, - "Data2": -4779489225573095047, - "Data3": -312686873729316813, - "Data4": 8233305058887338028 + "Data1": 5736533366924262606, + "Data2": 4642458884951091176 }, "Flags": 0, "Kind": 0, @@ -33704,10 +32834,8 @@ }, { "__Checksum": { - "Data1": 1839293578173049097, - "Data2": -8197983570764296008, - "Data3": 2370894160050756519, - "Data4": -1310444703903506473 + "Data1": 5088785897786395359, + "Data2": 2080145322788027048 }, "Flags": 0, "Kind": 0, @@ -33799,10 +32927,8 @@ }, { "__Checksum": { - "Data1": -2828317922814755461, - "Data2": -778393101232977790, - "Data3": -4794842006495205272, - "Data4": 5434553477794615411 + "Data1": 8489326421139238160, + "Data2": 8744475124320205179 }, "Flags": 0, "Kind": 0, @@ -34177,10 +33303,8 @@ }, { "__Checksum": { - "Data1": 4817201053376145942, - "Data2": 7056888229685829796, - "Data3": 1126012237553653004, - "Data4": -1065882536164438177 + "Data1": -2349611790595940295, + "Data2": -321599228405246882 }, "Flags": 0, "Kind": 0, @@ -34227,10 +33351,8 @@ }, { "__Checksum": { - "Data1": 384503180534743422, - "Data2": -6600352840780045600, - "Data3": 3136834341638129705, - "Data4": -601175266039775196 + "Data1": 5468369949509996547, + "Data2": 2250958256842574465 }, "Flags": 0, "Kind": 0, @@ -34284,10 +33406,8 @@ }, { "__Checksum": { - "Data1": 8297806173302848072, - "Data2": 4078193122582604416, - "Data3": 8208578727395509096, - "Data4": 1611604308566391322 + "Data1": -8646839000259429829, + "Data2": -522139113858026618 }, "Flags": 0, "Kind": 0, @@ -34341,10 +33461,8 @@ }, { "__Checksum": { - "Data1": 8626414478780767488, - "Data2": 5745933565645095028, - "Data3": -1221191801841758441, - "Data4": -8100425667427464118 + "Data1": -5690234156193882605, + "Data2": -935755255850840552 }, "Flags": 0, "Kind": 0, @@ -34448,10 +33566,8 @@ }, { "__Checksum": { - "Data1": 1174301973272897400, - "Data2": 4695307333860109729, - "Data3": -2161545863471203922, - "Data4": -7070009921384660016 + "Data1": 2638370492095692125, + "Data2": 1758587409444356368 }, "Flags": 0, "Kind": 0, @@ -34491,10 +33607,8 @@ }, { "__Checksum": { - "Data1": 6454555288440122001, - "Data2": 6725790596842289658, - "Data3": 4241257447959753380, - "Data4": 7696969968405512539 + "Data1": 2339968650531549995, + "Data2": 3925501399856273840 }, "Flags": 0, "Kind": 0, @@ -34548,10 +33662,8 @@ }, { "__Checksum": { - "Data1": -7379989291088751555, - "Data2": 1190896767117048850, - "Data3": 4142270531713726822, - "Data4": -7410715915633487969 + "Data1": 223418628950237956, + "Data2": 3642613993510089861 }, "Flags": 0, "Kind": 0, @@ -34713,10 +33825,8 @@ }, { "__Checksum": { - "Data1": -3796138101293972119, - "Data2": -8729921778899845976, - "Data3": 1402233376278520269, - "Data4": 7604591270461084001 + "Data1": -7086564469266973177, + "Data2": 4552419105027327651 }, "Flags": 0, "Kind": 0, @@ -34784,10 +33894,8 @@ }, { "__Checksum": { - "Data1": 8192339357975376622, - "Data2": 4280025929385525915, - "Data3": 5129545861610800637, - "Data4": 3683294452265512279 + "Data1": 8317785621509905030, + "Data2": -1485249687957875021 }, "Flags": 0, "Kind": 0, @@ -34834,10 +33942,8 @@ }, { "__Checksum": { - "Data1": -910505062360185458, - "Data2": 1297891029615069741, - "Data3": 283611281736000048, - "Data4": -7006739293620577024 + "Data1": 8644172618726148463, + "Data2": -5333780790271549626 }, "Flags": 0, "Kind": 0, @@ -34891,10 +33997,8 @@ }, { "__Checksum": { - "Data1": -2846490415178576156, - "Data2": -1173344041089520570, - "Data3": -1021180374916371770, - "Data4": 8308959156711876061 + "Data1": 70712506062683354, + "Data2": 1832535636208344777 }, "Flags": 0, "Kind": 0, @@ -35002,10 +34106,8 @@ }, { "__Checksum": { - "Data1": 7245645849629336799, - "Data2": -844512120491467875, - "Data3": 390802436991598274, - "Data4": 3511130688556124160 + "Data1": -4389317454019993857, + "Data2": 2251965696125542667 }, "Flags": 0, "Kind": 0, @@ -35052,10 +34154,8 @@ }, { "__Checksum": { - "Data1": -6411901714340353147, - "Data2": 1907347127914548697, - "Data3": 2964541697324704519, - "Data4": -8087576553447583118 + "Data1": 4075221472678101102, + "Data2": 8561211665542916310 }, "Flags": 0, "Kind": 0, @@ -35109,10 +34209,8 @@ }, { "__Checksum": { - "Data1": 8796401842725306627, - "Data2": 3972911014802169935, - "Data3": -7118312667032175504, - "Data4": -954243092707096651 + "Data1": -7360840078989610153, + "Data2": -2249595083695057165 }, "Flags": 0, "Kind": 0, @@ -35166,10 +34264,8 @@ }, { "__Checksum": { - "Data1": -120428537005985229, - "Data2": -1853248916190037990, - "Data3": 3903799075282357297, - "Data4": 1676868393346149675 + "Data1": 6234498104850048086, + "Data2": 9175089310823452814 }, "Flags": 0, "Kind": 0, @@ -35209,10 +34305,8 @@ }, { "__Checksum": { - "Data1": 3825113681201544268, - "Data2": 1004749337029957117, - "Data3": -2273514945728729152, - "Data4": 7243254687536268886 + "Data1": 4681829526532613362, + "Data2": 7936239527128616804 }, "Flags": 0, "Kind": 0, @@ -35358,10 +34452,8 @@ }, { "__Checksum": { - "Data1": -1964075189932855278, - "Data2": 327550648568476021, - "Data3": 4300103236236377244, - "Data4": -4332250246525276496 + "Data1": -3297479546917754788, + "Data2": -7926669976761824038 }, "Flags": 0, "Kind": 0, @@ -35415,10 +34507,8 @@ }, { "__Checksum": { - "Data1": 8074613945832826994, - "Data2": -5584652187538413983, - "Data3": -9153980968966235848, - "Data4": 6079795010745442720 + "Data1": -3004612208062320992, + "Data2": -1416696386291099660 }, "Flags": 0, "Kind": 0, @@ -35493,10 +34583,8 @@ }, { "__Checksum": { - "Data1": 5694266815648411023, - "Data2": -8607032016530266048, - "Data3": 6309025145073502386, - "Data4": -6450770414768996898 + "Data1": -8122457216684165116, + "Data2": -4225494188541912867 }, "Flags": 0, "Kind": 0, @@ -35557,10 +34645,8 @@ }, { "__Checksum": { - "Data1": -5000218969660591948, - "Data2": -4874806024537468103, - "Data3": -7251887463185771209, - "Data4": -7282425327376015873 + "Data1": 9033122828000418503, + "Data2": -9026661960346834873 }, "Flags": 0, "Kind": 0, @@ -35635,10 +34721,8 @@ }, { "__Checksum": { - "Data1": -3151886343537109151, - "Data2": -551864726300917953, - "Data3": -8260578113330742624, - "Data4": -8711957261261857180 + "Data1": 932268381883630594, + "Data2": -5737027939523357839 }, "Flags": 0, "Kind": 0, @@ -35706,10 +34790,8 @@ }, { "__Checksum": { - "Data1": 4807934746661831125, - "Data2": -4591510315704275849, - "Data3": -7180375446105327730, - "Data4": 6381130727214491705 + "Data1": 8736746797853938550, + "Data2": -3035744167582062226 }, "Flags": 0, "Kind": 0, @@ -35749,10 +34831,8 @@ }, { "__Checksum": { - "Data1": 2416717461224025383, - "Data2": 3903049560288887991, - "Data3": -835662520095487707, - "Data4": 1743630787401725693 + "Data1": -2730138132140819332, + "Data2": 624601548548190362 }, "Flags": 0, "Kind": 0, @@ -35813,10 +34893,8 @@ }, { "__Checksum": { - "Data1": -3194170730696853002, - "Data2": -3581593444368750092, - "Data3": -820379429840795686, - "Data4": -8806566918776972982 + "Data1": -1919160113159850495, + "Data2": 8126219074800815810 }, "Flags": 0, "Kind": 0, @@ -35863,10 +34941,8 @@ }, { "__Checksum": { - "Data1": -466982148722548487, - "Data2": 4975246844393797047, - "Data3": -207703575887309361, - "Data4": 6627807093959046763 + "Data1": 4097477663350264110, + "Data2": -3946301962439104912 }, "Flags": 0, "Kind": 0, @@ -35976,10 +35052,8 @@ }, { "__Checksum": { - "Data1": -4008539820932494983, - "Data2": -4699486338251857875, - "Data3": -8587535951247564717, - "Data4": -2921241901085710061 + "Data1": 3375814896660873604, + "Data2": -8755554015416104702 }, "Flags": 0, "Kind": 0, @@ -36033,10 +35107,8 @@ }, { "__Checksum": { - "Data1": -8995766559987518107, - "Data2": -3258208400582404848, - "Data3": -8441094001930243379, - "Data4": 6230357164073972943 + "Data1": 7883488817312133290, + "Data2": -6218631286788552358 }, "Flags": 0, "Kind": 0, @@ -36093,10 +35165,8 @@ }, { "__Checksum": { - "Data1": -5182291634972447740, - "Data2": -1909293573638113808, - "Data3": -7774549365795509971, - "Data4": -1438839418148789265 + "Data1": 3142983700831408630, + "Data2": 4831272524110755076 }, "Flags": 0, "Kind": 0, @@ -36143,10 +35213,8 @@ }, { "__Checksum": { - "Data1": -117852638099501469, - "Data2": -3916044742501806648, - "Data3": 2485777053178435444, - "Data4": -1564464807776487503 + "Data1": -1889613619190890198, + "Data2": 1302521493193755088 }, "Flags": 0, "Kind": 0, @@ -36200,10 +35268,8 @@ }, { "__Checksum": { - "Data1": 135228373851575151, - "Data2": 8955408850278948338, - "Data3": 280260890029290989, - "Data4": -5713225647523840226 + "Data1": -5234863031280168580, + "Data2": -3582997496996858540 }, "Flags": 0, "Kind": 0, @@ -36257,10 +35323,8 @@ }, { "__Checksum": { - "Data1": -5462375314583295086, - "Data2": -5232869453999271900, - "Data3": -7297475889699298364, - "Data4": -8887831931508584952 + "Data1": 269559646712767148, + "Data2": -4797220064953565939 }, "Flags": 0, "Kind": 0, @@ -36366,10 +35430,8 @@ }, { "__Checksum": { - "Data1": 7584089636884267160, - "Data2": -1530045680531715028, - "Data3": -5847088089428127491, - "Data4": -6425753675423763712 + "Data1": -8802736526217085010, + "Data2": 4542589212138483418 }, "Flags": 0, "Kind": 0, @@ -36423,10 +35485,8 @@ }, { "__Checksum": { - "Data1": -1158372562579951190, - "Data2": 1039872778714750756, - "Data3": -3062024598604847655, - "Data4": -7012791319660554135 + "Data1": 3511804107630872292, + "Data2": -2780302475477324817 }, "Flags": 0, "Kind": 0, @@ -36456,10 +35516,8 @@ }, { "__Checksum": { - "Data1": -6276777227062033072, - "Data2": 5885144003554943537, - "Data3": -6140880507185277919, - "Data4": -5600639546008759779 + "Data1": 2191843992281727274, + "Data2": -2838843596898677776 }, "Flags": 0, "Kind": 0, @@ -36635,10 +35693,8 @@ }, { "__Checksum": { - "Data1": 8199013573281055351, - "Data2": -5297189188855091169, - "Data3": 3472179047224436580, - "Data4": -4094722908071022731 + "Data1": 5570449653293723205, + "Data2": 4046921549887660847 }, "Flags": 0, "Kind": 0, @@ -36678,10 +35734,8 @@ }, { "__Checksum": { - "Data1": 5282277113465453854, - "Data2": 3761738127699381559, - "Data3": 6900912623191532317, - "Data4": -7333830849391781501 + "Data1": 5589820085985328048, + "Data2": -6363510560922154161 }, "Flags": 0, "Kind": 0, @@ -36728,10 +35782,8 @@ }, { "__Checksum": { - "Data1": -2290329431843994773, - "Data2": 7127021757774179389, - "Data3": 8821141411933951131, - "Data4": -1950328054678691443 + "Data1": 7072276082322028329, + "Data2": 7239379275780035073 }, "Flags": 0, "Kind": 0, @@ -36785,10 +35837,8 @@ }, { "__Checksum": { - "Data1": 6770534678920469637, - "Data2": -1129531027727432536, - "Data3": 2635840126247063783, - "Data4": -4439214138701619873 + "Data1": 7922107230557451223, + "Data2": -6785872205107477371 }, "Flags": 0, "Kind": 0, @@ -36842,10 +35892,8 @@ }, { "__Checksum": { - "Data1": 3329061725976081537, - "Data2": -5282294078709696424, - "Data3": -7870334703508244706, - "Data4": -3334627478639413023 + "Data1": -6345950480935017431, + "Data2": 7233107247402851967 }, "Flags": 0, "Kind": 0, @@ -36944,10 +35992,8 @@ }, { "__Checksum": { - "Data1": -4409942718580252867, - "Data2": 2536440428087765192, - "Data3": 1159942994061538023, - "Data4": 7826927450831415028 + "Data1": -7556203270781012086, + "Data2": -563519150765132366 }, "Flags": 0, "Kind": 0, @@ -37015,10 +36061,8 @@ }, { "__Checksum": { - "Data1": 4624497412927411667, - "Data2": -7462762606910315442, - "Data3": 6413330207251175832, - "Data4": 7172619188785866548 + "Data1": 6339704218722232916, + "Data2": -7955301754516128621 }, "Flags": 0, "Kind": 0, @@ -37065,10 +36109,8 @@ }, { "__Checksum": { - "Data1": 1873954330809360023, - "Data2": -3572095479732636925, - "Data3": 5112153752053518364, - "Data4": 4534445606069617148 + "Data1": 7459520516616707800, + "Data2": -5332132453140935991 }, "Flags": 0, "Kind": 0, @@ -37122,10 +36164,8 @@ }, { "__Checksum": { - "Data1": 8225027798411620482, - "Data2": -1687290280928402221, - "Data3": -3683439201632307279, - "Data4": 8624788917968926679 + "Data1": 4421602738621930742, + "Data2": 7776538287903633962 }, "Flags": 0, "Kind": 0, @@ -37233,10 +36273,8 @@ }, { "__Checksum": { - "Data1": -7914844288845000832, - "Data2": -809480840785065516, - "Data3": -2015847691176559412, - "Data4": 270824815051182956 + "Data1": -4349787386737492977, + "Data2": 3071879315012080867 }, "Flags": 0, "Kind": 0, @@ -37283,10 +36321,8 @@ }, { "__Checksum": { - "Data1": 7179985632129594488, - "Data2": -5996334716843832607, - "Data3": -9134217827700065758, - "Data4": -4091188037457430652 + "Data1": -8724478367428471257, + "Data2": -1305690002105152564 }, "Flags": 0, "Kind": 0, @@ -37347,10 +36383,8 @@ }, { "__Checksum": { - "Data1": -2403549270371298476, - "Data2": 2093703941419583987, - "Data3": 2068645162069006522, - "Data4": 3911205892211190147 + "Data1": 3616350356387256074, + "Data2": -1927538380082463925 }, "Flags": 0, "Kind": 0, @@ -37404,10 +36438,8 @@ }, { "__Checksum": { - "Data1": -1476368883500884236, - "Data2": -1986173941261693854, - "Data3": 1400099858048123521, - "Data4": 6450166955963953645 + "Data1": -298441273399949922, + "Data2": 3496462901530889582 }, "Flags": 0, "Kind": 0, @@ -37461,10 +36493,8 @@ }, { "__Checksum": { - "Data1": 1382828888471323262, - "Data2": 1999721998211034413, - "Data3": 3968442898182588185, - "Data4": -1640910114447873466 + "Data1": -5971398782258131817, + "Data2": -9049003921880602704 }, "Flags": 0, "Kind": 0, @@ -37504,10 +36534,8 @@ }, { "__Checksum": { - "Data1": 8658744351505834251, - "Data2": -5685236650627490115, - "Data3": 8504554968822141732, - "Data4": 5791328634534051657 + "Data1": -2783485061542809956, + "Data2": 2408235107528324844 }, "Flags": 0, "Kind": 0, @@ -37665,10 +36693,8 @@ }, { "__Checksum": { - "Data1": 1753053633170276693, - "Data2": -2531194518283577394, - "Data3": 4449152423517047517, - "Data4": 7882973562438456758 + "Data1": 5039998505182149663, + "Data2": 1420750923782575903 }, "Flags": 0, "Kind": 0, @@ -37722,10 +36748,8 @@ }, { "__Checksum": { - "Data1": 8496209920041063389, - "Data2": 6448814693983445097, - "Data3": -6480949652290434952, - "Data4": 3608791653804000520 + "Data1": 9092500780466923234, + "Data2": -1705225696883921746 }, "Flags": 0, "Kind": 0, @@ -37793,10 +36817,8 @@ }, { "__Checksum": { - "Data1": 5985318376326556269, - "Data2": 2882931076352878664, - "Data3": -3772040049737158724, - "Data4": -4984863393389319968 + "Data1": 833268413732135567, + "Data2": 6134038882799131205 }, "Flags": 0, "Kind": 0, @@ -37864,10 +36886,8 @@ }, { "__Checksum": { - "Data1": -4679135645778608502, - "Data2": 6710639024661319624, - "Data3": 9063217515387680630, - "Data4": 838463860577206874 + "Data1": -5283900951385749412, + "Data2": 8827544767127901950 }, "Flags": 0, "Kind": 0, @@ -37935,10 +36955,8 @@ }, { "__Checksum": { - "Data1": 4989958719906015059, - "Data2": 7769763396141392675, - "Data3": -7563869796019532195, - "Data4": 4730423219283907731 + "Data1": 7507851327287501570, + "Data2": 9220188478979841865 }, "Flags": 0, "Kind": 0, @@ -38006,10 +37024,8 @@ }, { "__Checksum": { - "Data1": -273078785922165729, - "Data2": -3220269578992839669, - "Data3": -3832917551069038608, - "Data4": -7866709968650988129 + "Data1": -5986005790663611720, + "Data2": -358986699776136351 }, "Flags": 0, "Kind": 0, @@ -38049,10 +37065,8 @@ }, { "__Checksum": { - "Data1": 7223194906076295166, - "Data2": 515997091592390889, - "Data3": -1235391990686930488, - "Data4": -2579194288623742616 + "Data1": 6266734173395565353, + "Data2": -2236987709302284256 }, "Flags": 0, "Kind": 0, @@ -38113,10 +37127,8 @@ }, { "__Checksum": { - "Data1": 3747376636909803553, - "Data2": -5251582808080159548, - "Data3": 5841434044192555437, - "Data4": -2772733443105338304 + "Data1": -3126638084498629250, + "Data2": 1698442332365741283 }, "Flags": 0, "Kind": 0, @@ -38163,10 +37175,8 @@ }, { "__Checksum": { - "Data1": -8651163405182474489, - "Data2": 1199855674816542894, - "Data3": 1446591017610115979, - "Data4": -6153540487148769725 + "Data1": 4938325112909539374, + "Data2": -7981049543920868883 }, "Flags": 0, "Kind": 0, @@ -38276,10 +37286,8 @@ }, { "__Checksum": { - "Data1": 751768156256460500, - "Data2": 3682454053375074624, - "Data3": -2737742603447845040, - "Data4": 1050641368617536144 + "Data1": -3514851005635975854, + "Data2": -4684316922143847339 }, "Flags": 0, "Kind": 0, @@ -38333,10 +37341,8 @@ }, { "__Checksum": { - "Data1": 1022254021236920522, - "Data2": 6098492101860099868, - "Data3": -1472753769390973893, - "Data4": -6888304377751231971 + "Data1": 5482477766473027042, + "Data2": -5594734392556576792 }, "Flags": 0, "Kind": 0, @@ -38393,10 +37399,8 @@ }, { "__Checksum": { - "Data1": -2246259115922929365, - "Data2": -5714788338180499347, - "Data3": 6186577583892146887, - "Data4": 6918322093841788474 + "Data1": 1658648120847365874, + "Data2": 3831644791016455998 }, "Flags": 0, "Kind": 0, @@ -38443,10 +37447,8 @@ }, { "__Checksum": { - "Data1": 8133152928744175922, - "Data2": 1476105454525813271, - "Data3": -8241223644043064156, - "Data4": 4115911532649319517 + "Data1": 4903284409208695627, + "Data2": -2962696887005732408 }, "Flags": 0, "Kind": 0, @@ -38500,10 +37502,8 @@ }, { "__Checksum": { - "Data1": 2107587453110092917, - "Data2": -4998367008439293286, - "Data3": 6916338735498565474, - "Data4": 1331460261785682176 + "Data1": 7992045924233217549, + "Data2": 5284648747952063501 }, "Flags": 0, "Kind": 0, @@ -38557,10 +37557,8 @@ }, { "__Checksum": { - "Data1": 4766364195189350993, - "Data2": 8814856481679629192, - "Data3": -3565222148790280097, - "Data4": -4384601562999065295 + "Data1": 5415933294777194593, + "Data2": 6366523156348655921 }, "Flags": 0, "Kind": 0, @@ -38666,10 +37664,8 @@ }, { "__Checksum": { - "Data1": -2508869610998404804, - "Data2": 4063471807045916232, - "Data3": -6892777110355512156, - "Data4": -7608127731931402028 + "Data1": -1053405271793527644, + "Data2": 1948889218952161394 }, "Flags": 0, "Kind": 0, @@ -38723,10 +37719,8 @@ }, { "__Checksum": { - "Data1": 8948713276561619918, - "Data2": 4039108083142140110, - "Data3": -5148085945570530443, - "Data4": 6871557203134075982 + "Data1": -7294655767031086085, + "Data2": 8630861749361242599 }, "Flags": 0, "Kind": 0, @@ -38756,10 +37750,8 @@ }, { "__Checksum": { - "Data1": 8730037922961179813, - "Data2": 9019642218240322875, - "Data3": 356718118097922826, - "Data4": 3197659770305059918 + "Data1": -8135875178689586504, + "Data2": -9200592397798266611 }, "Flags": 0, "Kind": 0, @@ -38949,10 +37941,8 @@ }, { "__Checksum": { - "Data1": -6127106353999535034, - "Data2": 8923338635812113068, - "Data3": -2367808146879126077, - "Data4": 3619623638070032404 + "Data1": -4621591689881722787, + "Data2": 5071949023637828008 }, "Flags": 0, "Kind": 0, @@ -38992,10 +37982,8 @@ }, { "__Checksum": { - "Data1": -3745738291516783062, - "Data2": -529869614501808735, - "Data3": -7887707924500244571, - "Data4": -8174082219434645842 + "Data1": -8969804071189589423, + "Data2": 7585437628126816514 }, "Flags": 0, "Kind": 0, @@ -39042,10 +38030,8 @@ }, { "__Checksum": { - "Data1": 5920014094231148248, - "Data2": -5364347683638669365, - "Data3": 3763463940201133007, - "Data4": -3444178230062391259 + "Data1": 4159979065338616065, + "Data2": -3115423883188450923 }, "Flags": 0, "Kind": 0, @@ -39099,10 +38085,8 @@ }, { "__Checksum": { - "Data1": 4503846411902222566, - "Data2": 8926577991197208621, - "Data3": 361891683438694921, - "Data4": 8548054051046936061 + "Data1": -2002512472735076682, + "Data2": 6921008619488306010 }, "Flags": 0, "Kind": 0, @@ -39156,10 +38140,8 @@ }, { "__Checksum": { - "Data1": 1608108931490461189, - "Data2": -9107173937929684536, - "Data3": -7721834802226050230, - "Data4": 1489654789093885783 + "Data1": 4501575008186698920, + "Data2": 5427309830021552941 }, "Flags": 0, "Kind": 0, @@ -39258,10 +38240,8 @@ }, { "__Checksum": { - "Data1": -4440473771774296204, - "Data2": 7311354704986233856, - "Data3": 6592791305223586956, - "Data4": -32297129296387151 + "Data1": -984107595328529470, + "Data2": -916375241664776189 }, "Flags": 0, "Kind": 0, @@ -39329,10 +38309,8 @@ }, { "__Checksum": { - "Data1": 7792602894599048492, - "Data2": 1060254847028105771, - "Data3": -5521135814662679922, - "Data4": -8580688773836345565 + "Data1": -2437991047082872614, + "Data2": 8847937063262238154 }, "Flags": 0, "Kind": 0, @@ -39379,10 +38357,8 @@ }, { "__Checksum": { - "Data1": -4341757370616625836, - "Data2": -6127198869227717548, - "Data3": 8204176372163354250, - "Data4": -5469824597263793162 + "Data1": 3253583145065170484, + "Data2": 4756255164190047061 }, "Flags": 0, "Kind": 0, @@ -39436,10 +38412,8 @@ }, { "__Checksum": { - "Data1": -4967798108497291799, - "Data2": -2670563123304499160, - "Data3": 4310426958208413915, - "Data4": 6377376167703913124 + "Data1": 3964942518969699553, + "Data2": 576535141520761076 }, "Flags": 0, "Kind": 0, @@ -39547,10 +38521,8 @@ }, { "__Checksum": { - "Data1": -8391114108657324146, - "Data2": -6793211976396706751, - "Data3": 3667800557222173726, - "Data4": 5793547099059558255 + "Data1": 2365152942508031602, + "Data2": -1301214348559261334 }, "Flags": 0, "Kind": 0, @@ -39597,10 +38569,8 @@ }, { "__Checksum": { - "Data1": -6230819681295381488, - "Data2": 8694596063998416218, - "Data3": -3828889371069360498, - "Data4": 867394223279308823 + "Data1": 6102508172467439662, + "Data2": 2038853462507438741 }, "Flags": 0, "Kind": 0, @@ -39661,10 +38631,8 @@ }, { "__Checksum": { - "Data1": 381641149744624183, - "Data2": 5963238093748985878, - "Data3": 295899217966002773, - "Data4": -1100897266389302494 + "Data1": -7626993864794623972, + "Data2": -8790159374239764358 }, "Flags": 0, "Kind": 0, @@ -39718,10 +38686,8 @@ }, { "__Checksum": { - "Data1": 4735696851220329388, - "Data2": 2589622147268050779, - "Data3": -3562346332725656292, - "Data4": 4621585439252003177 + "Data1": 1219941374721209592, + "Data2": 6043748514580274945 }, "Flags": 0, "Kind": 0, @@ -39775,10 +38741,8 @@ }, { "__Checksum": { - "Data1": 4545945351990335692, - "Data2": 1833172629912045817, - "Data3": -6735056377369112207, - "Data4": 4189780368589716211 + "Data1": -3102738329725495048, + "Data2": 5259691695686291368 }, "Flags": 0, "Kind": 0, @@ -39818,10 +38782,8 @@ }, { "__Checksum": { - "Data1": -4396765275833540551, - "Data2": -8141877761678091486, - "Data3": -3666848106381865880, - "Data4": 2367132917185154470 + "Data1": 6321967470590330525, + "Data2": -7143809851480539180 }, "Flags": 0, "Kind": 0, @@ -39979,10 +38941,8 @@ }, { "__Checksum": { - "Data1": -4476041210986591854, - "Data2": 5457462341269065785, - "Data3": -6577394848964397041, - "Data4": 9073552378535922767 + "Data1": -8504223094937379188, + "Data2": -7949553138259573831 }, "Flags": 0, "Kind": 0, @@ -40036,10 +38996,8 @@ }, { "__Checksum": { - "Data1": 330291243074322095, - "Data2": -9028983543454175631, - "Data3": 3299237213428903041, - "Data4": 3144877514941332513 + "Data1": 258420464780807304, + "Data2": -6097766532115653331 }, "Flags": 0, "Kind": 0, @@ -40107,10 +39065,8 @@ }, { "__Checksum": { - "Data1": -5064128421600872463, - "Data2": -4660789313955892554, - "Data3": -8155356166387587295, - "Data4": 7121473396579330892 + "Data1": 2968061501817021358, + "Data2": -3888584247885098200 }, "Flags": 0, "Kind": 0, @@ -40178,10 +39134,8 @@ }, { "__Checksum": { - "Data1": 1280631343407766174, - "Data2": 299453043542802421, - "Data3": 7081129536831500041, - "Data4": -5893505061616338864 + "Data1": 1683166619263795417, + "Data2": 8437332695855377368 }, "Flags": 0, "Kind": 0, @@ -40249,10 +39203,8 @@ }, { "__Checksum": { - "Data1": -4444876841264671701, - "Data2": 7412129381334753515, - "Data3": -7350656585231368894, - "Data4": -3463418558669300015 + "Data1": -4953183079135960014, + "Data2": -1889375118045426039 }, "Flags": 0, "Kind": 0, @@ -40320,10 +39272,8 @@ }, { "__Checksum": { - "Data1": 6226337571733592661, - "Data2": 1376183863356071010, - "Data3": 5696117881966659685, - "Data4": -2074695895261102235 + "Data1": -5002450388928674179, + "Data2": 3990430198224327476 }, "Flags": 0, "Kind": 0, @@ -40363,10 +39313,8 @@ }, { "__Checksum": { - "Data1": -2984201535497939034, - "Data2": 7564355407966990716, - "Data3": -7212262105681825497, - "Data4": -6219506474297083361 + "Data1": -41774807687101467, + "Data2": 5710193512155695863 }, "Flags": 0, "Kind": 0, @@ -40427,10 +39375,8 @@ }, { "__Checksum": { - "Data1": -352238705460669454, - "Data2": -5115660001922880164, - "Data3": -4533856679944653652, - "Data4": -6859913708955574758 + "Data1": -2269805086764390181, + "Data2": 9096013320688787117 }, "Flags": 0, "Kind": 0, @@ -40477,10 +39423,8 @@ }, { "__Checksum": { - "Data1": -5140781427415825653, - "Data2": 6886835668409381038, - "Data3": 9154559154415926435, - "Data4": 5480774566465865010 + "Data1": 3350615173853279643, + "Data2": 408859765493274971 }, "Flags": 0, "Kind": 0, @@ -40590,10 +39534,8 @@ }, { "__Checksum": { - "Data1": 2345548853535655630, - "Data2": -3297130813507142911, - "Data3": -3705979707366994103, - "Data4": 2866809105159071394 + "Data1": 4674038092326974789, + "Data2": -2170184587087549903 }, "Flags": 0, "Kind": 0, @@ -40647,10 +39589,8 @@ }, { "__Checksum": { - "Data1": 7376850026338105778, - "Data2": 8171304015480909288, - "Data3": 8240120438555863605, - "Data4": -81933907531393861 + "Data1": -5287431114114778102, + "Data2": 984673225258267972 }, "Flags": 0, "Kind": 0, @@ -40707,10 +39647,8 @@ }, { "__Checksum": { - "Data1": -1578211993147013049, - "Data2": -6415982404350933588, - "Data3": -6542391103190875613, - "Data4": -8534770964216222116 + "Data1": -4362927391302367476, + "Data2": -277861700021556084 }, "Flags": 0, "Kind": 0, @@ -40757,10 +39695,8 @@ }, { "__Checksum": { - "Data1": -196431290779439952, - "Data2": -5785668029127474626, - "Data3": -4930506829364737019, - "Data4": -8856689766311980706 + "Data1": -54321948178011118, + "Data2": 8992084053779268060 }, "Flags": 0, "Kind": 0, @@ -40814,10 +39750,8 @@ }, { "__Checksum": { - "Data1": 518353674160999691, - "Data2": -7074598291188522710, - "Data3": -5560717434128727057, - "Data4": -6337453957267913332 + "Data1": -5748210313977697701, + "Data2": 8085214017579007151 }, "Flags": 0, "Kind": 0, @@ -40871,10 +39805,8 @@ }, { "__Checksum": { - "Data1": -2212048229985003196, - "Data2": 2444335058963493823, - "Data3": -4007897096421364942, - "Data4": 394839723190969167 + "Data1": -122048113582750176, + "Data2": 6462579321906828882 }, "Flags": 0, "Kind": 0, @@ -40980,10 +39912,8 @@ }, { "__Checksum": { - "Data1": 210009780082434110, - "Data2": 3865650195120454629, - "Data3": -6093103422818378328, - "Data4": -4946931529386160956 + "Data1": 3574689301969554145, + "Data2": 9055408884567610678 }, "Flags": 0, "Kind": 0, @@ -41037,10 +39967,8 @@ }, { "__Checksum": { - "Data1": -6377314243006946888, - "Data2": -2364403593676389001, - "Data3": -4569805155832441749, - "Data4": -7354083238266804979 + "Data1": -3493595823120288958, + "Data2": 1566413416170127109 }, "Flags": 0, "Kind": 0, @@ -41070,10 +39998,8 @@ }, { "__Checksum": { - "Data1": 3506862527946929138, - "Data2": -3517858426461614089, - "Data3": 5069108253768293790, - "Data4": -4108317605196946212 + "Data1": 8842784476348315286, + "Data2": -4079098215980333301 }, "Flags": 0, "Kind": 0, @@ -41256,10 +40182,8 @@ }, { "__Checksum": { - "Data1": 1579017499426155778, - "Data2": 2393388598374557858, - "Data3": -5137729969970687385, - "Data4": 3984050442833739866 + "Data1": -4826684233566932353, + "Data2": 5605298349040829132 }, "Flags": 0, "Kind": 0, @@ -41289,10 +40213,8 @@ }, { "__Checksum": { - "Data1": -5993769351769084827, - "Data2": 8573007742990573018, - "Data3": -4314281547637209682, - "Data4": 6592240933099327158 + "Data1": -5120433570139520293, + "Data2": 3964890736093147978 }, "Flags": 0, "Kind": 0, @@ -41339,10 +40261,8 @@ }, { "__Checksum": { - "Data1": 1825638045484204425, - "Data2": -4849259302768147166, - "Data3": 6741637402829841569, - "Data4": -3338101189196634924 + "Data1": -2080836879397287826, + "Data2": -4953477100480981331 }, "Flags": 0, "Kind": 0, @@ -41396,10 +40316,8 @@ }, { "__Checksum": { - "Data1": -4359056268770630120, - "Data2": -7789744378202417619, - "Data3": -8099139361540792422, - "Data4": -815283708135322185 + "Data1": 1981845514721071037, + "Data2": -8334347376142151268 }, "Flags": 0, "Kind": 0, @@ -41453,10 +40371,8 @@ }, { "__Checksum": { - "Data1": -1077114713486080834, - "Data2": 8722137767738072701, - "Data3": 5735750228939261080, - "Data4": 4041114714620732955 + "Data1": -5280557470528430783, + "Data2": -228460782734408159 }, "Flags": 0, "Kind": 0, @@ -41555,10 +40471,8 @@ }, { "__Checksum": { - "Data1": -4830515265187650466, - "Data2": 8919588002736608097, - "Data3": 2542055156414519324, - "Data4": -3617661833749197924 + "Data1": -391732022356815522, + "Data2": 4905657150994276230 }, "Flags": 0, "Kind": 0, @@ -41605,10 +40519,8 @@ }, { "__Checksum": { - "Data1": 5615910511147372676, - "Data2": 4415822016621219608, - "Data3": -6035908628191763190, - "Data4": -4572266448163292620 + "Data1": -2700710263102475990, + "Data2": 1206650169171169395 }, "Flags": 0, "Kind": 0, @@ -41655,10 +40567,8 @@ }, { "__Checksum": { - "Data1": 7773433041416612215, - "Data2": -449366979359843189, - "Data3": 4629494043399819591, - "Data4": -8566140841236701417 + "Data1": -5754790480212836097, + "Data2": 6523547154523646158 }, "Flags": 0, "Kind": 0, @@ -41709,10 +40619,8 @@ }, { "__Checksum": { - "Data1": -8359001405283151657, - "Data2": 8128112443525502269, - "Data3": 1047483932484553619, - "Data4": 2243340234221491850 + "Data1": 2183839105612072129, + "Data2": 30864699168015708 }, "Flags": 0, "Kind": 0, @@ -41759,10 +40667,8 @@ }, { "__Checksum": { - "Data1": 7113696007641183427, - "Data2": 4533068016450813808, - "Data3": 4545400655773638213, - "Data4": 1843089374257200595 + "Data1": -16104289318900592, + "Data2": -8582859390560801026 }, "Flags": 0, "Kind": 0, @@ -41874,10 +40780,8 @@ }, { "__Checksum": { - "Data1": -8256348581920911124, - "Data2": 6921380337117831790, - "Data3": 6512173774109440866, - "Data4": -4430825680045626228 + "Data1": 2148983538838241069, + "Data2": -408079977715828584 }, "Flags": 0, "Kind": 0, @@ -41936,10 +40840,8 @@ }, { "__Checksum": { - "Data1": -4304242373790836000, - "Data2": -561634160535898623, - "Data3": -2769340033747505032, - "Data4": 6994292614925886512 + "Data1": -4704268513818484046, + "Data2": -3477045374471701561 }, "Flags": 0, "Kind": 0, @@ -41986,10 +40888,8 @@ }, { "__Checksum": { - "Data1": -5745359721708579953, - "Data2": -1154354018277753675, - "Data3": 8581397858404274651, - "Data4": 3966264920225891474 + "Data1": 4626355984340021467, + "Data2": 7049909886370903612 }, "Flags": 0, "Kind": 0, @@ -42019,10 +40919,8 @@ }, { "__Checksum": { - "Data1": 7879627541028128562, - "Data2": 7642479346639160896, - "Data3": -5144422339809762199, - "Data4": 2629089271090970431 + "Data1": 3142862953985232129, + "Data2": 4277343668188672271 }, "Flags": 0, "Kind": 0, @@ -42074,10 +40972,8 @@ }, { "__Checksum": { - "Data1": 7466285188820455239, - "Data2": 3291874323983480457, - "Data3": 5225235056685052644, - "Data4": -9169042024938076756 + "Data1": 3095250885942251336, + "Data2": -5111528646996100946 }, "Flags": 0, "Kind": 0, @@ -42117,10 +41013,8 @@ }, { "__Checksum": { - "Data1": -8727550165834033190, - "Data2": 9105745861658942420, - "Data3": -7591785384182072091, - "Data4": 921778375708372845 + "Data1": -641094158454915373, + "Data2": -5159472552708097243 }, "Flags": 0, "Kind": 0, @@ -42235,10 +41129,8 @@ }, { "__Checksum": { - "Data1": -3312060188080931995, - "Data2": -7932871652075058815, - "Data3": 5563830958740441801, - "Data4": 4227772127995714854 + "Data1": 2673071844576721605, + "Data2": 6787677995123483811 }, "Flags": 0, "Kind": 0, @@ -42308,10 +41200,8 @@ }, { "__Checksum": { - "Data1": -2078410820486288139, - "Data2": 4693846827482139259, - "Data3": 8735412321720305569, - "Data4": -8624281947113168501 + "Data1": 3505562368887947718, + "Data2": -5705584951337702348 }, "Flags": 0, "Kind": 0, @@ -42346,10 +41236,8 @@ }, { "__Checksum": { - "Data1": 7139003970956737905, - "Data2": -7201186809288240634, - "Data3": -4583575676063984967, - "Data4": -1423701927727681622 + "Data1": -698084329609834601, + "Data2": -3249713340286710326 }, "Flags": 0, "Kind": 0, @@ -42483,10 +41371,8 @@ }, { "__Checksum": { - "Data1": -1047695412506784761, - "Data2": 3741443652739380895, - "Data3": 3699118537027941423, - "Data4": -2713024240955392494 + "Data1": -8108543451866185230, + "Data2": 6499623571817237576 }, "Flags": 0, "Kind": 0, @@ -42666,10 +41552,8 @@ }, { "__Checksum": { - "Data1": -8478562275819613921, - "Data2": -4197323379895898119, - "Data3": 2205783189917592487, - "Data4": 1850930537274768697 + "Data1": 5548623116559548502, + "Data2": 8900672051406490065 }, "Flags": 0, "Kind": 0, @@ -42753,10 +41637,8 @@ }, { "__Checksum": { - "Data1": -5855193408092412615, - "Data2": -7100947405920905563, - "Data3": -5398007574088591116, - "Data4": -7940532568214175440 + "Data1": 5700371259305430284, + "Data2": -3051063946683857360 }, "Flags": 0, "Kind": 0, @@ -42786,10 +41668,8 @@ }, { "__Checksum": { - "Data1": 5816271254672701881, - "Data2": 7907933564686406450, - "Data3": 8091920205786528772, - "Data4": -1275166819695510903 + "Data1": -8992900836059971395, + "Data2": -3842297415707634810 }, "Flags": 0, "Kind": 0, @@ -42904,10 +41784,8 @@ }, { "__Checksum": { - "Data1": -6617008685586343429, - "Data2": -2236735698075516096, - "Data3": -2627229996602094623, - "Data4": -5447611853516230784 + "Data1": -3127000202225862538, + "Data2": 4007144076062431862 }, "Flags": 0, "Kind": 0, @@ -42954,10 +41832,8 @@ }, { "__Checksum": { - "Data1": -3380066313494511908, - "Data2": -8346045583411278141, - "Data3": -5613998331002763260, - "Data4": -5208306331729091697 + "Data1": 6315930945841751511, + "Data2": 1643115538314324736 }, "Flags": 0, "Kind": 0, @@ -42987,10 +41863,8 @@ }, { "__Checksum": { - "Data1": 7170541472695662861, - "Data2": 8190205741111206418, - "Data3": 820865069233126961, - "Data4": -2783036513175869490 + "Data1": -8340435657153319426, + "Data2": -7887104879693173195 }, "Flags": 0, "Kind": 0, @@ -43044,10 +41918,8 @@ }, { "__Checksum": { - "Data1": -17558100259488508, - "Data2": -2659980065488230374, - "Data3": -3411075841603062162, - "Data4": 5636267907711699350 + "Data1": -60120264133047896, + "Data2": -7550248582921042981 }, "Flags": 0, "Kind": 0, @@ -43101,10 +41973,8 @@ }, { "__Checksum": { - "Data1": -2689928927056954874, - "Data2": 2934965302221637483, - "Data3": 1752734309178694382, - "Data4": 8917264861906357039 + "Data1": -2259802649129387965, + "Data2": -4954429909638637902 }, "Flags": 0, "Kind": 0, @@ -43163,10 +42033,8 @@ }, { "__Checksum": { - "Data1": -8401996994571300061, - "Data2": -908789690441584171, - "Data3": 6375107346914027466, - "Data4": 8419163067193471374 + "Data1": 6507911323814578832, + "Data2": -904112969312173267 }, "Flags": 0, "Kind": 0, @@ -43220,10 +42088,8 @@ }, { "__Checksum": { - "Data1": 2059820188113737515, - "Data2": -5911504455686327052, - "Data3": -7052920551417507472, - "Data4": -6176648302260331894 + "Data1": 7833053380541965900, + "Data2": -6779869999962259217 }, "Flags": 0, "Kind": 0, @@ -43277,10 +42143,8 @@ }, { "__Checksum": { - "Data1": 8608907678830685547, - "Data2": -5065497801401261717, - "Data3": -116022139513871993, - "Data4": -7069202638572260538 + "Data1": -334377027007082725, + "Data2": -489850176998109645 }, "Flags": 0, "Kind": 0, @@ -43334,10 +42198,8 @@ }, { "__Checksum": { - "Data1": 1541468244493005809, - "Data2": 6281257109615033314, - "Data3": -7084509199977756172, - "Data4": -9150900891610215786 + "Data1": -504946245238076660, + "Data2": 6497962929603970059 }, "Flags": 0, "Kind": 0, @@ -43450,10 +42312,8 @@ }, { "__Checksum": { - "Data1": 1739249340114868453, - "Data2": -8633583418302072888, - "Data3": 2049346816504936106, - "Data4": -4148044579671410924 + "Data1": -1337811607278144170, + "Data2": 9042997214563244365 }, "Flags": 0, "Kind": 0, @@ -43507,10 +42367,8 @@ }, { "__Checksum": { - "Data1": 7694554824302010049, - "Data2": -9109152594474323904, - "Data3": 4526233217412732108, - "Data4": 1146430638118393359 + "Data1": -5730840039673170065, + "Data2": -3230210534866822795 }, "Flags": 0, "Kind": 0, @@ -43564,10 +42422,8 @@ }, { "__Checksum": { - "Data1": -3112454522148958790, - "Data2": -5514629473397213961, - "Data3": -2055582729814465320, - "Data4": -536742176553530495 + "Data1": -3894039242615933910, + "Data2": 6835905165777636016 }, "Flags": 0, "Kind": 0, @@ -43673,10 +42529,8 @@ }, { "__Checksum": { - "Data1": 3400952826343417765, - "Data2": 2400585394037616980, - "Data3": -8436313477905228543, - "Data4": 1337552207947604330 + "Data1": 7981646271177148614, + "Data2": -1053579388110072808 }, "Flags": 0, "Kind": 0, @@ -43815,10 +42669,8 @@ }, { "__Checksum": { - "Data1": -4153581960003976864, - "Data2": -8638268319105048375, - "Data3": 753520377305801954, - "Data4": -8653493283765743022 + "Data1": 5742281881951375025, + "Data2": -2201344561059339355 }, "Flags": 0, "Kind": 0, @@ -43865,10 +42717,8 @@ }, { "__Checksum": { - "Data1": 7352662148845798886, - "Data2": 3887316380506437840, - "Data3": -1916570238510892635, - "Data4": -3956967382948356803 + "Data1": 8835604174859662225, + "Data2": 5387505864062093256 }, "Flags": 0, "Kind": 0, @@ -43898,10 +42748,8 @@ }, { "__Checksum": { - "Data1": -5648136691277697555, - "Data2": 7028403150921644275, - "Data3": -4755694736008939734, - "Data4": 3447598454475780373 + "Data1": 1670750462546378308, + "Data2": -5951715916038315217 }, "Flags": 0, "Kind": 0, @@ -44058,10 +42906,8 @@ }, { "__Checksum": { - "Data1": -3533725767787887716, - "Data2": 3539223838521390257, - "Data3": -8068119307679691933, - "Data4": -698480313187760413 + "Data1": -3049499754564578487, + "Data2": -4781528891044974199 }, "Flags": 0, "Kind": 0, @@ -44101,10 +42947,8 @@ }, { "__Checksum": { - "Data1": 4296741609931365714, - "Data2": -7005743595949138615, - "Data3": 26639441310123891, - "Data4": -2848536927637050481 + "Data1": 8328684291235692089, + "Data2": -581639461544474964 }, "Flags": 0, "Kind": 0, @@ -44193,10 +43037,8 @@ }, { "__Checksum": { - "Data1": 3330728968128594177, - "Data2": -276879213537612002, - "Data3": 6442839840392795924, - "Data4": 2235489884710897619 + "Data1": 8131781021388608373, + "Data2": 600499032454807747 }, "Flags": 0, "Kind": 0, @@ -44314,10 +43156,8 @@ }, { "__Checksum": { - "Data1": 5383327590529803620, - "Data2": 1790509077852839862, - "Data3": 8623062452798836414, - "Data4": 3226151796702397162 + "Data1": -5861740835352400126, + "Data2": 4285352643107340582 }, "Flags": 0, "Kind": 0, @@ -44424,10 +43264,8 @@ }, { "__Checksum": { - "Data1": -5552764959212535107, - "Data2": -3739725647781632083, - "Data3": -1432928268142459627, - "Data4": 2493899272358212740 + "Data1": -5224363795006833477, + "Data2": -8159562129026553786 }, "Flags": 0, "Kind": 0, @@ -44467,10 +43305,8 @@ }, { "__Checksum": { - "Data1": -5525755619569681130, - "Data2": 4279641353581532859, - "Data3": 6599980003625168466, - "Data4": 1545893220434999902 + "Data1": -2294608631525670373, + "Data2": -1189203195484439919 }, "Flags": 0, "Kind": 0, @@ -44510,10 +43346,8 @@ }, { "__Checksum": { - "Data1": -6385209024000142512, - "Data2": -621634657990093972, - "Data3": 2074917850893114594, - "Data4": 7607263074172145404 + "Data1": 3886961774687610079, + "Data2": 3672719891388290642 }, "Flags": 0, "Kind": 0, @@ -44650,10 +43484,8 @@ }, { "__Checksum": { - "Data1": 7735361695905761155, - "Data2": 1314662044812889058, - "Data3": -2293231316763893404, - "Data4": -7941406429815932351 + "Data1": 5183712149682121226, + "Data2": -9064205404122298682 }, "Flags": 0, "Kind": 0, @@ -44889,10 +43721,8 @@ }, { "__Checksum": { - "Data1": -5728472243705357853, - "Data2": 7782353527473461154, - "Data3": 5001314562068875056, - "Data4": 3446905227897830855 + "Data1": 4601582977527193940, + "Data2": 873137207820709608 }, "Flags": 0, "Kind": 0, @@ -44938,10 +43768,8 @@ }, { "__Checksum": { - "Data1": -1922374722556370837, - "Data2": -2727689075840458611, - "Data3": -1642740421181207552, - "Data4": 5739569918391343145 + "Data1": -1958250723257804673, + "Data2": 3743455610112413999 }, "Flags": 0, "Kind": 0, @@ -44992,10 +43820,8 @@ }, { "__Checksum": { - "Data1": -4716760575420694872, - "Data2": 4501689229543543063, - "Data3": -7101670193529419663, - "Data4": 6018326394783883672 + "Data1": -1117232309788629146, + "Data2": -7427395050534946006 }, "Flags": 0, "Kind": 0, @@ -45042,10 +43868,8 @@ }, { "__Checksum": { - "Data1": -7545176144847845163, - "Data2": 201725002001319407, - "Data3": 7569753581794535489, - "Data4": 4321710128219789126 + "Data1": 3492518630138016731, + "Data2": 4716148502290817630 }, "Flags": 0, "Kind": 0, @@ -45091,10 +43915,8 @@ }, { "__Checksum": { - "Data1": 5987489719611172847, - "Data2": 2569404454276944891, - "Data3": 8734931538853291465, - "Data4": -1098774973103997975 + "Data1": 1631869402049901841, + "Data2": 8369990421127457723 }, "Flags": 0, "Kind": 0, @@ -45189,10 +44011,8 @@ }, { "__Checksum": { - "Data1": -4260356657794759978, - "Data2": -8807049103750965878, - "Data3": -7551103768224625076, - "Data4": 7885947058226247076 + "Data1": 7904490271631503214, + "Data2": 7893795695387562286 }, "Flags": 0, "Kind": 0, @@ -45709,10 +44529,8 @@ }, { "__Checksum": { - "Data1": 9070807709969247433, - "Data2": -7545944002837432425, - "Data3": -6044848545965575564, - "Data4": 2566768570189401982 + "Data1": -2206085642648703372, + "Data2": 9113486913820759230 }, "Flags": 0, "Kind": 0, @@ -45772,10 +44590,8 @@ }, { "__Checksum": { - "Data1": 5905486753825926331, - "Data2": -140331708144057122, - "Data3": -8800470508319438348, - "Data4": -1014116636868416128 + "Data1": 2251640811704128026, + "Data2": 8301591857898073239 }, "Flags": 0, "Kind": 0, @@ -45815,10 +44631,8 @@ }, { "__Checksum": { - "Data1": 1805383308654726667, - "Data2": 7285997122871647174, - "Data3": 7258009754573995834, - "Data4": 5620667304454602335 + "Data1": 909845183113015707, + "Data2": 3243571841589914030 }, "Flags": 0, "Kind": 0, @@ -45858,10 +44672,8 @@ }, { "__Checksum": { - "Data1": 6250356946553309322, - "Data2": -4528197665740816638, - "Data3": 7964570611717174009, - "Data4": 4073015980796164662 + "Data1": 204084632956973882, + "Data2": 2644198441339242591 }, "Flags": 0, "Kind": 0, @@ -45906,10 +44718,8 @@ }, { "__Checksum": { - "Data1": -9195699655599509485, - "Data2": -6819373692780001950, - "Data3": -4192035181532156419, - "Data4": 501580685386232565 + "Data1": -2297108072745527407, + "Data2": 8708079668353115265 }, "Flags": 0, "Kind": 0, @@ -45968,10 +44778,8 @@ }, { "__Checksum": { - "Data1": -152287863744827422, - "Data2": 365696123336247296, - "Data3": -5125578050630913227, - "Data4": -7087531712060098473 + "Data1": -7663519630400489155, + "Data2": -6739160512550481188 }, "Flags": 0, "Kind": 0, @@ -45993,10 +44801,8 @@ }, { "__Checksum": { - "Data1": 8917545606039570992, - "Data2": -7141058998007744263, - "Data3": -4015204760947540162, - "Data4": 3500353163358304410 + "Data1": -1464120528248379744, + "Data2": -8038377722076947813 }, "Flags": 0, "Kind": 0, @@ -46062,10 +44868,8 @@ }, { "__Checksum": { - "Data1": 4643219491436759158, - "Data2": -278153531270344851, - "Data3": -5697628441414794171, - "Data4": -6651335249337187394 + "Data1": -2941116064853055841, + "Data2": 704167401955407387 }, "Flags": 0, "Kind": 0, @@ -46112,10 +44916,8 @@ }, { "__Checksum": { - "Data1": -2657182471460087204, - "Data2": -925076281289457807, - "Data3": -1780115645311920015, - "Data4": 3036241178415980379 + "Data1": 536654089621614899, + "Data2": 8557358864176566186 }, "Flags": 0, "Kind": 0, @@ -46162,10 +44964,8 @@ }, { "__Checksum": { - "Data1": 1757144171164722347, - "Data2": -5189205487941341471, - "Data3": 6678211214858892542, - "Data4": -1531544720390205215 + "Data1": -6285973157646629005, + "Data2": -5960182329750825437 }, "Flags": 0, "Kind": 0, @@ -46196,10 +44996,8 @@ }, { "__Checksum": { - "Data1": -2241488911557853255, - "Data2": -7591461612403293119, - "Data3": 7397007808056915220, - "Data4": -1929737533122834012 + "Data1": 5148579232828942414, + "Data2": -6044385505707528011 }, "Flags": 0, "Kind": 0, @@ -46286,10 +45084,8 @@ }, { "__Checksum": { - "Data1": 1223447479104347522, - "Data2": 9223223072320487631, - "Data3": -340802595354311602, - "Data4": 4997793491412766942 + "Data1": 5566366371137015574, + "Data2": 4515963056041857734 }, "Flags": 0, "Kind": 0, @@ -46341,10 +45137,8 @@ }, { "__Checksum": { - "Data1": 8864359801011334074, - "Data2": -5251020058671828841, - "Data3": -5562260425820086367, - "Data4": 5470078924590728220 + "Data1": -4279815178520706722, + "Data2": -1583195580611486405 }, "Flags": 0, "Kind": 0, @@ -46391,10 +45185,8 @@ }, { "__Checksum": { - "Data1": 7689269432508655642, - "Data2": 3733045910650526329, - "Data3": -7196418371594126946, - "Data4": -1573101225396797202 + "Data1": -6472286997443808268, + "Data2": -6418622248532245477 }, "Flags": 0, "Kind": 0, @@ -46441,10 +45233,8 @@ }, { "__Checksum": { - "Data1": 7016086856451777558, - "Data2": -4317869108099326338, - "Data3": 2499706391886199244, - "Data4": 8553704223433224499 + "Data1": 1859347541122520753, + "Data2": -3070504301490783950 }, "Flags": 0, "Kind": 0, @@ -46489,10 +45279,8 @@ }, { "__Checksum": { - "Data1": -8018366069265798032, - "Data2": 3789821269081801859, - "Data3": 2785636197326630322, - "Data4": 5165762075673147898 + "Data1": -9221579878350035927, + "Data2": -8524888405763278940 }, "Flags": 0, "Kind": 0, @@ -46532,10 +45320,8 @@ }, { "__Checksum": { - "Data1": 1661556048722003206, - "Data2": -1304601250330912864, - "Data3": 503390311188278175, - "Data4": 3347420779668972916 + "Data1": -5399464064216829681, + "Data2": -2131659137248070913 }, "Flags": 0, "Kind": 0, @@ -46771,10 +45557,8 @@ }, { "__Checksum": { - "Data1": -8461744988675178228, - "Data2": 8210665540647083546, - "Data3": 7148158585238700490, - "Data4": 6215573119513931511 + "Data1": -5054109350161359831, + "Data2": -1683967684035932400 }, "Flags": 0, "Kind": 0, @@ -46814,10 +45598,8 @@ }, { "__Checksum": { - "Data1": -5443960465500760103, - "Data2": 3741242861111624615, - "Data3": 259356641025920187, - "Data4": -2754540235281634419 + "Data1": -3264816411228192212, + "Data2": 2807036934892649626 }, "Flags": 0, "Kind": 0, @@ -46890,10 +45672,8 @@ }, { "__Checksum": { - "Data1": -1546761717315135702, - "Data2": -8729968450005369923, - "Data3": 5511799651550262967, - "Data4": 6318571413739916150 + "Data1": -5253523374422191977, + "Data2": 256796362062841403 }, "Flags": 0, "Kind": 0, @@ -46961,10 +45741,8 @@ }, { "__Checksum": { - "Data1": -3373346508967764212, - "Data2": 6339808126570345098, - "Data3": 3848621996488889743, - "Data4": 8359349354733977869 + "Data1": 1643072031288490594, + "Data2": 3865681362544306062 }, "Flags": 0, "Kind": 0, @@ -47061,10 +45839,8 @@ }, { "__Checksum": { - "Data1": 4496961311093135278, - "Data2": 1384259502942978559, - "Data3": 8799799082252960370, - "Data4": 8705086146877244826 + "Data1": -7748594425008504739, + "Data2": 1977083754715910111 }, "Flags": 0, "Kind": 0, @@ -47094,10 +45870,8 @@ }, { "__Checksum": { - "Data1": -9209457954825600231, - "Data2": 9006846821491854187, - "Data3": -1025518518378774641, - "Data4": -5942098561123481900 + "Data1": -716576238096641797, + "Data2": 8167112409385313047 }, "Flags": 0, "Kind": 0, @@ -47151,10 +45925,8 @@ }, { "__Checksum": { - "Data1": 7613981010542893838, - "Data2": 3210830576394696413, - "Data3": -2539783903591360290, - "Data4": -7734163043485484344 + "Data1": -7377237697337217461, + "Data2": 1809079809273129672 }, "Flags": 0, "Kind": 0, @@ -47227,10 +45999,8 @@ }, { "__Checksum": { - "Data1": -3860330331242198097, - "Data2": 4766386669960127505, - "Data3": -6432883630690192614, - "Data4": -7935803243976187972 + "Data1": 4127720569744650257, + "Data2": -1803947757268224395 }, "Flags": 0, "Kind": 0, @@ -47260,10 +46030,8 @@ }, { "__Checksum": { - "Data1": 1765275829491946892, - "Data2": 8386469732436286611, - "Data3": -2899323353924570466, - "Data4": -212909077512140769 + "Data1": -8036211818469616176, + "Data2": -2562126597179521786 }, "Flags": 0, "Kind": 0, @@ -47345,10 +46113,8 @@ }, { "__Checksum": { - "Data1": -192174626234904842, - "Data2": 4494632051820047586, - "Data3": -8630938721021374756, - "Data4": 2896323713460613454 + "Data1": 5801998246728180604, + "Data2": 3959544271916035613 }, "Flags": 0, "Kind": 0, @@ -47409,10 +46175,8 @@ }, { "__Checksum": { - "Data1": -206059440562076847, - "Data2": -266260753402216155, - "Data3": 9014122771007684807, - "Data4": 4395340683854473047 + "Data1": -8907212180281271548, + "Data2": -1137609233974413247 }, "Flags": 0, "Kind": 0, @@ -47459,10 +46223,8 @@ }, { "__Checksum": { - "Data1": 4713265184135491640, - "Data2": -7212974131866596061, - "Data3": -6310984794203741196, - "Data4": -1564051325141556995 + "Data1": 917123525146010163, + "Data2": 1649800860273489342 }, "Flags": 0, "Kind": 0, @@ -47508,10 +46270,8 @@ }, { "__Checksum": { - "Data1": 3598478801875541905, - "Data2": 8301780757959984284, - "Data3": 6738414720176522061, - "Data4": 2970018109858605390 + "Data1": -8010473524191650067, + "Data2": 7905932671683220710 }, "Flags": 0, "Kind": 0, @@ -47664,10 +46424,8 @@ }, { "__Checksum": { - "Data1": -58580272041574511, - "Data2": -2686056209720883167, - "Data3": -465594588407322254, - "Data4": 366345736202796763 + "Data1": 4688182280568223409, + "Data2": 2277637785081852329 }, "Flags": 0, "Kind": 0, @@ -47714,10 +46472,8 @@ }, { "__Checksum": { - "Data1": 6495781601479227871, - "Data2": 8484465575011007659, - "Data3": 2581589422241679862, - "Data4": -2748581881704945247 + "Data1": -5156702682311377326, + "Data2": -8343353615428612415 }, "Flags": 0, "Kind": 0, @@ -47802,10 +46558,8 @@ }, { "__Checksum": { - "Data1": 5777626408228977327, - "Data2": 2330866467370955483, - "Data3": -7083394413304615562, - "Data4": 2603902820056148660 + "Data1": 5649923079240263799, + "Data2": 7892398451658029158 }, "Flags": 0, "Kind": 0, @@ -48190,10 +46944,8 @@ }, { "__Checksum": { - "Data1": 3113811219273170549, - "Data2": 8271199795152436697, - "Data3": -267193934812837067, - "Data4": 1763424760721496967 + "Data1": 4732406907671958831, + "Data2": -6778392433617877391 }, "Flags": 0, "Kind": 0, @@ -48270,10 +47022,8 @@ }, { "__Checksum": { - "Data1": -6406287533804253598, - "Data2": -3873433423272696477, - "Data3": 7262342955487989189, - "Data4": 5036870336606978949 + "Data1": -8052119897345394705, + "Data2": -9164691285449966094 }, "Flags": 0, "Kind": 0, @@ -48350,10 +47100,8 @@ }, { "__Checksum": { - "Data1": 3067271628493402515, - "Data2": -2843804049028992106, - "Data3": 2238835453695668054, - "Data4": 6541854717671673991 + "Data1": -2640498989559796156, + "Data2": 7774718405629446929 }, "Flags": 0, "Kind": 0, @@ -48430,10 +47178,8 @@ }, { "__Checksum": { - "Data1": 5553726310743685641, - "Data2": 3282604464927073945, - "Data3": -1675237998259133029, - "Data4": 1290878668405930256 + "Data1": 7895052297445815035, + "Data2": -6930725414656263348 }, "Flags": 0, "Kind": 0, @@ -48592,10 +47338,8 @@ }, { "__Checksum": { - "Data1": 2861058637564855427, - "Data2": 773712365459647219, - "Data3": -4875545210967277167, - "Data4": 3952242931885269152 + "Data1": -2125782070480546205, + "Data2": -4025637598122658341 }, "Flags": 0, "Kind": 0, @@ -48672,10 +47416,8 @@ }, { "__Checksum": { - "Data1": -2313764309958266943, - "Data2": 2245904922478712908, - "Data3": -7487190059880655853, - "Data4": 6772771143319062445 + "Data1": -1602446845485300558, + "Data2": 7402859114745237700 }, "Flags": 0, "Kind": 0, @@ -48722,10 +47464,8 @@ }, { "__Checksum": { - "Data1": -1095856948464164472, - "Data2": 2513708249917792247, - "Data3": -5857637784526502335, - "Data4": 5295205581342492318 + "Data1": -5700171101508819030, + "Data2": 4148230409686109840 }, "Flags": 0, "Kind": 0, @@ -48813,10 +47553,8 @@ }, { "__Checksum": { - "Data1": -1503748177384222852, - "Data2": 6180222894405000004, - "Data3": 4098485241767310147, - "Data4": -7579619542321991696 + "Data1": 2380117644305820027, + "Data2": -3297319837562970711 }, "Flags": 0, "Kind": 0, @@ -48936,10 +47674,8 @@ }, { "__Checksum": { - "Data1": 4323596387923935673, - "Data2": -7042189310206889253, - "Data3": 3165371038629755033, - "Data4": -3399995168265931195 + "Data1": 8784874939810577405, + "Data2": 5324568905745117823 }, "Flags": 0, "Kind": 0, @@ -48986,10 +47722,8 @@ }, { "__Checksum": { - "Data1": -6604407587181399925, - "Data2": 4075471863636922085, - "Data3": 6461099988621471468, - "Data4": 7327868096291550833 + "Data1": 7887374627783058998, + "Data2": 6990790039608611207 }, "Flags": 0, "Kind": 0, @@ -49071,10 +47805,8 @@ }, { "__Checksum": { - "Data1": 7163675799706208761, - "Data2": 7896246168645158133, - "Data3": 8619371027460270761, - "Data4": 5609376879228941583 + "Data1": -7637283093253871098, + "Data2": -8688391367165517730 }, "Flags": 0, "Kind": 0, @@ -49107,10 +47839,8 @@ }, { "__Checksum": { - "Data1": -6931493265769336135, - "Data2": 6440950758488189024, - "Data3": 7716763328446159478, - "Data4": 8060098557315630316 + "Data1": -2977207304125757062, + "Data2": -8142861590489985058 }, "Flags": 0, "Kind": 0, @@ -49220,10 +47950,8 @@ }, { "__Checksum": { - "Data1": -4517316804338115583, - "Data2": -7722727582777650381, - "Data3": 6928871238015790115, - "Data4": 4813732701784448031 + "Data1": -928874392869562375, + "Data2": 6308920319998179696 }, "Flags": 0, "Kind": 0, @@ -49276,10 +48004,8 @@ }, { "__Checksum": { - "Data1": -633847625150674533, - "Data2": -8267987853351967394, - "Data3": -6503637264325412127, - "Data4": 229140732879814428 + "Data1": 7304329179027579393, + "Data2": -8836983271284437635 }, "Flags": 0, "Kind": 0, @@ -49541,10 +48267,8 @@ }, { "__Checksum": { - "Data1": 7198722185623924286, - "Data2": -5779567627613298808, - "Data3": 7198839063739674974, - "Data4": -8784810610057672896 + "Data1": 2113340419913280642, + "Data2": 4832195372893087185 }, "Flags": 0, "Kind": 0, @@ -49584,10 +48308,8 @@ }, { "__Checksum": { - "Data1": -1994734171926298575, - "Data2": 8166419430396752294, - "Data3": -1344519792550101295, - "Data4": -6656837165292362028 + "Data1": -8790097427319668971, + "Data2": -3967825915153966597 }, "Flags": 0, "Kind": 0, @@ -49634,10 +48356,8 @@ }, { "__Checksum": { - "Data1": 5093210690546284256, - "Data2": 6435190652111565880, - "Data3": -8979204880098588929, - "Data4": 2632522329700906611 + "Data1": 2717864275528309651, + "Data2": 6571240277512392238 }, "Flags": 0, "Kind": 0, @@ -49677,10 +48397,8 @@ }, { "__Checksum": { - "Data1": 1666384695441952547, - "Data2": -4803346836444677101, - "Data3": 5030790088027317694, - "Data4": -1771698698511532252 + "Data1": 6764126933443351708, + "Data2": -6140825464466242075 }, "Flags": 0, "Kind": 0, @@ -49925,10 +48643,8 @@ }, { "__Checksum": { - "Data1": -2961221145605480922, - "Data2": -745130444285007832, - "Data3": -4606893095668628946, - "Data4": -6825418079192955962 + "Data1": 2098967182459731008, + "Data2": -8797444227112263868 }, "Flags": 0, "Kind": 0, @@ -49975,10 +48691,8 @@ }, { "__Checksum": { - "Data1": 583994226946608202, - "Data2": 106117357225159515, - "Data3": 5429573966391584563, - "Data4": 8258339157791661240 + "Data1": -6849728116506003173, + "Data2": -3004602544901089649 }, "Flags": 0, "Kind": 0, @@ -50060,10 +48774,8 @@ }, { "__Checksum": { - "Data1": 8070900114448667907, - "Data2": 8698532568380614717, - "Data3": 4167256845279219075, - "Data4": -7293515138742207999 + "Data1": 3317217702323488030, + "Data2": -5318643484961015046 }, "Flags": 0, "Kind": 0, @@ -50096,10 +48808,8 @@ }, { "__Checksum": { - "Data1": -5325572794413924382, - "Data2": 8451381650359111887, - "Data3": 3452226410206765661, - "Data4": -2362644304570383020 + "Data1": 3126412320941103409, + "Data2": -4006560602313239356 }, "Flags": 0, "Kind": 0, @@ -50209,10 +48919,8 @@ }, { "__Checksum": { - "Data1": -6424088097309072150, - "Data2": -3145312662845701384, - "Data3": 4507199367470018601, - "Data4": 3152065450873930559 + "Data1": -2211912790993677768, + "Data2": -4258033949820535113 }, "Flags": 0, "Kind": 0, @@ -50265,10 +48973,8 @@ }, { "__Checksum": { - "Data1": -6013345278358762989, - "Data2": 917181695691429248, - "Data3": -6209886116708918252, - "Data4": 42291376571775594 + "Data1": 1687013358528217569, + "Data2": 7268478732383853951 }, "Flags": 0, "Kind": 0, @@ -50537,10 +49243,8 @@ }, { "__Checksum": { - "Data1": 7176774354366739182, - "Data2": -4545637403657300146, - "Data3": 3312585123236419824, - "Data4": 747056355993312928 + "Data1": 6883668054968670320, + "Data2": -4155356441934330889 }, "Flags": 0, "Kind": 0, @@ -50643,10 +49347,8 @@ }, { "__Checksum": { - "Data1": -4967993256295549110, - "Data2": -5124621407683705673, - "Data3": 8195087232402373784, - "Data4": 8250000121736825588 + "Data1": -4250892827382765251, + "Data2": -2634444624298608765 }, "Flags": 0, "Kind": 0, @@ -50749,10 +49451,8 @@ }, { "__Checksum": { - "Data1": -7318660878749410765, - "Data2": -8705474386193985520, - "Data3": -7340940363071111186, - "Data4": 9082703009856590342 + "Data1": 3013127476586867177, + "Data2": 289232522546395570 }, "Flags": 0, "Kind": 0, @@ -50806,10 +49506,8 @@ }, { "__Checksum": { - "Data1": -6251131804016573119, - "Data2": 5209069816937117184, - "Data3": -8087018331597593386, - "Data4": 5093142890204850547 + "Data1": 5978620595295719612, + "Data2": -4215404709652906919 }, "Flags": 0, "Kind": 0, @@ -50942,10 +49640,8 @@ }, { "__Checksum": { - "Data1": -1285250680621292165, - "Data2": -5737434193039973707, - "Data3": -4361635332000812839, - "Data4": 4019635769089812952 + "Data1": 5303412716579073797, + "Data2": -3551330574938697844 }, "Flags": 0, "Kind": 0, @@ -50975,10 +49671,8 @@ }, { "__Checksum": { - "Data1": -1544647694560071829, - "Data2": 6464200690373197819, - "Data3": -1527503990992635521, - "Data4": 3346010480430890050 + "Data1": 3256257149682971570, + "Data2": -7136744169615647369 }, "Flags": 0, "Kind": 0, @@ -51062,10 +49756,8 @@ }, { "__Checksum": { - "Data1": -294572382219790415, - "Data2": 6722607234263228626, - "Data3": -4390681150164624063, - "Data4": -8897626485806416241 + "Data1": -8997962699943403855, + "Data2": -8664902626966669852 }, "Flags": 0, "Kind": 0, @@ -51095,10 +49787,8 @@ }, { "__Checksum": { - "Data1": 9162500702307258529, - "Data2": -6150301222137184891, - "Data3": -5585868751483254815, - "Data4": 2821509826363242692 + "Data1": 8928988873314184969, + "Data2": -1216373647974568760 }, "Flags": 0, "Kind": 0, @@ -51327,10 +50017,8 @@ }, { "__Checksum": { - "Data1": -7976101805552007304, - "Data2": 4811711170506055999, - "Data3": 1290808499230012784, - "Data4": -8256415367469889888 + "Data1": 4073402113294245727, + "Data2": 3962892297969142996 }, "Flags": 0, "Kind": 0, @@ -51360,10 +50048,8 @@ }, { "__Checksum": { - "Data1": 4959785961729693092, - "Data2": 172240816599652242, - "Data3": -5049567758192709732, - "Data4": -1479686683550100593 + "Data1": -8679655291046394438, + "Data2": 6550047042580445882 }, "Flags": 0, "Kind": 0, @@ -51396,10 +50082,8 @@ }, { "__Checksum": { - "Data1": 8014003855282830194, - "Data2": -7427072864479312891, - "Data3": 7083204209744742283, - "Data4": 2483489697267546436 + "Data1": -8426105943024515041, + "Data2": -5295316180245529376 }, "Flags": 0, "Kind": 0, @@ -51444,10 +50128,8 @@ }, { "__Checksum": { - "Data1": -5160441794015624827, - "Data2": -2272765884754543826, - "Data3": 5898784136101121183, - "Data4": -1945025467193645162 + "Data1": -7510832420702569056, + "Data2": 126362524377822246 }, "Flags": 0, "Kind": 0, @@ -51494,10 +50176,8 @@ }, { "__Checksum": { - "Data1": 6805212830878442283, - "Data2": -4156710599146339853, - "Data3": 5642866860380241938, - "Data4": 6513920105589330356 + "Data1": -775187509159661537, + "Data2": 5297512847356904832 }, "Flags": 0, "Kind": 0, @@ -51528,10 +50208,8 @@ }, { "__Checksum": { - "Data1": -872768535302181202, - "Data2": -3520592569508997942, - "Data3": 5136065677621387312, - "Data4": 5683622015867940108 + "Data1": -7529650605818898937, + "Data2": 4656674383169818611 }, "Flags": 0, "Kind": 0, @@ -51564,10 +50242,8 @@ }, { "__Checksum": { - "Data1": -600525083674571298, - "Data2": -3781988065046766104, - "Data3": -8046211030265129580, - "Data4": 2662721591884371830 + "Data1": 2074252122340740306, + "Data2": 999027844781832186 }, "Flags": 0, "Kind": 0, @@ -51600,10 +50276,8 @@ }, { "__Checksum": { - "Data1": 8020619721259757786, - "Data2": -1155922609965669095, - "Data3": -3747171216580516799, - "Data4": 5789377103986599521 + "Data1": 8997369347168057608, + "Data2": 6355321566139272849 }, "Flags": 0, "Kind": 0, @@ -51655,10 +50329,8 @@ }, { "__Checksum": { - "Data1": -9108947274022885598, - "Data2": -6451348609270096217, - "Data3": 1804287357594232012, - "Data4": 5629591722054305161 + "Data1": -5524840462716646483, + "Data2": 8659080680933113543 }, "Flags": 0, "Kind": 0, @@ -51691,10 +50363,8 @@ }, { "__Checksum": { - "Data1": 9200776684722386946, - "Data2": 6175628142553034672, - "Data3": 577672877552394400, - "Data4": -5814760609049295825 + "Data1": -7948213304970380236, + "Data2": -7489262196723256773 }, "Flags": 0, "Kind": 0, @@ -51725,10 +50395,8 @@ }, { "__Checksum": { - "Data1": -289015955156917733, - "Data2": -6571816820394340348, - "Data3": 3152925054033525934, - "Data4": -7468646165706984681 + "Data1": -7896608409799862600, + "Data2": -3287079060358139820 }, "Flags": 0, "Kind": 0, @@ -51819,10 +50487,8 @@ }, { "__Checksum": { - "Data1": -261980300319449139, - "Data2": 9058594678221407849, - "Data3": 2438060609974292068, - "Data4": -5702790851630563783 + "Data1": -1513130764387992419, + "Data2": 970050727134339030 }, "Flags": 0, "Kind": 0, @@ -51855,10 +50521,8 @@ }, { "__Checksum": { - "Data1": -2157424948736570661, - "Data2": 6190026823789984459, - "Data3": -5481552194847764674, - "Data4": 7067866765424421035 + "Data1": -9173936088803892287, + "Data2": -7993830147141521617 }, "Flags": 0, "Kind": 0, @@ -51903,10 +50567,8 @@ }, { "__Checksum": { - "Data1": 1159466441957969801, - "Data2": -7460142608682698923, - "Data3": -5732896334337899605, - "Data4": -7974877963749336108 + "Data1": -973050187622285213, + "Data2": 716991911029284829 }, "Flags": 0, "Kind": 0, @@ -51953,10 +50615,8 @@ }, { "__Checksum": { - "Data1": 1424449620685147075, - "Data2": -394947823497854756, - "Data3": -4050372442143872056, - "Data4": 4139784618149919474 + "Data1": 367452392173210518, + "Data2": -7310459470308371122 }, "Flags": 0, "Kind": 0, @@ -51996,10 +50656,8 @@ }, { "__Checksum": { - "Data1": 979910132388267525, - "Data2": 6321443215807574205, - "Data3": -4995175637047974084, - "Data4": 7881481707959332583 + "Data1": 1354850784775164670, + "Data2": 2973236105607961835 }, "Flags": 0, "Kind": 0, @@ -52039,10 +50697,8 @@ }, { "__Checksum": { - "Data1": 8858731743696218171, - "Data2": 4276184374690095490, - "Data3": -3553598211754225497, - "Data4": 6693702525384638227 + "Data1": 8774718351330152, + "Data2": 8163614718693345448 }, "Flags": 0, "Kind": 0, @@ -52175,10 +50831,8 @@ }, { "__Checksum": { - "Data1": -7575847780798059575, - "Data2": 6783736100158195167, - "Data3": -6323078889285260868, - "Data4": 6035844439009984113 + "Data1": -9134336825845275804, + "Data2": 4851406270035065136 }, "Flags": 0, "Kind": 0, @@ -52208,10 +50862,8 @@ }, { "__Checksum": { - "Data1": 3708909093875317187, - "Data2": -3979490625415389766, - "Data3": -4789245232167696075, - "Data4": -3017116219511309799 + "Data1": -7527102124684245458, + "Data2": 495758517373196232 }, "Flags": 0, "Kind": 0, @@ -52295,10 +50947,8 @@ }, { "__Checksum": { - "Data1": 2536670269385763319, - "Data2": 7579708635675182021, - "Data3": 1110031260284821026, - "Data4": 8463211923351885578 + "Data1": -7974886492466291561, + "Data2": -8075323552160095987 }, "Flags": 0, "Kind": 0, @@ -52328,10 +50978,8 @@ }, { "__Checksum": { - "Data1": -513289545561707441, - "Data2": 6346992931132160732, - "Data3": 8872826804058919596, - "Data4": -4571005550493120648 + "Data1": -6964836371107539967, + "Data2": 4529181411484116835 }, "Flags": 0, "Kind": 0, @@ -52560,10 +51208,8 @@ }, { "__Checksum": { - "Data1": 2077146601451663962, - "Data2": -6734947285151883103, - "Data3": 1959849162983980499, - "Data4": 8261406516130417568 + "Data1": 341254838415745633, + "Data2": -754454078200061846 }, "Flags": 0, "Kind": 0, @@ -52593,10 +51239,8 @@ }, { "__Checksum": { - "Data1": -2965846720144666818, - "Data2": 7155284023843135599, - "Data3": 3497719654851852255, - "Data4": 3819121501869524291 + "Data1": 4815905692389138460, + "Data2": -7218425099348935361 }, "Flags": 0, "Kind": 0, @@ -52629,10 +51273,8 @@ }, { "__Checksum": { - "Data1": 2815190314601218119, - "Data2": -6919881458385621182, - "Data3": 2822890277287770749, - "Data4": 1770963745527565218 + "Data1": -3889510369238530349, + "Data2": -3823472342082257232 }, "Flags": 0, "Kind": 0, @@ -52677,10 +51319,8 @@ }, { "__Checksum": { - "Data1": -3335022507866306922, - "Data2": 6497983826242155869, - "Data3": 3873823394349354040, - "Data4": -5272621889928524813 + "Data1": 436537187212201708, + "Data2": 26645976862861504 }, "Flags": 0, "Kind": 0, @@ -52727,10 +51367,8 @@ }, { "__Checksum": { - "Data1": -9069777958249806145, - "Data2": -2956530007323322015, - "Data3": 8826066991378182744, - "Data4": 3199185813692885333 + "Data1": 346620020768095847, + "Data2": -582114882665242401 }, "Flags": 0, "Kind": 0, @@ -52770,10 +51408,8 @@ }, { "__Checksum": { - "Data1": -7350272248019499759, - "Data2": 7523550801549196477, - "Data3": -5760839757497449674, - "Data4": 653275653722436408 + "Data1": 424967472337347887, + "Data2": -4729841510493499176 }, "Flags": 0, "Kind": 0, @@ -52804,10 +51440,8 @@ }, { "__Checksum": { - "Data1": -2116832453075922489, - "Data2": -8219723766231459399, - "Data3": -5211287192217937790, - "Data4": -2196937957646159201 + "Data1": -5449095006135799494, + "Data2": -3387090408783999892 }, "Flags": 0, "Kind": 0, @@ -52840,10 +51474,8 @@ }, { "__Checksum": { - "Data1": 1338094052090002725, - "Data2": 8446764598371121386, - "Data3": -5970696959493760636, - "Data4": 2355457482164726540 + "Data1": 8397646465842422006, + "Data2": -2572652831153708423 }, "Flags": 0, "Kind": 0, @@ -52883,10 +51515,8 @@ }, { "__Checksum": { - "Data1": 1186697457870239052, - "Data2": 598601906211717320, - "Data3": -9171901010424989090, - "Data4": -8504080490096599823 + "Data1": -4642532648380036336, + "Data2": -2793496267351136399 }, "Flags": 0, "Kind": 0, @@ -52916,10 +51546,8 @@ }, { "__Checksum": { - "Data1": -1462891811166106688, - "Data2": 7411012702157212384, - "Data3": -1181352848606933401, - "Data4": -8797449104150718913 + "Data1": 4612622419884095369, + "Data2": -5775308724611243458 }, "Flags": 0, "Kind": 0, @@ -52952,10 +51580,8 @@ }, { "__Checksum": { - "Data1": 3340942409510099725, - "Data2": -5200582417103369179, - "Data3": -2870081040242871814, - "Data4": 1819515824205388391 + "Data1": -7282228515454640412, + "Data2": 7145189546966947391 }, "Flags": 0, "Kind": 0, @@ -53007,10 +51633,8 @@ }, { "__Checksum": { - "Data1": -3462900963195117823, - "Data2": -7056797312259839252, - "Data3": -8319031370926612723, - "Data4": 8283510104219447406 + "Data1": -4616513761149621569, + "Data2": 2268031604369572758 }, "Flags": 0, "Kind": 0, @@ -53043,10 +51667,8 @@ }, { "__Checksum": { - "Data1": 2941536370356980902, - "Data2": -8404453373541936933, - "Data3": 1583618524409553821, - "Data4": 7167639329255854065 + "Data1": -5821069036234603497, + "Data2": -6723424345829041072 }, "Flags": 0, "Kind": 0, @@ -53077,10 +51699,8 @@ }, { "__Checksum": { - "Data1": -2523362717196261491, - "Data2": -359004861273342737, - "Data3": 3299394800466360557, - "Data4": 6262589932764511098 + "Data1": 2336972403202589632, + "Data2": -7341739064621107099 }, "Flags": 0, "Kind": 0, @@ -53113,10 +51733,8 @@ }, { "__Checksum": { - "Data1": 1402361462521492446, - "Data2": -6034490927666840904, - "Data3": -4106200963351528351, - "Data4": -4678993781510566601 + "Data1": -9132103380890206325, + "Data2": 3576324121604856871 }, "Flags": 0, "Kind": 0, @@ -53161,10 +51779,8 @@ }, { "__Checksum": { - "Data1": -5492371674063294306, - "Data2": -2135402863875100317, - "Data3": 1871298800747019485, - "Data4": -8121876840281582981 + "Data1": -5864652747925258108, + "Data2": 3022289511226742182 }, "Flags": 0, "Kind": 0, @@ -53211,10 +51827,8 @@ }, { "__Checksum": { - "Data1": 1132297650545548645, - "Data2": 586663382503534087, - "Data3": 2384175589618697764, - "Data4": -391932571879982064 + "Data1": 2144149654248706352, + "Data2": -4193988332167814660 }, "Flags": 0, "Kind": 0, @@ -53254,10 +51868,8 @@ }, { "__Checksum": { - "Data1": -3693468302934381955, - "Data2": 5787450930430084892, - "Data3": -8984194531634379060, - "Data4": 3961926119595690059 + "Data1": 7362954822265326050, + "Data2": 1896912220982715533 }, "Flags": 0, "Kind": 0, @@ -53356,10 +51968,8 @@ }, { "__Checksum": { - "Data1": -7087968163725540100, - "Data2": -7393967432099029123, - "Data3": 5916451578871262804, - "Data4": 5169020398115831189 + "Data1": 2319413722840539223, + "Data2": 7862076712474192285 }, "Flags": 0, "Kind": 0, @@ -53389,10 +51999,8 @@ }, { "__Checksum": { - "Data1": 5848028439840320216, - "Data2": -6790965375271672095, - "Data3": 6974895997634926291, - "Data4": 893120815793433452 + "Data1": 2866346933429508995, + "Data2": -5533925964669129919 }, "Flags": 0, "Kind": 0, @@ -53432,10 +52040,8 @@ }, { "__Checksum": { - "Data1": -5712450925379231931, - "Data2": -4371853284024510675, - "Data3": 6399530544875262857, - "Data4": 3098157526730866286 + "Data1": 8415076236144774323, + "Data2": 2799124231737481826 }, "Flags": 0, "Kind": 0, @@ -53475,10 +52081,8 @@ }, { "__Checksum": { - "Data1": 7988561835351441079, - "Data2": 3675702128424444613, - "Data3": 6562556997349511650, - "Data4": -4876098939466740277 + "Data1": 3545314326843483617, + "Data2": -2430652062219650828 }, "Flags": 0, "Kind": 0, @@ -53518,10 +52122,8 @@ }, { "__Checksum": { - "Data1": -6571489233629104772, - "Data2": -808407604177927784, - "Data3": -1011769238271985858, - "Data4": 4545731691770840784 + "Data1": -2056466398828918376, + "Data2": -5287353093280088752 }, "Flags": 0, "Kind": 0, @@ -53561,10 +52163,8 @@ }, { "__Checksum": { - "Data1": -858669875240838453, - "Data2": -6567019933399791967, - "Data3": 4678196487007174422, - "Data4": -2920356560994382881 + "Data1": 7381918675028464709, + "Data2": 1275013805613821521 }, "Flags": 0, "Kind": 0, @@ -53604,10 +52204,8 @@ }, { "__Checksum": { - "Data1": 3654100646415409944, - "Data2": -1228669442574146922, - "Data3": -101780747821206330, - "Data4": -4426703266756738532 + "Data1": 6929811973128437207, + "Data2": 1422578015842650597 }, "Flags": 0, "Kind": 0, @@ -53643,10 +52241,8 @@ }, { "__Checksum": { - "Data1": 4363551972708650791, - "Data2": -367157325478890162, - "Data3": -6668908545457145859, - "Data4": -7880772026367482342 + "Data1": -2489100784684180962, + "Data2": -226780767788428432 }, "Flags": 0, "Kind": 0, @@ -53693,10 +52289,8 @@ }, { "__Checksum": { - "Data1": -6773308553809312107, - "Data2": -3675731043280826925, - "Data3": 1799265177409351049, - "Data4": 4757340811958640381 + "Data1": 6280809977618809185, + "Data2": -5784025276472252861 }, "Flags": 0, "Kind": 0, @@ -53753,10 +52347,8 @@ }, { "__Checksum": { - "Data1": 7716529386557861796, - "Data2": -6719981726577816781, - "Data3": -920769444129587821, - "Data4": -7730837827129953105 + "Data1": -3491850139524768885, + "Data2": 4214145825259100317 }, "Flags": 0, "Kind": 0, @@ -53803,10 +52395,8 @@ }, { "__Checksum": { - "Data1": 8405961455731166688, - "Data2": 6478285662166752738, - "Data3": 5008947733700969458, - "Data4": 707116986291655553 + "Data1": 3466327086724696566, + "Data2": 1731548544695966826 }, "Flags": 0, "Kind": 0, @@ -53846,10 +52436,8 @@ }, { "__Checksum": { - "Data1": 6355378367272912402, - "Data2": -5738427832247494741, - "Data3": 2116752902735222625, - "Data4": 2198719565556776974 + "Data1": 1547851937204184587, + "Data2": -5519018655069853583 }, "Flags": 0, "Kind": 0, @@ -53889,10 +52477,8 @@ }, { "__Checksum": { - "Data1": -5982292104695603400, - "Data2": 8685651050668612755, - "Data3": -529255994365475795, - "Data4": -3124439092442909991 + "Data1": -3037939395069558913, + "Data2": -9013148976495934860 }, "Flags": 0, "Kind": 0, @@ -53937,10 +52523,8 @@ }, { "__Checksum": { - "Data1": 8161124189285573317, - "Data2": -5279808961889092181, - "Data3": 6897358116259703837, - "Data4": -8826625777495826747 + "Data1": -6981911569852175006, + "Data2": -1244821734142438040 }, "Flags": 0, "Kind": 0, @@ -53980,10 +52564,8 @@ }, { "__Checksum": { - "Data1": 7453072198954721980, - "Data2": -535448531941127058, - "Data3": -4536760134526761549, - "Data4": 598871263100990351 + "Data1": 8007030798635046360, + "Data2": 1270431658453205760 }, "Flags": 0, "Kind": 0, @@ -54101,10 +52683,8 @@ }, { "__Checksum": { - "Data1": -8423409627974100191, - "Data2": 1064828135352083705, - "Data3": -5601175088295187175, - "Data4": 1496617782124873136 + "Data1": 1951506106225859123, + "Data2": 3965499147634060257 }, "Flags": 0, "Kind": 0, @@ -54237,10 +52817,8 @@ }, { "__Checksum": { - "Data1": -1544026819608153608, - "Data2": 9053753991543157988, - "Data3": -5829365066744252758, - "Data4": 4988015222914281674 + "Data1": -1841284768146041086, + "Data2": 1951274675776448697 }, "Flags": 0, "Kind": 0, @@ -54270,10 +52848,8 @@ }, { "__Checksum": { - "Data1": -3414271185168398953, - "Data2": -7980159539883755683, - "Data3": 45663996268315424, - "Data4": 5850529612052214227 + "Data1": 1479186693475870838, + "Data2": 2595228664093256690 }, "Flags": 0, "Kind": 0, @@ -54357,10 +52933,8 @@ }, { "__Checksum": { - "Data1": 4801221253639479694, - "Data2": -8781432150380947072, - "Data3": -6665894484668102140, - "Data4": 9198042043960269276 + "Data1": -5106428196902516688, + "Data2": 4970787671000128132 }, "Flags": 0, "Kind": 0, @@ -54390,10 +52964,8 @@ }, { "__Checksum": { - "Data1": 4524983015929845508, - "Data2": -6748577485321931327, - "Data3": 1212001643886739958, - "Data4": -3205049190627615108 + "Data1": 4661801418049929939, + "Data2": 3661385191451429189 }, "Flags": 0, "Kind": 0, @@ -54629,10 +53201,8 @@ }, { "__Checksum": { - "Data1": 417617526891801312, - "Data2": 640444958058551640, - "Data3": -7584851746591309151, - "Data4": 9207268562662799697 + "Data1": -8642451442652428720, + "Data2": -5447503044417551455 }, "Flags": 0, "Kind": 0, @@ -54662,10 +53232,8 @@ }, { "__Checksum": { - "Data1": -3760746320627304504, - "Data2": -1802113896510706684, - "Data3": -9182201875666436638, - "Data4": 3848547004765497944 + "Data1": 74628272798928415, + "Data2": 2199768983058211897 }, "Flags": 0, "Kind": 0, @@ -54726,10 +53294,8 @@ }, { "__Checksum": { - "Data1": 4767439814929770313, - "Data2": 7650520336101198125, - "Data3": -2690156556106967324, - "Data4": 1096916495793773063 + "Data1": 8721837982024520577, + "Data2": 5758826433801398688 }, "Flags": 0, "Kind": 0, @@ -54867,10 +53433,8 @@ }, { "__Checksum": { - "Data1": -4628215661023580710, - "Data2": 4322327629770905510, - "Data3": -2955022057055495734, - "Data4": 7793758321004519681 + "Data1": 1323894317069998482, + "Data2": 8267241755211956510 }, "Flags": 0, "Kind": 0, @@ -54910,10 +53474,8 @@ }, { "__Checksum": { - "Data1": -1664229628499434915, - "Data2": 2329212081377083028, - "Data3": 4703298370743596983, - "Data4": 1748515552062076519 + "Data1": 3548104787233606269, + "Data2": 4861871841316539461 }, "Flags": 0, "Kind": 0, @@ -54967,10 +53529,8 @@ }, { "__Checksum": { - "Data1": 8561177666588117426, - "Data2": -5167569418829329941, - "Data3": 4538725723691983513, - "Data4": 3695321616204756923 + "Data1": -1517291190889769075, + "Data2": -6050872688973190759 }, "Flags": 0, "Kind": 0, @@ -55087,10 +53647,8 @@ }, { "__Checksum": { - "Data1": 3793363424730047053, - "Data2": -2606064003633998800, - "Data3": 7825226984365203506, - "Data4": -8930899420150977992 + "Data1": 403698106802689586, + "Data2": 450584568850513895 }, "Flags": 0, "Kind": 0, @@ -55144,10 +53702,8 @@ }, { "__Checksum": { - "Data1": 6923294208394032806, - "Data2": -1289012610988667429, - "Data3": 7516179666102113770, - "Data4": 1176035270889389206 + "Data1": -7440773628341382514, + "Data2": -1198885815987028268 }, "Flags": 0, "Kind": 0, @@ -55194,10 +53750,8 @@ }, { "__Checksum": { - "Data1": -6631792136229140176, - "Data2": 3300738211664021570, - "Data3": -7451811072953293590, - "Data4": 7850736995928006703 + "Data1": 6898569959389682389, + "Data2": -2516070638890302586 }, "Flags": 0, "Kind": 0, @@ -55237,10 +53791,8 @@ }, { "__Checksum": { - "Data1": 714327775837002433, - "Data2": 5843554489810657751, - "Data3": 5047662751186017529, - "Data4": 4021687639750247728 + "Data1": 2781989624951294391, + "Data2": -7471533791408320507 }, "Flags": 0, "Kind": 0, @@ -55280,10 +53832,8 @@ }, { "__Checksum": { - "Data1": -3477566324382376941, - "Data2": 2793087615335940741, - "Data3": -1234272640946607463, - "Data4": -9108241816130412969 + "Data1": -6604753298096878095, + "Data2": -730544112401639649 }, "Flags": 0, "Kind": 0, @@ -55319,10 +53869,8 @@ }, { "__Checksum": { - "Data1": 2405332482742883828, - "Data2": -8718865989034154714, - "Data3": 3623487160771163835, - "Data4": -2311591546571532139 + "Data1": -6885988909301161859, + "Data2": 7993440679112317167 }, "Flags": 0, "Kind": 0, @@ -55369,10 +53917,8 @@ }, { "__Checksum": { - "Data1": -8579298781611102362, - "Data2": 5999437760957605992, - "Data3": 3934718439894139865, - "Data4": -4984279904998367981 + "Data1": -5728473026278305657, + "Data2": -3935729771048683121 }, "Flags": 0, "Kind": 0, @@ -55429,10 +53975,8 @@ }, { "__Checksum": { - "Data1": -2811617998476644629, - "Data2": -4940837655597364360, - "Data3": 9080329253436830156, - "Data4": 7308444515302978564 + "Data1": 3902751070311927389, + "Data2": -3827891414703731116 }, "Flags": 0, "Kind": 0, @@ -55479,10 +54023,8 @@ }, { "__Checksum": { - "Data1": 3855593875510165026, - "Data2": -9203945200192265293, - "Data3": 2249980725567140644, - "Data4": -4286754921958646679 + "Data1": 3115395588204085492, + "Data2": -836973472201112174 }, "Flags": 0, "Kind": 0, @@ -55522,10 +54064,8 @@ }, { "__Checksum": { - "Data1": 8505396844141969409, - "Data2": -3893384515788328228, - "Data3": 7684803388078714512, - "Data4": 2665062655559290755 + "Data1": 1299739017700319636, + "Data2": 5412460532794497428 }, "Flags": 0, "Kind": 0, @@ -55565,10 +54105,8 @@ }, { "__Checksum": { - "Data1": -80403295561628803, - "Data2": -3067865913983430532, - "Data3": -8025644476060506167, - "Data4": 1489913724221722847 + "Data1": -5871203469964543991, + "Data2": -4181127327143645677 }, "Flags": 0, "Kind": 0, @@ -55604,10 +54142,8 @@ }, { "__Checksum": { - "Data1": -8638073062924436115, - "Data2": -3925608013367976525, - "Data3": -1673124192810508772, - "Data4": -6791497082834339970 + "Data1": 2818877536763397117, + "Data2": 2962731458250796728 }, "Flags": 0, "Kind": 0, @@ -55654,10 +54190,8 @@ }, { "__Checksum": { - "Data1": -9189511961986162759, - "Data2": -1592494047028288660, - "Data3": 8150430461784141529, - "Data4": -3658351998240190793 + "Data1": -7335205319408863912, + "Data2": -898354520894682478 }, "Flags": 0, "Kind": 0, @@ -55704,10 +54238,8 @@ }, { "__Checksum": { - "Data1": -4952892569367291852, - "Data2": -1481838791625882857, - "Data3": 229882700729671194, - "Data4": 7876380063811425049 + "Data1": 3991038185538732141, + "Data2": -987496973802041659 }, "Flags": 0, "Kind": 0, @@ -55785,10 +54317,8 @@ }, { "__Checksum": { - "Data1": 6370746978715723731, - "Data2": -8902219968057468582, - "Data3": -5823858073318369332, - "Data4": 1781917394066108182 + "Data1": -7990482774966776876, + "Data2": 8418445762038966950 }, "Flags": 0, "Kind": 0, @@ -55818,10 +54348,8 @@ }, { "__Checksum": { - "Data1": -8473152307159529781, - "Data2": -687897821090108459, - "Data3": 7010693455851737566, - "Data4": 2468049212190482235 + "Data1": -8433467408039320765, + "Data2": -8826370045648215138 }, "Flags": 0, "Kind": 0, @@ -55924,10 +54452,8 @@ }, { "__Checksum": { - "Data1": -6775891223620916181, - "Data2": -3374045946617433665, - "Data3": 1774409699856896994, - "Data4": -7480028729964948565 + "Data1": 881563399003550641, + "Data2": 4496310728468291653 }, "Flags": 0, "Kind": 0, @@ -55967,10 +54493,8 @@ }, { "__Checksum": { - "Data1": -3834555396750595574, - "Data2": -5508206404766634828, - "Data3": -2367972925387353948, - "Data4": 2933199160141647090 + "Data1": -5258941978261812426, + "Data2": 2611144501281546724 }, "Flags": 0, "Kind": 0, @@ -56010,10 +54534,8 @@ }, { "__Checksum": { - "Data1": 8778776374977557669, - "Data2": -5739770086476115613, - "Data3": 3651226615308406600, - "Data4": 1875654083848915046 + "Data1": -21031093070946188, + "Data2": 8187168789199153228 }, "Flags": 0, "Kind": 0, @@ -56049,10 +54571,8 @@ }, { "__Checksum": { - "Data1": 333755957258348357, - "Data2": 4995668803401222562, - "Data3": -4455956404758122602, - "Data4": 3684970634265229926 + "Data1": 8566850816546722971, + "Data2": 4973449917165936959 }, "Flags": 0, "Kind": 0, @@ -56099,10 +54619,8 @@ }, { "__Checksum": { - "Data1": 5787709520672143249, - "Data2": -4596481933028167616, - "Data3": 5055683728988448744, - "Data4": -432848404938069651 + "Data1": 1760857940535083099, + "Data2": 4464690995509110049 }, "Flags": 0, "Kind": 0, @@ -56159,10 +54677,8 @@ }, { "__Checksum": { - "Data1": -2865525971380548932, - "Data2": -421671475130174254, - "Data3": -5984208881548333489, - "Data4": -6447395731561544535 + "Data1": 3044670193190907424, + "Data2": -3096317658367695511 }, "Flags": 0, "Kind": 0, @@ -56209,10 +54725,8 @@ }, { "__Checksum": { - "Data1": 709131668475686298, - "Data2": 5531317580272654498, - "Data3": -4320727071514957230, - "Data4": -961887453988646767 + "Data1": 8439452789415637118, + "Data2": 6548965525436957308 }, "Flags": 0, "Kind": 0, @@ -56252,10 +54766,8 @@ }, { "__Checksum": { - "Data1": -2473942574130909481, - "Data2": 3165817711092646737, - "Data3": -2429502522910698250, - "Data4": -721397028830908023 + "Data1": 2979554590562516397, + "Data2": -1360590166626493706 }, "Flags": 0, "Kind": 0, @@ -56295,10 +54807,8 @@ }, { "__Checksum": { - "Data1": 3983048726862888974, - "Data2": 6926691955012842966, - "Data3": 3237100611522891626, - "Data4": 544751231911503561 + "Data1": -2594795629626371572, + "Data2": -3183661811888113835 }, "Flags": 0, "Kind": 0, @@ -56334,10 +54844,8 @@ }, { "__Checksum": { - "Data1": -4062871242536649183, - "Data2": 4573205812778211341, - "Data3": -1413000160525254316, - "Data4": -8593215277289625188 + "Data1": -1848171548510202441, + "Data2": -792386594142247578 }, "Flags": 0, "Kind": 0, @@ -56384,10 +54892,8 @@ }, { "__Checksum": { - "Data1": 2923149221270890962, - "Data2": 2963159357971691197, - "Data3": 5874454236815116375, - "Data4": -9009089913680578598 + "Data1": 5134324773367470231, + "Data2": 5312578754562858228 }, "Flags": 0, "Kind": 0, @@ -56434,10 +54940,8 @@ }, { "__Checksum": { - "Data1": 1123188959465221642, - "Data2": -7905630628508989390, - "Data3": 3803529933148443844, - "Data4": -1400828485612041821 + "Data1": 5168666915916036706, + "Data2": -4182466681490365824 }, "Flags": 0, "Kind": 0, @@ -56540,10 +55044,8 @@ }, { "__Checksum": { - "Data1": -6661309344382592060, - "Data2": 913260077149803980, - "Data3": 1769164637731784275, - "Data4": -5759650750936707518 + "Data1": -7637314648865942453, + "Data2": 4258957239775762944 }, "Flags": 0, "Kind": 0, @@ -56604,10 +55106,8 @@ }, { "__Checksum": { - "Data1": -6648248953962407674, - "Data2": 7021461405496408590, - "Data3": 7618631623908510747, - "Data4": 6887039748072903591 + "Data1": -6240847999846564299, + "Data2": 8817541848072321982 }, "Flags": 0, "Kind": 0, @@ -56740,10 +55240,8 @@ }, { "__Checksum": { - "Data1": -955313303428658567, - "Data2": -8374595217564832203, - "Data3": 6646783257249376295, - "Data4": 3942330263492793211 + "Data1": -4153414793977640860, + "Data2": -902786235501060220 }, "Flags": 0, "Kind": 0, @@ -56773,10 +55271,8 @@ }, { "__Checksum": { - "Data1": 5851826844705911847, - "Data2": -6176390631703271405, - "Data3": 1097274102290869100, - "Data4": -3733479198938401577 + "Data1": 5543628028795937667, + "Data2": -4145151332408474338 }, "Flags": 0, "Kind": 0, @@ -56860,10 +55356,8 @@ }, { "__Checksum": { - "Data1": -2579770451224499295, - "Data2": 1446654178996474895, - "Data3": 1676624106653343616, - "Data4": 1010213784309432381 + "Data1": 5694801673379354858, + "Data2": 2553280334945641436 }, "Flags": 0, "Kind": 0, @@ -56893,10 +55387,8 @@ }, { "__Checksum": { - "Data1": -1442357629103713342, - "Data2": 1968528300724269094, - "Data3": -1873826036711441151, - "Data4": -8166465076367240865 + "Data1": -1443160986115965512, + "Data2": 6484091604838095969 }, "Flags": 0, "Kind": 0, @@ -57132,10 +55624,8 @@ }, { "__Checksum": { - "Data1": 279720033858591209, - "Data2": -8649753487177951606, - "Data3": -7158858866598149037, - "Data4": 3384566121971282943 + "Data1": 4717677938664976553, + "Data2": 1142143784507944903 }, "Flags": 0, "Kind": 0, @@ -57165,10 +55655,8 @@ }, { "__Checksum": { - "Data1": 6433389782741085210, - "Data2": -2825787687272285731, - "Data3": 6274379971871501312, - "Data4": -622814471287718448 + "Data1": 6202795954292100129, + "Data2": -7191793191886759156 }, "Flags": 0, "Kind": 0, @@ -57215,10 +55703,8 @@ }, { "__Checksum": { - "Data1": 879148924407127598, - "Data2": -7201974455781299439, - "Data3": -555151483299880873, - "Data4": 2108997988377972799 + "Data1": -2209513271894651534, + "Data2": 4511026773157733943 }, "Flags": 0, "Kind": 0, @@ -57248,10 +55734,8 @@ }, { "__Checksum": { - "Data1": -4171612777428898590, - "Data2": -1821613464252355892, - "Data3": 2619470190270819591, - "Data4": 1039629508476612935 + "Data1": -4766395661447507391, + "Data2": 7089004907654975417 }, "Flags": 0, "Kind": 0, @@ -57319,10 +55803,8 @@ }, { "__Checksum": { - "Data1": 6660574940497795334, - "Data2": -5170558584264076619, - "Data3": 4474786736680009114, - "Data4": -651361932701191869 + "Data1": -1707512536381084246, + "Data2": -5352367433953486067 }, "Flags": 0, "Kind": 0, @@ -57369,10 +55851,8 @@ }, { "__Checksum": { - "Data1": 2920013822942706068, - "Data2": -7641212993113162849, - "Data3": 8995001846617170024, - "Data4": 1631596758387016221 + "Data1": -3374625354177250003, + "Data2": 5405156880396132501 }, "Flags": 0, "Kind": 0, @@ -57412,10 +55892,8 @@ }, { "__Checksum": { - "Data1": 8082083079532526281, - "Data2": 2217850277842449500, - "Data3": -6004272680205334717, - "Data4": -5988891962302591760 + "Data1": -2514508649597431330, + "Data2": -7513601697044846739 }, "Flags": 0, "Kind": 0, @@ -57446,10 +55924,8 @@ }, { "__Checksum": { - "Data1": -4838830970519241879, - "Data2": 697154284087399943, - "Data3": -6531219950513391540, - "Data4": 7119659892989982513 + "Data1": 7464611192761161895, + "Data2": 7379354489464615132 }, "Flags": 0, "Kind": 0, @@ -57482,10 +55958,8 @@ }, { "__Checksum": { - "Data1": 2291275882883911275, - "Data2": 6394490454234280419, - "Data3": 466578173512533982, - "Data4": -8454154157160839310 + "Data1": -1156930813824951448, + "Data2": 1228976312432401931 }, "Flags": 0, "Kind": 0, @@ -57556,10 +56030,8 @@ }, { "__Checksum": { - "Data1": -5236545904649585253, - "Data2": 8111013381791297576, - "Data3": 8138466944905781148, - "Data4": -3490740159849104228 + "Data1": -3741162855986532985, + "Data2": 6457987159778156706 }, "Flags": 0, "Kind": 0, @@ -57589,10 +56061,8 @@ }, { "__Checksum": { - "Data1": -1464730534687891406, - "Data2": 7283351431267396315, - "Data3": 7047895005236862354, - "Data4": -2387586243443807667 + "Data1": 3817341009415343271, + "Data2": 4673743021780862970 }, "Flags": 0, "Kind": 0, @@ -57737,10 +56207,8 @@ }, { "__Checksum": { - "Data1": 7523995792776393576, - "Data2": -9099519166887030165, - "Data3": 8384652211401789751, - "Data4": -3802991361984567518 + "Data1": 887451380745723158, + "Data2": -2101818175394879486 }, "Flags": 0, "Kind": 0, @@ -57787,10 +56255,8 @@ }, { "__Checksum": { - "Data1": 497965607212224754, - "Data2": -2971543707216623721, - "Data3": 728709982443442493, - "Data4": -8906955175375875973 + "Data1": -3157981509813942644, + "Data2": -7689740180202472679 }, "Flags": 0, "Kind": 0, @@ -57837,10 +56303,8 @@ }, { "__Checksum": { - "Data1": 3262004727576511778, - "Data2": -5883894757466880662, - "Data3": -182997466019211296, - "Data4": -8677220460397194606 + "Data1": 7536876180531238438, + "Data2": -1461555757436384769 }, "Flags": 0, "Kind": 0, @@ -57973,10 +56437,8 @@ }, { "__Checksum": { - "Data1": -1245030050678082602, - "Data2": -3936847652083625951, - "Data3": -1915953213542591273, - "Data4": -8843852162041085475 + "Data1": -2127920273026383917, + "Data2": -6217828429596957285 }, "Flags": 0, "Kind": 0, @@ -58006,10 +56468,8 @@ }, { "__Checksum": { - "Data1": -7019171750182878924, - "Data2": -6045938514059238034, - "Data3": 262106104634610324, - "Data4": 2540207646360719946 + "Data1": -4660518226033243678, + "Data2": -9221993629820751864 }, "Flags": 0, "Kind": 0, @@ -58093,10 +56553,8 @@ }, { "__Checksum": { - "Data1": -1373283183311141644, - "Data2": 45353607997872373, - "Data3": 9148849216277838700, - "Data4": 5097956521573864821 + "Data1": 2448289200906788556, + "Data2": 4781396480103948768 }, "Flags": 0, "Kind": 0, @@ -58126,10 +56584,8 @@ }, { "__Checksum": { - "Data1": 7843095437845596727, - "Data2": -5918010434565823436, - "Data3": -5895612085207265041, - "Data4": 3880366410926654919 + "Data1": 4672383370651421568, + "Data2": 3041174444899398770 }, "Flags": 0, "Kind": 0, @@ -58365,10 +56821,8 @@ }, { "__Checksum": { - "Data1": -2102690224618659957, - "Data2": -2883867916015376759, - "Data3": -8429394236157494470, - "Data4": -218217653490749552 + "Data1": -4148686071173422737, + "Data2": -7853415720224437121 }, "Flags": 0, "Kind": 0, @@ -58398,10 +56852,8 @@ }, { "__Checksum": { - "Data1": 2801505603228110311, - "Data2": 7228866285153439962, - "Data3": 1596789165554115360, - "Data4": -3297451285399992894 + "Data1": -5035001475981966446, + "Data2": -8461669106576071378 }, "Flags": 0, "Kind": 0, @@ -58448,10 +56900,8 @@ }, { "__Checksum": { - "Data1": -2910015969538301781, - "Data2": 7645691876388369479, - "Data3": -7715784465007742686, - "Data4": 8289388678696732727 + "Data1": -5300869981452146192, + "Data2": 4167050322497450611 }, "Flags": 0, "Kind": 0, @@ -58481,10 +56931,8 @@ }, { "__Checksum": { - "Data1": 2639222709039048234, - "Data2": -1583085291158845877, - "Data3": -8148889233107275459, - "Data4": -640144807351430460 + "Data1": -6405974970475069739, + "Data2": -8836145079954003869 }, "Flags": 0, "Kind": 0, @@ -58552,10 +57000,8 @@ }, { "__Checksum": { - "Data1": -8260699695935064723, - "Data2": 992040870549482551, - "Data3": 3781908136516523879, - "Data4": -7760065351570204568 + "Data1": -5701476766820266781, + "Data2": -4995392558871235966 }, "Flags": 0, "Kind": 0, @@ -58602,10 +57048,8 @@ }, { "__Checksum": { - "Data1": 5509938583594995365, - "Data2": 8838968750538750778, - "Data3": 5413213222771613369, - "Data4": -8689764380836391559 + "Data1": 6897755480655122678, + "Data2": 6808104523868370838 }, "Flags": 0, "Kind": 0, @@ -58645,10 +57089,8 @@ }, { "__Checksum": { - "Data1": 3447163780723693382, - "Data2": 3694905363019971046, - "Data3": 3816816445502110390, - "Data4": -7958356861040795583 + "Data1": 6084142326591894699, + "Data2": -4065437583328597672 }, "Flags": 0, "Kind": 0, @@ -58679,10 +57121,8 @@ }, { "__Checksum": { - "Data1": -164674216835762072, - "Data2": 8969689416951801903, - "Data3": -4698799587544922338, - "Data4": -3353432114925805800 + "Data1": 8729458447742006008, + "Data2": 7673198979753820287 }, "Flags": 0, "Kind": 0, @@ -58715,10 +57155,8 @@ }, { "__Checksum": { - "Data1": -7643249750203665495, - "Data2": 1169688971000920704, - "Data3": -2379955965652865574, - "Data4": 7368049870736109213 + "Data1": 617090964202610347, + "Data2": 3842490919195759480 }, "Flags": 0, "Kind": 0, @@ -58765,10 +57203,8 @@ }, { "__Checksum": { - "Data1": -6154847254869909344, - "Data2": -1919838968672052937, - "Data3": -7746043049899204272, - "Data4": -4004581545065017369 + "Data1": -7326632069408613322, + "Data2": 7462683465303641808 }, "Flags": 0, "Kind": 0, @@ -58913,10 +57349,8 @@ }, { "__Checksum": { - "Data1": -5057548527186750062, - "Data2": 3796678650027314431, - "Data3": 3864947183197024852, - "Data4": 2598014975461650097 + "Data1": -6325741212171468192, + "Data2": 6525777366661296174 }, "Flags": 0, "Kind": 0, @@ -58946,10 +57380,8 @@ }, { "__Checksum": { - "Data1": 5951335715179678279, - "Data2": 2318489288386456551, - "Data3": 6262852112212670911, - "Data4": -577910133103538675 + "Data1": 7569379665159975811, + "Data2": 7498387515775531073 }, "Flags": 0, "Kind": 0, @@ -59275,10 +57707,8 @@ }, { "__Checksum": { - "Data1": 3985917159583923610, - "Data2": 4743418541455813322, - "Data3": 5260963973293811306, - "Data4": -7671733851978970968 + "Data1": 5010439592216435184, + "Data2": -7958936705235890912 }, "Flags": 0, "Kind": 0, @@ -59332,10 +57762,8 @@ }, { "__Checksum": { - "Data1": -9174523293922402675, - "Data2": 3765614069614029473, - "Data3": 192964318291599480, - "Data4": 9195580381553919910 + "Data1": 6701967999235096489, + "Data2": 1960962814215151508 }, "Flags": 0, "Kind": 0, @@ -59365,10 +57793,8 @@ }, { "__Checksum": { - "Data1": -7166199946357558653, - "Data2": 1392675149444708014, - "Data3": 405748434971336752, - "Data4": 4745560771565466126 + "Data1": -927886143102503091, + "Data2": 1724738598084788128 }, "Flags": 0, "Kind": 0, @@ -59416,10 +57842,8 @@ }, { "__Checksum": { - "Data1": -5370578421708054374, - "Data2": 4343608927543762027, - "Data3": -7755373421467674086, - "Data4": 6015440993907214402 + "Data1": -3035282716218429612, + "Data2": -695098028246620311 }, "Flags": 0, "Kind": 0, @@ -59459,10 +57883,8 @@ }, { "__Checksum": { - "Data1": 1809535752365793599, - "Data2": 2189521474334744937, - "Data3": 4925508234429281682, - "Data4": 7672016064739503237 + "Data1": -2358486496547466493, + "Data2": 8584744589588360706 }, "Flags": 0, "Kind": 0, @@ -59502,10 +57924,8 @@ }, { "__Checksum": { - "Data1": 4289324398217937302, - "Data2": -8566709112725280126, - "Data3": 5432898037323061142, - "Data4": -869009187739249619 + "Data1": 6166983001659540820, + "Data2": 7588185189577845814 }, "Flags": 0, "Kind": 0, @@ -59552,10 +57972,8 @@ }, { "__Checksum": { - "Data1": 3297323991006806789, - "Data2": -9022946642043023345, - "Data3": 7581789756629642343, - "Data4": 1100683572372007005 + "Data1": 3358280480933900367, + "Data2": 3642763487512844070 }, "Flags": 0, "Kind": 0, @@ -59602,10 +58020,8 @@ }, { "__Checksum": { - "Data1": -4174346774183960321, - "Data2": 426022494153579200, - "Data3": 2170710127152058959, - "Data4": 2410916088533110516 + "Data1": 158956809156156078, + "Data2": 8517554671693596612 }, "Flags": 0, "Kind": 0, @@ -59650,10 +58066,8 @@ }, { "__Checksum": { - "Data1": 8124591688573303277, - "Data2": -5172001617475034018, - "Data3": 3589372064628084936, - "Data4": -3454532928103577750 + "Data1": 3942705202095272530, + "Data2": 6773285356397628556 }, "Flags": 0, "Kind": 0, @@ -59859,10 +58273,8 @@ }, { "__Checksum": { - "Data1": 1973553378756528560, - "Data2": -718362750552491472, - "Data3": 4120887683345952013, - "Data4": 3816981112038880964 + "Data1": 7063313510868013683, + "Data2": 767581536875441476 }, "Flags": 0, "Kind": 0, @@ -59902,10 +58314,8 @@ }, { "__Checksum": { - "Data1": 5403892922084413489, - "Data2": -6240861685162231603, - "Data3": 5574656448946097350, - "Data4": 843398807780605253 + "Data1": 1248442563521198276, + "Data2": -8473541353629934982 }, "Flags": 0, "Kind": 0, @@ -60162,10 +58572,8 @@ }, { "__Checksum": { - "Data1": -7448500377768208056, - "Data2": 8169007429928610913, - "Data3": 7057478086120621807, - "Data4": -3811542372596222635 + "Data1": -4373248927874105619, + "Data2": 5728269552411561482 }, "Flags": 0, "Kind": 0, @@ -60188,10 +58596,8 @@ }, { "__Checksum": { - "Data1": 3111173296156042085, - "Data2": -3065444926140371610, - "Data3": -4654994157760597828, - "Data4": -320327055813035622 + "Data1": 8521573949568100928, + "Data2": -8157253218600240882 }, "Flags": 0, "Kind": 0, @@ -60259,10 +58665,8 @@ }, { "__Checksum": { - "Data1": -5711177456089296903, - "Data2": -1906762505058826828, - "Data3": -5600215279549031666, - "Data4": -8430432067535998571 + "Data1": 6897691498751795055, + "Data2": 7699380622541850560 }, "Flags": 0, "Kind": 0, @@ -60424,10 +58828,8 @@ }, { "__Checksum": { - "Data1": -4522225529304887361, - "Data2": -2639008809606940929, - "Data3": 196582254355111891, - "Data4": 2846982848732086661 + "Data1": 5883703278592231796, + "Data2": -841866010683353574 }, "Flags": 0, "Kind": 0, @@ -60525,10 +58927,8 @@ }, { "__Checksum": { - "Data1": -8390601531188440668, - "Data2": -4129279103488349662, - "Data3": -8859370808970898657, - "Data4": 3244583493568287848 + "Data1": 4597801777063179535, + "Data2": 4867917677399784834 }, "Flags": 0, "Kind": 0, @@ -60558,10 +58958,8 @@ }, { "__Checksum": { - "Data1": -6327766471012132220, - "Data2": 5127752200220764587, - "Data3": -6896781196336946106, - "Data4": 4768448161167917983 + "Data1": 2556465794607161972, + "Data2": -6365150214071030894 }, "Flags": 0, "Kind": 0, @@ -60594,10 +58992,8 @@ }, { "__Checksum": { - "Data1": -3743241759528754428, - "Data2": -2559027468429514546, - "Data3": 7441733359663388918, - "Data4": 1750351805831174562 + "Data1": 6806124353848366492, + "Data2": -2049793609234308795 }, "Flags": 0, "Kind": 0, @@ -60630,10 +59026,8 @@ }, { "__Checksum": { - "Data1": 679625500702925891, - "Data2": -3487982954043130896, - "Data3": -4766130549606709686, - "Data4": 8214872389038479120 + "Data1": -7459872370203435947, + "Data2": -8976381067899239924 }, "Flags": 0, "Kind": 0, @@ -60821,10 +59215,8 @@ }, { "__Checksum": { - "Data1": 7168446338084917183, - "Data2": 4994809616923705366, - "Data3": 4418903969863050776, - "Data4": 7474196476541865369 + "Data1": 8177444831584087431, + "Data2": 4294624250629461407 }, "Flags": 0, "Kind": 0, @@ -60875,10 +59267,8 @@ }, { "__Checksum": { - "Data1": -4650153362915887204, - "Data2": 7712797445294507482, - "Data3": -5806580003671400298, - "Data4": -1015474566977554600 + "Data1": -4278085749678721071, + "Data2": -1995838448890305009 }, "Flags": 0, "Kind": 0, @@ -60925,10 +59315,8 @@ }, { "__Checksum": { - "Data1": 7459355327402975204, - "Data2": -952082687195681029, - "Data3": 2638203731076810285, - "Data4": -842793793101800167 + "Data1": 2005396315089985771, + "Data2": -5870180002802921017 }, "Flags": 0, "Kind": 0, @@ -60967,10 +59355,8 @@ }, { "__Checksum": { - "Data1": 5047192092889246153, - "Data2": -7007847442782631332, - "Data3": 8568252863190785854, - "Data4": -158426439050171015 + "Data1": 430777719205562380, + "Data2": 7690786441315662600 }, "Flags": 0, "Kind": 0, @@ -61065,10 +59451,8 @@ }, { "__Checksum": { - "Data1": -581126348258603513, - "Data2": -5084258952179370652, - "Data3": 7457340448250311419, - "Data4": 8378419694308344852 + "Data1": -2317493820219844574, + "Data2": 7241864096364332732 }, "Flags": 0, "Kind": 0, @@ -61613,10 +59997,8 @@ }, { "__Checksum": { - "Data1": -806541024466401372, - "Data2": 6819068534084786679, - "Data3": -1764730598636171696, - "Data4": -731347807797174080 + "Data1": 5324678947979196669, + "Data2": -1430010492278580109 }, "Flags": 0, "Kind": 0, @@ -61676,10 +60058,8 @@ }, { "__Checksum": { - "Data1": 4637034411505408405, - "Data2": -1068765191950467960, - "Data3": -7519827759388388097, - "Data4": 8142232444743033024 + "Data1": 298631386551646403, + "Data2": -1385136299952496550 }, "Flags": 0, "Kind": 0, @@ -61730,10 +60110,8 @@ }, { "__Checksum": { - "Data1": -3338631797288193859, - "Data2": -9074182530675486317, - "Data3": -6525695502077430653, - "Data4": 5293975085443324028 + "Data1": 6896945476287103030, + "Data2": 316734778598469592 }, "Flags": 0, "Kind": 0, @@ -61800,10 +60178,8 @@ }, { "__Checksum": { - "Data1": -7726102382181599554, - "Data2": 6405345968169697858, - "Data3": -1033184466521161339, - "Data4": 7508798891390650775 + "Data1": 9063117766738812406, + "Data2": 1272035925356357084 }, "Flags": 0, "Kind": 0, @@ -61929,10 +60305,8 @@ }, { "__Checksum": { - "Data1": -3842954210608228341, - "Data2": -8572506160919083599, - "Data3": -5193839296565672231, - "Data4": 1241553707693967586 + "Data1": -2943238236780012269, + "Data2": -8308184894407175688 }, "Flags": 0, "Kind": 0, @@ -61967,10 +60341,8 @@ }, { "__Checksum": { - "Data1": -2882096737490705739, - "Data2": -3414861977250162771, - "Data3": 2151355200948350305, - "Data4": 351469246434512252 + "Data1": -23000492764930842, + "Data2": -5500396460995276818 }, "Flags": 0, "Kind": 0, @@ -62017,10 +60389,8 @@ }, { "__Checksum": { - "Data1": -2967172371437537913, - "Data2": -6057778915235509295, - "Data3": -6380569254398713914, - "Data4": -3532299963369235168 + "Data1": 8878759421131998832, + "Data2": 5587881426495607827 }, "Flags": 0, "Kind": 0, @@ -62080,10 +60450,8 @@ }, { "__Checksum": { - "Data1": 8248249999128523617, - "Data2": -8867405780328867714, - "Data3": 7100799273682335102, - "Data4": 6093184583376174172 + "Data1": 3138724983850181781, + "Data2": 8211451924535168631 }, "Flags": 0, "Kind": 0, @@ -62113,10 +60481,8 @@ }, { "__Checksum": { - "Data1": 1030365686238882849, - "Data2": -2587415465945871246, - "Data3": -5850317443527516996, - "Data4": 3041880794125640494 + "Data1": 6423448676448708726, + "Data2": 810094103787048334 }, "Flags": 0, "Kind": 0, @@ -62211,10 +60577,8 @@ }, { "__Checksum": { - "Data1": -3701630428156068598, - "Data2": -5628166926347174418, - "Data3": -9173894021362329763, - "Data4": 4784318697013815255 + "Data1": 2705138262795473471, + "Data2": 62818739085993009 }, "Flags": 0, "Kind": 0, @@ -62728,10 +61092,8 @@ }, { "__Checksum": { - "Data1": 6471912473258841589, - "Data2": -4883525965146626463, - "Data3": -428553059997181127, - "Data4": 4251730085994275677 + "Data1": -2329876237178484010, + "Data2": -7707267476194982617 }, "Flags": 0, "Kind": 0, @@ -62911,10 +61273,8 @@ }, { "__Checksum": { - "Data1": -208360027492985529, - "Data2": 5540678524465459969, - "Data3": -5983073468786353319, - "Data4": -8935345845080491627 + "Data1": 1621767331666950539, + "Data2": -2180818683083442429 }, "Flags": 0, "Kind": 0, @@ -63087,10 +61447,8 @@ }, { "__Checksum": { - "Data1": -7350693789901162092, - "Data2": -5957083446875778833, - "Data3": 3770940152558874507, - "Data4": 3904258989303528433 + "Data1": 8743981535176563373, + "Data2": 138618897009464463 }, "Flags": 0, "Kind": 0, @@ -63129,10 +61487,8 @@ }, { "__Checksum": { - "Data1": 525922767082292902, - "Data2": -5534069184825730997, - "Data3": -8819387175492784780, - "Data4": 5357666767698057547 + "Data1": -5354851987248325518, + "Data2": -1032646867508631237 }, "Flags": 0, "Kind": 0, @@ -63178,10 +61534,8 @@ }, { "__Checksum": { - "Data1": -4009123433733182703, - "Data2": 5259011127538665188, - "Data3": -8179427359277830849, - "Data4": -4327804531354391505 + "Data1": 4383772685565504999, + "Data2": 6035323611269391551 }, "Flags": 0, "Kind": 0, @@ -63277,10 +61631,8 @@ }, { "__Checksum": { - "Data1": 1393720266297076758, - "Data2": 1960168263942218996, - "Data3": -5450933980855013783, - "Data4": 7906858433052902589 + "Data1": -8869963418475386774, + "Data2": 2534614355685414246 }, "Flags": 0, "Kind": 0, @@ -63320,10 +61672,8 @@ }, { "__Checksum": { - "Data1": 120691310194773854, - "Data2": -8644723000213183614, - "Data3": -7232992631573838732, - "Data4": 2994463902805452950 + "Data1": -5202882584503157554, + "Data2": 1545268901140501509 }, "Flags": 0, "Kind": 0, @@ -63364,10 +61714,8 @@ }, { "__Checksum": { - "Data1": -1257076082964783124, - "Data2": -829477450920570960, - "Data3": 3155890839228290119, - "Data4": -8616016763924946396 + "Data1": 6341867109311157825, + "Data2": -7128495950991521227 }, "Flags": 0, "Kind": 0, @@ -63407,10 +61755,8 @@ }, { "__Checksum": { - "Data1": 6649923510238680262, - "Data2": 7817518800128165310, - "Data3": 2591449557554036396, - "Data4": -5908588553399236355 + "Data1": 8056757233958969841, + "Data2": 3227410931124658323 }, "Flags": 0, "Kind": 0, @@ -63450,10 +61796,8 @@ }, { "__Checksum": { - "Data1": 713732983564729741, - "Data2": -757434657992390869, - "Data3": -7694421939970697277, - "Data4": -6018941872264416680 + "Data1": -3439276701038607178, + "Data2": -460445625600298842 }, "Flags": 0, "Kind": 0, @@ -63493,10 +61837,8 @@ }, { "__Checksum": { - "Data1": 1227278049951417462, - "Data2": 3754819501614405913, - "Data3": -5993873786850228372, - "Data4": -8034796622196891411 + "Data1": -882297472036934415, + "Data2": -9064758788720568854 }, "Flags": 0, "Kind": 0, @@ -63527,10 +61869,8 @@ }, { "__Checksum": { - "Data1": 1097789728313074278, - "Data2": -5072842295543760142, - "Data3": -5859091250823236633, - "Data4": 285774219238311141 + "Data1": 7466336435245432973, + "Data2": -502283144295772453 }, "Flags": 0, "Kind": 0, @@ -63593,10 +61933,8 @@ }, { "__Checksum": { - "Data1": 9186100576584668447, - "Data2": 1425337849146845568, - "Data3": 8923635250974808918, - "Data4": -8219856280137041324 + "Data1": 8186276151890327693, + "Data2": 4693291186309057197 }, "Flags": 0, "Kind": 0, @@ -63650,10 +61988,8 @@ }, { "__Checksum": { - "Data1": -554955401489373592, - "Data2": -3026845832981287225, - "Data3": 6248818070476985925, - "Data4": 7180163141188281431 + "Data1": 7241779590915076182, + "Data2": 2308515498986848721 }, "Flags": 0, "Kind": 0, @@ -63707,10 +62043,8 @@ }, { "__Checksum": { - "Data1": 1170381810692310845, - "Data2": -1230184666999366473, - "Data3": 2555175299925791074, - "Data4": 3073481948447759448 + "Data1": -7482491785179012796, + "Data2": -7558653346797458722 }, "Flags": 0, "Kind": 0, @@ -63764,10 +62098,8 @@ }, { "__Checksum": { - "Data1": -3513093551530931993, - "Data2": 7424887881270790152, - "Data3": 6064948724034595134, - "Data4": -5454084075349961469 + "Data1": -1323731397365270963, + "Data2": -9168210519096744317 }, "Flags": 0, "Kind": 0, @@ -63831,10 +62163,8 @@ }, { "__Checksum": { - "Data1": -3337992450196685411, - "Data2": -16959687238908813, - "Data3": 506359410405445861, - "Data4": -8706949379398705948 + "Data1": 7559295212816039375, + "Data2": -2833834900217004526 }, "Flags": 0, "Kind": 0, @@ -63930,10 +62260,8 @@ }, { "__Checksum": { - "Data1": -2007235782708572141, - "Data2": 2639847723533372139, - "Data3": 8277095610086953026, - "Data4": -8225362953854598035 + "Data1": -6901878461269599424, + "Data2": 4542069707396069663 }, "Flags": 0, "Kind": 0, @@ -63973,10 +62301,8 @@ }, { "__Checksum": { - "Data1": -8525149222957738844, - "Data2": -4018295853833401192, - "Data3": 5250012197071741391, - "Data4": 3312552257921242656 + "Data1": -3542031299450125857, + "Data2": 887766216695048608 }, "Flags": 0, "Kind": 0, @@ -64017,10 +62343,8 @@ }, { "__Checksum": { - "Data1": -1120581019111934447, - "Data2": -17419642593784270, - "Data3": 331107650593269204, - "Data4": 2913312185892888142 + "Data1": 8986369470202438486, + "Data2": -309998548719702669 }, "Flags": 0, "Kind": 0, @@ -64060,10 +62384,8 @@ }, { "__Checksum": { - "Data1": 3404967597658227859, - "Data2": -8841829385640393813, - "Data3": 1735214245818199502, - "Data4": 6945689156775392583 + "Data1": -4668545798158252242, + "Data2": 3457673770577283139 }, "Flags": 0, "Kind": 0, @@ -64103,10 +62425,8 @@ }, { "__Checksum": { - "Data1": 6311987336286252029, - "Data2": 8898452779210142823, - "Data3": 1738758573228754617, - "Data4": 2746943401616792857 + "Data1": -2409737852226588165, + "Data2": -103490220055647895 }, "Flags": 0, "Kind": 0, @@ -64146,10 +62466,8 @@ }, { "__Checksum": { - "Data1": 7127886338263747489, - "Data2": -5014259869698980893, - "Data3": -1379085400217572512, - "Data4": 8425874923928564463 + "Data1": 1333523540851621721, + "Data2": -3256042992107044348 }, "Flags": 0, "Kind": 0, @@ -64180,10 +62498,8 @@ }, { "__Checksum": { - "Data1": 8050929352387134391, - "Data2": -3461037520016885204, - "Data3": -8926277024308711819, - "Data4": -4883854054427499659 + "Data1": -1545950959939518151, + "Data2": -7992990097857027127 }, "Flags": 0, "Kind": 0, @@ -64246,10 +62562,8 @@ }, { "__Checksum": { - "Data1": 9055146617990279593, - "Data2": -5165473758630564532, - "Data3": -1729524795771294922, - "Data4": 3353162481567885025 + "Data1": -5926611299552563063, + "Data2": -2912286094068535257 }, "Flags": 0, "Kind": 0, @@ -64310,10 +62624,8 @@ }, { "__Checksum": { - "Data1": -994488215713619560, - "Data2": -3413300375529255644, - "Data3": 8157145259355925679, - "Data4": 3934870069525897611 + "Data1": -4773371773502240366, + "Data2": -6626819582467775300 }, "Flags": 0, "Kind": 0, @@ -64374,10 +62686,8 @@ }, { "__Checksum": { - "Data1": 6962504485361073765, - "Data2": -3440225263480857426, - "Data3": 2472132757527832475, - "Data4": 4205876693026000340 + "Data1": 6524712025682127241, + "Data2": -1967051976244178363 }, "Flags": 0, "Kind": 0, @@ -64438,10 +62748,8 @@ }, { "__Checksum": { - "Data1": 129540008226163186, - "Data2": -5993685176038784270, - "Data3": 4493649931470725871, - "Data4": 2447638442640664485 + "Data1": 3817438558357228332, + "Data2": -7993655105978833689 }, "Flags": 0, "Kind": 0, @@ -64519,10 +62827,8 @@ }, { "__Checksum": { - "Data1": 7535205692778938706, - "Data2": 2811567791392763278, - "Data3": -473745780833470146, - "Data4": 2296562746295328586 + "Data1": -4344047567748995549, + "Data2": -139036793996553502 }, "Flags": 0, "Kind": 0, @@ -64582,10 +62888,8 @@ }, { "__Checksum": { - "Data1": 9207670054517589642, - "Data2": 5319573546192708947, - "Data3": 1041810171084084207, - "Data4": 6642195519986092032 + "Data1": -6438257371200405538, + "Data2": -7368251369895567644 }, "Flags": 0, "Kind": 0, @@ -64673,10 +62977,8 @@ }, { "__Checksum": { - "Data1": -4041783687465727628, - "Data2": 5343308760889367917, - "Data3": 8098928091400743224, - "Data4": -8101420847107563409 + "Data1": 5509158044384452781, + "Data2": 3503033581341881985 }, "Flags": 0, "Kind": 0, @@ -65408,10 +63710,8 @@ }, { "__Checksum": { - "Data1": -6702276761288849194, - "Data2": -6010309673501207396, - "Data3": -7666830138730423577, - "Data4": -6988512390486830123 + "Data1": 7557737402943969315, + "Data2": -2901510019177871229 }, "Flags": 0, "Kind": 0, @@ -65506,10 +63806,8 @@ }, { "__Checksum": { - "Data1": 2894365138198702418, - "Data2": -4674265842410368104, - "Data3": -687930354518677843, - "Data4": 776211494152090538 + "Data1": -4507919877007441258, + "Data2": 5719128162148322469 }, "Flags": 0, "Kind": 0, @@ -65563,10 +63861,8 @@ }, { "__Checksum": { - "Data1": -7110837875226867923, - "Data2": 8391955151569694356, - "Data3": 8209899868195667709, - "Data4": -663237723905424980 + "Data1": -7674971464003660248, + "Data2": -8884228805812796701 }, "Flags": 0, "Kind": 0, @@ -65717,10 +64013,8 @@ }, { "__Checksum": { - "Data1": 7957428556039877530, - "Data2": 3526500062472416996, - "Data3": 6585004565935725536, - "Data4": 1762836124572125844 + "Data1": 267844465130470581, + "Data2": -6171627230074415046 }, "Flags": 0, "Kind": 0, @@ -65787,10 +64081,8 @@ }, { "__Checksum": { - "Data1": 8005574308925107072, - "Data2": -909144557366696098, - "Data3": -87808944186914586, - "Data4": 3292523722245069757 + "Data1": 387609756546636329, + "Data2": -2994991955919651843 }, "Flags": 0, "Kind": 0, @@ -65857,10 +64149,8 @@ }, { "__Checksum": { - "Data1": 7295736752265338163, - "Data2": -4943047429649587480, - "Data3": -3025276982842882792, - "Data4": 4154901952773247098 + "Data1": 4794182950460633904, + "Data2": -2839582244165211546 }, "Flags": 0, "Kind": 0, @@ -66082,10 +64372,8 @@ }, { "__Checksum": { - "Data1": 2640181806900702052, - "Data2": 2816624894674722606, - "Data3": 7841203858349675762, - "Data4": 3077864576662250384 + "Data1": -6804460462972701814, + "Data2": -5193388784939916727 }, "Flags": 0, "Kind": 0, @@ -66132,10 +64420,8 @@ }, { "__Checksum": { - "Data1": -2937353963772599949, - "Data2": -5902439402424746074, - "Data3": 512583125624872358, - "Data4": -7788351297479949220 + "Data1": 5835368087237971537, + "Data2": -7289321763461547112 }, "Flags": 0, "Kind": 0, @@ -66165,10 +64451,8 @@ }, { "__Checksum": { - "Data1": 4650688971931624636, - "Data2": -5468645433230698614, - "Data3": -4281660880846910192, - "Data4": 4534418640240574920 + "Data1": -2527214426090355561, + "Data2": -1868146995757306673 }, "Flags": 0, "Kind": 0, @@ -66264,10 +64548,8 @@ }, { "__Checksum": { - "Data1": 3671745652144538285, - "Data2": 1089708924810227391, - "Data3": 2780027255740016061, - "Data4": 2262583944742868393 + "Data1": -509544894668173101, + "Data2": 763701636209384599 }, "Flags": 0, "Kind": 0, @@ -66302,10 +64584,8 @@ }, { "__Checksum": { - "Data1": 3638268070447949851, - "Data2": -2338953113404279476, - "Data3": 4476215754885246527, - "Data4": 8650785939697309202 + "Data1": -4728052332578410986, + "Data2": -4224884865583178665 }, "Flags": 0, "Kind": 0, @@ -66345,10 +64625,8 @@ }, { "__Checksum": { - "Data1": -4220101335821997619, - "Data2": -3865426078416092284, - "Data3": -4812163676687921103, - "Data4": 8759033057980486574 + "Data1": -5542780788924552243, + "Data2": -8128426062598169308 }, "Flags": 0, "Kind": 0, @@ -66388,10 +64666,8 @@ }, { "__Checksum": { - "Data1": -5548727824624403922, - "Data2": -2293675480102616476, - "Data3": 64825735994537151, - "Data4": -7666684855759973607 + "Data1": -3202423584992351405, + "Data2": -4135103864321577084 }, "Flags": 0, "Kind": 0, @@ -66436,10 +64712,8 @@ }, { "__Checksum": { - "Data1": -8766991263710165875, - "Data2": -9097955189849389949, - "Data3": -5998103988980773256, - "Data4": -4136132362478021808 + "Data1": 961651761177991889, + "Data2": -6055354457056287507 }, "Flags": 0, "Kind": 0, @@ -66462,10 +64736,8 @@ }, { "__Checksum": { - "Data1": 1288915103610931552, - "Data2": 7507789355668795799, - "Data3": 5675428151525528368, - "Data4": -4937368531928702588 + "Data1": 6022334613301259590, + "Data2": 6367400622410115035 }, "Flags": 0, "Kind": 0, @@ -66606,10 +64878,8 @@ }, { "__Checksum": { - "Data1": -8172830382436128755, - "Data2": -5274743641233537478, - "Data3": -8500154539624051437, - "Data4": 4184594374805125535 + "Data1": 3418772230141963916, + "Data2": -4411589457701073794 }, "Flags": 0, "Kind": 0, @@ -66656,10 +64926,8 @@ }, { "__Checksum": { - "Data1": -2752997437573846974, - "Data2": -7095238843584479890, - "Data3": 415515660117674308, - "Data4": 4538453109001461932 + "Data1": 6498338904349223272, + "Data2": 9206970560610631266 }, "Flags": 0, "Kind": 0, @@ -66713,10 +64981,8 @@ }, { "__Checksum": { - "Data1": 3977406274919962447, - "Data2": -5638327088747477540, - "Data3": -2777953703484185957, - "Data4": -6821322534185228750 + "Data1": -1760859797185645436, + "Data2": 8361914325843881584 }, "Flags": 0, "Kind": 0, @@ -66746,10 +65012,8 @@ }, { "__Checksum": { - "Data1": 6174842532366674806, - "Data2": -2722222478888285691, - "Data3": -7084070654395204618, - "Data4": -5059886268648482241 + "Data1": 387999902755975539, + "Data2": -1790486613982775528 }, "Flags": 0, "Kind": 0, @@ -66824,10 +65088,8 @@ }, { "__Checksum": { - "Data1": 418697920908331928, - "Data2": -1451775423876323397, - "Data3": 1210891283361353068, - "Data4": -7404106726492937196 + "Data1": 8709954004526492818, + "Data2": 5456479889223846972 }, "Flags": 0, "Kind": 0, @@ -66874,10 +65136,8 @@ }, { "__Checksum": { - "Data1": 4374615559609894378, - "Data2": 661079871214086142, - "Data3": -799268622996814532, - "Data4": 4020683868992592837 + "Data1": -7462217758748718567, + "Data2": -5899945231949445140 }, "Flags": 0, "Kind": 0, @@ -66907,10 +65167,8 @@ }, { "__Checksum": { - "Data1": 6569253908800484828, - "Data2": 7436921089449699813, - "Data3": 8210039716570539966, - "Data4": -5825196320792754601 + "Data1": -401130459794020388, + "Data2": -791592115942664545 }, "Flags": 0, "Kind": 0, @@ -66971,10 +65229,8 @@ }, { "__Checksum": { - "Data1": 1616602031808388939, - "Data2": 8995089826377549903, - "Data3": -5855062887898015265, - "Data4": 8978003015251888772 + "Data1": -8210657069388312919, + "Data2": -4839745755954136611 }, "Flags": 0, "Kind": 0, @@ -67021,10 +65277,8 @@ }, { "__Checksum": { - "Data1": 7085642539535482402, - "Data2": -890671485469161735, - "Data3": -2885595978915889435, - "Data4": 8553713499408577865 + "Data1": -1108080574347759872, + "Data2": 6069052693542113477 }, "Flags": 0, "Kind": 0, @@ -67054,10 +65308,8 @@ }, { "__Checksum": { - "Data1": -4834253248226397923, - "Data2": 3763503819175402179, - "Data3": 2229088240699554157, - "Data4": -7697067300388700261 + "Data1": 5998672385667935018, + "Data2": -227706541070486019 }, "Flags": 0, "Kind": 0, @@ -67118,10 +65370,8 @@ }, { "__Checksum": { - "Data1": -1114912748708204718, - "Data2": -1339260039601128937, - "Data3": -1463503247144832536, - "Data4": -7198755231753690439 + "Data1": 738617968969167048, + "Data2": 1509915702246417394 }, "Flags": 0, "Kind": 0, @@ -67168,10 +65418,8 @@ }, { "__Checksum": { - "Data1": -2232827219850696478, - "Data2": -2430295571472104758, - "Data3": -3122535922163649327, - "Data4": 1756660986335573883 + "Data1": -8777576057289845427, + "Data2": -7493192320728352655 }, "Flags": 0, "Kind": 0, @@ -67201,10 +65449,8 @@ }, { "__Checksum": { - "Data1": 4012155546603784996, - "Data2": 7204159137498520398, - "Data3": 8824191570211376195, - "Data4": 5165043000081658279 + "Data1": -2033392387568499819, + "Data2": 4757417566275304006 }, "Flags": 0, "Kind": 0, @@ -67265,10 +65511,8 @@ }, { "__Checksum": { - "Data1": 1103026699001821168, - "Data2": 788918455463346439, - "Data3": 1845677482678576095, - "Data4": 6171012450666247183 + "Data1": -5041893011423695869, + "Data2": 1168331332677469120 }, "Flags": 0, "Kind": 0, @@ -67314,10 +65558,8 @@ }, { "__Checksum": { - "Data1": 7247055628691669880, - "Data2": -60804421011627740, - "Data3": -1640390005061607749, - "Data4": -8625256697470268423 + "Data1": -8157895990208490314, + "Data2": 7119247007934721041 }, "Flags": 0, "Kind": 0, @@ -67364,10 +65606,8 @@ }, { "__Checksum": { - "Data1": 3962161376158726973, - "Data2": -239729153947528587, - "Data3": -9121133592260107998, - "Data4": 5447763202087694110 + "Data1": 3298932467783601063, + "Data2": -3766378261483110239 }, "Flags": 0, "Kind": 0, @@ -67397,10 +65637,8 @@ }, { "__Checksum": { - "Data1": 1116164742046517816, - "Data2": -5713887747882906132, - "Data3": -7311231517009136325, - "Data4": -4351021884749433192 + "Data1": 5915294766745581084, + "Data2": 8540702339483930095 }, "Flags": 0, "Kind": 0, @@ -67461,10 +65699,8 @@ }, { "__Checksum": { - "Data1": 6916741821956856567, - "Data2": 1797883786959983799, - "Data3": 1969888721895792186, - "Data4": -3070758106730462313 + "Data1": 6801886198838389578, + "Data2": -7324873377468327917 }, "Flags": 0, "Kind": 0, @@ -67525,10 +65761,8 @@ }, { "__Checksum": { - "Data1": 7231256669180930531, - "Data2": -1096505372692327523, - "Data3": 94731393377200506, - "Data4": -6333479141060763137 + "Data1": 7717582612920119933, + "Data2": -353445378474416930 }, "Flags": 0, "Kind": 0, @@ -67589,10 +65823,8 @@ }, { "__Checksum": { - "Data1": 1753062146696095568, - "Data2": -6732447374492020707, - "Data3": 1598572855615011369, - "Data4": 8206898090462750992 + "Data1": 7976779169509858019, + "Data2": -8603250546641292875 }, "Flags": 0, "Kind": 0, @@ -67653,10 +65885,8 @@ }, { "__Checksum": { - "Data1": 9068856435804239461, - "Data2": 970690826050753700, - "Data3": 9088897031135781082, - "Data4": -5238964239707731319 + "Data1": -864205691829140773, + "Data2": 6019507149331028113 }, "Flags": 0, "Kind": 0, @@ -67702,10 +65932,8 @@ }, { "__Checksum": { - "Data1": 1080492977425002283, - "Data2": 7714139476590416065, - "Data3": 718436151989913851, - "Data4": 183377985668173120 + "Data1": -5331985003516963435, + "Data2": 6797991085552411646 }, "Flags": 0, "Kind": 0, @@ -67752,10 +65980,8 @@ }, { "__Checksum": { - "Data1": 7825550352850362042, - "Data2": 7091681397999495577, - "Data3": 2381104631869770094, - "Data4": 9078378580889815410 + "Data1": -8941599198122894009, + "Data2": 7409860335647446603 }, "Flags": 0, "Kind": 0, @@ -67823,10 +66049,8 @@ }, { "__Checksum": { - "Data1": 5570907126568761218, - "Data2": 4199788908229891647, - "Data3": -1535639701487842233, - "Data4": 2012549117602732641 + "Data1": -4757069395229548873, + "Data2": -6360233678277359579 }, "Flags": 0, "Kind": 0, @@ -67872,10 +66096,8 @@ }, { "__Checksum": { - "Data1": -3859239864034701781, - "Data2": -5197355374333819165, - "Data3": -1980381158444325729, - "Data4": 6900766195644336681 + "Data1": 3818030603323715970, + "Data2": 7082898577678532818 }, "Flags": 0, "Kind": 0, @@ -68020,10 +66242,8 @@ }, { "__Checksum": { - "Data1": 9193504985526392578, - "Data2": 2592635121817227685, - "Data3": -2892724215957070465, - "Data4": 3841600823206861413 + "Data1": 4056504099030898171, + "Data2": -4503333071371461446 }, "Flags": 0, "Kind": 0, @@ -68091,10 +66311,8 @@ }, { "__Checksum": { - "Data1": 6869008296940886521, - "Data2": -7899301407672303650, - "Data3": 8290893217541833166, - "Data4": -1529704131794533201 + "Data1": 100966353527577462, + "Data2": -5448660994947452034 }, "Flags": 0, "Kind": 0, @@ -68211,10 +66429,8 @@ }, { "__Checksum": { - "Data1": -5675678363006852525, - "Data2": -2208488748226419753, - "Data3": -530011882448045599, - "Data4": 759226813253829394 + "Data1": -947910608677836341, + "Data2": 7970467638973448010 }, "Flags": 0, "Kind": 0, @@ -68425,10 +66641,8 @@ }, { "__Checksum": { - "Data1": 4569809188048914199, - "Data2": 354762393754662833, - "Data3": 4594290058529134770, - "Data4": -3275332186918574157 + "Data1": 6089323893954269867, + "Data2": -4779928379600703792 }, "Flags": 0, "Kind": 0, @@ -68610,10 +66824,8 @@ }, { "__Checksum": { - "Data1": 6460700349051761752, - "Data2": -8211623575162936701, - "Data3": -4403759885090965988, - "Data4": 1600195909947458650 + "Data1": 988027316747536046, + "Data2": -4134698042106939631 }, "Flags": 0, "Kind": 0, @@ -68643,10 +66855,8 @@ }, { "__Checksum": { - "Data1": -338010125583431293, - "Data2": -3024644487048918848, - "Data3": -7175411445148412501, - "Data4": 6084639280082488880 + "Data1": 5194223339080673890, + "Data2": -476069440198750661 }, "Flags": 0, "Kind": 0, @@ -68728,10 +66938,8 @@ }, { "__Checksum": { - "Data1": 7931283489094950717, - "Data2": 1762593361756086510, - "Data3": 2717068975726755701, - "Data4": 6526018568405313240 + "Data1": 5665933178875041132, + "Data2": -1042591837840579514 }, "Flags": 0, "Kind": 0, @@ -68827,10 +67035,8 @@ }, { "__Checksum": { - "Data1": 346415826593028539, - "Data2": 8799222867381785838, - "Data3": -5623778128122473994, - "Data4": 5021453045693652148 + "Data1": -5612353351054276428, + "Data2": -120426249247026932 }, "Flags": 0, "Kind": 0, @@ -68968,10 +67174,8 @@ }, { "__Checksum": { - "Data1": -4586067834146895017, - "Data2": 6309603917898270933, - "Data3": 4975614402440356154, - "Data4": -8227682617638933094 + "Data1": -4288528927525506374, + "Data2": 6863099978827134745 }, "Flags": 0, "Kind": 0, @@ -69112,10 +67316,8 @@ }, { "__Checksum": { - "Data1": -2598713980603618032, - "Data2": -1495900372642969716, - "Data3": 5138185495577795999, - "Data4": -5803417933085291452 + "Data1": -3210602269458515330, + "Data2": 7713048339939508479 }, "Flags": 0, "Kind": 0, @@ -69162,10 +67364,8 @@ }, { "__Checksum": { - "Data1": 94402742000292196, - "Data2": -5045201818696371876, - "Data3": 6164236385139264044, - "Data4": 8638574575512547583 + "Data1": 6514793006217594283, + "Data2": -4858336351031000315 }, "Flags": 0, "Kind": 0, @@ -69275,10 +67475,8 @@ }, { "__Checksum": { - "Data1": 5828187404599627230, - "Data2": -958152568697625675, - "Data3": 1610260098665357400, - "Data4": 9071396583090193220 + "Data1": 4681082759036746989, + "Data2": 3617868193187058834 }, "Flags": 0, "Kind": 0, @@ -69308,10 +67506,8 @@ }, { "__Checksum": { - "Data1": 2830500817907870049, - "Data2": 6585765414558019078, - "Data3": 8417807192757994387, - "Data4": 1253308620663244695 + "Data1": 55651186135451954, + "Data2": 3969246595000432907 }, "Flags": 0, "Kind": 0, @@ -69342,10 +67538,8 @@ }, { "__Checksum": { - "Data1": -985609893596326203, - "Data2": 8759614402984911586, - "Data3": 4926150672666542503, - "Data4": -4332318012208171899 + "Data1": 1728747787042302892, + "Data2": -350618827802741122 }, "Flags": 0, "Kind": 0, @@ -69455,10 +67649,8 @@ }, { "__Checksum": { - "Data1": -5377940781411732849, - "Data2": -5598662921938176653, - "Data3": 3759036759824772412, - "Data4": 2492380844814561734 + "Data1": -1965934579574907690, + "Data2": -6149782325709023891 }, "Flags": 0, "Kind": 0, @@ -69499,10 +67691,8 @@ }, { "__Checksum": { - "Data1": 7751777704032962864, - "Data2": -1504487893528784986, - "Data3": 3247611023620457341, - "Data4": 1078759556470979914 + "Data1": 2964966626550192302, + "Data2": 258287477167786989 }, "Flags": 0, "Kind": 0, @@ -69556,10 +67746,8 @@ }, { "__Checksum": { - "Data1": 7313422238051434863, - "Data2": 7906150404998092335, - "Data3": -7712696630541526965, - "Data4": -6254866162490653632 + "Data1": 3366094610886375399, + "Data2": -5725706045252906239 }, "Flags": 0, "Kind": 0, @@ -69613,10 +67801,8 @@ }, { "__Checksum": { - "Data1": 538201397594418129, - "Data2": 3205284701971484813, - "Data3": -4564070280262513592, - "Data4": -1900640845972310248 + "Data1": -189176597514060114, + "Data2": -7078126094401179646 }, "Flags": 0, "Kind": 0, @@ -69739,10 +67925,8 @@ }, { "__Checksum": { - "Data1": 1483584678817654402, - "Data2": -3703298249589538017, - "Data3": 3802876102154163393, - "Data4": 1043925065351278040 + "Data1": 5926240026128978386, + "Data2": -4775236263694008752 }, "Flags": 0, "Kind": 0, @@ -69977,10 +68161,8 @@ }, { "__Checksum": { - "Data1": -3416082417882661311, - "Data2": -7642001413029474007, - "Data3": -1791794669271078232, - "Data4": 749246512532114480 + "Data1": 4765354956566258192, + "Data2": 2671258874125668845 }, "Flags": 0, "Kind": 0, @@ -70045,10 +68227,8 @@ }, { "__Checksum": { - "Data1": -1239968305457289938, - "Data2": 8165424192374909352, - "Data3": -7590749209032359228, - "Data4": 4631563700677197557 + "Data1": 9118375593809523428, + "Data2": 8451972164765728677 }, "Flags": 0, "Kind": 0, @@ -70137,10 +68317,8 @@ }, { "__Checksum": { - "Data1": 7467888291754707849, - "Data2": 2372741968202781812, - "Data3": -4584072246746751959, - "Data4": 6723730831392260288 + "Data1": 3297391573988483816, + "Data2": -7202754530063413075 }, "Flags": 0, "Kind": 0, @@ -70170,10 +68348,8 @@ }, { "__Checksum": { - "Data1": -3630793526547779960, - "Data2": -6219955012921596009, - "Data3": -1134548889529295299, - "Data4": -5930601923790552160 + "Data1": -1163109399354308397, + "Data2": 7502607329346384999 }, "Flags": 0, "Kind": 0, @@ -70255,10 +68431,8 @@ }, { "__Checksum": { - "Data1": -6703368641060126830, - "Data2": 6856418532212605470, - "Data3": -7822143817117968722, - "Data4": 6920201542957387626 + "Data1": 362607662550648458, + "Data2": -7236919340921455560 }, "Flags": 0, "Kind": 0, @@ -70297,10 +68471,8 @@ }, { "__Checksum": { - "Data1": -7649557227078753428, - "Data2": 1541531014681912838, - "Data3": -7047002048008038317, - "Data4": -6901017128666858784 + "Data1": -2498120977040455471, + "Data2": 8774281405760901216 }, "Flags": 0, "Kind": 0, @@ -70381,10 +68553,8 @@ }, { "__Checksum": { - "Data1": -1533510028335945318, - "Data2": 5271671919179163143, - "Data3": 589104494095629202, - "Data4": 7719857829620085992 + "Data1": -6845135781220337147, + "Data2": 8240586296269126833 }, "Flags": 0, "Kind": 0, @@ -70465,10 +68635,8 @@ }, { "__Checksum": { - "Data1": -4087343071297462549, - "Data2": 505008773925497253, - "Data3": 1341249674465572384, - "Data4": -1391423456999694159 + "Data1": -7945729695271551868, + "Data2": -7856085520289280116 }, "Flags": 0, "Kind": 0, @@ -70520,10 +68688,8 @@ }, { "__Checksum": { - "Data1": -8814408285241889649, - "Data2": 5437277536976570947, - "Data3": 5510642222024738459, - "Data4": -1155475580053111831 + "Data1": -2779117491039561898, + "Data2": 5713799177047665065 }, "Flags": 0, "Kind": 0, @@ -70632,10 +68798,8 @@ }, { "__Checksum": { - "Data1": 47435073197670380, - "Data2": -5663265654688060008, - "Data3": -4592473969627011308, - "Data4": -1682390410428383662 + "Data1": -2584246102688039116, + "Data2": -7528651572598553063 }, "Flags": 0, "Kind": 0, @@ -70746,10 +68910,8 @@ }, { "__Checksum": { - "Data1": -8619649773255056069, - "Data2": -2417811933581686536, - "Data3": 6051458370655073301, - "Data4": -7978147037821440820 + "Data1": 1843265656003982268, + "Data2": -6152570278109186683 }, "Flags": 0, "Kind": 0, @@ -70789,10 +68951,8 @@ }, { "__Checksum": { - "Data1": 4519667213146838855, - "Data2": -6204759390165961261, - "Data3": 8509889206505224282, - "Data4": -405862436216424875 + "Data1": -653834662288159185, + "Data2": -23965203740697493 }, "Flags": 0, "Kind": 0, @@ -70916,10 +69076,8 @@ }, { "__Checksum": { - "Data1": 1449992308195836238, - "Data2": -7288199334608706342, - "Data3": 6566647154016665056, - "Data4": 854006440321051051 + "Data1": 3488510985770785776, + "Data2": -73310582596246508 }, "Flags": 0, "Kind": 0, @@ -71100,10 +69258,8 @@ }, { "__Checksum": { - "Data1": 7080330229528586937, - "Data2": -6041707879341971916, - "Data3": 5303479299430008598, - "Data4": -3348657062737331621 + "Data1": 7187081772080982285, + "Data2": 4138125416744483029 }, "Flags": 0, "Kind": 0, @@ -71199,10 +69355,8 @@ }, { "__Checksum": { - "Data1": -5168472171459410888, - "Data2": -6808854943942461239, - "Data3": -8304685518198152746, - "Data4": -6013288473094673824 + "Data1": -7151115516831224449, + "Data2": -6957428575119676563 }, "Flags": 0, "Kind": 0, @@ -71232,10 +69386,8 @@ }, { "__Checksum": { - "Data1": 8537323273006780372, - "Data2": -1662251672191141175, - "Data3": -2546920779780109203, - "Data4": 7972939813234368178 + "Data1": -6127569496142365071, + "Data2": -9133611367130748142 }, "Flags": 0, "Kind": 0, @@ -71399,10 +69551,8 @@ }, { "__Checksum": { - "Data1": -7586261920021875824, - "Data2": 675197696387278514, - "Data3": 5753517545159108224, - "Data4": -106505993955338338 + "Data1": 4384765172360240844, + "Data2": 3900644224642420314 }, "Flags": 0, "Kind": 0, @@ -71504,10 +69654,8 @@ }, { "__Checksum": { - "Data1": 6202280485087166275, - "Data2": 7136384167431020479, - "Data3": 7003036004208827330, - "Data4": 4254054347505515225 + "Data1": -4884963542661215400, + "Data2": 1740304005729789850 }, "Flags": 0, "Kind": 0, @@ -71559,10 +69707,8 @@ }, { "__Checksum": { - "Data1": 8284433213020267504, - "Data2": -3183484504241752339, - "Data3": 4488913395620233698, - "Data4": 6702712339154830464 + "Data1": 8306599190816410491, + "Data2": 9066459364768359890 }, "Flags": 0, "Kind": 0, @@ -71609,10 +69755,8 @@ }, { "__Checksum": { - "Data1": 6092634584809583752, - "Data2": 1997505946632021323, - "Data3": -6367740962599375604, - "Data4": -458589506577827558 + "Data1": -769019148892977571, + "Data2": 955777680318641198 }, "Flags": 0, "Kind": 0, @@ -71869,10 +70013,8 @@ }, { "__Checksum": { - "Data1": 7205890902209575801, - "Data2": -8363033840340813243, - "Data3": -8822825548796327974, - "Data4": -4848626321537096996 + "Data1": -1427939852471870754, + "Data2": 9210181456599104909 }, "Flags": 0, "Kind": 0, @@ -71912,10 +70054,8 @@ }, { "__Checksum": { - "Data1": -8675414449693032623, - "Data2": -2700285912430363516, - "Data3": -3098893647599813465, - "Data4": -4751105932351470082 + "Data1": 8836551237130411249, + "Data2": 4761582172144903913 }, "Flags": 0, "Kind": 0, @@ -71968,10 +70108,8 @@ }, { "__Checksum": { - "Data1": -3020820062056922300, - "Data2": 4127572414865315571, - "Data3": 7490765549375952636, - "Data4": 351086341157736281 + "Data1": -897115458134682029, + "Data2": -61837533811046541 }, "Flags": 0, "Kind": 0, @@ -72161,10 +70299,8 @@ }, { "__Checksum": { - "Data1": -4354443232945487948, - "Data2": -4710183313370749729, - "Data3": -4722941818073045501, - "Data4": -978329385164392360 + "Data1": 3524724746592563566, + "Data2": -8439842041392143454 }, "Flags": 0, "Kind": 0, @@ -72238,10 +70374,8 @@ }, { "__Checksum": { - "Data1": -310433482569853175, - "Data2": 8385029315499419842, - "Data3": 2037796629653547606, - "Data4": 2998677793492071992 + "Data1": -7893536873364159669, + "Data2": -2297501280380830746 }, "Flags": 0, "Kind": 0, @@ -72309,10 +70443,8 @@ }, { "__Checksum": { - "Data1": 8464297318026347826, - "Data2": -7369064131054728813, - "Data3": -8425466357317521023, - "Data4": -4234939140418448678 + "Data1": -2091665343687522557, + "Data2": -4528050674324757318 }, "Flags": 0, "Kind": 0, @@ -72359,10 +70491,8 @@ }, { "__Checksum": { - "Data1": 6031956932905743177, - "Data2": -1720434010901079179, - "Data3": 6920563043059080810, - "Data4": -8222118146296051163 + "Data1": 8241951619851668743, + "Data2": 8253363068268279197 }, "Flags": 0, "Kind": 0, @@ -72402,10 +70532,8 @@ }, { "__Checksum": { - "Data1": 3069731714499810634, - "Data2": -3770761720108185429, - "Data3": 6328023257682364792, - "Data4": -113724678261386876 + "Data1": 8377676808306058771, + "Data2": -2206501304108763802 }, "Flags": 0, "Kind": 0, @@ -72592,10 +70720,8 @@ }, { "__Checksum": { - "Data1": -7707599934531879049, - "Data2": 5096887515206491988, - "Data3": 4068995873505072407, - "Data4": 8042316551375699075 + "Data1": -6588452385594714181, + "Data2": -7613954705149103602 }, "Flags": 0, "Kind": 0, @@ -72625,10 +70751,8 @@ }, { "__Checksum": { - "Data1": -2192840685457690995, - "Data2": 3695491154764548768, - "Data3": -3211741483649700103, - "Data4": -6378072428050437495 + "Data1": -4069933001439197006, + "Data2": 651388782047973567 }, "Flags": 0, "Kind": 0, @@ -72668,10 +70792,8 @@ }, { "__Checksum": { - "Data1": -1872797544421352900, - "Data2": -8194703581454538394, - "Data3": -8301651074909035420, - "Data4": 3850589053946623750 + "Data1": -2781451162970464490, + "Data2": 8130744956587194499 }, "Flags": 0, "Kind": 0, @@ -72809,10 +70931,8 @@ }, { "__Checksum": { - "Data1": 8635480054348602605, - "Data2": 7347930298036696731, - "Data3": -490100940480288927, - "Data4": -4027586077831529032 + "Data1": 779653035151867760, + "Data2": 518830778644489030 }, "Flags": 0, "Kind": 0, @@ -72873,10 +70993,8 @@ }, { "__Checksum": { - "Data1": 5785444233842811070, - "Data2": -8761113571001989315, - "Data3": -2129201287502229509, - "Data4": -3970885925396830853 + "Data1": 8541132218959342562, + "Data2": 8554912728061341187 }, "Flags": 0, "Kind": 0, @@ -73070,10 +71188,8 @@ }, { "__Checksum": { - "Data1": 2616561309245195916, - "Data2": -3048520275588863740, - "Data3": -1224750096791035745, - "Data4": -6758773559797375956 + "Data1": -2116236598453115601, + "Data2": 8510827659470650458 }, "Flags": 0, "Kind": 0, @@ -73148,10 +71264,8 @@ }, { "__Checksum": { - "Data1": 5365228676702960178, - "Data2": 3566344336344856608, - "Data3": -242359733138406257, - "Data4": -3319067124099031658 + "Data1": 6880648616544350896, + "Data2": 542528450986473593 }, "Flags": 0, "Kind": 0, @@ -73250,10 +71364,8 @@ }, { "__Checksum": { - "Data1": 5479989783668454220, - "Data2": -7884601323632997414, - "Data3": -2030402753161351206, - "Data4": -707832347112295458 + "Data1": -5457610709682158056, + "Data2": 5116555714804192153 }, "Flags": 0, "Kind": 0, @@ -73321,10 +71433,8 @@ }, { "__Checksum": { - "Data1": 4223134210831994491, - "Data2": -6657051482445739950, - "Data3": -1058141489985970159, - "Data4": -3523524548522765355 + "Data1": 2083684172920027257, + "Data2": -5004344456963096025 }, "Flags": 0, "Kind": 0, @@ -73354,10 +71464,8 @@ }, { "__Checksum": { - "Data1": 7932028234245871467, - "Data2": 6833116090972050619, - "Data3": -4561931064704283355, - "Data4": 1001841770719221061 + "Data1": 6244935951080616829, + "Data2": 437386675896385597 }, "Flags": 0, "Kind": 0, @@ -73411,10 +71519,8 @@ }, { "__Checksum": { - "Data1": 7592603065046756361, - "Data2": -3515146943695559421, - "Data3": 954685831702671947, - "Data4": 5602348222948510302 + "Data1": -4770024006396290726, + "Data2": 8136373232248313237 }, "Flags": 0, "Kind": 0, @@ -73559,10 +71665,8 @@ }, { "__Checksum": { - "Data1": 5389394179129682827, - "Data2": -414066773334542142, - "Data3": -4905000690759507022, - "Data4": -1378755662214736466 + "Data1": 6976390826252808271, + "Data2": 6822636587304589727 }, "Flags": 0, "Kind": 0, @@ -73602,10 +71706,8 @@ }, { "__Checksum": { - "Data1": -6584285903879970196, - "Data2": -5117682408591164798, - "Data3": -4101262705553722395, - "Data4": 3410216546534307816 + "Data1": -6487723399469192114, + "Data2": 7788691730984527755 }, "Flags": 0, "Kind": 0, @@ -73680,10 +71782,8 @@ }, { "__Checksum": { - "Data1": 2166939374438496811, - "Data2": 3183870581142655839, - "Data3": -8474602507844636526, - "Data4": 5134205052335894563 + "Data1": -8679252282674768125, + "Data2": -3840129657063143114 }, "Flags": 0, "Kind": 0, @@ -74138,10 +72238,8 @@ }, { "__Checksum": { - "Data1": -2536303706619511226, - "Data2": -7908899336519727981, - "Data3": 4030085256543010193, - "Data4": 6708561704433758909 + "Data1": -7191315907203654560, + "Data2": 4699152106026163178 }, "Flags": 0, "Kind": 0, @@ -74209,10 +72307,8 @@ }, { "__Checksum": { - "Data1": 8221989223340451613, - "Data2": -7482682212891961593, - "Data3": 6442171974844082875, - "Data4": -6756506439085388902 + "Data1": -9134838912107580392, + "Data2": -3292355083292244603 }, "Flags": 0, "Kind": 0, @@ -74242,10 +72338,8 @@ }, { "__Checksum": { - "Data1": 6541971406724923963, - "Data2": -5138307892839241045, - "Data3": 5080356412967034777, - "Data4": 109678517203254158 + "Data1": 2842146667273673645, + "Data2": 1388370702214112427 }, "Flags": 0, "Kind": 0, @@ -74306,10 +72400,8 @@ }, { "__Checksum": { - "Data1": 5555425507655835816, - "Data2": 439003243119258458, - "Data3": 3164152561859599833, - "Data4": -3251245956151638769 + "Data1": -1814943800444626951, + "Data2": 2810683503901948288 }, "Flags": 0, "Kind": 0, @@ -74349,10 +72441,8 @@ }, { "__Checksum": { - "Data1": 8087490576167798305, - "Data2": -6114744380947738318, - "Data3": 605036229956175099, - "Data4": 5531177562271549433 + "Data1": 8062454489807579747, + "Data2": 3284511237479975524 }, "Flags": 0, "Kind": 0, @@ -74560,10 +72650,8 @@ }, { "__Checksum": { - "Data1": -1049305404671512928, - "Data2": -3773693346275601337, - "Data3": 3563988629573439574, - "Data4": -1031869143821612715 + "Data1": 2579001742918627878, + "Data2": -5191931589863848318 }, "Flags": 0, "Kind": 0, @@ -74593,10 +72681,8 @@ }, { "__Checksum": { - "Data1": -8588451438667804557, - "Data2": -6517264326357705215, - "Data3": -3831548355690566919, - "Data4": 553792664296770835 + "Data1": 7856828534515859790, + "Data2": -4662185703418751900 }, "Flags": 0, "Kind": 0, @@ -74846,10 +72932,8 @@ }, { "__Checksum": { - "Data1": -6902488054848568720, - "Data2": 6943494611533008735, - "Data3": 6004390051717021258, - "Data4": 1963987017817232835 + "Data1": 335542389078767356, + "Data2": 6541955051655105035 }, "Flags": 0, "Kind": 0, @@ -75099,10 +73183,8 @@ }, { "__Checksum": { - "Data1": 8624653512892417774, - "Data2": 2328290698532252361, - "Data3": -1248196234855374412, - "Data4": -2245141231972488864 + "Data1": 7643464478460758825, + "Data2": 3809891909832587769 }, "Flags": 0, "Kind": 0, @@ -75142,10 +73224,8 @@ }, { "__Checksum": { - "Data1": -6479633635716695894, - "Data2": -9063499584249347780, - "Data3": -2156707545939399641, - "Data4": 371806866433127787 + "Data1": 8228075006828872086, + "Data2": -8464972905996890657 }, "Flags": 0, "Kind": 0, @@ -75241,10 +73321,8 @@ }, { "__Checksum": { - "Data1": 901781072918299432, - "Data2": 5617735500562294593, - "Data3": -1995624964573851378, - "Data4": -7175091029984678074 + "Data1": -3958773370324322524, + "Data2": 2312135335119746798 }, "Flags": 0, "Kind": 0, @@ -75274,10 +73352,8 @@ }, { "__Checksum": { - "Data1": 7611536192432806374, - "Data2": -7523457270107797056, - "Data3": 9107544376205554267, - "Data4": -4920916884283010451 + "Data1": -8444326949038937788, + "Data2": -1752339521514649507 }, "Flags": 0, "Kind": 0, @@ -75324,10 +73400,8 @@ }, { "__Checksum": { - "Data1": -7554075572292048236, - "Data2": 9041344116914462482, - "Data3": -2978960011577718652, - "Data4": -256046479431498181 + "Data1": 2926690881474008076, + "Data2": -5400314215550841983 }, "Flags": 0, "Kind": 0, @@ -75409,10 +73483,8 @@ }, { "__Checksum": { - "Data1": 3977042043699171400, - "Data2": 130444899702327147, - "Data3": 353949446367637254, - "Data4": 406508599351966967 + "Data1": 5967085929831926496, + "Data2": 2076986033377749253 }, "Flags": 0, "Kind": 0, @@ -75539,10 +73611,8 @@ }, { "__Checksum": { - "Data1": -5908124194904241978, - "Data2": 5657994134525905530, - "Data3": -7400421326229794565, - "Data4": -7914798382558378331 + "Data1": -7263874206226385806, + "Data2": -7145123492979270377 }, "Flags": 0, "Kind": 0, @@ -75773,10 +73843,8 @@ }, { "__Checksum": { - "Data1": -5870747263532652447, - "Data2": -7040906103020252883, - "Data3": 2375258134357162856, - "Data4": -6183011906630349074 + "Data1": 74636099254928729, + "Data2": 8053429551020709641 }, "Flags": 0, "Kind": 0, @@ -75816,10 +73884,8 @@ }, { "__Checksum": { - "Data1": 7934456183559814399, - "Data2": -4760303132963763345, - "Data3": 1340238275028026119, - "Data4": -2769037167242717537 + "Data1": -1477890437945326105, + "Data2": 1389141315898281186 }, "Flags": 0, "Kind": 0, @@ -75859,10 +73925,8 @@ }, { "__Checksum": { - "Data1": -6829366655085270759, - "Data2": -6324772589563344757, - "Data3": 7607676588039702995, - "Data4": -5451476996724207568 + "Data1": -4114535919172482615, + "Data2": -1790544119055302199 }, "Flags": 0, "Kind": 0, @@ -75892,10 +73956,8 @@ }, { "__Checksum": { - "Data1": 5387672831824397827, - "Data2": 1015709622793287519, - "Data3": 8821116212391090781, - "Data4": 5064105821331773316 + "Data1": 1297246329894351794, + "Data2": -8950773400221532028 }, "Flags": 0, "Kind": 0, @@ -75935,10 +73997,8 @@ }, { "__Checksum": { - "Data1": 965018296127095462, - "Data2": -3410298429284902592, - "Data3": -5703274078954160480, - "Data4": -1396852409624969922 + "Data1": 3343794554661201692, + "Data2": 3999883259162655510 }, "Flags": 0, "Kind": 0, @@ -75985,10 +74045,8 @@ }, { "__Checksum": { - "Data1": -3236737067421556602, - "Data2": -8454946420807298855, - "Data3": -358494803168054132, - "Data4": -8022147326616856791 + "Data1": 1558866872062321630, + "Data2": 3259625223009672071 }, "Flags": 0, "Kind": 0, @@ -76105,10 +74163,8 @@ }, { "__Checksum": { - "Data1": -3472715215653001128, - "Data2": -2845197013691089715, - "Data3": 3442454590727686490, - "Data4": 6742887712249688608 + "Data1": 5952047974079895894, + "Data2": -5305510618945898454 }, "Flags": 0, "Kind": 0, @@ -76174,10 +74230,8 @@ }, { "__Checksum": { - "Data1": 4489506806059347954, - "Data2": -7773859461165096793, - "Data3": 3504886346074688824, - "Data4": -4756448246943568335 + "Data1": -656400053280423567, + "Data2": 543549830038559646 }, "Flags": 0, "Kind": 0, @@ -76231,10 +74285,8 @@ }, { "__Checksum": { - "Data1": 8752186612740600774, - "Data2": 7060436748397849786, - "Data3": 5920129234290289064, - "Data4": 5345430282351389593 + "Data1": -644976428197217670, + "Data2": -5358627945153027129 }, "Flags": 0, "Kind": 0, @@ -76599,10 +74651,8 @@ }, { "__Checksum": { - "Data1": 8475193428509496468, - "Data2": -3283634122324763962, - "Data3": 4260369116202385354, - "Data4": -1065982403682325758 + "Data1": 2685500509628831097, + "Data2": 959692520537775951 }, "Flags": 0, "Kind": 0, @@ -76637,10 +74687,8 @@ }, { "__Checksum": { - "Data1": 662598297861179718, - "Data2": -1658548149257892681, - "Data3": -5310218848932787412, - "Data4": 7745860547821996218 + "Data1": 2847911305029491403, + "Data2": -6865612018453548074 }, "Flags": 0, "Kind": 0, @@ -76757,10 +74805,8 @@ }, { "__Checksum": { - "Data1": -1740433172420897082, - "Data2": -8506855365362821471, - "Data3": -702585032704082175, - "Data4": 5502334024295888851 + "Data1": -2280685041314958298, + "Data2": -227940979267066083 }, "Flags": 0, "Kind": 0, @@ -76828,10 +74874,8 @@ }, { "__Checksum": { - "Data1": 8513546265556969696, - "Data2": -3567050505558547832, - "Data3": -6627344283234746339, - "Data4": -5368403015420536406 + "Data1": 3909568137565625040, + "Data2": -5448306987665799777 }, "Flags": 0, "Kind": 0, @@ -76955,10 +74999,8 @@ }, { "__Checksum": { - "Data1": -7976596497342638967, - "Data2": -8704395366343430127, - "Data3": -5266248606442371156, - "Data4": 6163303756120468219 + "Data1": -1491386618301286519, + "Data2": -5183287382339864318 }, "Flags": 0, "Kind": 0, @@ -77040,10 +75082,8 @@ }, { "__Checksum": { - "Data1": 3428270600851029000, - "Data2": 5978981382739907890, - "Data3": -1627666946287379095, - "Data4": -2606341706341384751 + "Data1": 1576103891105928074, + "Data2": -4925134389039327661 }, "Flags": 0, "Kind": 0, @@ -77097,10 +75137,8 @@ }, { "__Checksum": { - "Data1": 1193668320957289942, - "Data2": -7440647456634449859, - "Data3": -3961493083516783164, - "Data4": 622274883541534266 + "Data1": 4340225189409992324, + "Data2": -1486000380307129431 }, "Flags": 0, "Kind": 0, @@ -77182,10 +75220,8 @@ }, { "__Checksum": { - "Data1": 3176418669381029789, - "Data2": -6429362260132278249, - "Data3": 7195124727439784180, - "Data4": 2702722353709802525 + "Data1": -4429541397171077093, + "Data2": 49099940122643196 }, "Flags": 0, "Kind": 0, @@ -77261,10 +75297,8 @@ }, { "__Checksum": { - "Data1": -58100436323208027, - "Data2": 368444347704494188, - "Data3": -5220070430593812178, - "Data4": 9012749993342814685 + "Data1": 2931430803275109429, + "Data2": -7036539433312978849 }, "Flags": 0, "Kind": 0, @@ -77374,10 +75408,8 @@ }, { "__Checksum": { - "Data1": 4058806520214693672, - "Data2": -1356679056607119706, - "Data3": 7529304394570664791, - "Data4": 4037153114883606010 + "Data1": 299484970353932542, + "Data2": -2812315375935133632 }, "Flags": 0, "Kind": 0, @@ -77450,10 +75482,8 @@ }, { "__Checksum": { - "Data1": -8164175314044886387, - "Data2": 3459342462657768043, - "Data3": -8175312248115655980, - "Data4": 6288698204495712877 + "Data1": -893341342879136381, + "Data2": 7331346019789866610 }, "Flags": 0, "Kind": 0, @@ -77846,10 +75876,8 @@ }, { "__Checksum": { - "Data1": -7146871650617057221, - "Data2": -3108691677653480568, - "Data3": -4213788229912851955, - "Data4": -3909721492503698144 + "Data1": -5108420019772514722, + "Data2": -1404645695678241034 }, "Flags": 0, "Kind": 0, @@ -77882,10 +75910,8 @@ }, { "__Checksum": { - "Data1": 8790634263265299990, - "Data2": -8110342847185667146, - "Data3": 5713525387635324767, - "Data4": -3465335179917821121 + "Data1": 4111341504563022631, + "Data2": -79496057525412890 }, "Flags": 0, "Kind": 0, @@ -77937,10 +75963,8 @@ }, { "__Checksum": { - "Data1": -9054661594407396036, - "Data2": 1818385092642579168, - "Data3": -7567051153773578949, - "Data4": -4750956379781372713 + "Data1": 2222978992572625948, + "Data2": 8676291339909359422 }, "Flags": 0, "Kind": 0, @@ -77980,10 +76004,8 @@ }, { "__Checksum": { - "Data1": -2624304974289964294, - "Data2": 35783732451557932, - "Data3": -8349086964829207758, - "Data4": 2293083541864284213 + "Data1": -4946838562096178123, + "Data2": 6735947686725437166 }, "Flags": 0, "Kind": 0, @@ -78072,10 +76094,8 @@ }, { "__Checksum": { - "Data1": -7185741117575404301, - "Data2": -5806394065879366074, - "Data3": 6125209916550423930, - "Data4": 1203935682049801862 + "Data1": -8666739362439806462, + "Data2": 2515405818882272097 }, "Flags": 0, "Kind": 0, @@ -78122,10 +76142,8 @@ }, { "__Checksum": { - "Data1": 5818447242983554145, - "Data2": -5495072354375838021, - "Data3": -8407386292606502283, - "Data4": -5539385851455977291 + "Data1": -7855471953933329506, + "Data2": 5373651864111295088 }, "Flags": 0, "Kind": 0, @@ -78155,10 +76173,8 @@ }, { "__Checksum": { - "Data1": 1438678663135339678, - "Data2": 6496498785606678000, - "Data3": -2654747365745478974, - "Data4": -6422310653694048419 + "Data1": 3772578993650947230, + "Data2": 3301279927541834619 }, "Flags": 0, "Kind": 0, @@ -78219,10 +76235,8 @@ }, { "__Checksum": { - "Data1": -5082833416799184473, - "Data2": -1068814739646583426, - "Data3": 868397729369079464, - "Data4": 8430453232814695702 + "Data1": 4201115035078770299, + "Data2": 8426989406741388899 }, "Flags": 0, "Kind": 0, @@ -78325,10 +76339,8 @@ }, { "__Checksum": { - "Data1": 577639371531705150, - "Data2": 8840060705890584672, - "Data3": -4245753255695530832, - "Data4": -4389435184472365083 + "Data1": 1346452060978888168, + "Data2": -109730860087675012 }, "Flags": 0, "Kind": 0, @@ -78452,10 +76464,8 @@ }, { "__Checksum": { - "Data1": 8031434856229876975, - "Data2": -6094114028358344344, - "Data3": -8470779073884949741, - "Data4": -7286727583691446004 + "Data1": 2273462764052549921, + "Data2": -1247598112591136529 }, "Flags": 0, "Kind": 0, @@ -78509,10 +76519,8 @@ }, { "__Checksum": { - "Data1": 1528389469532863874, - "Data2": -5680794063155616656, - "Data3": 7030576972529095414, - "Data4": 5017962033016027735 + "Data1": -1178498460777449199, + "Data2": 1019907568395906394 }, "Flags": 0, "Kind": 0, @@ -78706,10 +76714,8 @@ }, { "__Checksum": { - "Data1": 6129181511064532764, - "Data2": 8916635364531762459, - "Data3": 7169275631755689241, - "Data4": -7632639727121435358 + "Data1": -1834420911637959395, + "Data2": 5640684413607809627 }, "Flags": 0, "Kind": 0, @@ -78756,10 +76762,8 @@ }, { "__Checksum": { - "Data1": 1401708284044208623, - "Data2": -6556396045095051584, - "Data3": 5933443375083641821, - "Data4": 3629559276107307044 + "Data1": -3691995786718571544, + "Data2": -2166929681934095996 }, "Flags": 0, "Kind": 0, @@ -78806,10 +76810,8 @@ }, { "__Checksum": { - "Data1": -7137459787102862751, - "Data2": -8407954887561338747, - "Data3": 9219741594763993088, - "Data4": 7347135554028454996 + "Data1": -5836866817035534224, + "Data2": -8997145485172513077 }, "Flags": 0, "Kind": 0, @@ -78849,10 +76851,8 @@ }, { "__Checksum": { - "Data1": -4271401575606188068, - "Data2": -2058075689133341220, - "Data3": 4308306232284968569, - "Data4": 5138219448521161650 + "Data1": 1373597633222221536, + "Data2": 3030196333050922660 }, "Flags": 0, "Kind": 0, @@ -78899,10 +76899,8 @@ }, { "__Checksum": { - "Data1": -7684650493307808592, - "Data2": 1508585122603116311, - "Data3": 6846458453777943093, - "Data4": -4231783175545697475 + "Data1": -7896345274045299790, + "Data2": -5011104871271711005 }, "Flags": 0, "Kind": 0, @@ -78963,10 +76961,8 @@ }, { "__Checksum": { - "Data1": -1784654500693515126, - "Data2": 5939393067717339400, - "Data3": 6474799695377014769, - "Data4": -4097070279214873844 + "Data1": 3321212765012241114, + "Data2": 1801268782194116415 }, "Flags": 0, "Kind": 0, @@ -79537,10 +77533,8 @@ }, { "__Checksum": { - "Data1": -4600869687758612715, - "Data2": 2307806457679351194, - "Data3": 35336140606917925, - "Data4": 1849679572301267574 + "Data1": -5989828472979459053, + "Data2": -3797933176362715976 }, "Flags": 0, "Kind": 0, @@ -79594,10 +77588,8 @@ }, { "__Checksum": { - "Data1": 7704133682772855812, - "Data2": -923040547771721261, - "Data3": 3165748191388975435, - "Data4": -1245422053455304083 + "Data1": -4965207378017536328, + "Data2": -8953955865447468931 }, "Flags": 0, "Kind": 0, @@ -79657,10 +77649,8 @@ }, { "__Checksum": { - "Data1": 8463381411326865877, - "Data2": 2160290488821607453, - "Data3": 4425276275140253886, - "Data4": -3869257066163401973 + "Data1": 5697531067047992421, + "Data2": 7435713804091700133 }, "Flags": 0, "Kind": 0, @@ -79765,10 +77755,8 @@ }, { "__Checksum": { - "Data1": -7562922143169158932, - "Data2": -412515388286402663, - "Data3": -9912382234380565, - "Data4": -7683466625209656786 + "Data1": -7089286483968842382, + "Data2": 5244338848452831901 }, "Flags": 0, "Kind": 0, @@ -79801,10 +77789,8 @@ }, { "__Checksum": { - "Data1": 993204558772383158, - "Data2": -27515563649460869, - "Data3": -6430131570824748127, - "Data4": 5846604483382324675 + "Data1": -857844216314242683, + "Data2": -8205778017858053793 }, "Flags": 0, "Kind": 0, @@ -79834,10 +77820,8 @@ }, { "__Checksum": { - "Data1": 5755084128579973338, - "Data2": 4432010337435182409, - "Data3": 1160372708025395333, - "Data4": -4987179715821810562 + "Data1": 321882399710572420, + "Data2": -6993618870276397101 }, "Flags": 0, "Kind": 0, @@ -79898,10 +77882,8 @@ }, { "__Checksum": { - "Data1": -1916101186237739711, - "Data2": 6496432983047097775, - "Data3": 4758659340048061465, - "Data4": -8926947569541501636 + "Data1": -4436566357922684378, + "Data2": -2204282145224724706 }, "Flags": 0, "Kind": 0, @@ -79931,10 +77913,8 @@ }, { "__Checksum": { - "Data1": 8550272091504914701, - "Data2": 2078556298988804430, - "Data3": -91546456555313690, - "Data4": 6621592994974128966 + "Data1": -678556715788790508, + "Data2": 5012795244895142625 }, "Flags": 0, "Kind": 0, @@ -79967,10 +77947,8 @@ }, { "__Checksum": { - "Data1": -7232187126076005113, - "Data2": -2895460573135900108, - "Data3": -1455712007252615804, - "Data4": 6055341607527235531 + "Data1": -1085639044607078463, + "Data2": 4717945149141333990 }, "Flags": 0, "Kind": 0, @@ -80000,10 +77978,8 @@ }, { "__Checksum": { - "Data1": -7123426915339345557, - "Data2": -6630550611678676275, - "Data3": -7504722580449326232, - "Data4": 779262678432811174 + "Data1": 9138574287835035689, + "Data2": -2652993145598027955 }, "Flags": 0, "Kind": 0, @@ -80057,10 +78033,8 @@ }, { "__Checksum": { - "Data1": -3032328580833345218, - "Data2": 4884117385232529574, - "Data3": -8121570563642199989, - "Data4": -7181735351521693875 + "Data1": 2532963157902917359, + "Data2": -1864530346246423203 }, "Flags": 0, "Kind": 0, @@ -80190,10 +78164,8 @@ }, { "__Checksum": { - "Data1": 3522956868953234190, - "Data2": 4024074242514141234, - "Data3": 6998119699729639834, - "Data4": -5039368026523642049 + "Data1": -961855562192444220, + "Data2": 702155101482332529 }, "Flags": 0, "Kind": 0, @@ -80463,10 +78435,8 @@ }, { "__Checksum": { - "Data1": -6101904065858087011, - "Data2": 6464851657397827665, - "Data3": 9124062307445154541, - "Data4": -3454075296985997814 + "Data1": -342347319429170049, + "Data2": -4711806858073698725 }, "Flags": 0, "Kind": 0, @@ -80527,10 +78497,8 @@ }, { "__Checksum": { - "Data1": 7969900793454558987, - "Data2": -685116953542666905, - "Data3": -3120323787223301041, - "Data4": -1282590348971462040 + "Data1": -7086785765972557120, + "Data2": 6446362120520832367 }, "Flags": 0, "Kind": 0, @@ -80591,10 +78559,8 @@ }, { "__Checksum": { - "Data1": -6041729481754171403, - "Data2": -4624882898886058330, - "Data3": -3636352243350575444, - "Data4": 5550720914903214891 + "Data1": -4051715226067792314, + "Data2": -3869786469234716629 }, "Flags": 0, "Kind": 0, @@ -80641,10 +78607,8 @@ }, { "__Checksum": { - "Data1": 8476365902634410444, - "Data2": -644927312845976381, - "Data3": -4384448333822937784, - "Data4": 4942297971278807229 + "Data1": 5900040963345538674, + "Data2": 8173670795415071412 }, "Flags": 0, "Kind": 0, @@ -80680,10 +78644,8 @@ }, { "__Checksum": { - "Data1": -6842359896946943951, - "Data2": 5061995529332792927, - "Data3": 6565410255662361353, - "Data4": -7912028694005202670 + "Data1": 6090295430901031894, + "Data2": 3064208609051965040 }, "Flags": 0, "Kind": 0, @@ -80724,10 +78686,8 @@ }, { "__Checksum": { - "Data1": -923618746989706125, - "Data2": 4227603167988747082, - "Data3": 5734010805601226258, - "Data4": -1671000699342239190 + "Data1": 2762811812492453870, + "Data2": -1397394579901732464 }, "Flags": 0, "Kind": 0, @@ -80830,10 +78790,8 @@ }, { "__Checksum": { - "Data1": 79841009772692075, - "Data2": -2952241428952198501, - "Data3": -3037041811616986500, - "Data4": 6368002849782666650 + "Data1": -2663655899449542113, + "Data2": -8754359343646118852 }, "Flags": 0, "Kind": 0, @@ -80887,10 +78845,8 @@ }, { "__Checksum": { - "Data1": 6357308093038488273, - "Data2": -590221267978626193, - "Data3": -2813028512931838099, - "Data4": -5741325089293471617 + "Data1": 3507708905815758046, + "Data2": -5992433472031933315 }, "Flags": 0, "Kind": 0, @@ -81008,10 +78964,8 @@ }, { "__Checksum": { - "Data1": -5358893479713659131, - "Data2": -2402568364620000586, - "Data3": -6745191798513769980, - "Data4": -5642587779183136642 + "Data1": 5673208721365739650, + "Data2": -2691800461872323678 }, "Flags": 0, "Kind": 0, @@ -81193,10 +79147,8 @@ }, { "__Checksum": { - "Data1": 5944728564506036853, - "Data2": 5986712273956370036, - "Data3": -5472611059364917144, - "Data4": 648471601623891404 + "Data1": -4515681604057336624, + "Data2": 2718632959241416511 }, "Flags": 0, "Kind": 0, @@ -81226,10 +79178,8 @@ }, { "__Checksum": { - "Data1": -5790374759278495312, - "Data2": -5781577031452499736, - "Data3": 1825440571378990394, - "Data4": -7765678758283729548 + "Data1": -4877357090630237673, + "Data2": -1402125495406797604 }, "Flags": 0, "Kind": 0, @@ -81311,10 +79261,8 @@ }, { "__Checksum": { - "Data1": -319212888573528935, - "Data2": 4781136246579382843, - "Data3": -171587018636297407, - "Data4": -4219352666900912935 + "Data1": -5165075839233423477, + "Data2": -5592925214349163386 }, "Flags": 0, "Kind": 0, @@ -81361,10 +79309,8 @@ }, { "__Checksum": { - "Data1": -643558682560672798, - "Data2": 5621877394696188322, - "Data3": -2836291252375092218, - "Data4": -7081941850982470291 + "Data1": -9141030196579206720, + "Data2": -5190641485232954020 }, "Flags": 0, "Kind": 0, @@ -81418,10 +79364,8 @@ }, { "__Checksum": { - "Data1": -26445416106042325, - "Data2": 183005403126985918, - "Data3": -3605213424710367092, - "Data4": -5891134132886743643 + "Data1": 7805578555914778800, + "Data2": 6112924000440823299 }, "Flags": 0, "Kind": 0, @@ -81480,10 +79424,8 @@ }, { "__Checksum": { - "Data1": 6402422368241231071, - "Data2": -3409924537754252723, - "Data3": 33868101308219001, - "Data4": -3851967501114225349 + "Data1": 178589890824493724, + "Data2": 3511718243385985987 }, "Flags": 0, "Kind": 0, @@ -81530,10 +79472,8 @@ }, { "__Checksum": { - "Data1": 3294007472844321801, - "Data2": 5288020896198773622, - "Data3": -591511968589158104, - "Data4": 1535527063816626164 + "Data1": -6426978650064452105, + "Data2": 7310869436234430215 }, "Flags": 0, "Kind": 0, @@ -81613,10 +79553,8 @@ }, { "__Checksum": { - "Data1": -5511213276636612432, - "Data2": -7315732885625886243, - "Data3": 7275543891687759368, - "Data4": 3122094341494611823 + "Data1": -6831043225861974880, + "Data2": -7055029692807566113 }, "Flags": 0, "Kind": 0, @@ -81646,10 +79584,8 @@ }, { "__Checksum": { - "Data1": 5681931512146051728, - "Data2": 1171716135850293227, - "Data3": -3520304351997331697, - "Data4": 2398112905845781755 + "Data1": -1995686178844060649, + "Data2": 7113591873652307470 }, "Flags": 0, "Kind": 0, @@ -81696,10 +79632,8 @@ }, { "__Checksum": { - "Data1": -862143888178267538, - "Data2": -1233797604564493950, - "Data3": 2528621040691249135, - "Data4": -6185971080846653767 + "Data1": 5276715078971068427, + "Data2": -2316870861745151056 }, "Flags": 0, "Kind": 0, @@ -81760,10 +79694,8 @@ }, { "__Checksum": { - "Data1": -1068447800697818517, - "Data2": -2180657638167789436, - "Data3": 5566859166523450613, - "Data4": -4952885343736918039 + "Data1": -4675139049870281556, + "Data2": 9087413528125928448 }, "Flags": 0, "Kind": 0, @@ -81810,10 +79742,8 @@ }, { "__Checksum": { - "Data1": -9040510474403957344, - "Data2": 8133179642666704600, - "Data3": 5916923385494697571, - "Data4": 1806739495516187533 + "Data1": -13475361927492368, + "Data2": 8927002645332287661 }, "Flags": 0, "Kind": 0, @@ -81867,10 +79797,8 @@ }, { "__Checksum": { - "Data1": 7443940092200960274, - "Data2": -2302520695221903842, - "Data3": 2894425633493122518, - "Data4": -8413250361124616046 + "Data1": 8271339722290035992, + "Data2": -1389090065655049758 }, "Flags": 0, "Kind": 0, @@ -81924,10 +79852,8 @@ }, { "__Checksum": { - "Data1": -6067826381727825500, - "Data2": -7122290610451194532, - "Data3": -5376314565751492700, - "Data4": -5845233532052611904 + "Data1": -1565644528740351463, + "Data2": 2356010124229506845 }, "Flags": 0, "Kind": 0, @@ -82033,10 +79959,8 @@ }, { "__Checksum": { - "Data1": 2999849698700213839, - "Data2": 3069867938521466041, - "Data3": -5762701017497726857, - "Data4": -7496441322636307355 + "Data1": 4668026210849753825, + "Data2": 5859975536301331888 }, "Flags": 0, "Kind": 0, @@ -82090,10 +80014,8 @@ }, { "__Checksum": { - "Data1": -4791808362500001359, - "Data2": -5796902506827321406, - "Data3": 4369316630489892390, - "Data4": -4928497457887030859 + "Data1": -5047552813454326468, + "Data2": -3503957363834753867 }, "Flags": 0, "Kind": 0, @@ -82147,10 +80069,8 @@ }, { "__Checksum": { - "Data1": 4326655859163906173, - "Data2": -5397004952699540246, - "Data3": 1143531101179843810, - "Data4": -5100416675327084450 + "Data1": 1017021631062318257, + "Data2": 5731332736424437023 }, "Flags": 0, "Kind": 0, @@ -82204,10 +80124,8 @@ }, { "__Checksum": { - "Data1": -2629247447738509390, - "Data2": 226481303575573525, - "Data3": -1365426462638432020, - "Data4": 7849051893112526504 + "Data1": 4872238159873903179, + "Data2": 538381416650800953 }, "Flags": 0, "Kind": 0, @@ -82261,10 +80179,8 @@ }, { "__Checksum": { - "Data1": 2753204010590902230, - "Data2": 203051380607338661, - "Data3": -924252779358353986, - "Data4": 7289398089165250733 + "Data1": -3525556234775114918, + "Data2": -8088344275229689054 }, "Flags": 0, "Kind": 0, @@ -82294,10 +80210,8 @@ }, { "__Checksum": { - "Data1": -7925182783885337366, - "Data2": -3109511055501846297, - "Data3": -4195694077576093870, - "Data4": -8236129109722918486 + "Data1": -4694159241279474258, + "Data2": 2290104022240172569 }, "Flags": 0, "Kind": 0, @@ -82413,10 +80327,8 @@ }, { "__Checksum": { - "Data1": 4245779871021445183, - "Data2": 2401446374359852196, - "Data3": 6614557890405253754, - "Data4": 4354498947078068395 + "Data1": 5573280651284031388, + "Data2": 7376836577182467638 }, "Flags": 0, "Kind": 0, @@ -82506,10 +80418,8 @@ }, { "__Checksum": { - "Data1": -259964969547255980, - "Data2": 3024841006622247182, - "Data3": 239676028967934323, - "Data4": 8763084388213702615 + "Data1": 2558264761293407339, + "Data2": -517870662192627869 }, "Flags": 0, "Kind": 0, @@ -82556,10 +80466,8 @@ }, { "__Checksum": { - "Data1": -5131199078058219354, - "Data2": -3232041030555439571, - "Data3": 3126646538468824999, - "Data4": -8514627196665799044 + "Data1": 3704182969475144037, + "Data2": -2347592466437552449 }, "Flags": 0, "Kind": 0, @@ -82590,10 +80498,8 @@ }, { "__Checksum": { - "Data1": -5836178454553673236, - "Data2": -1585013994309688357, - "Data3": -2434295458944261012, - "Data4": 6360994487852394532 + "Data1": 4240368093632645519, + "Data2": 1931752516165651417 }, "Flags": 0, "Kind": 0, @@ -82668,10 +80574,8 @@ }, { "__Checksum": { - "Data1": -7208782614861315512, - "Data2": 3376703359933200161, - "Data3": 7451784114185547013, - "Data4": 2917431603229037853 + "Data1": 328963547609925029, + "Data2": 3704282485359255893 }, "Flags": 0, "Kind": 0, @@ -82899,10 +80803,8 @@ }, { "__Checksum": { - "Data1": 10040371328805314, - "Data2": -799600833556787066, - "Data3": -1506347185225842154, - "Data4": 6549823965772075056 + "Data1": -3707121440754685698, + "Data2": 1328726902477057281 }, "Flags": 0, "Kind": 0, @@ -82942,10 +80844,8 @@ }, { "__Checksum": { - "Data1": 6798091608035255846, - "Data2": 1312874950651368179, - "Data3": -1358650269754816676, - "Data4": -2897764748166429137 + "Data1": -6357919353816521294, + "Data2": 5869141887352532476 }, "Flags": 0, "Kind": 0, @@ -82985,10 +80885,8 @@ }, { "__Checksum": { - "Data1": -4851752313173988585, - "Data2": -4953084585838279537, - "Data3": -8988653415264343388, - "Data4": 6463220340500911201 + "Data1": -2857530648624438601, + "Data2": 3618418675103158173 }, "Flags": 0, "Kind": 0, @@ -83035,10 +80933,8 @@ }, { "__Checksum": { - "Data1": 2160616508406577201, - "Data2": -7261957949814667199, - "Data3": -5661215183574915532, - "Data4": 5654313126646841403 + "Data1": -5586142188442151652, + "Data2": 601018275357348401 }, "Flags": 0, "Kind": 0, @@ -83134,10 +81030,8 @@ }, { "__Checksum": { - "Data1": 4463657768566109627, - "Data2": 7400419818599228842, - "Data3": -867524837463791312, - "Data4": 6302931693201333601 + "Data1": 6613641549303227499, + "Data2": -660628293967656241 }, "Flags": 0, "Kind": 0, @@ -83240,10 +81134,8 @@ }, { "__Checksum": { - "Data1": -3722817700218848418, - "Data2": 7518321932683341890, - "Data3": -4339406937405383908, - "Data4": 6103154041626812043 + "Data1": 8646740778941087531, + "Data2": 6195730506774779377 }, "Flags": 0, "Kind": 0, @@ -83283,10 +81175,8 @@ }, { "__Checksum": { - "Data1": -944684283571085115, - "Data2": -1965269703592919988, - "Data3": -6707111595774124328, - "Data4": -3621355268257495292 + "Data1": 6261927728037289791, + "Data2": 3848697647455796515 }, "Flags": 0, "Kind": 0, @@ -83326,10 +81216,8 @@ }, { "__Checksum": { - "Data1": -1513884231478169097, - "Data2": -1965783262950718222, - "Data3": 4692924244148077292, - "Data4": -1322591086644750029 + "Data1": 2220291597144294677, + "Data2": 3076492141608679348 }, "Flags": 0, "Kind": 0, @@ -83623,10 +81511,8 @@ }, { "__Checksum": { - "Data1": -7997480663883219968, - "Data2": 3564713622892237563, - "Data3": -5678896655206372003, - "Data4": -2797491195106568856 + "Data1": 4671970866537115307, + "Data2": -5256279907485164947 }, "Flags": 0, "Kind": 0, @@ -83659,10 +81545,8 @@ }, { "__Checksum": { - "Data1": 7857424351699934230, - "Data2": -7257556628696110288, - "Data3": 4060929961553564999, - "Data4": -7338589209722215927 + "Data1": 4237483960856268504, + "Data2": 4092900193162819178 }, "Flags": 0, "Kind": 0, @@ -83742,10 +81626,8 @@ }, { "__Checksum": { - "Data1": 7937271305396460451, - "Data2": 226255705872922352, - "Data3": -4626327303890486451, - "Data4": -3606523741139496088 + "Data1": -8478950923017202208, + "Data2": 4502905893898010211 }, "Flags": 0, "Kind": 0, @@ -83785,10 +81667,8 @@ }, { "__Checksum": { - "Data1": 4175334668408248644, - "Data2": -3227566332669687944, - "Data3": -6075402920702070057, - "Data4": -336468431022482448 + "Data1": -6030859996304857939, + "Data2": 6895836441531480750 }, "Flags": 0, "Kind": 0, @@ -83828,10 +81708,8 @@ }, { "__Checksum": { - "Data1": -3378987887778810081, - "Data2": 1425205191085188109, - "Data3": -1672733585250620205, - "Data4": 8582059236541988863 + "Data1": -7729476504066039342, + "Data2": 5999819323627834312 }, "Flags": 0, "Kind": 0, @@ -83872,10 +81750,8 @@ }, { "__Checksum": { - "Data1": -7566977287338100742, - "Data2": 561519272467353430, - "Data3": -2859348563112448055, - "Data4": -7987719649289897902 + "Data1": 3462795062659435866, + "Data2": 7382564716538602336 }, "Flags": 0, "Kind": 0, @@ -83915,10 +81791,8 @@ }, { "__Checksum": { - "Data1": 545621692362626889, - "Data2": 491629585663273200, - "Data3": -2300787220419308376, - "Data4": -8235970456314056026 + "Data1": -1435840966710068803, + "Data2": 6788734144973192583 }, "Flags": 0, "Kind": 0, @@ -83979,10 +81853,8 @@ }, { "__Checksum": { - "Data1": 7820123960719364262, - "Data2": 492811524873459687, - "Data3": 8175050503364939926, - "Data4": 6250620361168922580 + "Data1": -6020997124083744144, + "Data2": 6140444169999968937 }, "Flags": 0, "Kind": 0, @@ -84064,10 +81936,8 @@ }, { "__Checksum": { - "Data1": -4241220659428613655, - "Data2": 5497369162126152548, - "Data3": -2654370060543081587, - "Data4": 644948587934722037 + "Data1": 8011269727583374922, + "Data2": 1283586963508938334 }, "Flags": 0, "Kind": 0, @@ -84121,10 +81991,8 @@ }, { "__Checksum": { - "Data1": 7829377378917842452, - "Data2": 5994430050913574682, - "Data3": -4558910567754996605, - "Data4": -1164076406161486955 + "Data1": -4298718780883897597, + "Data2": -1046723096992372805 }, "Flags": 0, "Kind": 0, @@ -84184,10 +82052,8 @@ }, { "__Checksum": { - "Data1": -4006521584620432083, - "Data2": -7365044804663657705, - "Data3": -6094338357147694628, - "Data4": -8858434562965780643 + "Data1": 2462390800695552904, + "Data2": -3356164836703998158 }, "Flags": 0, "Kind": 0, @@ -84241,10 +82107,8 @@ }, { "__Checksum": { - "Data1": -2128679360139847443, - "Data2": 8417079790177910382, - "Data3": -5566169617139483776, - "Data4": 4921727092863713949 + "Data1": -7568729117956105392, + "Data2": -5440248889398258372 }, "Flags": 0, "Kind": 0, @@ -84319,10 +82183,8 @@ }, { "__Checksum": { - "Data1": 1055578075238076105, - "Data2": 3619328326210119033, - "Data3": -5247458267437967328, - "Data4": -6270276587096319128 + "Data1": -6956540871716298495, + "Data2": 9065104439074712513 }, "Flags": 0, "Kind": 0, @@ -84568,10 +82430,8 @@ }, { "__Checksum": { - "Data1": 2960844190601706606, - "Data2": -729526386944492204, - "Data3": -8777164770250167123, - "Data4": 1664160813412432604 + "Data1": 4663101058627741406, + "Data2": 8540822858393378551 }, "Flags": 0, "Kind": 0, @@ -84601,10 +82461,8 @@ }, { "__Checksum": { - "Data1": -3061933988715505663, - "Data2": 6275513504993924947, - "Data3": 1350642602144745930, - "Data4": -5599698761140757949 + "Data1": 9118473269643556368, + "Data2": -2985561450141691360 }, "Flags": 0, "Kind": 0, @@ -84651,10 +82509,8 @@ }, { "__Checksum": { - "Data1": 1173465331231241995, - "Data2": 2454048023020067663, - "Data3": 7118595976422114405, - "Data4": 7528120796079215227 + "Data1": -7847929025438371500, + "Data2": 3364014095654657191 }, "Flags": 0, "Kind": 0, @@ -84721,10 +82577,8 @@ }, { "__Checksum": { - "Data1": 1872790472937305477, - "Data2": -172569408194244711, - "Data3": 516363223129043326, - "Data4": -3682694806721583720 + "Data1": 598460647985136669, + "Data2": 4895649668433264332 }, "Flags": 0, "Kind": 0, @@ -84754,10 +82608,8 @@ }, { "__Checksum": { - "Data1": 8183964032777964208, - "Data2": 6139156096736192472, - "Data3": -4484194876195583884, - "Data4": -960192563575842650 + "Data1": -1023969867708008275, + "Data2": 6251387030947163284 }, "Flags": 0, "Kind": 0, @@ -84797,10 +82649,8 @@ }, { "__Checksum": { - "Data1": -1602307915445855719, - "Data2": -7703127636290899948, - "Data3": 6485514132443927448, - "Data4": 9077896348149999637 + "Data1": -4341669065968753872, + "Data2": -8127917311847209521 }, "Flags": 0, "Kind": 0, @@ -84864,10 +82714,8 @@ }, { "__Checksum": { - "Data1": 4604849030390128580, - "Data2": -2731795260578685114, - "Data3": 1989770626095690960, - "Data4": -5310489917093443895 + "Data1": -4725732303668886757, + "Data2": 5484488404301793673 }, "Flags": 0, "Kind": 0, @@ -84921,10 +82769,8 @@ }, { "__Checksum": { - "Data1": 976201292216575848, - "Data2": 7046889333078981819, - "Data3": 7670416448838418052, - "Data4": -4792541691661481194 + "Data1": 6894960042670378381, + "Data2": 169260171560033744 }, "Flags": 0, "Kind": 0, @@ -85164,10 +83010,8 @@ }, { "__Checksum": { - "Data1": -2927286333294680967, - "Data2": 5629632198939845022, - "Data3": 438318085674149228, - "Data4": -4029102788101916807 + "Data1": 2023240939446281963, + "Data2": -3961992196401511427 }, "Flags": 0, "Kind": 0, @@ -85214,10 +83058,8 @@ }, { "__Checksum": { - "Data1": -1961878580728239869, - "Data2": 8454164920375123346, - "Data3": 1085189110098296316, - "Data4": -3540780514368358488 + "Data1": 7390587564164687573, + "Data2": 3204250109662192221 }, "Flags": 0, "Kind": 0, @@ -85264,10 +83106,8 @@ }, { "__Checksum": { - "Data1": 4497614540882466708, - "Data2": -6163952936326420831, - "Data3": 4369479276749997252, - "Data4": 800908144929865776 + "Data1": 5018182531599503087, + "Data2": -2188400999409247109 }, "Flags": 0, "Kind": 0, @@ -85312,10 +83152,8 @@ }, { "__Checksum": { - "Data1": -2566909407904645960, - "Data2": -5724611424359321603, - "Data3": 3307224868100875204, - "Data4": 2727501482133806656 + "Data1": -6124169109551269687, + "Data2": -7828211083796658385 }, "Flags": 0, "Kind": 0, @@ -85471,10 +83309,8 @@ }, { "__Checksum": { - "Data1": 1728230270954372960, - "Data2": -4186077717123442825, - "Data3": -1312649551791997927, - "Data4": -5752320569802222647 + "Data1": -894221031743133334, + "Data2": -1847700993775701681 }, "Flags": 0, "Kind": 0, @@ -85527,10 +83363,8 @@ }, { "__Checksum": { - "Data1": -3731139326624940098, - "Data2": 5592032672401981292, - "Data3": 3176748125220842466, - "Data4": -8407433221855702154 + "Data1": 4449158771056320719, + "Data2": -7725535951231632584 }, "Flags": 0, "Kind": 0, @@ -85688,10 +83522,8 @@ }, { "__Checksum": { - "Data1": 5055102293288094635, - "Data2": -612856892994658261, - "Data3": -1998456644592543714, - "Data4": 757535856315646308 + "Data1": 7021393268803502587, + "Data2": 9155000302948588446 }, "Flags": 0, "Kind": 0, @@ -85731,10 +83563,8 @@ }, { "__Checksum": { - "Data1": 7826316585542609126, - "Data2": -5951970258108598816, - "Data3": 2969282041397928898, - "Data4": 5455215235896588699 + "Data1": 532421719950810661, + "Data2": 6875564986392873810 }, "Flags": 0, "Kind": 0, @@ -85802,10 +83632,8 @@ }, { "__Checksum": { - "Data1": 1971011827508589392, - "Data2": 1136696551122770103, - "Data3": -7766507964430422329, - "Data4": -517216873519287893 + "Data1": -861752925650816412, + "Data2": -8653860620791637288 }, "Flags": 0, "Kind": 0, @@ -85960,10 +83788,8 @@ }, { "__Checksum": { - "Data1": 8348114557271982040, - "Data2": -5683563858363116744, - "Data3": -7844048889865693328, - "Data4": 3140738443425876688 + "Data1": 6907695807570893086, + "Data2": -2092610086634711619 }, "Flags": 0, "Kind": 0, @@ -86010,10 +83836,8 @@ }, { "__Checksum": { - "Data1": -7493847953877662714, - "Data2": -2755054143211689274, - "Data3": -8768204081167443837, - "Data4": 6499720612577051786 + "Data1": -1307868164753575122, + "Data2": 2152439832661122870 }, "Flags": 0, "Kind": 0, @@ -86060,10 +83884,8 @@ }, { "__Checksum": { - "Data1": -458624563487209319, - "Data2": 7396874179270711935, - "Data3": -4111893411114921531, - "Data4": 4448883019156753331 + "Data1": -9137407715203377298, + "Data2": 2671836885714677621 }, "Flags": 0, "Kind": 0, @@ -86108,10 +83930,8 @@ }, { "__Checksum": { - "Data1": -5250832387972610849, - "Data2": 2032075224619072500, - "Data3": -7799269000327796666, - "Data4": 1389933545942251305 + "Data1": 119509547514686782, + "Data2": 1326206212581122970 }, "Flags": 0, "Kind": 0, @@ -86135,10 +83955,8 @@ }, { "__Checksum": { - "Data1": 4822912581710071616, - "Data2": 7032918168406412304, - "Data3": 8431610164706640711, - "Data4": -7027360435465633889 + "Data1": -5609955202335299110, + "Data2": 6871508839404209109 }, "Flags": 0, "Kind": 0, @@ -86173,10 +83991,8 @@ }, { "__Checksum": { - "Data1": -6251179829283471520, - "Data2": -5109482696736383077, - "Data3": 1135393951204507953, - "Data4": -5702834655434763122 + "Data1": 7133826808822225945, + "Data2": 1764358619717571083 }, "Flags": 0, "Kind": 0, @@ -86207,10 +84023,8 @@ }, { "__Checksum": { - "Data1": -4193663739586775594, - "Data2": 8864569755451010659, - "Data3": -9050284181855403154, - "Data4": 1531274131227855754 + "Data1": 833475303932675253, + "Data2": 1592417876295350126 }, "Flags": 0, "Kind": 0, @@ -86421,10 +84235,8 @@ }, { "__Checksum": { - "Data1": -8231839052644154816, - "Data2": 3972452644702979677, - "Data3": -3687582502076025824, - "Data4": 5498436326317642430 + "Data1": -6826740470371855114, + "Data2": 3783507759357444968 }, "Flags": 0, "Kind": 0, @@ -86471,10 +84283,8 @@ }, { "__Checksum": { - "Data1": 9105251389870836396, - "Data2": -1896305580049995548, - "Data3": 5021255423687373540, - "Data4": -8388666090447964474 + "Data1": 970118508071892818, + "Data2": -8433771589064412730 }, "Flags": 0, "Kind": 0, @@ -86514,10 +84324,8 @@ }, { "__Checksum": { - "Data1": -8591536587485239870, - "Data2": 3432442557389181313, - "Data3": 2585322641923835996, - "Data4": -7077582426563086834 + "Data1": -7845279972767409321, + "Data2": -7252364528598992968 }, "Flags": 0, "Kind": 0, @@ -86735,10 +84543,8 @@ }, { "__Checksum": { - "Data1": -6555607201600940028, - "Data2": -5631345773296635355, - "Data3": -5053369474264128727, - "Data4": -327927057680112476 + "Data1": -7778186335436584473, + "Data2": -5854331879801591035 }, "Flags": 0, "Kind": 0, @@ -86789,10 +84595,8 @@ }, { "__Checksum": { - "Data1": 2329631366355633352, - "Data2": -6278003983623421339, - "Data3": 1111122230953692481, - "Data4": -4037802770511694906 + "Data1": 9124880371552317516, + "Data2": -7069058474571024817 }, "Flags": 0, "Kind": 0, @@ -86895,10 +84699,8 @@ }, { "__Checksum": { - "Data1": -8210664441275056094, - "Data2": 5279502077202921878, - "Data3": 4614332242462751700, - "Data4": -3438098703011876301 + "Data1": 7184958060201731454, + "Data2": -8580408999385120817 }, "Flags": 0, "Kind": 0, @@ -86933,10 +84735,8 @@ }, { "__Checksum": { - "Data1": 6849157031054149969, - "Data2": 2761568600842001516, - "Data3": -3411706064217935965, - "Data4": -9041932635805199378 + "Data1": -6865441354312427211, + "Data2": 2328659852700089057 }, "Flags": 0, "Kind": 0, @@ -86983,10 +84783,8 @@ }, { "__Checksum": { - "Data1": -106375043854889438, - "Data2": -3737662662578970279, - "Data3": 7486329516137145513, - "Data4": -9103374203376313305 + "Data1": 1767673884119664662, + "Data2": 8255906872581009673 }, "Flags": 0, "Kind": 0, @@ -87032,10 +84830,8 @@ }, { "__Checksum": { - "Data1": -2506208984453521174, - "Data2": -7354875687824841222, - "Data3": 7904493270976839666, - "Data4": 8448614420872113132 + "Data1": 6183149820639705630, + "Data2": -6175282246737788249 }, "Flags": 0, "Kind": 0, @@ -87130,10 +84926,8 @@ }, { "__Checksum": { - "Data1": -2461903200574431551, - "Data2": 4214831010778528537, - "Data3": -8174204391826776435, - "Data4": -6170823584537315722 + "Data1": -284155871930671966, + "Data2": -8316889331665756942 }, "Flags": 0, "Kind": 0, @@ -87633,10 +85427,8 @@ }, { "__Checksum": { - "Data1": -6241897199623078785, - "Data2": -5009017713284052588, - "Data3": -3815239264640618004, - "Data4": -7606087879122279010 + "Data1": -1948163522226365190, + "Data2": 894868353464403035 }, "Flags": 0, "Kind": 0, @@ -87696,10 +85488,8 @@ }, { "__Checksum": { - "Data1": 4127726349412418495, - "Data2": -2254322118543933909, - "Data3": 6594640460682258869, - "Data4": 9161358433692689967 + "Data1": -7286160219947523740, + "Data2": -5260825288286968930 }, "Flags": 0, "Kind": 0, @@ -87750,10 +85540,8 @@ }, { "__Checksum": { - "Data1": -1605031261337062163, - "Data2": -5039308220904818513, - "Data3": 3107184748371588908, - "Data4": -7352527035562687312 + "Data1": 7608133710547199592, + "Data2": 8667283994938132569 }, "Flags": 0, "Kind": 0, @@ -87800,10 +85588,8 @@ }, { "__Checksum": { - "Data1": -9013974280313783623, - "Data2": -9113122014960941704, - "Data3": 1973786544557038782, - "Data4": 3424950996618729496 + "Data1": 5263849118419257338, + "Data2": -2443434117436946910 }, "Flags": 0, "Kind": 0, @@ -87870,10 +85656,8 @@ }, { "__Checksum": { - "Data1": 7423176409769543790, - "Data2": -5882651038688248646, - "Data3": 5928224627729280213, - "Data4": -5903903569224540518 + "Data1": -8216169004180991548, + "Data2": -2942024109546066228 }, "Flags": 0, "Kind": 0, @@ -87968,10 +85752,8 @@ }, { "__Checksum": { - "Data1": -2816146879265245983, - "Data2": 3944789001055278108, - "Data3": -7782858546241179367, - "Data4": -2780533961859081407 + "Data1": 7330356546061315960, + "Data2": 2450077665364594548 }, "Flags": 0, "Kind": 0, @@ -88488,10 +86270,8 @@ }, { "__Checksum": { - "Data1": -8333225582392552439, - "Data2": -6598662470991238900, - "Data3": -9004275431360159948, - "Data4": 2609499995095151460 + "Data1": -7911955615639855755, + "Data2": 4654608592003995633 }, "Flags": 0, "Kind": 0, @@ -88551,10 +86331,8 @@ }, { "__Checksum": { - "Data1": -7833310973729949839, - "Data2": -7060776557072937121, - "Data3": 7104216504914614364, - "Data4": 2622228442929108690 + "Data1": -9063057760335765081, + "Data2": 7494601800901727961 }, "Flags": 0, "Kind": 0, @@ -88587,10 +86365,8 @@ }, { "__Checksum": { - "Data1": -2208835202527862782, - "Data2": 7855447887828883450, - "Data3": 7349137094262136943, - "Data4": 6117681419279713798 + "Data1": 1460370140059852513, + "Data2": -6897059974835967766 }, "Flags": 0, "Kind": 0, @@ -88637,10 +86413,8 @@ }, { "__Checksum": { - "Data1": -7676897133916657326, - "Data2": -5721760308476224107, - "Data3": 8005520496212370171, - "Data4": 965072445167429644 + "Data1": 7265469300810303805, + "Data2": -4933946430080152774 }, "Flags": 0, "Kind": 0, @@ -88680,10 +86454,8 @@ }, { "__Checksum": { - "Data1": -8506059694405922128, - "Data2": 1908488284467604248, - "Data3": -5326111635463201403, - "Data4": 7320733344298677441 + "Data1": -7552462844619314445, + "Data2": -1597363401469697634 }, "Flags": 0, "Kind": 0, @@ -88885,10 +86657,8 @@ }, { "__Checksum": { - "Data1": 2016210892959599442, - "Data2": 6560282499196346377, - "Data3": -6675670081819925580, - "Data4": -572358654235451354 + "Data1": -4684174121536186137, + "Data2": 8577400875079038531 }, "Flags": 0, "Kind": 0, @@ -88935,10 +86705,8 @@ }, { "__Checksum": { - "Data1": -1152326973569096852, - "Data2": 4388237314134921122, - "Data3": -1923526082080066929, - "Data4": -5687939517159962398 + "Data1": -3099289554218115041, + "Data2": 577568169903161480 }, "Flags": 0, "Kind": 0, @@ -88985,10 +86753,8 @@ }, { "__Checksum": { - "Data1": 5298989650742581614, - "Data2": -2726802744677615022, - "Data3": -5480701362446127788, - "Data4": 938718493251005198 + "Data1": -5181616402347772127, + "Data2": -2008499809085311275 }, "Flags": 0, "Kind": 0, @@ -89033,10 +86799,8 @@ }, { "__Checksum": { - "Data1": -1990850396549311507, - "Data2": -3326984682250434368, - "Data3": -5675096476651205098, - "Data4": 4180262253364950188 + "Data1": -9221187830287185365, + "Data2": -1623573066379999899 }, "Flags": 0, "Kind": 0, @@ -89097,10 +86861,8 @@ }, { "__Checksum": { - "Data1": -1024748052838330928, - "Data2": -1381819360889887937, - "Data3": 5156652333301276544, - "Data4": -8081363456981581600 + "Data1": -8125914608578199132, + "Data2": -5540903569619679071 }, "Flags": 0, "Kind": 0, @@ -89247,10 +87009,8 @@ }, { "__Checksum": { - "Data1": -910858899819530666, - "Data2": -4329720378056114517, - "Data3": -1529136810930134819, - "Data4": 5657900011977326718 + "Data1": 5834876516037027489, + "Data2": 168333804585176831 }, "Flags": 0, "Kind": 0, @@ -89311,10 +87071,8 @@ }, { "__Checksum": { - "Data1": -7175636986130688741, - "Data2": 2873835459959486443, - "Data3": -3397325908977163951, - "Data4": -3634460012777382079 + "Data1": -1275322205345427142, + "Data2": 164019816868444989 }, "Flags": 0, "Kind": 0, @@ -89344,10 +87102,8 @@ }, { "__Checksum": { - "Data1": 4133281047926837570, - "Data2": 778680050833011035, - "Data3": 1649781057888114417, - "Data4": -7011486332042443047 + "Data1": -155871451478332048, + "Data2": -4614779733739565520 }, "Flags": 0, "Kind": 0, @@ -89400,10 +87156,8 @@ }, { "__Checksum": { - "Data1": -1649289207117574360, - "Data2": 2124448607756317249, - "Data3": 6645564815033636330, - "Data4": 5068727873610670771 + "Data1": -1539414966543317241, + "Data2": -2417377149480555123 }, "Flags": 0, "Kind": 0, @@ -89622,10 +87376,8 @@ }, { "__Checksum": { - "Data1": 4115741328570440041, - "Data2": 3026365949310639266, - "Data3": -1042982448166961320, - "Data4": 2970949868089024035 + "Data1": 1460954363314173919, + "Data2": -8174947366189770352 }, "Flags": 0, "Kind": 0, @@ -89693,10 +87445,8 @@ }, { "__Checksum": { - "Data1": -4501523636368318158, - "Data2": 3990040663938312361, - "Data3": -4621233057461208382, - "Data4": 6380403987212366613 + "Data1": 846765413197922473, + "Data2": 8948287366620028160 }, "Flags": 0, "Kind": 0, @@ -89834,10 +87584,8 @@ }, { "__Checksum": { - "Data1": 2255397199740451149, - "Data2": -8763734473383453490, - "Data3": -4491940126382746338, - "Data4": -8697382164448355699 + "Data1": -6484175248809510114, + "Data2": 6735235331324765407 }, "Flags": 0, "Kind": 0, @@ -90060,10 +87808,8 @@ }, { "__Checksum": { - "Data1": 8211525306189241537, - "Data2": 3738733186207670971, - "Data3": 4235274883495233769, - "Data4": 2134965269679396206 + "Data1": -9048884633309900093, + "Data2": -4862392706804738907 }, "Flags": 0, "Kind": 0, @@ -90145,10 +87891,8 @@ }, { "__Checksum": { - "Data1": -2737164173777898215, - "Data2": -7051268329471981122, - "Data3": 3511839554845046576, - "Data4": 8883899450132131551 + "Data1": 6060730136133457741, + "Data2": 2975129124741458111 }, "Flags": 0, "Kind": 0, @@ -90278,10 +88022,8 @@ }, { "__Checksum": { - "Data1": 501637591897550419, - "Data2": 6408186305901270679, - "Data3": 4108843179172169377, - "Data4": -7192546700067295133 + "Data1": 9198647489482835652, + "Data2": -5077788958966449653 }, "Flags": 0, "Kind": 0, @@ -90521,10 +88263,8 @@ }, { "__Checksum": { - "Data1": 1187247699031600490, - "Data2": 8781017886918587397, - "Data3": 3308044826540907686, - "Data4": 6717449266006944663 + "Data1": -153161732019912513, + "Data2": 3379900640809116785 }, "Flags": 0, "Kind": 0, @@ -90648,10 +88388,8 @@ }, { "__Checksum": { - "Data1": -1141634561356931921, - "Data2": 4127772290678889922, - "Data3": 6934740999376718019, - "Data4": -6766139798064977683 + "Data1": -8712842092990504742, + "Data2": 1023508308125820291 }, "Flags": 0, "Kind": 0, @@ -90878,10 +88616,8 @@ }, { "__Checksum": { - "Data1": 5529635906185363667, - "Data2": 7859664131347338860, - "Data3": -8394508801504710409, - "Data4": 8162796307560717355 + "Data1": 2200202416381200806, + "Data2": 7907925147723342364 }, "Flags": 0, "Kind": 0, @@ -90940,10 +88676,8 @@ }, { "__Checksum": { - "Data1": 4392189677623773155, - "Data2": -5857795651986867425, - "Data3": 5806825531536398422, - "Data4": 8387563920235112073 + "Data1": 6363727539275019739, + "Data2": -7746982833017778205 }, "Flags": 0, "Kind": 0, @@ -90976,10 +88710,8 @@ }, { "__Checksum": { - "Data1": -2966485144223015453, - "Data2": 4525436540277874421, - "Data3": -5992359739369693466, - "Data4": -82348698658543288 + "Data1": 1686731137620591310, + "Data2": -293129758338596094 }, "Flags": 0, "Kind": 0, @@ -91109,10 +88841,8 @@ }, { "__Checksum": { - "Data1": -982563931417698204, - "Data2": 4884886507000507336, - "Data3": -4577510630091647496, - "Data4": -2660092048663448714 + "Data1": 220512028963792563, + "Data2": -3319007497291018848 }, "Flags": 0, "Kind": 0, @@ -91142,10 +88872,8 @@ }, { "__Checksum": { - "Data1": -1191611615782942320, - "Data2": -1706914564053307358, - "Data3": 7399846075575165667, - "Data4": -8966246995167811084 + "Data1": 2744961599071578285, + "Data2": 9136954988518417984 }, "Flags": 0, "Kind": 0, @@ -91192,10 +88920,8 @@ }, { "__Checksum": { - "Data1": 9079852245370037820, - "Data2": -6786165223088413164, - "Data3": -5098536825258526166, - "Data4": -3923279915057169632 + "Data1": 3211382517084119716, + "Data2": -8628514299474908431 }, "Flags": 0, "Kind": 0, @@ -91226,10 +88952,8 @@ }, { "__Checksum": { - "Data1": -5544199444519555504, - "Data2": 8478102168472228483, - "Data3": -4523438335862058452, - "Data4": -8170452022604220751 + "Data1": 7959888600802438390, + "Data2": -2509953481163719901 }, "Flags": 0, "Kind": 0, @@ -91449,10 +89173,8 @@ }, { "__Checksum": { - "Data1": 1667231320940535324, - "Data2": 3581462355448813754, - "Data3": -6365519066829942907, - "Data4": -6167213148283402865 + "Data1": 1245436460055086567, + "Data2": 5045304630666205730 }, "Flags": 0, "Kind": 0, @@ -91492,10 +89214,8 @@ }, { "__Checksum": { - "Data1": -521125837285069760, - "Data2": -2029182454830830861, - "Data3": 3580758409868217308, - "Data4": -7660157250453228250 + "Data1": 6551745922400841090, + "Data2": 8519040710005771571 }, "Flags": 0, "Kind": 0, @@ -91528,10 +89248,8 @@ }, { "__Checksum": { - "Data1": -3210877275081111072, - "Data2": -2921518135194637108, - "Data3": -1529599115302327974, - "Data4": 773201106826790293 + "Data1": 4293510644495471999, + "Data2": 1678787373335617783 }, "Flags": 0, "Kind": 0, @@ -91585,10 +89303,8 @@ }, { "__Checksum": { - "Data1": -3576967706771276712, - "Data2": -6151030919991784341, - "Data3": 8551048775522568720, - "Data4": 8047163670920228395 + "Data1": 6506448594591376625, + "Data2": 6560737539235863096 }, "Flags": 0, "Kind": 0, @@ -91638,10 +89354,8 @@ }, { "__Checksum": { - "Data1": 8136423506523537004, - "Data2": 4485972031544623045, - "Data3": 7343793772139716710, - "Data4": 7100762904703837088 + "Data1": 1553462114652538592, + "Data2": 3226918520649338558 }, "Flags": 0, "Kind": 0, @@ -91681,10 +89395,8 @@ }, { "__Checksum": { - "Data1": 5169014018142477188, - "Data2": 2356706578705863875, - "Data3": 896456829444216250, - "Data4": -4207013758497904447 + "Data1": 8927993439308061019, + "Data2": 1209905517012222343 }, "Flags": 0, "Kind": 0, @@ -91731,10 +89443,8 @@ }, { "__Checksum": { - "Data1": 2550060678499191091, - "Data2": -8394629133596741583, - "Data3": -6218300387976850357, - "Data4": 5643965298564965418 + "Data1": 3608905330802189734, + "Data2": -3988170182898715202 }, "Flags": 0, "Kind": 0, @@ -91802,10 +89512,8 @@ }, { "__Checksum": { - "Data1": -8584852408582080903, - "Data2": -9121209794159583880, - "Data3": 1671438526214077737, - "Data4": -9029225262413065699 + "Data1": -6002129520817465426, + "Data2": -371114573351798952 }, "Flags": 0, "Kind": 0, @@ -91880,10 +89588,8 @@ }, { "__Checksum": { - "Data1": 4113458371443734246, - "Data2": -5101633481513172564, - "Data3": -8446397982175879537, - "Data4": 3648471332076519897 + "Data1": 4237130970923253922, + "Data2": 746603826117560518 }, "Flags": 0, "Kind": 0, @@ -91942,10 +89648,8 @@ }, { "__Checksum": { - "Data1": 5654486355681824727, - "Data2": -7490356542408758645, - "Data3": -7259975524213974912, - "Data4": -4771594491706349500 + "Data1": -5660936712984208487, + "Data2": 7987274508981795715 }, "Flags": 0, "Kind": 0, @@ -91999,10 +89703,8 @@ }, { "__Checksum": { - "Data1": 1557763137084017594, - "Data2": -6534952209127884627, - "Data3": -2843792740971077442, - "Data4": -3933770011569406001 + "Data1": 2275706821282718431, + "Data2": 6596580923929911175 }, "Flags": 0, "Kind": 0, @@ -92052,10 +89754,8 @@ }, { "__Checksum": { - "Data1": -1382200893034535419, - "Data2": -6051603578108244932, - "Data3": -7123136596977258257, - "Data4": -7620176588945463460 + "Data1": -1088304316942876792, + "Data2": 1245513315363712394 }, "Flags": 0, "Kind": 0, @@ -92130,10 +89830,8 @@ }, { "__Checksum": { - "Data1": 5985475591607834504, - "Data2": 6166035148743520704, - "Data3": 6826733261146472919, - "Data4": -1676129737155823680 + "Data1": 4033816135188635665, + "Data2": 7328532857097426426 }, "Flags": 0, "Kind": 0, @@ -92220,10 +89918,8 @@ }, { "__Checksum": { - "Data1": 2085365324885120601, - "Data2": -1048116426082836502, - "Data3": 7107654961134967601, - "Data4": -4856644988031255615 + "Data1": -4909250524265010603, + "Data2": -1763519224232202790 }, "Flags": 0, "Kind": 0, @@ -92298,10 +89994,8 @@ }, { "__Checksum": { - "Data1": -958702504218037949, - "Data2": -9110469117042328003, - "Data3": 8552573292835244353, - "Data4": -6926403926701612070 + "Data1": 7676831662727225051, + "Data2": -1166143061405703741 }, "Flags": 0, "Kind": 0, @@ -92362,10 +90056,8 @@ }, { "__Checksum": { - "Data1": -363965740195677328, - "Data2": 2377369156272566748, - "Data3": 3804230050906273789, - "Data4": -1710155926078287159 + "Data1": 2381677159042259372, + "Data2": 1581636625616605064 }, "Flags": 0, "Kind": 0, @@ -92521,10 +90213,8 @@ }, { "__Checksum": { - "Data1": -3224180478069774678, - "Data2": 5435125945944932610, - "Data3": 2201450988322848172, - "Data4": 3693583402166790950 + "Data1": -2060184457551295129, + "Data2": -5006798383979134494 }, "Flags": 0, "Kind": 0, @@ -92706,10 +90396,8 @@ }, { "__Checksum": { - "Data1": -757679498455187409, - "Data2": -4823308709767812299, - "Data3": -817732480492761284, - "Data4": 3014337379308016595 + "Data1": 5418043399828551010, + "Data2": 3190994011828689574 }, "Flags": 0, "Kind": 0, @@ -92739,10 +90427,8 @@ }, { "__Checksum": { - "Data1": 5264602298664979396, - "Data2": -4782031934658437317, - "Data3": 3384030357207634169, - "Data4": -2023299953497420220 + "Data1": -884939635473107982, + "Data2": 6836152213515180136 }, "Flags": 0, "Kind": 0, @@ -92782,10 +90468,8 @@ }, { "__Checksum": { - "Data1": -6988030220709081360, - "Data2": 401066954090873018, - "Data3": 5028241016365278446, - "Data4": 608570567827965417 + "Data1": 1758745021426947666, + "Data2": -4572797258881400115 }, "Flags": 0, "Kind": 0, @@ -92818,10 +90502,8 @@ }, { "__Checksum": { - "Data1": 4254349130506330511, - "Data2": 4503491567411621533, - "Data3": 5146860497821094611, - "Data4": -8280163337195028136 + "Data1": 8727633347017809403, + "Data2": 3059594490738747196 }, "Flags": 0, "Kind": 0, @@ -92889,10 +90571,8 @@ }, { "__Checksum": { - "Data1": 4681900961524153925, - "Data2": 4569115872184252973, - "Data3": 625291112728017119, - "Data4": 6393376438934314455 + "Data1": -2657872999229221016, + "Data2": 5612794311309639231 }, "Flags": 0, "Kind": 0, @@ -92995,10 +90675,8 @@ }, { "__Checksum": { - "Data1": 23762966136722077, - "Data2": 240987922729171225, - "Data3": 9090445988575534215, - "Data4": -4272922564914679782 + "Data1": 2327824470571704858, + "Data2": -1036250107007713926 }, "Flags": 0, "Kind": 0, @@ -93080,10 +90758,8 @@ }, { "__Checksum": { - "Data1": -8528546461173608007, - "Data2": 6646466454374253112, - "Data3": -555174646737574543, - "Data4": -2806900519804198951 + "Data1": -4129044059722577608, + "Data2": -2101597395718599691 }, "Flags": 0, "Kind": 0, @@ -93123,10 +90799,8 @@ }, { "__Checksum": { - "Data1": -6765007443478372700, - "Data2": 8051754657954374302, - "Data3": 5055758319881677378, - "Data4": -3081838416004028471 + "Data1": -1198779158247709035, + "Data2": -7134241773906170044 }, "Flags": 0, "Kind": 0, @@ -93216,10 +90890,8 @@ }, { "__Checksum": { - "Data1": 6322019702851685226, - "Data2": 8419498485038146491, - "Data3": -1143820722678815665, - "Data4": 8380797785369802875 + "Data1": -861817440636478660, + "Data2": -5762684324198680015 }, "Flags": 0, "Kind": 0, @@ -93285,10 +90957,8 @@ }, { "__Checksum": { - "Data1": 4203274613650184349, - "Data2": 5807057966251800254, - "Data3": -9139363467507166007, - "Data4": 2727875508202653410 + "Data1": 3482222224391394793, + "Data2": 8282288786275353852 }, "Flags": 0, "Kind": 0, @@ -93356,10 +91026,8 @@ }, { "__Checksum": { - "Data1": -7105367334509422564, - "Data2": -8249473597708717391, - "Data3": -1152594019022990451, - "Data4": 7343615494571348128 + "Data1": 8639947838734565557, + "Data2": 2252627557602894955 }, "Flags": 0, "Kind": 0, @@ -93448,10 +91116,8 @@ }, { "__Checksum": { - "Data1": -4715992306481650128, - "Data2": -205559948506057973, - "Data3": -1779513485434264539, - "Data4": 2905720195066248974 + "Data1": 2410804034946857145, + "Data2": -2513327407382848969 }, "Flags": 0, "Kind": 0, @@ -93526,10 +91192,8 @@ }, { "__Checksum": { - "Data1": 5364675233617387940, - "Data2": -3629051885353247326, - "Data3": 8876673032345332551, - "Data4": -7289209815746775485 + "Data1": 3374562678437169288, + "Data2": -8136133653113517809 }, "Flags": 0, "Kind": 0, @@ -93616,10 +91280,8 @@ }, { "__Checksum": { - "Data1": -7894348945288117617, - "Data2": -7685205074307386317, - "Data3": -1831868065740496325, - "Data4": -8607588605951475828 + "Data1": -6776774529191224409, + "Data2": 2867783991961372030 }, "Flags": 0, "Kind": 0, @@ -93679,10 +91341,8 @@ }, { "__Checksum": { - "Data1": -1203611404148780875, - "Data2": 2547027945291955156, - "Data3": -8957375359501259652, - "Data4": -3148140428573317776 + "Data1": -8244439305150752650, + "Data2": -2806538136733907441 }, "Flags": 0, "Kind": 0, @@ -93722,10 +91382,8 @@ }, { "__Checksum": { - "Data1": -9029439528561141161, - "Data2": 1175142839108768558, - "Data3": 9131182222407452764, - "Data4": -7853118380969336121 + "Data1": 7207503054001445871, + "Data2": 3298766521685808474 }, "Flags": 0, "Kind": 0, @@ -93765,10 +91423,8 @@ }, { "__Checksum": { - "Data1": 4633246185851047881, - "Data2": 8310066299873503775, - "Data3": -236557203908558636, - "Data4": -120284727823333258 + "Data1": 4106323150683425441, + "Data2": 3204858998332264233 }, "Flags": 0, "Kind": 0, @@ -93808,10 +91464,8 @@ }, { "__Checksum": { - "Data1": -2893338398160047226, - "Data2": -8030308100138645750, - "Data3": 6525681672875655311, - "Data4": -3169855347809185378 + "Data1": -1941782182025325073, + "Data2": -587592566128653392 }, "Flags": 0, "Kind": 0, @@ -93842,10 +91496,8 @@ }, { "__Checksum": { - "Data1": -342445591334828882, - "Data2": 7321967516083977208, - "Data3": 2309760711362370788, - "Data4": -5159734070790316378 + "Data1": -2203944264266373781, + "Data2": -1037058445654294686 }, "Flags": 0, "Kind": 0, @@ -93920,10 +91572,8 @@ }, { "__Checksum": { - "Data1": 1502364996124197907, - "Data2": -9052898465034819706, - "Data3": 4976107115147325311, - "Data4": -2531178839034021294 + "Data1": -2383802682770405559, + "Data2": 7772020652182871285 }, "Flags": 0, "Kind": 0, @@ -93954,10 +91604,8 @@ }, { "__Checksum": { - "Data1": 3926214736388960127, - "Data2": -1920049811015259991, - "Data3": -8286162496313966150, - "Data4": 7967671195756225010 + "Data1": 3162819332762975130, + "Data2": -3828997566279789979 }, "Flags": 0, "Kind": 0, @@ -94009,10 +91657,8 @@ }, { "__Checksum": { - "Data1": -6047494980788204597, - "Data2": 5223943950899945399, - "Data3": -6416102272868722040, - "Data4": 5052394430286966860 + "Data1": -2126842959662505622, + "Data2": 2788371340336393380 }, "Flags": 0, "Kind": 0, @@ -94052,10 +91698,8 @@ }, { "__Checksum": { - "Data1": 3084098894118224723, - "Data2": 2848001857081691560, - "Data3": 4960929066592165848, - "Data4": -2639453560907752108 + "Data1": 3558341025306048996, + "Data2": 1777550799128250365 }, "Flags": 0, "Kind": 0, @@ -94095,10 +91739,8 @@ }, { "__Checksum": { - "Data1": 2049694144502075801, - "Data2": 5818922885096434263, - "Data3": -3494529841516532037, - "Data4": -3269566104719932301 + "Data1": 2172171514930628015, + "Data2": -3161865648664135839 }, "Flags": 0, "Kind": 0, @@ -94134,10 +91776,8 @@ }, { "__Checksum": { - "Data1": 2391621654809118047, - "Data2": 8911389832826671608, - "Data3": -138194335767252219, - "Data4": 8358598790640489271 + "Data1": 498629536945016980, + "Data2": -7644534414635850609 }, "Flags": 0, "Kind": 0, @@ -94370,10 +92010,8 @@ }, { "__Checksum": { - "Data1": 536260152316433550, - "Data2": -8157254209878934162, - "Data3": 8103105095953496404, - "Data4": 5233009261776173318 + "Data1": 1213391537620839403, + "Data2": -5810543154297442482 }, "Flags": 0, "Kind": 0, @@ -94623,10 +92261,8 @@ }, { "__Checksum": { - "Data1": 8126457184854456138, - "Data2": -3999168037303665699, - "Data3": -1545383251572119790, - "Data4": 436929441887080877 + "Data1": -8057851609033560966, + "Data2": -873672242795557931 }, "Flags": 0, "Kind": 0, @@ -94666,10 +92302,8 @@ }, { "__Checksum": { - "Data1": -8441474744868596083, - "Data2": -2043138184739616153, - "Data3": -4769851338611263426, - "Data4": 7766743376118123374 + "Data1": 7157338885016538583, + "Data2": 8968080481804123024 }, "Flags": 0, "Kind": 0, @@ -94746,10 +92380,8 @@ }, { "__Checksum": { - "Data1": -1568342964054040284, - "Data2": 6970357332631371141, - "Data3": -5023961693696659728, - "Data4": 8684472123472465522 + "Data1": 5016322656020512763, + "Data2": -6979353958726712640 }, "Flags": 0, "Kind": 0, @@ -94855,10 +92487,8 @@ }, { "__Checksum": { - "Data1": 6806233739267355174, - "Data2": 3810551128997305986, - "Data3": 4183228794176844211, - "Data4": -6705399653685497503 + "Data1": -1650928179212592511, + "Data2": -829945511791357017 }, "Flags": 0, "Kind": 0, @@ -95071,10 +92701,8 @@ }, { "__Checksum": { - "Data1": 7756058951324039537, - "Data2": -7904352261689414294, - "Data3": 1479889633161596534, - "Data4": -7684462712773365511 + "Data1": 1595153956852380782, + "Data2": 6596321925287442521 }, "Flags": 0, "Kind": 0, @@ -95324,10 +92952,8 @@ }, { "__Checksum": { - "Data1": 6804600231923759723, - "Data2": 8948555583851245361, - "Data3": -4872338849297864151, - "Data4": -1932044323421370454 + "Data1": -7032062085300008934, + "Data2": 1704811876465139746 }, "Flags": 0, "Kind": 0, @@ -95381,10 +93007,8 @@ }, { "__Checksum": { - "Data1": -776394147104812854, - "Data2": -1345015843168821017, - "Data3": -723023157326422940, - "Data4": -3851498504511028497 + "Data1": 2006973256418064712, + "Data2": 7480707590708730404 }, "Flags": 0, "Kind": 0, @@ -95452,10 +93076,8 @@ }, { "__Checksum": { - "Data1": -8936901209235739711, - "Data2": 8066889857044216530, - "Data3": 8415577414618282514, - "Data4": 8197382348577777951 + "Data1": 6808183449329970559, + "Data2": 189436567892206140 }, "Flags": 0, "Kind": 0, @@ -95558,10 +93180,8 @@ }, { "__Checksum": { - "Data1": 6853934041709664844, - "Data2": -2736680937620092547, - "Data3": -9159282918739830002, - "Data4": 916527756877389471 + "Data1": 38823742577701564, + "Data2": -5694504920997292437 }, "Flags": 0, "Kind": 0, @@ -95615,10 +93235,8 @@ }, { "__Checksum": { - "Data1": -2654759959309653356, - "Data2": 4402474682259086160, - "Data3": 7864815541611704170, - "Data4": -1656443494235573734 + "Data1": -7170447221030555841, + "Data2": 3723413815037394548 }, "Flags": 0, "Kind": 0, @@ -95672,10 +93290,8 @@ }, { "__Checksum": { - "Data1": 4205147297397294048, - "Data2": 686154771490889314, - "Data3": -7679525039525878894, - "Data4": -1910749378158041564 + "Data1": 3644119163101203054, + "Data2": -5502967435176298137 }, "Flags": 0, "Kind": 0, @@ -95820,10 +93436,8 @@ }, { "__Checksum": { - "Data1": 2094069235573864684, - "Data2": 7120602219831511728, - "Data3": 7723995133031640710, - "Data4": 6405579141762381726 + "Data1": -8158801395866491531, + "Data2": 1740057634313530788 }, "Flags": 0, "Kind": 0, @@ -95863,10 +93477,8 @@ }, { "__Checksum": { - "Data1": 6395016510104074270, - "Data2": -3361687186589861034, - "Data3": 1242686149556759276, - "Data4": 5919696018778398426 + "Data1": -59669407009017878, + "Data2": -999645346606168317 }, "Flags": 0, "Kind": 0, @@ -96155,10 +93767,8 @@ }, { "__Checksum": { - "Data1": 5891953738733656443, - "Data2": -3458011353980278625, - "Data3": 4305647982772340851, - "Data4": -1684172327435648890 + "Data1": 8562756333306092618, + "Data2": -5291803048509130661 }, "Flags": 0, "Kind": 0, @@ -96212,10 +93822,8 @@ }, { "__Checksum": { - "Data1": 9090459845473575104, - "Data2": 4994951413086816500, - "Data3": 8022504538503157408, - "Data4": 5893044506582573081 + "Data1": 6490775176595723459, + "Data2": -4940513059110555382 }, "Flags": 0, "Kind": 0, @@ -96360,10 +93968,8 @@ }, { "__Checksum": { - "Data1": 5353962991919403075, - "Data2": 720599063526546571, - "Data3": 8609137270047280920, - "Data4": 5403960605625549489 + "Data1": 6630159737526288709, + "Data2": -225197935902531913 }, "Flags": 0, "Kind": 0, @@ -96581,10 +94187,8 @@ }, { "__Checksum": { - "Data1": -7285969436233453128, - "Data2": 471198200257935987, - "Data3": -1592444651282361423, - "Data4": -6165267730058068101 + "Data1": -259580275363691747, + "Data2": 6031797843926035024 }, "Flags": 0, "Kind": 0, @@ -96631,10 +94235,8 @@ }, { "__Checksum": { - "Data1": -1875401660807598650, - "Data2": -5679094219814616963, - "Data3": -7181400772228632146, - "Data4": -1084197522107275868 + "Data1": 2630461591310654830, + "Data2": -1479969317642859822 }, "Flags": 0, "Kind": 0, @@ -96664,10 +94266,8 @@ }, { "__Checksum": { - "Data1": 6213702375392022356, - "Data2": 7434328444938379983, - "Data3": 6811525562037665190, - "Data4": -8189641924023420254 + "Data1": -42096838473830759, + "Data2": -3365735889591695711 }, "Flags": 0, "Kind": 0, @@ -96707,10 +94307,8 @@ }, { "__Checksum": { - "Data1": 8844547795103050407, - "Data2": -462395489433938296, - "Data3": -957339882420682375, - "Data4": -6189222520197712932 + "Data1": 3052085835264383857, + "Data2": -1682920557752145157 }, "Flags": 0, "Kind": 0, @@ -96750,10 +94348,8 @@ }, { "__Checksum": { - "Data1": -7975730931685649855, - "Data2": 8863184169383071585, - "Data3": 5457573662034752484, - "Data4": 9084458678495108817 + "Data1": -589140985788053768, + "Data2": -6475446672937487546 }, "Flags": 0, "Kind": 0, @@ -96798,10 +94394,8 @@ }, { "__Checksum": { - "Data1": 1027774212515573589, - "Data2": 1003759179936954604, - "Data3": 479586028293241594, - "Data4": -6857245851395460883 + "Data1": 4923583821969074634, + "Data2": 7218355664881515367 }, "Flags": 0, "Kind": 0, @@ -96970,10 +94564,8 @@ }, { "__Checksum": { - "Data1": -7110540510889453002, - "Data2": -5480136932069217965, - "Data3": -2517651266723140345, - "Data4": 5420926687313265622 + "Data1": 2575010549817689914, + "Data2": 7152898124048840687 }, "Flags": 0, "Kind": 0, @@ -97020,10 +94612,8 @@ }, { "__Checksum": { - "Data1": -6695403060763563076, - "Data2": 8568019875531747771, - "Data3": -2508015779923822865, - "Data4": 4471611753663700955 + "Data1": -4309589388724676746, + "Data2": 4550410576622853663 }, "Flags": 0, "Kind": 0, @@ -97070,10 +94660,8 @@ }, { "__Checksum": { - "Data1": 2071506637509077368, - "Data2": -3985519145940268879, - "Data3": 6589474608178357850, - "Data4": -7814896975294582973 + "Data1": -224456759429288012, + "Data2": -1480129799885573499 }, "Flags": 0, "Kind": 0, @@ -97118,10 +94706,8 @@ }, { "__Checksum": { - "Data1": 277374697599211702, - "Data2": -1656042131074388685, - "Data3": -1291436749601844663, - "Data4": 1587348503659788332 + "Data1": 6344694321833469769, + "Data2": 7952016848999212294 }, "Flags": 0, "Kind": 0, @@ -97249,10 +94835,8 @@ }, { "__Checksum": { - "Data1": -7797424935181585232, - "Data2": -6860410742994192799, - "Data3": 1946130956404746843, - "Data4": 7557366829519776143 + "Data1": 5592118877439080077, + "Data2": -200640721453134075 }, "Flags": 0, "Kind": 0, @@ -97417,10 +95001,8 @@ }, { "__Checksum": { - "Data1": 7854774385915566474, - "Data2": 6443424995007119241, - "Data3": -6472656287435196791, - "Data4": 6952889391117971851 + "Data1": -5624798308200040775, + "Data2": 6232200475434487307 }, "Flags": 0, "Kind": 0, @@ -97460,10 +95042,8 @@ }, { "__Checksum": { - "Data1": -6629050681474077892, - "Data2": 1803629644672931092, - "Data3": 118163535664841758, - "Data4": -3296399799200206206 + "Data1": 6935098340378197108, + "Data2": -838090151499708513 }, "Flags": 0, "Kind": 0, @@ -97517,10 +95097,8 @@ }, { "__Checksum": { - "Data1": -8921233474791500992, - "Data2": -4517401052226932805, - "Data3": 6859246243993485583, - "Data4": 2996366244763740837 + "Data1": -4519459709286854843, + "Data2": 3608847725535420704 }, "Flags": 0, "Kind": 0, @@ -97640,10 +95218,8 @@ }, { "__Checksum": { - "Data1": 6723290816116112798, - "Data2": -2705769922005756503, - "Data3": 158305977271372268, - "Data4": -4465425703587961334 + "Data1": -3458932722759855868, + "Data2": 2291322572332593297 }, "Flags": 0, "Kind": 0, @@ -97697,10 +95273,8 @@ }, { "__Checksum": { - "Data1": -8256615327168759394, - "Data2": -8137863337513689168, - "Data3": 2726526806956826163, - "Data4": -5493166700250556308 + "Data1": -4271595526277710214, + "Data2": -7263554806252279614 }, "Flags": 0, "Kind": 0, @@ -97754,10 +95328,8 @@ }, { "__Checksum": { - "Data1": -1633129147601768160, - "Data2": -4512718560670372653, - "Data3": -8838797553631156652, - "Data4": -7948495936081647065 + "Data1": -8274684306093203752, + "Data2": -867800260908885282 }, "Flags": 0, "Kind": 0, @@ -97816,10 +95388,8 @@ }, { "__Checksum": { - "Data1": -5048405219756056144, - "Data2": -4555295258070270920, - "Data3": 1737884523502312822, - "Data4": 6129677897290229171 + "Data1": -5053380669220120494, + "Data2": 3565534609987467070 }, "Flags": 0, "Kind": 0, @@ -97859,10 +95429,8 @@ }, { "__Checksum": { - "Data1": 8409593914542310070, - "Data2": 3883833707870839538, - "Data3": -4165775581222026523, - "Data4": -8018608898088187429 + "Data1": -413026210716891277, + "Data2": -1067689069638900203 }, "Flags": 0, "Kind": 0, @@ -97916,10 +95484,8 @@ }, { "__Checksum": { - "Data1": 6830140504421446930, - "Data2": 5472520630783344594, - "Data3": 7044613862358790522, - "Data4": -3274646449868194909 + "Data1": 2115140279627981883, + "Data2": -6043406994923841156 }, "Flags": 0, "Kind": 0, @@ -97949,10 +95515,8 @@ }, { "__Checksum": { - "Data1": -3961752542711188010, - "Data2": -8431764663883167452, - "Data3": -5471420539090136930, - "Data4": -1938452042772989121 + "Data1": -3264539037816884839, + "Data2": -3760551309911774711 }, "Flags": 0, "Kind": 0, @@ -98006,10 +95570,8 @@ }, { "__Checksum": { - "Data1": 6781622918577867415, - "Data2": 7273895384683401247, - "Data3": -5643384228721076119, - "Data4": -3640557909646803816 + "Data1": -558912912419599373, + "Data2": 6644167216499031608 }, "Flags": 0, "Kind": 0, @@ -98063,10 +95625,8 @@ }, { "__Checksum": { - "Data1": -2096604269655157732, - "Data2": -3053086973656261381, - "Data3": 7183438314761817945, - "Data4": 5150498652034752905 + "Data1": -6369850633712553229, + "Data2": -9033516107720448204 }, "Flags": 0, "Kind": 0, @@ -98120,10 +95680,8 @@ }, { "__Checksum": { - "Data1": 7547296608232205169, - "Data2": 1096641591369729857, - "Data3": 9031678188706016844, - "Data4": -7515058963416650163 + "Data1": 6596798326958085311, + "Data2": -6208060390132748143 }, "Flags": 0, "Kind": 0, @@ -98236,10 +95794,8 @@ }, { "__Checksum": { - "Data1": -8865955744967084460, - "Data2": 6073457255198535907, - "Data3": -8570164254046768295, - "Data4": -3242106951048697980 + "Data1": -7782972308401603099, + "Data2": -7144050228440887985 }, "Flags": 0, "Kind": 0, @@ -98293,10 +95849,8 @@ }, { "__Checksum": { - "Data1": 4380613323758700202, - "Data2": 6968598838268957559, - "Data3": -4149523777862593432, - "Data4": -1553233324040373687 + "Data1": -1943234338401670148, + "Data2": 1836719506160560637 }, "Flags": 0, "Kind": 0, @@ -98350,10 +95904,8 @@ }, { "__Checksum": { - "Data1": 6756896587355408949, - "Data2": -8313581847466800444, - "Data3": 8207162698505693736, - "Data4": -7630106331452442747 + "Data1": 6483650459470862954, + "Data2": 3879152956634215235 }, "Flags": 0, "Kind": 0, @@ -98407,10 +95959,8 @@ }, { "__Checksum": { - "Data1": 5355347174963271634, - "Data2": 9141357368355535290, - "Data3": -2603939225237503440, - "Data4": 3279297262415214152 + "Data1": -8059184732616066820, + "Data2": -7551224923950182443 }, "Flags": 0, "Kind": 0, @@ -98440,10 +95990,8 @@ }, { "__Checksum": { - "Data1": 488264832851230948, - "Data2": -7801730940586535746, - "Data3": -5178293423752932843, - "Data4": -1613216765647920487 + "Data1": 5845378053642695449, + "Data2": -1906149357118292843 }, "Flags": 0, "Kind": 0, @@ -98561,10 +96109,8 @@ }, { "__Checksum": { - "Data1": 6772712421886403281, - "Data2": 3918996218357389053, - "Data3": 6802163445897381115, - "Data4": -3004995301201720815 + "Data1": 2436547072337464787, + "Data2": -1585940578310220739 }, "Flags": 0, "Kind": 0, @@ -98654,10 +96200,8 @@ }, { "__Checksum": { - "Data1": -4845784744048859738, - "Data2": 3939497018219394873, - "Data3": -5697883144812606310, - "Data4": -1878368739241773742 + "Data1": 8341152685201778091, + "Data2": 3304161425849484266 }, "Flags": 0, "Kind": 0, @@ -98765,10 +96309,8 @@ }, { "__Checksum": { - "Data1": -6802319876136761001, - "Data2": 9198539836693743747, - "Data3": -7216667347263747640, - "Data4": -1238687669253293909 + "Data1": 538569414130053478, + "Data2": -5712713633966891268 }, "Flags": 0, "Kind": 0, @@ -98838,10 +96380,8 @@ }, { "__Checksum": { - "Data1": 5791115515400900261, - "Data2": -5917121619258474202, - "Data3": 6268549499296310848, - "Data4": -1832222099561342780 + "Data1": 8039753713363240919, + "Data2": 5527187685004871764 }, "Flags": 0, "Kind": 0, @@ -98876,10 +96416,8 @@ }, { "__Checksum": { - "Data1": -1765938030733738378, - "Data2": 3920611511124153296, - "Data3": 2190534708628058239, - "Data4": 4866408979815390757 + "Data1": 1440315310121282397, + "Data2": 903340149927623140 }, "Flags": 0, "Kind": 0, @@ -99013,10 +96551,8 @@ }, { "__Checksum": { - "Data1": -8523724939081286583, - "Data2": -7704657486895985647, - "Data3": 1810346512042296150, - "Data4": 7188229229015023971 + "Data1": -5021599813588172177, + "Data2": 3630301668975901922 }, "Flags": 0, "Kind": 0, @@ -99174,10 +96710,8 @@ }, { "__Checksum": { - "Data1": 4751101499369742982, - "Data2": -7786948052744515186, - "Data3": -8546997313044194580, - "Data4": -6509376170048011580 + "Data1": 5723514919918389692, + "Data2": 2186226944124206076 }, "Flags": 0, "Kind": 0, @@ -99245,10 +96779,8 @@ }, { "__Checksum": { - "Data1": 8077998041431477589, - "Data2": -8770386033209998644, - "Data3": -2326727838928892458, - "Data4": 3960887835307622234 + "Data1": -1859073164499833510, + "Data2": -3231661059790823689 }, "Flags": 0, "Kind": 0, @@ -99315,10 +96847,8 @@ }, { "__Checksum": { - "Data1": 2958648910430827879, - "Data2": -7483816126791985955, - "Data3": 368684142207016381, - "Data4": -7300423607012182998 + "Data1": -2063973289654486440, + "Data2": 7440509338015959416 }, "Flags": 0, "Kind": 0, @@ -99550,10 +97080,8 @@ }, { "__Checksum": { - "Data1": -7286049699775976176, - "Data2": -6227980465306360652, - "Data3": 8972319461713257396, - "Data4": -6336819602630405904 + "Data1": -5934939232711319687, + "Data2": 8816736749724196231 }, "Flags": 0, "Kind": 0, @@ -99647,10 +97175,8 @@ }, { "__Checksum": { - "Data1": 1471381193959328660, - "Data2": -4480997993825414544, - "Data3": -7479280407405617278, - "Data4": 3820316589402567272 + "Data1": -5237850339508491145, + "Data2": 4524679415685596750 }, "Flags": 0, "Kind": 0, @@ -99697,10 +97223,8 @@ }, { "__Checksum": { - "Data1": 7253207078691554543, - "Data2": 7443352799240720072, - "Data3": -3350592289961189418, - "Data4": -6026913403274717367 + "Data1": 5235789334122559768, + "Data2": -8050863426573511023 }, "Flags": 0, "Kind": 0, @@ -99824,10 +97348,8 @@ }, { "__Checksum": { - "Data1": -3352760642334436447, - "Data2": -8021904359361292910, - "Data3": -3574022637307101435, - "Data4": 5637201015347788262 + "Data1": 233051350696727704, + "Data2": -6549130464307261239 }, "Flags": 0, "Kind": 0, @@ -100119,10 +97641,8 @@ }, { "__Checksum": { - "Data1": 2441360181116662263, - "Data2": -8182158476329417104, - "Data3": 3051658329861094677, - "Data4": -2515942032379079803 + "Data1": 2835061414506952066, + "Data2": 7713210514190792046 }, "Flags": 0, "Kind": 0, @@ -100162,10 +97682,8 @@ }, { "__Checksum": { - "Data1": -5980409433384458548, - "Data2": 7032493038563624442, - "Data3": 4806716256920630999, - "Data4": -4236114037732967599 + "Data1": -6620690051818506524, + "Data2": -1987637464001102952 }, "Flags": 0, "Kind": 0, @@ -100198,10 +97716,8 @@ }, { "__Checksum": { - "Data1": -8197720607894052190, - "Data2": -7609086288713128848, - "Data3": 3275023471728297805, - "Data4": -2942465902361517172 + "Data1": 5253481689676063747, + "Data2": -6326587199537314991 }, "Flags": 0, "Kind": 0, @@ -100232,10 +97748,8 @@ }, { "__Checksum": { - "Data1": -9112248675979062423, - "Data2": 8419302321697460314, - "Data3": 266963560739484298, - "Data4": 5930166532555508750 + "Data1": 4096736731723754958, + "Data2": 622167286163635186 }, "Flags": 0, "Kind": 0, @@ -100282,10 +97796,8 @@ }, { "__Checksum": { - "Data1": 3794558324348420326, - "Data2": -4805770510626598743, - "Data3": -4782366945724227294, - "Data4": 6061373773312964665 + "Data1": -1093838853007282619, + "Data2": -7196259674076403005 }, "Flags": 0, "Kind": 0, @@ -100318,10 +97830,8 @@ }, { "__Checksum": { - "Data1": 7277767957850542043, - "Data2": 6144364004461595071, - "Data3": 766076954300042959, - "Data4": -6838628373128168394 + "Data1": -8467387478264172022, + "Data2": -4325539875604974951 }, "Flags": 0, "Kind": 0, @@ -100438,10 +97948,8 @@ }, { "__Checksum": { - "Data1": -8452391855302051990, - "Data2": -5501961236213901328, - "Data3": -8626461286230890657, - "Data4": -4926404234256126620 + "Data1": 3173157027040964856, + "Data2": 7256375557662018912 }, "Flags": 0, "Kind": 0, @@ -100481,10 +97989,8 @@ }, { "__Checksum": { - "Data1": 3902133871965767274, - "Data2": -4673774844867715690, - "Data3": -7491164736365896887, - "Data4": -7682004822057363890 + "Data1": 2910040998055257212, + "Data2": 1956973467232270672 }, "Flags": 0, "Kind": 0, @@ -100552,10 +98058,8 @@ }, { "__Checksum": { - "Data1": -1392665787478441678, - "Data2": 7701629422174675100, - "Data3": 8073772451268813853, - "Data4": -59418497106986405 + "Data1": 3255066476342366217, + "Data2": -1085700014939110571 }, "Flags": 0, "Kind": 0, @@ -100616,10 +98120,8 @@ }, { "__Checksum": { - "Data1": 6540813415254497586, - "Data2": 3150078180429706802, - "Data3": -8020511964308996877, - "Data4": -9176397263825755786 + "Data1": -9194172250930585071, + "Data2": -241723873802025495 }, "Flags": 0, "Kind": 0, @@ -100680,10 +98182,8 @@ }, { "__Checksum": { - "Data1": -3316273672196904492, - "Data2": 84199784513444086, - "Data3": 8519083810631905230, - "Data4": 4372233111041354776 + "Data1": 8252127068265361364, + "Data2": -6221252968022037844 }, "Flags": 0, "Kind": 0, @@ -100744,10 +98244,8 @@ }, { "__Checksum": { - "Data1": 7420944100489386049, - "Data2": 3571881424880812179, - "Data3": -5744771181011513014, - "Data4": -1973305630366073028 + "Data1": -346207989374889214, + "Data2": 2309635859076398586 }, "Flags": 0, "Kind": 0, @@ -100857,10 +98355,8 @@ }, { "__Checksum": { - "Data1": -5132716147560633362, - "Data2": -8014852804426936368, - "Data3": -6863240361279564891, - "Data4": 8739159276524775664 + "Data1": 4525589108430925599, + "Data2": 3954470499251717579 }, "Flags": 0, "Kind": 0, @@ -100907,10 +98403,8 @@ }, { "__Checksum": { - "Data1": -8180488633969593710, - "Data2": 1103065717685329409, - "Data3": -5322161181834982167, - "Data4": 5008865266879927618 + "Data1": -2548548296235527714, + "Data2": 6591598965026609508 }, "Flags": 0, "Kind": 0, @@ -100957,10 +98451,8 @@ }, { "__Checksum": { - "Data1": 732681378517839243, - "Data2": -4964894062479060154, - "Data3": -6009072057567003805, - "Data4": 954609255695201325 + "Data1": -5911801408670820849, + "Data2": 8989093929623697483 }, "Flags": 0, "Kind": 0, @@ -101028,10 +98520,8 @@ }, { "__Checksum": { - "Data1": 1836123367550328691, - "Data2": 776676976588395587, - "Data3": -3511994609224321376, - "Data4": -7765473219273471316 + "Data1": 6901645971732334829, + "Data2": -1817722322559905711 }, "Flags": 0, "Kind": 0, @@ -101120,10 +98610,8 @@ }, { "__Checksum": { - "Data1": 4731004001631679076, - "Data2": -4938498696548364372, - "Data3": 1538899483755241322, - "Data4": -2226344911727631134 + "Data1": -7743857827697063713, + "Data2": -7513280417626130832 }, "Flags": 0, "Kind": 0, @@ -101330,10 +98818,8 @@ }, { "__Checksum": { - "Data1": -1180239379591377852, - "Data2": 4202264700810056953, - "Data3": -1689107224054670122, - "Data4": -7018081141650342940 + "Data1": 8068171080328061953, + "Data2": 978784724216318188 }, "Flags": 0, "Kind": 0, @@ -101408,10 +98894,8 @@ }, { "__Checksum": { - "Data1": 7888988915212495764, - "Data2": -5941281524149269630, - "Data3": 8930714344448914334, - "Data4": -7034579226770951521 + "Data1": -1771147558237159663, + "Data2": -4171673464609975943 }, "Flags": 0, "Kind": 0, @@ -101465,10 +98949,8 @@ }, { "__Checksum": { - "Data1": -2211450679122639903, - "Data2": 5875366339767924759, - "Data3": 3305031531379705303, - "Data4": -8710338821003138836 + "Data1": -1079958476678605919, + "Data2": 4005045773981429455 }, "Flags": 0, "Kind": 0, @@ -101613,10 +99095,8 @@ }, { "__Checksum": { - "Data1": -4357118766269946023, - "Data2": 2110562485858204707, - "Data3": -3917659936325220987, - "Data4": 5295956488757433886 + "Data1": 276044028698499776, + "Data2": -3703841090513004722 }, "Flags": 0, "Kind": 0, @@ -101719,10 +99199,8 @@ }, { "__Checksum": { - "Data1": -1280578273100719806, - "Data2": 219683759705738803, - "Data3": -4563450116364604812, - "Data4": -4259979296520509290 + "Data1": 3340791592318898300, + "Data2": 996034478663639993 }, "Flags": 0, "Kind": 0, @@ -101752,10 +99230,8 @@ }, { "__Checksum": { - "Data1": -9128220375413960947, - "Data2": -3776132929376003854, - "Data3": -8901332208674600680, - "Data4": -7834105000967864095 + "Data1": 612702687547948605, + "Data2": -3608235294539356393 }, "Flags": 0, "Kind": 0, @@ -102294,10 +99770,8 @@ }, { "__Checksum": { - "Data1": 8352209184762271815, - "Data2": -3830481575333626892, - "Data3": -7232614465871381601, - "Data4": -5240065180453767033 + "Data1": -7812758281463820430, + "Data2": 3641209262248720927 }, "Flags": 0, "Kind": 0, @@ -102330,10 +99804,8 @@ }, { "__Checksum": { - "Data1": 6725355759397147630, - "Data2": -3409430078819424205, - "Data3": -4474033373457058211, - "Data4": -5577336060877489797 + "Data1": 6014554538543077857, + "Data2": 8109945440807012678 }, "Flags": 0, "Kind": 0, @@ -102363,10 +99835,8 @@ }, { "__Checksum": { - "Data1": -1058108000201742076, - "Data2": 4893862441524686092, - "Data3": -7900887240041375782, - "Data4": 8637150542304637921 + "Data1": -1716692737444830289, + "Data2": 3549237856955491832 }, "Flags": 0, "Kind": 0, @@ -102420,10 +99890,8 @@ }, { "__Checksum": { - "Data1": -933796073662252875, - "Data2": 7922285364406659934, - "Data3": 9198951868075604450, - "Data4": 905289616200175860 + "Data1": 7245944814814470839, + "Data2": -6148264334182846251 }, "Flags": 0, "Kind": 0, @@ -102463,10 +99931,8 @@ }, { "__Checksum": { - "Data1": 2624966746758735455, - "Data2": -6776591971673912466, - "Data3": 1014331398796234561, - "Data4": 4186203365186432631 + "Data1": 4395849205892596082, + "Data2": 7176298961332867285 }, "Flags": 0, "Kind": 0, @@ -102952,10 +100418,8 @@ }, { "__Checksum": { - "Data1": 2008612175601521063, - "Data2": 1337802193800457781, - "Data3": 1605130353571052685, - "Data4": 7361808821040201954 + "Data1": 9195743791050005703, + "Data2": 853301776941957440 }, "Flags": 0, "Kind": 0, @@ -102985,10 +100449,8 @@ }, { "__Checksum": { - "Data1": 8883270224818753203, - "Data2": -1765474541091242311, - "Data3": -688064350468095619, - "Data4": -8939048009843649441 + "Data1": 3493837528837289885, + "Data2": 3900330538574343933 }, "Flags": 0, "Kind": 0, @@ -103028,10 +100490,8 @@ }, { "__Checksum": { - "Data1": 7642830771305680892, - "Data2": -8863153881069367201, - "Data3": -3205958766687400177, - "Data4": 1852743696735189311 + "Data1": 6442807942838930216, + "Data2": -6748350679487417446 }, "Flags": 0, "Kind": 0, @@ -103168,10 +100628,8 @@ }, { "__Checksum": { - "Data1": 6422440072215653449, - "Data2": -646006866862490234, - "Data3": -3952128617840531498, - "Data4": 2183030190335699171 + "Data1": -2212542542039193674, + "Data2": 5283338735336296235 }, "Flags": 0, "Kind": 0, @@ -103421,10 +100879,8 @@ }, { "__Checksum": { - "Data1": -5816278347539926211, - "Data2": -7932304586989082952, - "Data3": 4631508963827629181, - "Data4": 186828512828937562 + "Data1": 4641022759728973396, + "Data2": -2868762414532069028 }, "Flags": 0, "Kind": 0, @@ -103448,10 +100904,8 @@ }, { "__Checksum": { - "Data1": 2091748435210090660, - "Data2": -2538060544478726498, - "Data3": 4526036521269978197, - "Data4": 2698407696702718521 + "Data1": 9103570761461204805, + "Data2": -1755572943713677184 }, "Flags": 0, "Kind": 0, @@ -103483,10 +100937,8 @@ }, { "__Checksum": { - "Data1": -3518752755289948186, - "Data2": -2705804207684506609, - "Data3": -5849842024267220085, - "Data4": -1615860923889892245 + "Data1": 7904523522042801726, + "Data2": 9082283623208286673 }, "Flags": 0, "Kind": 0, @@ -103516,10 +100968,8 @@ }, { "__Checksum": { - "Data1": 2927312527685570555, - "Data2": 4504967412183265789, - "Data3": -7829481297773418809, - "Data4": -1468641039829509989 + "Data1": -6248690671005171718, + "Data2": 8271711444375597761 }, "Flags": 0, "Kind": 0, @@ -103559,10 +101009,8 @@ }, { "__Checksum": { - "Data1": -8993686980109684503, - "Data2": 3153234820852721131, - "Data3": -9137438843488633620, - "Data4": -7886108290547056040 + "Data1": 1971482593183914811, + "Data2": 6291997677035963981 }, "Flags": 0, "Kind": 0, @@ -103623,10 +101071,8 @@ }, { "__Checksum": { - "Data1": 2926317225641139904, - "Data2": 6792288717121857939, - "Data3": -7497585950247750443, - "Data4": -4803634193403255752 + "Data1": -1041285653649229209, + "Data2": 7020253430090984083 }, "Flags": 0, "Kind": 0, @@ -103862,10 +101308,8 @@ }, { "__Checksum": { - "Data1": -2166077089358206523, - "Data2": 666324208373802540, - "Data3": -2649034028646436753, - "Data4": 7188893156957936803 + "Data1": -820433097026860250, + "Data2": 1081678438669959493 }, "Flags": 0, "Kind": 0, @@ -104055,10 +101499,8 @@ }, { "__Checksum": { - "Data1": 8554454561106636690, - "Data2": 6193250714149628792, - "Data3": 3837444965427733450, - "Data4": 7110835860597742253 + "Data1": 4820451043571719001, + "Data2": -4648357873964153563 }, "Flags": 0, "Kind": 0, @@ -104098,10 +101540,8 @@ }, { "__Checksum": { - "Data1": 1765495006982245420, - "Data2": 8370897017959751539, - "Data3": -6470395862953408452, - "Data4": 9216698895464542380 + "Data1": -5928876074371489373, + "Data2": 7599250400035769581 }, "Flags": 0, "Kind": 0, @@ -104162,10 +101602,8 @@ }, { "__Checksum": { - "Data1": 7725343677797248752, - "Data2": 6947603396686306757, - "Data3": 2814485649918890957, - "Data4": -1903292399971712116 + "Data1": -5482866511028943483, + "Data2": -2533891857035589381 }, "Flags": 0, "Kind": 0, @@ -104195,10 +101633,8 @@ }, { "__Checksum": { - "Data1": -1168718083111992009, - "Data2": -5486670565549870794, - "Data3": -2901058085207558545, - "Data4": 1005870001110377766 + "Data1": 2656058165498654680, + "Data2": 6978138237056376812 }, "Flags": 0, "Kind": 0, @@ -104250,10 +101686,8 @@ }, { "__Checksum": { - "Data1": -2838921510008606569, - "Data2": -8286391302332551617, - "Data3": -2993314926900217292, - "Data4": -5495059625149357352 + "Data1": -1141260627196174089, + "Data2": 599894690223245847 }, "Flags": 0, "Kind": 0, @@ -104361,10 +101795,8 @@ }, { "__Checksum": { - "Data1": 4336460067386388618, - "Data2": -7394491538777293157, - "Data3": 6293337653416494916, - "Data4": 8980014810139312897 + "Data1": 8049905260415473618, + "Data2": -1651194488692154878 }, "Flags": 0, "Kind": 0, @@ -104527,10 +101959,8 @@ }, { "__Checksum": { - "Data1": -5984483191694212755, - "Data2": -2381925808998952597, - "Data3": 577748757874815860, - "Data4": 8384125349563598256 + "Data1": -2112243493311002710, + "Data2": 8445947849414406083 }, "Flags": 0, "Kind": 0, @@ -104604,10 +102034,8 @@ }, { "__Checksum": { - "Data1": 4161051771339483175, - "Data2": -3278147748134065065, - "Data3": -1185568281933072281, - "Data4": -2573877797757520084 + "Data1": 6320419251513211211, + "Data2": 5004214877967247307 }, "Flags": 0, "Kind": 0, @@ -104647,10 +102075,8 @@ }, { "__Checksum": { - "Data1": -1134674834430776573, - "Data2": -5060539950680608895, - "Data3": -142301121501020394, - "Data4": 937867696138588648 + "Data1": -2558335330301754577, + "Data2": -1049938961099715771 }, "Flags": 0, "Kind": 0, @@ -104828,10 +102254,8 @@ }, { "__Checksum": { - "Data1": -5791093930338730933, - "Data2": 751715332359122672, - "Data3": 8379944508135363834, - "Data4": 7411058185388880268 + "Data1": 1222231572147186802, + "Data2": 4860001890171955219 }, "Flags": 0, "Kind": 0, @@ -105207,10 +102631,8 @@ }, { "__Checksum": { - "Data1": -7168991628024048912, - "Data2": 1416046226230291146, - "Data3": -1816102848829641409, - "Data4": 3373598031077525849 + "Data1": -1478435428773117689, + "Data2": 5962388182847463323 }, "Flags": 0, "Kind": 0, @@ -105308,10 +102730,8 @@ }, { "__Checksum": { - "Data1": -8523142434026759336, - "Data2": -7581166895488988742, - "Data3": -325577880994220920, - "Data4": 6984036910160399376 + "Data1": 8706308072226285917, + "Data2": 9109217174649462153 }, "Flags": 0, "Kind": 0, @@ -105341,10 +102761,8 @@ }, { "__Checksum": { - "Data1": -451805407452667190, - "Data2": 5016471327957499403, - "Data3": 7371135098006771715, - "Data4": 5751933269797323358 + "Data1": 5636744456066877717, + "Data2": 1622102987052544422 }, "Flags": 0, "Kind": 0, @@ -105377,10 +102795,8 @@ }, { "__Checksum": { - "Data1": 6373423619526782620, - "Data2": 1989644979575796553, - "Data3": 8079016802992201187, - "Data4": -6644499930222599358 + "Data1": -3765862605527073926, + "Data2": -4288908705788228344 }, "Flags": 0, "Kind": 0, @@ -105413,10 +102829,8 @@ }, { "__Checksum": { - "Data1": 5634866664674229586, - "Data2": -7244993787540097413, - "Data3": 3086625706445014423, - "Data4": -5317647288566646794 + "Data1": 7806247550408752981, + "Data2": 8616761625862271525 }, "Flags": 0, "Kind": 0, @@ -105611,10 +103025,8 @@ }, { "__Checksum": { - "Data1": -6537289884399065489, - "Data2": 2339736641222273724, - "Data3": 8249457720792519845, - "Data4": 3678769729539062440 + "Data1": -1422950070721548406, + "Data2": 1520634707645541085 }, "Flags": 0, "Kind": 0, @@ -105724,10 +103136,8 @@ }, { "__Checksum": { - "Data1": -1614353054985841067, - "Data2": 3334857330168564043, - "Data3": 6761469209860568685, - "Data4": -1129178280780655356 + "Data1": 3523277175502885470, + "Data2": 5163505986882535445 }, "Flags": 0, "Kind": 0, @@ -105836,10 +103246,8 @@ }, { "__Checksum": { - "Data1": 2802918595209846532, - "Data2": 4984867790332099687, - "Data3": 6485779209597312164, - "Data4": 2537240218938488771 + "Data1": -6541127458860822075, + "Data2": 6934504327330110862 }, "Flags": 0, "Kind": 0, @@ -105872,10 +103280,8 @@ }, { "__Checksum": { - "Data1": 3780031576645444391, - "Data2": 1125820408347932797, - "Data3": 8574656049390328364, - "Data4": 6851714423963406257 + "Data1": 7190615449467541377, + "Data2": -2701605299109315497 }, "Flags": 0, "Kind": 0, @@ -105957,10 +103363,8 @@ }, { "__Checksum": { - "Data1": -5373190342295917003, - "Data2": 8215107361285748932, - "Data3": 2194370626520358858, - "Data4": -5190911683551730302 + "Data1": 1529605770194671699, + "Data2": 7125609324322175185 }, "Flags": 0, "Kind": 0, @@ -106007,10 +103411,8 @@ }, { "__Checksum": { - "Data1": -5847437702216760719, - "Data2": -3965327939259220931, - "Data3": 20404528810327064, - "Data4": 2070042097635013846 + "Data1": -404666963781102522, + "Data2": 8952410492837014331 }, "Flags": 0, "Kind": 0, @@ -106043,10 +103445,8 @@ }, { "__Checksum": { - "Data1": 2193511871249229039, - "Data2": -1754918640804748461, - "Data3": 8631275287076364584, - "Data4": -3814247377512954687 + "Data1": -5932982040478240971, + "Data2": -3025950059840369785 }, "Flags": 0, "Kind": 0, @@ -106079,10 +103479,8 @@ }, { "__Checksum": { - "Data1": -1171984894845914934, - "Data2": 7920793714258487603, - "Data3": 1033626228100413046, - "Data4": -8510248921572009354 + "Data1": -3231267016138586842, + "Data2": -4700711626206147815 }, "Flags": 0, "Kind": 0, @@ -106115,10 +103513,8 @@ }, { "__Checksum": { - "Data1": 5573913676626461633, - "Data2": -1925851546097680971, - "Data3": 1130771508771261006, - "Data4": -1373544191867284493 + "Data1": 7568556114519744905, + "Data2": -1408090446641363748 }, "Flags": 0, "Kind": 0, @@ -106172,10 +103568,8 @@ }, { "__Checksum": { - "Data1": -3076567358275536987, - "Data2": 154868687586119764, - "Data3": -4460242477882606458, - "Data4": 900456474602987096 + "Data1": 5131293811952736555, + "Data2": 2157116065872986605 }, "Flags": 0, "Kind": 0, @@ -106348,10 +103742,8 @@ }, { "__Checksum": { - "Data1": -7075589356061991801, - "Data2": -249052074312555562, - "Data3": -7651063938372098362, - "Data4": -7081966875965275173 + "Data1": 8824036220125637276, + "Data2": -1401712304559997740 }, "Flags": 0, "Kind": 0, @@ -106391,10 +103783,8 @@ }, { "__Checksum": { - "Data1": 4294238498180067264, - "Data2": 6888536353920857213, - "Data3": 3890376144794381232, - "Data4": -1635716565959957558 + "Data1": -8908024423759288219, + "Data2": -2290664197112985571 }, "Flags": 0, "Kind": 0, @@ -106424,10 +103814,8 @@ }, { "__Checksum": { - "Data1": -6537671294978651777, - "Data2": 8502744257501378530, - "Data3": -7065830861664193905, - "Data4": 4544356618118028836 + "Data1": 6850802821664080292, + "Data2": 7936883018388399556 }, "Flags": 0, "Kind": 0, @@ -106495,10 +103883,8 @@ }, { "__Checksum": { - "Data1": 7705693209066581697, - "Data2": -5977507060547191745, - "Data3": -4889003763285902937, - "Data4": 7203374625849196522 + "Data1": 7472861893156037167, + "Data2": -3109252054843395551 }, "Flags": 0, "Kind": 0, @@ -106528,10 +103914,8 @@ }, { "__Checksum": { - "Data1": -5381687497158937959, - "Data2": -6660068348998703589, - "Data3": 6033692235468348987, - "Data4": 8729829362721679322 + "Data1": -3918057490162299779, + "Data2": -5005285384754056476 }, "Flags": 0, "Kind": 0, @@ -106571,10 +103955,8 @@ }, { "__Checksum": { - "Data1": 6625765199198117602, - "Data2": 2655217281282863720, - "Data3": -6595634068535867695, - "Data4": -1068410532762153288 + "Data1": -3301356655555371654, + "Data2": 5654773832962402586 }, "Flags": 0, "Kind": 0, @@ -106604,10 +103986,8 @@ }, { "__Checksum": { - "Data1": 1492003261026686610, - "Data2": 718701805280430227, - "Data3": 232674111425584867, - "Data4": -6014866895202183985 + "Data1": -5294514079415509519, + "Data2": -348305182928743972 }, "Flags": 0, "Kind": 0, @@ -106682,10 +104062,8 @@ }, { "__Checksum": { - "Data1": 3785607655885503325, - "Data2": 207487176160624011, - "Data3": -3831353790589539055, - "Data4": 8693921633454241485 + "Data1": 4276562647994274699, + "Data2": -5975102364367632800 }, "Flags": 0, "Kind": 0, @@ -106715,10 +104093,8 @@ }, { "__Checksum": { - "Data1": -2996856512407580082, - "Data2": -5193526105079422530, - "Data3": -4847917035425056250, - "Data4": 429041388681260325 + "Data1": 2393003125719801074, + "Data2": -5873598256500294009 }, "Flags": 0, "Kind": 0, @@ -106758,10 +104134,8 @@ }, { "__Checksum": { - "Data1": 3485174770046445651, - "Data2": -2366005913157545239, - "Data3": -2804767278982677038, - "Data4": -5367014561164742533 + "Data1": 2090543653759356461, + "Data2": 9059098298378130367 }, "Flags": 0, "Kind": 0, @@ -106801,10 +104175,8 @@ }, { "__Checksum": { - "Data1": -6109118836485437411, - "Data2": 2738567767951483743, - "Data3": -5788366847891624143, - "Data4": -3103095833308233657 + "Data1": 188736178786788220, + "Data2": -4263101963579279508 }, "Flags": 0, "Kind": 0, @@ -106844,10 +104216,8 @@ }, { "__Checksum": { - "Data1": -2608370550844482759, - "Data2": -6222181298266741118, - "Data3": 1515557361406811514, - "Data4": -216431755442429820 + "Data1": 5587726139686844718, + "Data2": -319207173224806491 }, "Flags": 0, "Kind": 0, @@ -106887,10 +104257,8 @@ }, { "__Checksum": { - "Data1": 6736117339200862864, - "Data2": -7223256341811439219, - "Data3": 7906185888190877724, - "Data4": 8507690664922754484 + "Data1": -8096641265221165527, + "Data2": 383829414477940389 }, "Flags": 0, "Kind": 0, @@ -106930,10 +104298,8 @@ }, { "__Checksum": { - "Data1": -4896642504441246721, - "Data2": 4404315931294081386, - "Data3": 1912271170874857892, - "Data4": 6614448307752073093 + "Data1": -2303373056985901011, + "Data2": 9136154420040931763 }, "Flags": 0, "Kind": 0, @@ -107112,10 +104478,8 @@ }, { "__Checksum": { - "Data1": 7891611777075466262, - "Data2": -8312738297236828311, - "Data3": -4830774242660697557, - "Data4": -8361179693959884477 + "Data1": 7447572576346609948, + "Data2": -9014136404508185050 }, "Flags": 0, "Kind": 0, @@ -107145,10 +104509,8 @@ }, { "__Checksum": { - "Data1": 1578736989825808793, - "Data2": -5730074152344908104, - "Data3": 3293875507569644173, - "Data4": -7732105086306234922 + "Data1": 2939881751486069509, + "Data2": 8457295150061063549 }, "Flags": 0, "Kind": 0, @@ -107279,10 +104641,8 @@ }, { "__Checksum": { - "Data1": -2095875519872362364, - "Data2": -7515160112123073526, - "Data3": -8259576959312331772, - "Data4": 1983432360246538359 + "Data1": -6476345432519938280, + "Data2": -5467389395081515139 }, "Flags": 0, "Kind": 0, @@ -107336,10 +104696,8 @@ }, { "__Checksum": { - "Data1": -496028299842805838, - "Data2": -7634956689688617831, - "Data3": -5659118113148490665, - "Data4": -1987739476199846215 + "Data1": -5365949271119674517, + "Data2": 8226931590777891655 }, "Flags": 0, "Kind": 0, @@ -107369,10 +104727,8 @@ }, { "__Checksum": { - "Data1": 5218953421567976231, - "Data2": 5627669024872456668, - "Data3": -6246906300708850030, - "Data4": -9180416004012294306 + "Data1": -7604834377793455014, + "Data2": 3545162321941048080 }, "Flags": 0, "Kind": 0, @@ -107412,10 +104768,8 @@ }, { "__Checksum": { - "Data1": -8065239119448120018, - "Data2": 4403377694933279741, - "Data3": -5191119031206460732, - "Data4": 2900936585722796821 + "Data1": 2860764826007371429, + "Data2": 7313998036421201339 }, "Flags": 0, "Kind": 0, @@ -107445,10 +104799,8 @@ }, { "__Checksum": { - "Data1": -6087318753976377995, - "Data2": 1759307846223236088, - "Data3": -6255312607957856613, - "Data4": -2869371499629644861 + "Data1": 3353048068574100208, + "Data2": -8110367991812735164 }, "Flags": 0, "Kind": 0, @@ -107488,10 +104840,8 @@ }, { "__Checksum": { - "Data1": -7857836374657515802, - "Data2": -5706758493180914768, - "Data3": -5867777467501842089, - "Data4": -312137748757729171 + "Data1": -8437117646116466799, + "Data2": 508501538367554578 }, "Flags": 0, "Kind": 0, @@ -107593,10 +104943,8 @@ }, { "__Checksum": { - "Data1": 7178239143787754667, - "Data2": 1811554002821053632, - "Data3": -7586131863348192136, - "Data4": 2653590199740345456 + "Data1": 6611699168064050438, + "Data2": 275390815186114979 }, "Flags": 0, "Kind": 0, @@ -107626,10 +104974,8 @@ }, { "__Checksum": { - "Data1": 5730871103915130831, - "Data2": -522492048599919259, - "Data3": 1949809808806011893, - "Data4": 7967223083575923046 + "Data1": -5888352423256388186, + "Data2": 7889055883930161907 }, "Flags": 0, "Kind": 0, @@ -107954,10 +105300,8 @@ }, { "__Checksum": { - "Data1": 8388711414104586418, - "Data2": 7303216407191653464, - "Data3": -6050699946722865660, - "Data4": 4791491612257996281 + "Data1": -3420647095860516715, + "Data2": 5149321851717229915 }, "Flags": 0, "Kind": 0, @@ -108007,10 +105351,8 @@ }, { "__Checksum": { - "Data1": -2648216742469378289, - "Data2": 3954474722279848149, - "Data3": 4569365657219513516, - "Data4": 8295152184669254778 + "Data1": 1334188346915850463, + "Data2": -7184024980851372804 }, "Flags": 0, "Kind": 0, @@ -108062,10 +105404,8 @@ }, { "__Checksum": { - "Data1": -7811373971693421671, - "Data2": -51473591825569587, - "Data3": -8372832253404067454, - "Data4": 4877509268414302435 + "Data1": -8290878253078570843, + "Data2": -5593838783148217202 }, "Flags": 0, "Kind": 0, @@ -108110,10 +105450,8 @@ }, { "__Checksum": { - "Data1": -7826179356443599541, - "Data2": -6945441915313009115, - "Data3": 2884282909251825532, - "Data4": 7329269948807130261 + "Data1": -6213073715227663907, + "Data2": -1427887205517406686 }, "Flags": 0, "Kind": 0, @@ -108146,10 +105484,8 @@ }, { "__Checksum": { - "Data1": 5400611490460700638, - "Data2": -3420187361284295506, - "Data3": -5635539480569551386, - "Data4": -3893802599112163081 + "Data1": -450240532838901929, + "Data2": -4418628616402687361 }, "Flags": 0, "Kind": 0, @@ -108251,10 +105587,8 @@ }, { "__Checksum": { - "Data1": -570408648834440797, - "Data2": 5839213721325508253, - "Data3": -1353208597205361692, - "Data4": 8945096695893933629 + "Data1": 5698246438856955692, + "Data2": 4245318413418068337 }, "Flags": 0, "Kind": 0, @@ -108350,10 +105684,8 @@ }, { "__Checksum": { - "Data1": -8749464085194040608, - "Data2": -2973695944770122874, - "Data3": -6854851781103734885, - "Data4": 3752322786179957225 + "Data1": 2109870182382647779, + "Data2": -5110691914690543902 }, "Flags": 0, "Kind": 0, @@ -108383,10 +105715,8 @@ }, { "__Checksum": { - "Data1": -6577333609083947316, - "Data2": -4423260850924476930, - "Data3": 8158038130437898891, - "Data4": -676740387991143279 + "Data1": 1910838445028410540, + "Data2": 4377268962430710701 }, "Flags": 0, "Kind": 0, @@ -108494,10 +105824,8 @@ }, { "__Checksum": { - "Data1": 5811822130812387091, - "Data2": 8065357600705570849, - "Data3": -6456237317736641235, - "Data4": -4273659709975406440 + "Data1": 5044506580386641008, + "Data2": 6556564974513138123 }, "Flags": 0, "Kind": 0, @@ -108572,10 +105900,8 @@ }, { "__Checksum": { - "Data1": 5640802821573054488, - "Data2": -52756016518905719, - "Data3": 5449285194605205317, - "Data4": -2830493626311222798 + "Data1": -5470865150823297346, + "Data2": 4593089801321822492 }, "Flags": 0, "Kind": 0, @@ -108636,10 +105962,8 @@ }, { "__Checksum": { - "Data1": -4014757085934532436, - "Data2": 3505732978945231012, - "Data3": 116507735273383994, - "Data4": -6961400947566023712 + "Data1": -7772254407929717356, + "Data2": -3372137365859428789 }, "Flags": 0, "Kind": 0, @@ -108686,10 +106010,8 @@ }, { "__Checksum": { - "Data1": 4252709711268492626, - "Data2": 2963619661236522791, - "Data3": 5119829215169610957, - "Data4": 1678231904247259316 + "Data1": 5527799072985591811, + "Data2": 7102166474141964578 }, "Flags": 0, "Kind": 0, @@ -108743,10 +106065,8 @@ }, { "__Checksum": { - "Data1": -3454685169624006751, - "Data2": 2896105437383300444, - "Data3": -1811582324142602900, - "Data4": 2453733074242179995 + "Data1": -4939177979875555069, + "Data2": 8338275713979203931 }, "Flags": 0, "Kind": 0, @@ -108833,10 +106153,8 @@ }, { "__Checksum": { - "Data1": 5425848135691609351, - "Data2": -8833433652291456354, - "Data3": 9175383009655687425, - "Data4": -1509943706480211806 + "Data1": -8463492621350438857, + "Data2": -412829043790409375 }, "Flags": 0, "Kind": 0, @@ -108883,10 +106201,8 @@ }, { "__Checksum": { - "Data1": 947113237189566646, - "Data2": 4598695548655455066, - "Data3": 284604180431889181, - "Data4": -5059325354125240819 + "Data1": -5325337025718781495, + "Data2": -1044338132678283924 }, "Flags": 0, "Kind": 0, @@ -108947,10 +106263,8 @@ }, { "__Checksum": { - "Data1": -6991279822832689905, - "Data2": -5948794591726718989, - "Data3": 8308803133669512692, - "Data4": -7855741493484280412 + "Data1": 579123457118366817, + "Data2": 8126762402359857631 }, "Flags": 0, "Kind": 0, @@ -109004,10 +106318,8 @@ }, { "__Checksum": { - "Data1": 741495501874029799, - "Data2": -6533250217186091869, - "Data3": 5252256343850961232, - "Data4": 2356516858259567536 + "Data1": 2776156796901150058, + "Data2": 3783557485063469302 }, "Flags": 0, "Kind": 0, @@ -109061,10 +106373,8 @@ }, { "__Checksum": { - "Data1": 857468913363139058, - "Data2": 5023416672842477323, - "Data3": 7159327350748968740, - "Data4": 4219990335811548800 + "Data1": 237385919130854806, + "Data2": 289268123594513569 }, "Flags": 0, "Kind": 0, @@ -109196,10 +106506,8 @@ }, { "__Checksum": { - "Data1": 1475024101079881735, - "Data2": 2077793230178679620, - "Data3": -262166553823506356, - "Data4": 4809815927082713399 + "Data1": -1030486679460231811, + "Data2": -864470194908818353 }, "Flags": 0, "Kind": 0, @@ -109253,10 +106561,8 @@ }, { "__Checksum": { - "Data1": -4909359933754960645, - "Data2": 490354282526312112, - "Data3": 6381692697309358753, - "Data4": 1869610288596034754 + "Data1": -3373246681783892103, + "Data2": 1510345445595061996 }, "Flags": 0, "Kind": 0, @@ -109324,10 +106630,8 @@ }, { "__Checksum": { - "Data1": -670850831685871072, - "Data2": -961204738712237943, - "Data3": 9004845551075613246, - "Data4": -7877489153144098761 + "Data1": -8982865699000167970, + "Data2": -1905980174429194683 }, "Flags": 0, "Kind": 0, @@ -109395,10 +106699,8 @@ }, { "__Checksum": { - "Data1": 2574388571224172358, - "Data2": 2918235616140447240, - "Data3": 1324961624948730760, - "Data4": -1094274793802174709 + "Data1": 7980325625235964652, + "Data2": 7174086729676843498 }, "Flags": 0, "Kind": 0, @@ -109466,10 +106768,8 @@ }, { "__Checksum": { - "Data1": -2551266172679651837, - "Data2": -6305539410636729274, - "Data3": 541826542405099492, - "Data4": -1720102028380965959 + "Data1": -2228568820564253192, + "Data2": -6297902310841275415 }, "Flags": 0, "Kind": 0, @@ -109537,10 +106837,8 @@ }, { "__Checksum": { - "Data1": -8442438805483827575, - "Data2": 991758935168643406, - "Data3": 6412613392878734666, - "Data4": 7664087021715868951 + "Data1": -6124229529341539904, + "Data2": -4462037442131864720 }, "Flags": 0, "Kind": 0, @@ -109580,10 +106878,8 @@ }, { "__Checksum": { - "Data1": -481919019671122359, - "Data2": -9060103707753964386, - "Data3": -6849150439300531311, - "Data4": 4830924398893524506 + "Data1": -4697605510388191812, + "Data2": 3942594230926294718 }, "Flags": 0, "Kind": 0, @@ -109644,10 +106940,8 @@ }, { "__Checksum": { - "Data1": -4032706184754698527, - "Data2": 2361777921096951036, - "Data3": -2050642342453039724, - "Data4": -7402628050608075737 + "Data1": 4812559856719374633, + "Data2": -1809586538457174406 }, "Flags": 0, "Kind": 0, @@ -109694,10 +106988,8 @@ }, { "__Checksum": { - "Data1": 7455503039846466763, - "Data2": -8294056845547730611, - "Data3": 3186840773400976449, - "Data4": -1619812910664164154 + "Data1": 1465374346441001504, + "Data2": -2784110825505840141 }, "Flags": 0, "Kind": 0, @@ -109793,10 +107085,8 @@ }, { "__Checksum": { - "Data1": 4343636647506293268, - "Data2": -655088330699348618, - "Data3": 1585791662252732299, - "Data4": -4470394251609457730 + "Data1": 8805657677803322059, + "Data2": 4168512181809892474 }, "Flags": 0, "Kind": 0, @@ -109843,10 +107133,8 @@ }, { "__Checksum": { - "Data1": -1623310634880497518, - "Data2": 877185481522151613, - "Data3": 3353946528939882249, - "Data4": 2079931261289267659 + "Data1": 6126324775271747804, + "Data2": 4123503830036064937 }, "Flags": 0, "Kind": 0, @@ -109896,10 +107184,8 @@ }, { "__Checksum": { - "Data1": 4409683461890199997, - "Data2": -3590655440997132497, - "Data3": 8733369656325283347, - "Data4": 2691055486650026387 + "Data1": 435308302644146252, + "Data2": -2520600152328410538 }, "Flags": 0, "Kind": 0, @@ -109953,10 +107239,8 @@ }, { "__Checksum": { - "Data1": 7659782003192453710, - "Data2": 8552036824839520590, - "Data3": 9190034610359172389, - "Data4": -2989939129285387435 + "Data1": 7072921324004033463, + "Data2": -4798008917926002175 }, "Flags": 0, "Kind": 0, @@ -109986,10 +107270,8 @@ }, { "__Checksum": { - "Data1": 3387351584162715041, - "Data2": -3268948093069851465, - "Data3": -591838266700888182, - "Data4": 5835469594593099522 + "Data1": 8340702868863040223, + "Data2": -4534367933049979080 }, "Flags": 0, "Kind": 0, @@ -110191,10 +107473,8 @@ }, { "__Checksum": { - "Data1": 5139284939684209405, - "Data2": 4376105342520019956, - "Data3": -8496729327507740667, - "Data4": -449327505388366848 + "Data1": 5132133934385405736, + "Data2": 8018594042524083488 }, "Flags": 0, "Kind": 0, @@ -110241,10 +107521,8 @@ }, { "__Checksum": { - "Data1": 7616875346120700823, - "Data2": -6843863361671215350, - "Data3": 7942860253196125449, - "Data4": -4695436122791317544 + "Data1": 8588908343437490462, + "Data2": 7014390027661349961 }, "Flags": 0, "Kind": 0, @@ -110298,10 +107576,8 @@ }, { "__Checksum": { - "Data1": 8448418752073945474, - "Data2": 2150889701893335225, - "Data3": 4436009425638080787, - "Data4": 7768882431669060318 + "Data1": 2360207463042279118, + "Data2": -5718164177041873742 }, "Flags": 0, "Kind": 0, @@ -110355,10 +107631,8 @@ }, { "__Checksum": { - "Data1": 598681340737094687, - "Data2": 5262665402772621229, - "Data3": 612692867097540468, - "Data4": 3479186586660392605 + "Data1": 152907287860952116, + "Data2": -952034147060154623 }, "Flags": 0, "Kind": 0, @@ -110450,10 +107724,8 @@ }, { "__Checksum": { - "Data1": -1061022418412991585, - "Data2": -4278410224578509727, - "Data3": 5331679558003099981, - "Data4": -7591582239764941950 + "Data1": -6594169508355990147, + "Data2": 9052815142620596648 }, "Flags": 0, "Kind": 0, @@ -110507,10 +107779,8 @@ }, { "__Checksum": { - "Data1": -5042774313779515151, - "Data2": 4826904996316612987, - "Data3": 490542727687841044, - "Data4": 2253924916762659832 + "Data1": 2698005634124000635, + "Data2": -3627955976318921757 }, "Flags": 0, "Kind": 0, @@ -110557,10 +107827,8 @@ }, { "__Checksum": { - "Data1": -6079779480119954568, - "Data2": -7651024005587762875, - "Data3": 916692258727386374, - "Data4": 450445795039945361 + "Data1": -8365281401356682267, + "Data2": 973417285975546489 }, "Flags": 0, "Kind": 0, @@ -110614,10 +107882,8 @@ }, { "__Checksum": { - "Data1": -3365715392549174826, - "Data2": -2941666969145396651, - "Data3": 5501558472909502720, - "Data4": -6238100182331184347 + "Data1": -8219791770706039211, + "Data2": -5740953097571473772 }, "Flags": 0, "Kind": 0, @@ -110671,10 +107937,8 @@ }, { "__Checksum": { - "Data1": -9075689060447433749, - "Data2": -5916519830305954699, - "Data3": -2982854146957454639, - "Data4": 3780254715862374038 + "Data1": -7202718123472559343, + "Data2": -4788786748166136072 }, "Flags": 0, "Kind": 0, @@ -110743,10 +108007,8 @@ }, { "__Checksum": { - "Data1": 6620983937953656574, - "Data2": -1913918543800779491, - "Data3": 9130525567757944308, - "Data4": 6031968978206342466 + "Data1": -4998094339811312008, + "Data2": -1032441796857679907 }, "Flags": 0, "Kind": 0, @@ -110793,10 +108055,8 @@ }, { "__Checksum": { - "Data1": -6411527437647793421, - "Data2": 975587015575255587, - "Data3": 3859733976640634631, - "Data4": -6920577280451676222 + "Data1": 4987926415939864379, + "Data2": -1177647120502052710 }, "Flags": 0, "Kind": 0, @@ -110850,10 +108110,8 @@ }, { "__Checksum": { - "Data1": 9124331330708946343, - "Data2": 4105124586005237566, - "Data3": 6119611855008233278, - "Data4": 771889018596568783 + "Data1": -213564224776003147, + "Data2": 7690532018485756864 }, "Flags": 0, "Kind": 0, @@ -110933,10 +108191,8 @@ }, { "__Checksum": { - "Data1": 6243774340848503349, - "Data2": 3654756522420107600, - "Data3": 3794252407152071665, - "Data4": 6553879924923268916 + "Data1": -8169865439155068363, + "Data2": 534114548678769534 }, "Flags": 0, "Kind": 0, @@ -110983,10 +108239,8 @@ }, { "__Checksum": { - "Data1": -7135683376075427654, - "Data2": -2622372390627496036, - "Data3": -3263898872815471459, - "Data4": 2140637250123655702 + "Data1": 7666227803666412656, + "Data2": 177910978116091710 }, "Flags": 0, "Kind": 0, @@ -111033,10 +108287,8 @@ }, { "__Checksum": { - "Data1": 5829125361455193903, - "Data2": -980044943912662686, - "Data3": 8053888739942126442, - "Data4": -2313115469673325059 + "Data1": -4210119139123110523, + "Data2": 5724008335988073831 }, "Flags": 0, "Kind": 0, @@ -111129,10 +108381,8 @@ }, { "__Checksum": { - "Data1": -1088094950782012449, - "Data2": -2854750545008652507, - "Data3": -1627932732989013552, - "Data4": -3006012944696629073 + "Data1": 5445819067546795431, + "Data2": 7093484044624196736 }, "Flags": 0, "Kind": 0, @@ -111509,10 +108759,8 @@ }, { "__Checksum": { - "Data1": 9195640589667791003, - "Data2": -3538345313143786708, - "Data3": -6454637513114079801, - "Data4": -8778204711005528135 + "Data1": 5506013560827696568, + "Data2": -7705946115373302034 }, "Flags": 0, "Kind": 0, @@ -111558,10 +108806,8 @@ }, { "__Checksum": { - "Data1": 783246010902186069, - "Data2": 6634449503625407387, - "Data3": 6295313575962931472, - "Data4": 1623638459880098650 + "Data1": 6545596264075333671, + "Data2": 1471691653763583559 }, "Flags": 0, "Kind": 0, @@ -111688,10 +108934,8 @@ }, { "__Checksum": { - "Data1": 6777664319068885921, - "Data2": 5610638372392800241, - "Data3": -7757191415674909930, - "Data4": -6713233224227906122 + "Data1": -3946668826642050542, + "Data2": 5128757721344783842 }, "Flags": 0, "Kind": 0, @@ -111738,10 +108982,8 @@ }, { "__Checksum": { - "Data1": -2591520137371115781, - "Data2": -8760085842283553209, - "Data3": -8345388471666028048, - "Data4": -4623460887778704176 + "Data1": 5840361579377208665, + "Data2": -7639274072757300969 }, "Flags": 0, "Kind": 0, @@ -111788,10 +109030,8 @@ }, { "__Checksum": { - "Data1": 7157656809828352558, - "Data2": -216130379412681087, - "Data3": -5536866363399924799, - "Data4": -7242093521486819309 + "Data1": -283158170504232657, + "Data2": -4300429034974550419 }, "Flags": 0, "Kind": 0, @@ -111836,10 +109076,8 @@ }, { "__Checksum": { - "Data1": -2241756137801854565, - "Data2": 7271868528899127637, - "Data3": -4786576865981678491, - "Data4": 3425553653636025880 + "Data1": 3903498901175385306, + "Data2": -5584281217026526121 }, "Flags": 0, "Kind": 0, @@ -111863,10 +109101,8 @@ }, { "__Checksum": { - "Data1": -6977192959057145502, - "Data2": 4996008852559949608, - "Data3": 1614204648066942687, - "Data4": -3750942193738429812 + "Data1": -4903725968985237797, + "Data2": -8104292559503303520 }, "Flags": 0, "Kind": 0, @@ -111897,10 +109133,8 @@ }, { "__Checksum": { - "Data1": 1412185854149866380, - "Data2": -7731889789922808509, - "Data3": 5599966680971007587, - "Data4": 7595825897651867412 + "Data1": 5078528077915386541, + "Data2": -2094999457038832619 }, "Flags": 0, "Kind": 0, @@ -112093,10 +109327,8 @@ }, { "__Checksum": { - "Data1": -4448536848835733611, - "Data2": 4138512975928906124, - "Data3": 4592169939457369770, - "Data4": 1947885668455158194 + "Data1": -8072778864979458665, + "Data2": -1593823013408035308 }, "Flags": 0, "Kind": 0, @@ -112136,10 +109368,8 @@ }, { "__Checksum": { - "Data1": -8840689525288475667, - "Data2": -6920579585305772251, - "Data3": -7898366205610160636, - "Data4": 2067409001904697749 + "Data1": 8859354254895669413, + "Data2": 8057628910997187273 }, "Flags": 0, "Kind": 0, @@ -112282,10 +109512,8 @@ }, { "__Checksum": { - "Data1": -3893384707083736666, - "Data2": 4392710547575142816, - "Data3": 4522436571428376778, - "Data4": -4952664003211421636 + "Data1": 8289449300663749323, + "Data2": -930023040618680062 }, "Flags": 0, "Kind": 0, @@ -112353,10 +109581,8 @@ }, { "__Checksum": { - "Data1": 5114371898709562093, - "Data2": -6498407570511341410, - "Data3": -4965998181120416314, - "Data4": -4085276829926156854 + "Data1": -7243042431905208987, + "Data2": 8045159260513344904 }, "Flags": 0, "Kind": 0, @@ -112386,10 +109612,8 @@ }, { "__Checksum": { - "Data1": 2783896034495235453, - "Data2": 3598389084990104478, - "Data3": -8058560253932008221, - "Data4": -7537808556409158362 + "Data1": 5707177240085246879, + "Data2": -1028352935034285031 }, "Flags": 0, "Kind": 0, @@ -112457,10 +109681,8 @@ }, { "__Checksum": { - "Data1": -944891854326790465, - "Data2": -3774884138711172150, - "Data3": -8357037022219929954, - "Data4": 7463886430632650292 + "Data1": 6439097681649702730, + "Data2": -1213711676497675987 }, "Flags": 0, "Kind": 0, @@ -112490,10 +109712,8 @@ }, { "__Checksum": { - "Data1": -6084403106896952735, - "Data2": -6776244295748703764, - "Data3": -877703207289692923, - "Data4": 4315388637569906571 + "Data1": 2138650676927230765, + "Data2": -1683410603491908253 }, "Flags": 0, "Kind": 0, @@ -112582,10 +109802,8 @@ }, { "__Checksum": { - "Data1": 3589978296116307996, - "Data2": 393559784017312509, - "Data3": -2594613352943528457, - "Data4": -2578180829794000459 + "Data1": 1420603255543271862, + "Data2": 1165097714407404374 }, "Flags": 0, "Kind": 0, @@ -112625,10 +109843,8 @@ }, { "__Checksum": { - "Data1": 863069165485493087, - "Data2": -6547744139760514436, - "Data3": 5213476075215134562, - "Data4": -8302274044619602805 + "Data1": -1455338807768564804, + "Data2": 6235905817609167844 }, "Flags": 0, "Kind": 0, @@ -112679,10 +109895,8 @@ }, { "__Checksum": { - "Data1": -7244942165697822014, - "Data2": -832738125529518230, - "Data3": 1348766871303819862, - "Data4": -8771597552875748014 + "Data1": -8444003653431335282, + "Data2": 7586628127872649116 }, "Flags": 0, "Kind": 0, @@ -112757,10 +109971,8 @@ }, { "__Checksum": { - "Data1": 4234991691023576738, - "Data2": 5263013019828959116, - "Data3": -7842032383035289867, - "Data4": 5145951471234518948 + "Data1": 3385030191403378674, + "Data2": 262423670613195804 }, "Flags": 0, "Kind": 0, @@ -112790,10 +110002,8 @@ }, { "__Checksum": { - "Data1": -306164517852711442, - "Data2": -1039896795527022865, - "Data3": 4471652606536862059, - "Data4": 3029630014958783254 + "Data1": -3202845686512002392, + "Data2": 11792785464656610 }, "Flags": 0, "Kind": 0, @@ -112866,10 +110076,8 @@ }, { "__Checksum": { - "Data1": 952201844640568547, - "Data2": -7026284050625902607, - "Data3": 7142256380371173184, - "Data4": 8689523299835365186 + "Data1": 7630852732297755720, + "Data2": 6725672395488311566 }, "Flags": 0, "Kind": 0, @@ -113035,10 +110243,8 @@ }, { "__Checksum": { - "Data1": 6190885829187419819, - "Data2": -2513943499368401273, - "Data3": -1794886027881969548, - "Data4": -6564473290760913904 + "Data1": 6735612507266253295, + "Data2": 1633141076480015956 }, "Flags": 0, "Kind": 0, @@ -113113,10 +110319,8 @@ }, { "__Checksum": { - "Data1": 9156969188096158821, - "Data2": -8234416237247278149, - "Data3": -7681832024751431232, - "Data4": 5684538472602834172 + "Data1": 3788100314240062347, + "Data2": -6694826325067918631 }, "Flags": 0, "Kind": 0, @@ -113146,10 +110350,8 @@ }, { "__Checksum": { - "Data1": 231546689145090562, - "Data2": -1521054916011852910, - "Data3": -9149424761150996074, - "Data4": 5774282220159968457 + "Data1": 2833213835505759258, + "Data2": -3500168282131518458 }, "Flags": 0, "Kind": 0, @@ -113245,10 +110447,8 @@ }, { "__Checksum": { - "Data1": -1643611272151246611, - "Data2": -8065766504079763293, - "Data3": -1060499981953458807, - "Data4": -2771619169237751158 + "Data1": 281347468725030851, + "Data2": 3525457390547088836 }, "Flags": 0, "Kind": 0, @@ -113344,10 +110544,8 @@ }, { "__Checksum": { - "Data1": 742458277226671100, - "Data2": -618111745738052697, - "Data3": -2951355918792121097, - "Data4": 6448188447057210874 + "Data1": -721366392418217462, + "Data2": -2209252326160607720 }, "Flags": 0, "Kind": 0, @@ -113377,10 +110575,8 @@ }, { "__Checksum": { - "Data1": -8198147591925323982, - "Data2": -3330477460574495988, - "Data3": 2741862313467004810, - "Data4": -6321170321164879193 + "Data1": 7192760826553705010, + "Data2": -393709855797628165 }, "Flags": 0, "Kind": 0, @@ -113703,10 +110899,8 @@ }, { "__Checksum": { - "Data1": 4782163439477982009, - "Data2": -302388594056133397, - "Data3": 615084223475645663, - "Data4": -6239614851916119829 + "Data1": 8932073502537197295, + "Data2": 2569440879989900700 }, "Flags": 0, "Kind": 0, @@ -113888,10 +111082,8 @@ }, { "__Checksum": { - "Data1": 6240450193633124491, - "Data2": 7577646630012601452, - "Data3": 8818436363946010557, - "Data4": -6658782348175654027 + "Data1": 5305591553112386794, + "Data2": 6754371388225777700 }, "Flags": 0, "Kind": 0, @@ -113921,10 +111113,8 @@ }, { "__Checksum": { - "Data1": -6766792276461526503, - "Data2": 6759314591098442290, - "Data3": 48691154967415785, - "Data4": 7615876651381608867 + "Data1": -3382082028364440085, + "Data2": -1351830247968732915 }, "Flags": 0, "Kind": 0, @@ -113964,10 +111154,8 @@ }, { "__Checksum": { - "Data1": 4355778481298794608, - "Data2": -5684125402062824684, - "Data3": -4579545533879804007, - "Data4": 2974595205503873141 + "Data1": -8571176402535135618, + "Data2": -6649628470672866647 }, "Flags": 0, "Kind": 0, @@ -114020,10 +111208,8 @@ }, { "__Checksum": { - "Data1": -2568202658990039317, - "Data2": 1155590609131044666, - "Data3": -7378448161955530075, - "Data4": -6087059594112231107 + "Data1": -262327925389404479, + "Data2": -4103680495487739410 }, "Flags": 0, "Kind": 0, @@ -114192,10 +111378,8 @@ }, { "__Checksum": { - "Data1": -515471250814348360, - "Data2": -5528727766296595578, - "Data3": 2881701201978269484, - "Data4": 8980670115910215502 + "Data1": -1806241203256796359, + "Data2": -4113370512648673859 }, "Flags": 0, "Kind": 0, @@ -114248,10 +111432,8 @@ }, { "__Checksum": { - "Data1": 9206922593471829676, - "Data2": 5572792220347396388, - "Data3": 2455317645222493927, - "Data4": -8602817304271507630 + "Data1": -6665798557814022755, + "Data2": 226136763606751446 }, "Flags": 0, "Kind": 0, @@ -114380,10 +111562,8 @@ }, { "__Checksum": { - "Data1": 7090458880487196779, - "Data2": 2536731522836828485, - "Data3": -8827817919728419401, - "Data4": -4387320815339562473 + "Data1": 8173512946195432375, + "Data2": 8172044551273901667 }, "Flags": 0, "Kind": 0, @@ -114444,10 +111624,8 @@ }, { "__Checksum": { - "Data1": 3809935978875465689, - "Data2": 6536054917035367263, - "Data3": -5713030166226905325, - "Data4": -8257213542977496433 + "Data1": 688487429159640472, + "Data2": -1468015882033956800 }, "Flags": 0, "Kind": 0, @@ -114522,10 +111700,8 @@ }, { "__Checksum": { - "Data1": 102261352989700091, - "Data2": 5863813728983032218, - "Data3": -2235569472356388838, - "Data4": 5330569342821248810 + "Data1": 7017921667482466886, + "Data2": 1585025173415965420 }, "Flags": 0, "Kind": 0, @@ -114555,10 +111731,8 @@ }, { "__Checksum": { - "Data1": -593368132127871835, - "Data2": 4517248199409122035, - "Data3": 748638944747906503, - "Data4": -745322424253033607 + "Data1": 892482807149845674, + "Data2": -2095668763348837402 }, "Flags": 0, "Kind": 0, @@ -114598,10 +111772,8 @@ }, { "__Checksum": { - "Data1": -210690359520354669, - "Data2": 6848177449096090798, - "Data3": -6390687382892900191, - "Data4": 1218261100512381660 + "Data1": -2602904123909241171, + "Data2": -2976490205852648917 }, "Flags": 0, "Kind": 0, @@ -114735,10 +111907,8 @@ }, { "__Checksum": { - "Data1": 9085773908936248358, - "Data2": 2384255638769468472, - "Data3": -3860154280587635522, - "Data4": 7097178751536976050 + "Data1": 6567865068356440144, + "Data2": 2366644294605415172 }, "Flags": 0, "Kind": 0, @@ -114799,10 +111969,8 @@ }, { "__Checksum": { - "Data1": -8260229969855097330, - "Data2": -518436508247870994, - "Data3": 9008670252888697839, - "Data4": -3125870293174213999 + "Data1": -2562151227069686523, + "Data2": -7989790813658435299 }, "Flags": 0, "Kind": 0, @@ -114837,10 +112005,8 @@ }, { "__Checksum": { - "Data1": -1741509115117638294, - "Data2": -5589278090892227882, - "Data3": -2487573005490030584, - "Data4": 6901695981712847780 + "Data1": 6995745161958292727, + "Data2": -1671912062378646523 }, "Flags": 0, "Kind": 0, @@ -114921,10 +112087,8 @@ }, { "__Checksum": { - "Data1": -2379722745872955281, - "Data2": 7803447224935342470, - "Data3": 6957286529033880263, - "Data4": 5811655066760502142 + "Data1": -8684710151600010726, + "Data2": -7401098075341378286 }, "Flags": 0, "Kind": 0, @@ -114964,10 +112128,8 @@ }, { "__Checksum": { - "Data1": 10227924455806956, - "Data2": -5797372421140553003, - "Data3": 3615978776105110681, - "Data4": -2181616564164753634 + "Data1": -2687445293805403565, + "Data2": -5587898213758393228 }, "Flags": 0, "Kind": 0, @@ -115002,10 +112164,8 @@ }, { "__Checksum": { - "Data1": -6502002260366598250, - "Data2": 6290564072982527529, - "Data3": 5543964362348192636, - "Data4": -5748450359094345759 + "Data1": 3556802564770782688, + "Data2": -6342495656208943563 }, "Flags": 0, "Kind": 0, @@ -115156,10 +112316,8 @@ }, { "__Checksum": { - "Data1": -2298527977122457371, - "Data2": 1542362339419216278, - "Data3": 2464741469592571060, - "Data4": -3550816859304116557 + "Data1": 2146912325186197753, + "Data2": 5129216679216358192 }, "Flags": 0, "Kind": 0, @@ -115407,10 +112565,8 @@ }, { "__Checksum": { - "Data1": 1995472397332089316, - "Data2": -7893454610420393887, - "Data3": -5877109159693129164, - "Data4": -5962524136434491792 + "Data1": -2159374832426154224, + "Data2": -4766015666953503793 }, "Flags": 0, "Kind": 0, @@ -115457,10 +112613,8 @@ }, { "__Checksum": { - "Data1": 5062104187104131173, - "Data2": -8795300153436741217, - "Data3": 451034179702845683, - "Data4": 3650967356321586809 + "Data1": 2106638746666597342, + "Data2": 272801441082481264 }, "Flags": 0, "Kind": 0, @@ -115542,10 +112696,8 @@ }, { "__Checksum": { - "Data1": 1530161073001790496, - "Data2": -5877368021738694583, - "Data3": 3972173025747579922, - "Data4": -7189495401382591600 + "Data1": 5941886177172801447, + "Data2": 5079935389310916601 }, "Flags": 0, "Kind": 0, @@ -115620,10 +112772,8 @@ }, { "__Checksum": { - "Data1": -6106564977228241165, - "Data2": -5908438207033260072, - "Data3": -8975505673110761240, - "Data4": -6069077260973169172 + "Data1": 4663358846088898232, + "Data2": -8322956532853940559 }, "Flags": 0, "Kind": 0, @@ -115676,10 +112826,8 @@ }, { "__Checksum": { - "Data1": 8328873668574223917, - "Data2": 8854336518655205758, - "Data3": 2135771141288515587, - "Data4": 6408732645109712533 + "Data1": -8983867347038642950, + "Data2": -8844570692471095199 }, "Flags": 0, "Kind": 0, @@ -115856,10 +113004,8 @@ }, { "__Checksum": { - "Data1": -5447120628363132284, - "Data2": 6728299460237991061, - "Data3": 4882169995242226149, - "Data4": 2282753838878784018 + "Data1": -2012280253193176647, + "Data2": 1958874019535393768 }, "Flags": 0, "Kind": 0, @@ -115998,10 +113144,8 @@ }, { "__Checksum": { - "Data1": -5584662352397153921, - "Data2": -7820868501842816366, - "Data3": -2605385350847544524, - "Data4": 92898407967175674 + "Data1": -3441263047186260277, + "Data2": -5265297538272309623 }, "Flags": 0, "Kind": 0, @@ -116031,10 +113175,8 @@ }, { "__Checksum": { - "Data1": 6795807472080942879, - "Data2": 7353330522909965776, - "Data3": -6897966846198870771, - "Data4": 3903198775246906792 + "Data1": 1413947333345784446, + "Data2": -7726177148181415439 }, "Flags": 0, "Kind": 0, @@ -116124,10 +113266,8 @@ }, { "__Checksum": { - "Data1": -6457639101544789409, - "Data2": 8178770962198407090, - "Data3": -3859807439425541677, - "Data4": 6388681479585416396 + "Data1": -8123171144021859602, + "Data2": 7322991622991879282 }, "Flags": 0, "Kind": 0, @@ -116157,10 +113297,8 @@ }, { "__Checksum": { - "Data1": 5137921716318505582, - "Data2": 4681991371449230287, - "Data3": 1219558203173692897, - "Data4": -8146483497155959984 + "Data1": -1468550122356787881, + "Data2": -8754036630695064334 }, "Flags": 0, "Kind": 0, @@ -116388,10 +113526,8 @@ }, { "__Checksum": { - "Data1": -5778700698314740595, - "Data2": -2870130208536267173, - "Data3": 2241062030640312334, - "Data4": 377417914648766999 + "Data1": -864192222484151908, + "Data2": 4502425529420487836 }, "Flags": 0, "Kind": 0, @@ -116421,10 +113557,8 @@ }, { "__Checksum": { - "Data1": -6298109744246260071, - "Data2": -2261668864149351459, - "Data3": -7830157629620933633, - "Data4": -8101600569275599001 + "Data1": -8904320069032996192, + "Data2": -949846640504522142 }, "Flags": 0, "Kind": 0, @@ -116540,10 +113674,8 @@ }, { "__Checksum": { - "Data1": -3048583527832300350, - "Data2": -6224419332143389380, - "Data3": -3120041803618495457, - "Data4": -5381780661270562807 + "Data1": 5098624072292885845, + "Data2": 8291854839696608401 }, "Flags": 0, "Kind": 0, @@ -116590,10 +113722,8 @@ }, { "__Checksum": { - "Data1": 5642429249913841937, - "Data2": 6923955049922167242, - "Data3": 2883301843794737539, - "Data4": 8094119822474435167 + "Data1": -3793602372205339495, + "Data2": -747429432928170016 }, "Flags": 0, "Kind": 0, @@ -116640,10 +113770,8 @@ }, { "__Checksum": { - "Data1": -7089614135904488812, - "Data2": 5107105294574846332, - "Data3": -5837065225554326911, - "Data4": 7920301082054731352 + "Data1": -7807069510841702595, + "Data2": 8569425220971357576 }, "Flags": 0, "Kind": 0, @@ -116694,10 +113822,8 @@ }, { "__Checksum": { - "Data1": -5012293591249068615, - "Data2": 7031033410375209441, - "Data3": 2984667442970190223, - "Data4": -6084047600243863729 + "Data1": -4780304835206555856, + "Data2": -8526324981007749982 }, "Flags": 0, "Kind": 0, @@ -116897,10 +114023,8 @@ }, { "__Checksum": { - "Data1": 8064810988815604843, - "Data2": 4643088454583255938, - "Data3": -78346063039213504, - "Data4": -3185633822544628248 + "Data1": 1160154608327062426, + "Data2": 8399145065308774311 }, "Flags": 0, "Kind": 0, @@ -116961,10 +114085,8 @@ }, { "__Checksum": { - "Data1": -2209355770950460113, - "Data2": -5836941623286799961, - "Data3": -2302226869165818837, - "Data4": 6345775989810875745 + "Data1": -7740276602472224318, + "Data2": 5661550493955715454 }, "Flags": 0, "Kind": 0, @@ -116994,10 +114116,8 @@ }, { "__Checksum": { - "Data1": 1699425413727969854, - "Data2": 2331723063379149155, - "Data3": 1541886615703496656, - "Data4": -3203936253997015076 + "Data1": -6121661254746420042, + "Data2": 624731233111375015 }, "Flags": 0, "Kind": 0, @@ -117063,10 +114183,8 @@ }, { "__Checksum": { - "Data1": 8736552409577208190, - "Data2": -5619026453828225626, - "Data3": 4303412102615885316, - "Data4": 6114072779949951740 + "Data1": 4709380777075162312, + "Data2": -8306617838258942528 }, "Flags": 0, "Kind": 0, @@ -117141,10 +114259,8 @@ }, { "__Checksum": { - "Data1": 4299724152889836709, - "Data2": -4491967922558062987, - "Data3": 6147862000317319793, - "Data4": -7327437657093174827 + "Data1": 6730868378332850112, + "Data2": 4878255397310468269 }, "Flags": 0, "Kind": 0, @@ -117205,10 +114321,8 @@ }, { "__Checksum": { - "Data1": 2931727481321269281, - "Data2": -1316745861182688024, - "Data3": 4376759017804918503, - "Data4": 9219562952932079561 + "Data1": -3060618097975408959, + "Data2": -8892802631197220127 }, "Flags": 0, "Kind": 0, @@ -117248,10 +114362,8 @@ }, { "__Checksum": { - "Data1": 8766188874124121040, - "Data2": 627069210454559785, - "Data3": -3838937926181812512, - "Data4": -8230511217925169377 + "Data1": -1311905515647135398, + "Data2": 6734927178514718025 }, "Flags": 0, "Kind": 0, @@ -117520,10 +114632,8 @@ }, { "__Checksum": { - "Data1": -4365537405190566603, - "Data2": -7879565500719249568, - "Data3": 1161715400166556211, - "Data4": 838829922320283339 + "Data1": -9009257896966127546, + "Data2": -99871989684879940 }, "Flags": 0, "Kind": 0, @@ -117553,10 +114663,8 @@ }, { "__Checksum": { - "Data1": 8232264008382940168, - "Data2": -8037525786169312231, - "Data3": -6385564947761523562, - "Data4": 3759939311253855306 + "Data1": -6425952106250738534, + "Data2": 1850929424732129588 }, "Flags": 0, "Kind": 0, @@ -117596,10 +114704,8 @@ }, { "__Checksum": { - "Data1": 2968156160959977270, - "Data2": 5554106022564694432, - "Data3": 1739439397631014854, - "Data4": -9180406499211740684 + "Data1": 13252434110022135, + "Data2": -5845351103418393012 }, "Flags": 0, "Kind": 0, @@ -117667,10 +114773,8 @@ }, { "__Checksum": { - "Data1": 4218836103673510765, - "Data2": 2667858072929447816, - "Data3": -7437066797167442356, - "Data4": -3793767818753248346 + "Data1": -1550997411757849220, + "Data2": 6829768655090812731 }, "Flags": 0, "Kind": 0, @@ -117731,10 +114835,8 @@ }, { "__Checksum": { - "Data1": -5459023038693007884, - "Data2": 4142928740221107821, - "Data3": -6843387052645904813, - "Data4": -4452056164835692795 + "Data1": -3455940090358340802, + "Data2": -1884496582898305619 }, "Flags": 0, "Kind": 0, @@ -117816,10 +114918,8 @@ }, { "__Checksum": { - "Data1": -3230766500660718569, - "Data2": -6502681512389429634, - "Data3": -8448638626515578619, - "Data4": -2650885118283648719 + "Data1": 4496574427890705107, + "Data2": -4098505461037654875 }, "Flags": 0, "Kind": 0, @@ -117901,10 +115001,8 @@ }, { "__Checksum": { - "Data1": 5635852167976713920, - "Data2": 7499582926547104648, - "Data3": 2457619188072854522, - "Data4": 1174562651753624938 + "Data1": 975688223303109857, + "Data2": 6353782408269722950 }, "Flags": 0, "Kind": 0, @@ -117986,10 +115084,8 @@ }, { "__Checksum": { - "Data1": -4685041892922343494, - "Data2": -4334997098408910047, - "Data3": 8080907989605799275, - "Data4": -3978572607433536725 + "Data1": 6869913045050106137, + "Data2": -4718037547805258324 }, "Flags": 0, "Kind": 0, @@ -118030,10 +115126,8 @@ }, { "__Checksum": { - "Data1": -409225161597850758, - "Data2": -294457814727412873, - "Data3": -7782151053887331499, - "Data4": -6349134533640608086 + "Data1": -3186193861212947828, + "Data2": 8649787658184961408 }, "Flags": 0, "Kind": 0, @@ -118129,10 +115223,8 @@ }, { "__Checksum": { - "Data1": -2079027868331407182, - "Data2": -3806206923606314833, - "Data3": 6606403922797220339, - "Data4": 7596422237811733832 + "Data1": 369013821653809936, + "Data2": -2804251934436590903 }, "Flags": 0, "Kind": 0, @@ -118191,10 +115283,8 @@ }, { "__Checksum": { - "Data1": -8448322551484894386, - "Data2": 8996027154787386027, - "Data3": 2703832059296828143, - "Data4": -1157929281965437421 + "Data1": -3110028479311907236, + "Data2": 3352789149250437900 }, "Flags": 0, "Kind": 0, @@ -118297,10 +115387,8 @@ }, { "__Checksum": { - "Data1": 3597079530790671126, - "Data2": 7461581902378742052, - "Data3": -8833595339016638343, - "Data4": -5342929668139782980 + "Data1": -9149368414676586086, + "Data2": -737623075502963652 }, "Flags": 0, "Kind": 0, @@ -118361,10 +115449,8 @@ }, { "__Checksum": { - "Data1": -7416239566172023337, - "Data2": -4366028626070558781, - "Data3": -9133928881812975944, - "Data4": -2271494172642454037 + "Data1": 3013335858624810736, + "Data2": -885827294633566083 }, "Flags": 0, "Kind": 0, @@ -118394,10 +115480,8 @@ }, { "__Checksum": { - "Data1": 5436027853584480440, - "Data2": -37446193167327252, - "Data3": -1151745076245191782, - "Data4": -5806528204367026139 + "Data1": 2989751054813764084, + "Data2": 1240564091620435034 }, "Flags": 0, "Kind": 0, @@ -118500,10 +115584,8 @@ }, { "__Checksum": { - "Data1": -7898135630577757296, - "Data2": 3656092035358294355, - "Data3": -8996772969138593871, - "Data4": -2616591144672475331 + "Data1": -6673551323133927617, + "Data2": -3946773847184227632 }, "Flags": 0, "Kind": 0, @@ -118620,10 +115702,8 @@ }, { "__Checksum": { - "Data1": 8203978587540130899, - "Data2": -2012143760799064851, - "Data3": 4167841631827165812, - "Data4": -2059583623209241514 + "Data1": 6480626343392016440, + "Data2": 2182351871441628272 }, "Flags": 0, "Kind": 0, @@ -118677,10 +115757,8 @@ }, { "__Checksum": { - "Data1": 3363932405638797825, - "Data2": -6866605313355280320, - "Data3": -4592479383367325089, - "Data4": 243941118758191213 + "Data1": -7979700322486260865, + "Data2": 7610096118506833762 }, "Flags": 0, "Kind": 0, @@ -118832,10 +115910,8 @@ }, { "__Checksum": { - "Data1": -4018380796586772543, - "Data2": -8676685934027056194, - "Data3": -6855850005915423241, - "Data4": -3297871848626571284 + "Data1": -7229338186227089788, + "Data2": -1877477598021931191 }, "Flags": 0, "Kind": 0, @@ -118868,10 +115944,8 @@ }, { "__Checksum": { - "Data1": -2593661893135345786, - "Data2": -8983910900365205913, - "Data3": -5611006088400710545, - "Data4": -392084349930403933 + "Data1": 7699415110765569464, + "Data2": -8689998884511732111 }, "Flags": 0, "Kind": 0, @@ -118918,10 +115992,8 @@ }, { "__Checksum": { - "Data1": 6515208736822387287, - "Data2": -3674384844891812938, - "Data3": -7146402073852253801, - "Data4": 6343400083057715576 + "Data1": -2155878342007342885, + "Data2": -6328439189792520369 }, "Flags": 0, "Kind": 0, @@ -119343,10 +116415,8 @@ }, { "__Checksum": { - "Data1": 4986490317653419830, - "Data2": 2250255512320766964, - "Data3": 8012062806858945326, - "Data4": 6110904602635364045 + "Data1": 9093853207185171151, + "Data2": 3911195839584516870 }, "Flags": 0, "Kind": 0, @@ -119400,10 +116470,8 @@ }, { "__Checksum": { - "Data1": -4080649397932869869, - "Data2": 1629845634081343658, - "Data3": -931241299736232743, - "Data4": 3638218319256599959 + "Data1": -8496393713162508811, + "Data2": -9064060447332687507 }, "Flags": 0, "Kind": 0, @@ -119433,10 +116501,8 @@ }, { "__Checksum": { - "Data1": -6447667631626323023, - "Data2": -3263822769063457854, - "Data3": 8678359667003393613, - "Data4": -4825203981023736827 + "Data1": 5507392672671005946, + "Data2": -6238541853053818667 }, "Flags": 0, "Kind": 0, @@ -119490,10 +116556,8 @@ }, { "__Checksum": { - "Data1": -242015595585633326, - "Data2": -2532300957164262375, - "Data3": -3514897683293691148, - "Data4": -3539728788856638654 + "Data1": 934112524818245199, + "Data2": 6542349219511530770 }, "Flags": 0, "Kind": 0, @@ -119623,10 +116687,8 @@ }, { "__Checksum": { - "Data1": 899611867512171029, - "Data2": -4624455793943328734, - "Data3": -4599231691053010503, - "Data4": 5437267939745043305 + "Data1": 4947677443777259982, + "Data2": -4660880963465443385 }, "Flags": 0, "Kind": 0, @@ -119876,10 +116938,8 @@ }, { "__Checksum": { - "Data1": 7607371200409316380, - "Data2": -1982877730029834540, - "Data3": 2543082963532543234, - "Data4": -3555654353783282878 + "Data1": 1745079712341516657, + "Data2": -4093051416579956717 }, "Flags": 0, "Kind": 0, @@ -120043,10 +117103,8 @@ }, { "__Checksum": { - "Data1": -6355300002215573867, - "Data2": -6642336288920031988, - "Data3": -3657973082851724745, - "Data4": 4441794052828166876 + "Data1": 3129768229267066077, + "Data2": 924560137200339381 }, "Flags": 0, "Kind": 0, @@ -120105,10 +117163,8 @@ }, { "__Checksum": { - "Data1": -324189471634839130, - "Data2": 738178334139613873, - "Data3": -6389383441018566133, - "Data4": -5937007066233305660 + "Data1": 6734094071198535542, + "Data2": 7496699552196806760 }, "Flags": 0, "Kind": 0, @@ -120183,10 +117239,8 @@ }, { "__Checksum": { - "Data1": 6579290909815276098, - "Data2": -5786764862408862989, - "Data3": -223974500070862109, - "Data4": -8024705581969120173 + "Data1": 7598052764613469356, + "Data2": 7607451950169735931 }, "Flags": 0, "Kind": 0, @@ -120282,10 +117336,8 @@ }, { "__Checksum": { - "Data1": -8867534807447642614, - "Data2": -4282795529733840161, - "Data3": -4635615492145646672, - "Data4": -8195911472830248096 + "Data1": -7260797332835781380, + "Data2": -9221274584805839195 }, "Flags": 0, "Kind": 0, @@ -120315,10 +117367,8 @@ }, { "__Checksum": { - "Data1": 2055651399922282634, - "Data2": -6814724332078412608, - "Data3": -4455488790470296996, - "Data4": -1886259397078689711 + "Data1": -6608873196057053161, + "Data2": -2389098358862496266 }, "Flags": 0, "Kind": 0, @@ -120365,10 +117415,8 @@ }, { "__Checksum": { - "Data1": -783575063737605723, - "Data2": -4737122988413836642, - "Data3": -7391718704589048748, - "Data4": 7312971484644794326 + "Data1": -7475996256863006568, + "Data2": -7082523870322255979 }, "Flags": 0, "Kind": 0, @@ -120398,10 +117446,8 @@ }, { "__Checksum": { - "Data1": -8423331370337892124, - "Data2": 8607476731006155165, - "Data3": 7825986663753835046, - "Data4": -1326133542033694308 + "Data1": 1774779962166010577, + "Data2": 2943637722827542163 }, "Flags": 0, "Kind": 0, @@ -120677,10 +117723,8 @@ }, { "__Checksum": { - "Data1": -2268799541887309103, - "Data2": -668615304369281891, - "Data3": 7988170111111088687, - "Data4": -5765829378452645265 + "Data1": 3311294867888907380, + "Data2": 5753410381025474119 }, "Flags": 0, "Kind": 0, @@ -120797,10 +117841,8 @@ }, { "__Checksum": { - "Data1": 4616720039763893687, - "Data2": 5808876632879653911, - "Data3": -1065888359537067629, - "Data4": -2435685151728620991 + "Data1": 3434243883024616255, + "Data2": 1941200980358305574 }, "Flags": 0, "Kind": 0, @@ -120847,10 +117889,8 @@ }, { "__Checksum": { - "Data1": -3397824799546625955, - "Data2": 95453516525334837, - "Data3": -3260615537290027463, - "Data4": 7111788007408675375 + "Data1": -1928269758607805083, + "Data2": 8649736962830360354 }, "Flags": 0, "Kind": 0, @@ -120873,10 +117913,8 @@ }, { "__Checksum": { - "Data1": 4837051917780599729, - "Data2": 5053165941570701999, - "Data3": 6003586571519475842, - "Data4": -6761062790223405511 + "Data1": 2939576670624860802, + "Data2": 751196928023784388 }, "Flags": 0, "Kind": 0, @@ -121035,10 +118073,8 @@ }, { "__Checksum": { - "Data1": -2825625751485158550, - "Data2": -8951478464814054242, - "Data3": 5360712111422486356, - "Data4": -6823174351154519447 + "Data1": -1060423751967728383, + "Data2": -7676984597372165546 }, "Flags": 0, "Kind": 0, @@ -121260,10 +118296,8 @@ }, { "__Checksum": { - "Data1": 5304550624403384242, - "Data2": -5757024202355786823, - "Data3": 8643042856019946064, - "Data4": -5078077064770076685 + "Data1": 2744842580325011296, + "Data2": -6385516755127263655 }, "Flags": 0, "Kind": 0, @@ -121310,10 +118344,8 @@ }, { "__Checksum": { - "Data1": 8813118713798802730, - "Data2": 3111421505567381794, - "Data3": 7308009671379773460, - "Data4": 4615501719801401025 + "Data1": -1590444281766377840, + "Data2": 6247239611866780678 }, "Flags": 0, "Kind": 0, @@ -121434,10 +118466,8 @@ }, { "__Checksum": { - "Data1": 3654898954294160951, - "Data2": 2266405322193606728, - "Data3": 5400563069777141128, - "Data4": -7562869689290775340 + "Data1": 6857269024888280636, + "Data2": 6416585809422941284 }, "Flags": 0, "Kind": 0, @@ -121497,10 +118527,8 @@ }, { "__Checksum": { - "Data1": -5811167680428264316, - "Data2": 105144032448403338, - "Data3": 8530035611792725563, - "Data4": 4044134331271406771 + "Data1": -844307179274196398, + "Data2": -1366127723790698936 }, "Flags": 0, "Kind": 0, @@ -121546,10 +118574,8 @@ }, { "__Checksum": { - "Data1": -2457555725703393757, - "Data2": -447044426694863885, - "Data3": 5963770687743965827, - "Data4": 3526880835431422118 + "Data1": -7022765591269317462, + "Data2": -791593752699799468 }, "Flags": 0, "Kind": 0, @@ -121596,10 +118622,8 @@ }, { "__Checksum": { - "Data1": -8318092702215005576, - "Data2": 1166975836627013422, - "Data3": 1977761050442325733, - "Data4": 2068834247930104095 + "Data1": -2269077176507420016, + "Data2": -3721622384290320083 }, "Flags": 0, "Kind": 0, @@ -121646,10 +118670,8 @@ }, { "__Checksum": { - "Data1": 1044222473754506773, - "Data2": -2098635606892015939, - "Data3": -2228805133736317010, - "Data4": -2225408200399055669 + "Data1": -353313248048889768, + "Data2": 3774879919170962800 }, "Flags": 0, "Kind": 0, @@ -121700,10 +118722,8 @@ }, { "__Checksum": { - "Data1": 8298292010862954195, - "Data2": -6452131929705822801, - "Data3": -7134566091987459954, - "Data4": 166022515573277994 + "Data1": 4899442396854783979, + "Data2": -2682317158340921019 }, "Flags": 0, "Kind": 0, @@ -122019,10 +119039,8 @@ }, { "__Checksum": { - "Data1": 1415513549608202619, - "Data2": 7262354241668650742, - "Data3": -2387423681060068224, - "Data4": 5904739011134664302 + "Data1": -3632761981123121688, + "Data2": 8482639729461251251 }, "Flags": 0, "Kind": 0, @@ -122075,10 +119093,8 @@ }, { "__Checksum": { - "Data1": 1751940906615724931, - "Data2": -1575919742726299120, - "Data3": -7215653635185667453, - "Data4": -5735568122911297362 + "Data1": 6897285493576536306, + "Data2": 4696277682246522020 }, "Flags": 0, "Kind": 0, @@ -122146,10 +119162,8 @@ }, { "__Checksum": { - "Data1": 8653035414084213231, - "Data2": 2564212518522508993, - "Data3": -8280918236984447019, - "Data4": 3019511755706696719 + "Data1": -2586835754383711651, + "Data2": -4331514645808111828 }, "Flags": 0, "Kind": 0, @@ -122210,10 +119224,8 @@ }, { "__Checksum": { - "Data1": -533026722483522440, - "Data2": -3446999082842381959, - "Data3": -5078937376413946249, - "Data4": -97901690154634529 + "Data1": -1352139647443244513, + "Data2": -69728816474676460 }, "Flags": 0, "Kind": 0, @@ -122243,10 +119255,8 @@ }, { "__Checksum": { - "Data1": -8722134114817660871, - "Data2": 285160686329281860, - "Data3": -7628888178379054062, - "Data4": 4893392558521626434 + "Data1": 843743695953646097, + "Data2": 1636114930259390314 }, "Flags": 0, "Kind": 0, @@ -122269,10 +119279,8 @@ }, { "__Checksum": { - "Data1": 7645732095941153921, - "Data2": 2006043116496783748, - "Data3": 2721434041488755974, - "Data4": 1502512813668324742 + "Data1": -513863136095933147, + "Data2": 8159335768562144703 }, "Flags": 0, "Kind": 0, @@ -122319,10 +119327,8 @@ }, { "__Checksum": { - "Data1": -7751980444337371959, - "Data2": -3713363541770772082, - "Data3": 594873897184726572, - "Data4": 8205274252771473662 + "Data1": 5392373859184093239, + "Data2": 1696309909253248399 }, "Flags": 0, "Kind": 0, @@ -122442,10 +119448,8 @@ }, { "__Checksum": { - "Data1": -5062145086580971867, - "Data2": 3573305267323117294, - "Data3": 5814973781924060755, - "Data4": 9061574805665332737 + "Data1": -426994266524495156, + "Data2": -3800377045937866074 }, "Flags": 0, "Kind": 0, @@ -122475,10 +119479,8 @@ }, { "__Checksum": { - "Data1": -7900887348794687944, - "Data2": 788033211890135901, - "Data3": -1216783503851981722, - "Data4": -6598905042096115950 + "Data1": -5476364044272624689, + "Data2": -3793498162127638816 }, "Flags": 0, "Kind": 0, @@ -122631,10 +119633,8 @@ }, { "__Checksum": { - "Data1": -2211402915968872075, - "Data2": 9177012329480712191, - "Data3": 7101138547889236056, - "Data4": -7735821796682113947 + "Data1": -3163945886231246380, + "Data2": 6395296317227663044 }, "Flags": 0, "Kind": 0, @@ -122674,10 +119674,8 @@ }, { "__Checksum": { - "Data1": 8320071705980551447, - "Data2": -7621089228921924262, - "Data3": -7700818432625085674, - "Data4": -3414160519774345262 + "Data1": -1871924007324541164, + "Data2": -1058408952784275229 }, "Flags": 0, "Kind": 0, @@ -122891,10 +119889,8 @@ }, { "__Checksum": { - "Data1": 7722441086628972197, - "Data2": -5198533887374622813, - "Data3": -1943087658807053691, - "Data4": 5730006104632739246 + "Data1": -1451538971183231217, + "Data2": 6124826854861157010 }, "Flags": 0, "Kind": 0, @@ -123015,10 +120011,8 @@ }, { "__Checksum": { - "Data1": 5849421804075993773, - "Data2": -8183795674294729798, - "Data3": 1848242679840987201, - "Data4": 2663817720859527035 + "Data1": 7181767607730492214, + "Data2": -3088411739039462736 }, "Flags": 0, "Kind": 0, @@ -123076,10 +120070,8 @@ }, { "__Checksum": { - "Data1": 6382833008399476322, - "Data2": -8864929838010984255, - "Data3": 896442390122040549, - "Data4": 6814683429554919848 + "Data1": -5497580604680870128, + "Data2": -1909961576670929017 }, "Flags": 0, "Kind": 0, @@ -123206,10 +120198,8 @@ }, { "__Checksum": { - "Data1": -659093531722590187, - "Data2": 571484743044840002, - "Data3": 6293539017400838968, - "Data4": -637889721123008118 + "Data1": -3067056154658687826, + "Data2": 1721562915420270291 }, "Flags": 0, "Kind": 0, @@ -123258,10 +120248,8 @@ }, { "__Checksum": { - "Data1": 7657536613150264983, - "Data2": 1722152589363101495, - "Data3": 1704810975300284583, - "Data4": -4200602275821037557 + "Data1": 2891336507616117781, + "Data2": 3479209432438949737 }, "Flags": 0, "Kind": 0, @@ -123747,10 +120735,8 @@ }, { "__Checksum": { - "Data1": -5973867561462067939, - "Data2": -3117031851406302616, - "Data3": -341758834662112457, - "Data4": -6428390271876756620 + "Data1": 9169364826070594807, + "Data2": 889963421963101145 }, "Flags": 0, "Kind": 0, @@ -123849,10 +120835,8 @@ }, { "__Checksum": { - "Data1": -1991820770455400224, - "Data2": 1693373578302751869, - "Data3": -360825897901459990, - "Data4": -5149907753256862086 + "Data1": 4202298415526745367, + "Data2": 1477804035336377432 }, "Flags": 0, "Kind": 0, @@ -123904,10 +120888,8 @@ }, { "__Checksum": { - "Data1": 4536774483273600626, - "Data2": 963298915559212004, - "Data3": 2698677160200197787, - "Data4": -2522570048806138539 + "Data1": 8088349884937812382, + "Data2": -7462285816645188046 }, "Flags": 0, "Kind": 0, @@ -123979,10 +120961,8 @@ }, { "__Checksum": { - "Data1": -2503889042138534596, - "Data2": 5944672697998675577, - "Data3": -5953846837666489517, - "Data4": 967772668312038300 + "Data1": -923404022241533958, + "Data2": 4050550153902639182 }, "Flags": 0, "Kind": 0, @@ -124021,10 +121001,8 @@ }, { "__Checksum": { - "Data1": 6090551099408577597, - "Data2": 3891428188037487008, - "Data3": -5935797078672788554, - "Data4": 6668626974297504927 + "Data1": -3178774400958581986, + "Data2": 484145839025009376 }, "Flags": 0, "Kind": 0, @@ -124232,10 +121210,8 @@ }, { "__Checksum": { - "Data1": 986217379012934747, - "Data2": 4934076972075350013, - "Data3": -7927241970112712210, - "Data4": 828025559258905323 + "Data1": 6590126873475903708, + "Data2": 5920759079050954143 }, "Flags": 0, "Kind": 0, @@ -124268,10 +121244,8 @@ }, { "__Checksum": { - "Data1": 6647718174025966504, - "Data2": -6858173052259829391, - "Data3": 5191654462711583706, - "Data4": -5507238455884311850 + "Data1": 4927999799334504861, + "Data2": 2014498193810702946 }, "Flags": 0, "Kind": 0, @@ -124353,10 +121327,8 @@ }, { "__Checksum": { - "Data1": -4778680818360411598, - "Data2": 7583490790619290561, - "Data3": -1256793052882205749, - "Data4": 6563475770423382561 + "Data1": -1957651689492920886, + "Data2": 6564484724898317732 }, "Flags": 0, "Kind": 0, @@ -124390,10 +121362,8 @@ }, { "__Checksum": { - "Data1": -4944959893693472243, - "Data2": 8606253676449854177, - "Data3": 7027768814830126563, - "Data4": -2974676248973212066 + "Data1": 2907695594486775183, + "Data2": 7663470950256857599 }, "Flags": 0, "Kind": 0, @@ -124556,10 +121526,8 @@ }, { "__Checksum": { - "Data1": -1941626977083685035, - "Data2": -3966489185182592270, - "Data3": 7334571819713464294, - "Data4": 3603053544690182891 + "Data1": -7654089768008283733, + "Data2": -5985713407099371580 }, "Flags": 0, "Kind": 0, @@ -124624,10 +121592,8 @@ }, { "__Checksum": { - "Data1": 6005745375154449827, - "Data2": 3912718425664221739, - "Data3": -3179418185571089274, - "Data4": -2530797752364063199 + "Data1": -3106187743852661898, + "Data2": -1650092648248609538 }, "Flags": 0, "Kind": 0, @@ -124674,10 +121640,8 @@ }, { "__Checksum": { - "Data1": 525919373611745134, - "Data2": 2570870106687064583, - "Data3": -70329411796643411, - "Data4": 974073049878858269 + "Data1": 2965799670765488966, + "Data2": -3121358626247262196 }, "Flags": 0, "Kind": 0, @@ -124716,10 +121680,8 @@ }, { "__Checksum": { - "Data1": -1841187464556117518, - "Data2": 4064203487530938593, - "Data3": -69088997189265799, - "Data4": 7027451419955023129 + "Data1": -4222333357259271403, + "Data2": 1154581422269512988 }, "Flags": 0, "Kind": 0, @@ -124758,10 +121720,8 @@ }, { "__Checksum": { - "Data1": -3336685128183816073, - "Data2": 5177296417080891816, - "Data3": 2529517154045766195, - "Data4": -4889761765920485026 + "Data1": 2589487112133034240, + "Data2": -3267973929636399844 }, "Flags": 0, "Kind": 0, @@ -125139,10 +122099,8 @@ }, { "__Checksum": { - "Data1": -2208015513117142479, - "Data2": 8309379313477476810, - "Data3": 6767646123711685240, - "Data4": 7365054710633764131 + "Data1": 8280796860566111118, + "Data2": 8911350829329286611 }, "Flags": 5, "Kind": 5, @@ -125250,10 +122208,8 @@ }, { "__Checksum": { - "Data1": -4000033812635003167, - "Data2": -5950730445079187117, - "Data3": 4440922502184172901, - "Data4": 5202116158425997210 + "Data1": -5423395916693287393, + "Data2": -223906786504769138 }, "Flags": 5, "Kind": 5, @@ -125397,10 +122353,8 @@ }, { "__Checksum": { - "Data1": 3153007695218557304, - "Data2": 3922371191413434175, - "Data3": -5537468964553353012, - "Data4": 7390546894408728063 + "Data1": -8512531860322756466, + "Data2": 565535160638094242 }, "Flags": 5, "Kind": 5, @@ -125544,10 +122498,8 @@ }, { "__Checksum": { - "Data1": -7754745902619689175, - "Data2": -5134359080145857084, - "Data3": 4993529276979856248, - "Data4": -67383822311107497 + "Data1": -695186701189546795, + "Data2": 1713334652791315187 }, "Flags": 5, "Kind": 5, @@ -125704,10 +122656,8 @@ }, { "__Checksum": { - "Data1": 2568796741216897321, - "Data2": 1413523657933050761, - "Data3": 4759835387453048916, - "Data4": -7623413400349879011 + "Data1": -2189233830613740028, + "Data2": -3210546244466637264 }, "Flags": 5, "Kind": 5, @@ -125864,10 +122814,8 @@ }, { "__Checksum": { - "Data1": -3922423643600660840, - "Data2": 1861113121450198758, - "Data3": 4114726168194688327, - "Data4": -1128320206279884167 + "Data1": 4034581693026318237, + "Data2": 7175828996455085219 }, "Flags": 5, "Kind": 5, @@ -126024,10 +122972,8 @@ }, { "__Checksum": { - "Data1": -8775714726872022466, - "Data2": -545438209170010572, - "Data3": 6142391857546000887, - "Data4": 1982926167796330405 + "Data1": 132277126486428129, + "Data2": 406818806483413659 }, "Flags": 5, "Kind": 5, @@ -126184,10 +123130,8 @@ }, { "__Checksum": { - "Data1": 3050284125002467956, - "Data2": -8270852016883610587, - "Data3": 2582721202430644873, - "Data4": 1154486349124859276 + "Data1": -4699857774662552742, + "Data2": -7782941452454115360 }, "Flags": 5, "Kind": 5, @@ -126345,10 +123289,8 @@ }, { "__Checksum": { - "Data1": 4616190305368319910, - "Data2": 7447413165979947456, - "Data3": 1857369996590421839, - "Data4": 2325536753523476745 + "Data1": 3197114350085129281, + "Data2": 7535234814492069881 }, "Flags": 5, "Kind": 5, @@ -126506,10 +123448,8 @@ }, { "__Checksum": { - "Data1": 753566246165150567, - "Data2": -1484971089153632929, - "Data3": 753675216011997655, - "Data4": -2481015609383310033 + "Data1": 8552959263236561234, + "Data2": -963794937922758715 }, "Flags": 5, "Kind": 5, @@ -126667,10 +123607,8 @@ }, { "__Checksum": { - "Data1": 5982967440196202155, - "Data2": 8048742928898031017, - "Data3": 3737927635774825099, - "Data4": 7444377561005614462 + "Data1": 250683712170732012, + "Data2": 4608469616229978738 }, "Flags": 5, "Kind": 5, @@ -126828,10 +123766,8 @@ }, { "__Checksum": { - "Data1": -4423926610981284417, - "Data2": 6070813422952678817, - "Data3": 5467455227064425451, - "Data4": 5966057608582521435 + "Data1": 7943515544967438626, + "Data2": -6614915983299440337 }, "Flags": 5, "Kind": 5, @@ -126989,10 +123925,8 @@ }, { "__Checksum": { - "Data1": -8455680585630668266, - "Data2": -5249960128181441430, - "Data3": 6686758106941912323, - "Data4": -4808107875424454964 + "Data1": -3202898848456684823, + "Data2": 4441546661251474949 }, "Flags": 5, "Kind": 5, @@ -127150,10 +124084,8 @@ }, { "__Checksum": { - "Data1": 1424482053211315178, - "Data2": -3480568651311473287, - "Data3": -7888922457280522718, - "Data4": 7819848324246668642 + "Data1": 426207939972881254, + "Data2": 2278015698032139590 }, "Flags": 5, "Kind": 5, @@ -127311,10 +124243,8 @@ }, { "__Checksum": { - "Data1": -180827266690848425, - "Data2": 3093966056846658133, - "Data3": 5306032406616840726, - "Data4": 5925582501092149126 + "Data1": -4716617646748604688, + "Data2": 5078365839479461446 }, "Flags": 5, "Kind": 5, @@ -127472,10 +124402,8 @@ }, { "__Checksum": { - "Data1": 287945293919679924, - "Data2": -1848234636503790991, - "Data3": -6742909762419937277, - "Data4": -8593746758049323671 + "Data1": -3171029615981592633, + "Data2": -4873245902345257556 }, "Flags": 5, "Kind": 5, @@ -127619,10 +124547,8 @@ }, { "__Checksum": { - "Data1": -1370681849317955160, - "Data2": 5025759780459838645, - "Data3": 4532678055048649905, - "Data4": 3128789849970658225 + "Data1": 5266921814875941134, + "Data2": -1723987889949832252 }, "Flags": 5, "Kind": 5, @@ -127766,10 +124692,8 @@ }, { "__Checksum": { - "Data1": -8191073887387216009, - "Data2": -8252242229914814577, - "Data3": 407251635243716010, - "Data4": 4991382464013523462 + "Data1": 186676241108503817, + "Data2": 3535809253543099556 }, "Flags": 1, "Kind": 5, @@ -127867,10 +124791,8 @@ }, { "__Checksum": { - "Data1": -6692162820499350808, - "Data2": -7974253486706706353, - "Data3": -1873988677266008719, - "Data4": 6048255975166244398 + "Data1": -7368435224478696626, + "Data2": -8975450964490342878 }, "Flags": 3, "Kind": 5, @@ -127968,10 +124890,8 @@ }, { "__Checksum": { - "Data1": 970671822292712910, - "Data2": -1966831204505888063, - "Data3": -7724097183119675308, - "Data4": 5695577131580742068 + "Data1": -4611989471512184310, + "Data2": 2452883247346742866 }, "Flags": 1, "Kind": 5, @@ -128069,10 +124989,8 @@ }, { "__Checksum": { - "Data1": -8687713839042639128, - "Data2": 4209522885203462869, - "Data3": 6889413900290366404, - "Data4": -1911803412843107253 + "Data1": -7247637184667484428, + "Data2": 7214582437796182274 }, "Flags": 3, "Kind": 5, @@ -128170,10 +125088,8 @@ }, { "__Checksum": { - "Data1": 4901877077323870494, - "Data2": 3132105134707831167, - "Data3": 2930775666452184044, - "Data4": 1733629103907723867 + "Data1": 4869610556744405561, + "Data2": 7444860346095303511 }, "Flags": 1, "Kind": 5, @@ -128271,10 +125187,8 @@ }, { "__Checksum": { - "Data1": -5441527865553038936, - "Data2": 8249954223863785732, - "Data3": -1680070192287393176, - "Data4": 1021365094066695165 + "Data1": 3610714253495269450, + "Data2": 3832126896816967501 }, "Flags": 3, "Kind": 5, @@ -128372,10 +125286,8 @@ }, { "__Checksum": { - "Data1": 529336937853122963, - "Data2": -5974738061924800905, - "Data3": 8401592041848705634, - "Data4": -4810382036802378836 + "Data1": 4914381257188030878, + "Data2": -6776255457534492882 }, "Flags": 1, "Kind": 5, @@ -128473,10 +125385,8 @@ }, { "__Checksum": { - "Data1": 4684810500090083694, - "Data2": -4473915508101925580, - "Data3": 8372589347426950587, - "Data4": -7756037544956959828 + "Data1": 6220639181941488053, + "Data2": 4006370140578171650 }, "Flags": 3, "Kind": 5, @@ -128574,10 +125484,8 @@ }, { "__Checksum": { - "Data1": 4737033454769325478, - "Data2": -2090513954301140439, - "Data3": -807394041938419228, - "Data4": 3432233367385273942 + "Data1": 6765683905916178088, + "Data2": -6308010928379900817 }, "Flags": 1, "Kind": 5, @@ -128675,10 +125583,8 @@ }, { "__Checksum": { - "Data1": 8382635859535504499, - "Data2": -5824930526558211795, - "Data3": 8725434172378658978, - "Data4": -5907921743279659378 + "Data1": -969835745530965603, + "Data2": -2617888354289607659 }, "Flags": 3, "Kind": 5, @@ -128776,10 +125682,8 @@ }, { "__Checksum": { - "Data1": -5236124357581862597, - "Data2": 3855549514483631212, - "Data3": -8825105558650251111, - "Data4": 5893003190461767728 + "Data1": 7734030393075704645, + "Data2": -5559686494540786034 }, "Flags": 1, "Kind": 5, @@ -128877,10 +125781,8 @@ }, { "__Checksum": { - "Data1": 6874030420434042522, - "Data2": 3821059563686605518, - "Data3": -3336159978914356430, - "Data4": 7031972648351423414 + "Data1": 3140440923854350904, + "Data2": 5993610107683181528 }, "Flags": 3, "Kind": 5, @@ -128978,10 +125880,8 @@ }, { "__Checksum": { - "Data1": -5756319630115205171, - "Data2": 193597238803561630, - "Data3": 8100163357540844883, - "Data4": -7812478771628745792 + "Data1": -8836510472282925284, + "Data2": 277017648264922211 }, "Flags": 1, "Kind": 5, @@ -129079,10 +125979,8 @@ }, { "__Checksum": { - "Data1": -3636980096896999025, - "Data2": -2335904188467381676, - "Data3": 8229041675281148498, - "Data4": 1990870718024586924 + "Data1": -5315396747994042711, + "Data2": 6876462668790453058 }, "Flags": 3, "Kind": 5, @@ -129180,10 +126078,8 @@ }, { "__Checksum": { - "Data1": 3365048168811352164, - "Data2": -4682910616860045552, - "Data3": 6258815563934275762, - "Data4": 7821955903038087972 + "Data1": -2561068456446838585, + "Data2": -1233000796354258113 }, "Flags": 5, "Kind": 7, @@ -129221,10 +126117,8 @@ }, { "__Checksum": { - "Data1": 8189819797845902354, - "Data2": -6448299433261927894, - "Data3": 2916590341884141949, - "Data4": -8694328870348261197 + "Data1": -6824578604387854059, + "Data2": -7287926357947333959 }, "Flags": 5, "Kind": 6, diff --git a/src/Shared/files/Tooling/project.razor.json b/src/Shared/files/Tooling/project.razor.json index 13cab59afc4..a89e35c9d80 100644 --- a/src/Shared/files/Tooling/project.razor.json +++ b/src/Shared/files/Tooling/project.razor.json @@ -1,5 +1,5 @@ { - "__Version": 14, + "__Version": 16, "ProjectKey": "C:/Users/admin/location/blazorserver/obj/Debug/net7.0/", "FilePath": "C:\\Users\\admin\\location\\blazorserver\\blazorserver.csproj", "Configuration": { @@ -14,10 +14,8 @@ "TagHelpers": [ { "__Checksum": { - "Data1": 2967496428585671435, - "Data2": -3352304232902508242, - "Data3": -5998256862876405960, - "Data4": 1576807304695571412 + "Data1": -4391685313292579545, + "Data2": -5839713148686104899 }, "Flags": 1, "Name": "blazorserver.Shared.SurveyPrompt", @@ -42,10 +40,8 @@ }, { "__Checksum": { - "Data1": -2785352229528338082, - "Data2": -5906485398496513051, - "Data3": -7667234265814695029, - "Data4": 4604194166025247914 + "Data1": -5835395264369066247, + "Data2": -4725776681958415853 }, "Flags": 3, "Name": "blazorserver.Shared.SurveyPrompt", @@ -70,10 +66,8 @@ }, { "__Checksum": { - "Data1": -4494269745812731757, - "Data2": -396009697833901700, - "Data3": 5694788242101333997, - "Data4": 8928600972737343296 + "Data1": 2788539555702213661, + "Data2": -2554917938248634978 }, "Flags": 1, "Name": "blazorserver.Shared.MainLayout", @@ -103,10 +97,8 @@ }, { "__Checksum": { - "Data1": 2988936524480369213, - "Data2": 869415287385525809, - "Data3": -8313477746080071935, - "Data4": 6024837333616298108 + "Data1": 4579265492360322240, + "Data2": 6024560524961077168 }, "Flags": 3, "Name": "blazorserver.Shared.MainLayout", @@ -136,10 +128,8 @@ }, { "__Checksum": { - "Data1": -5279868902534588823, - "Data2": -2536396211718697160, - "Data3": -7510347339906015722, - "Data4": -1149780816892358149 + "Data1": 388953159858687863, + "Data2": 845281050342259688 }, "Flags": 1, "Kind": 3, @@ -158,10 +148,8 @@ }, { "__Checksum": { - "Data1": 3247116541277725763, - "Data2": 6140841547071189973, - "Data3": -9109014029364976000, - "Data4": -497675486824484447 + "Data1": 3081623777860965421, + "Data2": -1086451623293181036 }, "Flags": 3, "Kind": 3, @@ -180,10 +168,8 @@ }, { "__Checksum": { - "Data1": 7637203837437009422, - "Data2": 2014132386966516079, - "Data3": 6672482613091521041, - "Data4": -8921427918501502362 + "Data1": -6662754728844611456, + "Data2": 8039748820386358988 }, "Flags": 1, "Name": "blazorserver.Shared.NavMenu", @@ -199,10 +185,8 @@ }, { "__Checksum": { - "Data1": -3367579711069485881, - "Data2": 4966391456109454344, - "Data3": -6602378923164775930, - "Data4": 4637487686812820445 + "Data1": 6056407489316645594, + "Data2": 8711476662321709130 }, "Flags": 3, "Name": "blazorserver.Shared.NavMenu", @@ -218,10 +202,8 @@ }, { "__Checksum": { - "Data1": -50138065022015881, - "Data2": -4809702064578194966, - "Data3": -6620047368138518864, - "Data4": 4905201678367388846 + "Data1": 9211231022158569554, + "Data2": -4124543714360640021 }, "Flags": 1, "Name": "blazorserver.Pages.Index", @@ -237,10 +219,8 @@ }, { "__Checksum": { - "Data1": 738714579104281204, - "Data2": -3872042594639485766, - "Data3": -8992211901230016914, - "Data4": 3145771595227241832 + "Data1": -5719221880485734740, + "Data2": 8750035184788095316 }, "Flags": 3, "Name": "blazorserver.Pages.Index", @@ -256,10 +236,8 @@ }, { "__Checksum": { - "Data1": 5862865889580140845, - "Data2": -5735095817311324318, - "Data3": -8140407975622718967, - "Data4": -4953340369400899037 + "Data1": 2219594047778985685, + "Data2": -1475347980179087406 }, "Flags": 1, "Name": "blazorserver.Pages.Counter", @@ -284,10 +262,8 @@ }, { "__Checksum": { - "Data1": 4739713036503668449, - "Data2": 5266807143877340765, - "Data3": 696072208767979266, - "Data4": 2631125849518513978 + "Data1": 4198518938299483806, + "Data2": 3492526583167976042 }, "Flags": 3, "Name": "blazorserver.Pages.Counter", @@ -312,10 +288,8 @@ }, { "__Checksum": { - "Data1": -1834556304691149491, - "Data2": -1800664012694859561, - "Data3": 9166644664050479509, - "Data4": 5889816438111626492 + "Data1": 2373294590643959381, + "Data2": -4751302825777169640 }, "Flags": 1, "Name": "blazorserver.Pages.Component", @@ -331,10 +305,8 @@ }, { "__Checksum": { - "Data1": 2459936395947378616, - "Data2": -3913808081269995535, - "Data3": 693581907675913089, - "Data4": -3839669694568104823 + "Data1": 1574152029338056542, + "Data2": 951262864028807533 }, "Flags": 3, "Name": "blazorserver.Pages.Component", @@ -350,10 +322,8 @@ }, { "__Checksum": { - "Data1": -3986625398594113596, - "Data2": 7597019042719106563, - "Data3": -8835507497884682043, - "Data4": -5677253629637055316 + "Data1": -7677650062053748239, + "Data2": 6951268635456165850 }, "Flags": 1, "Name": "blazorserver.Pages.Error", @@ -369,10 +339,8 @@ }, { "__Checksum": { - "Data1": 3592827453280255774, - "Data2": -3805420293903805776, - "Data3": -1801084612726070559, - "Data4": -4095664554355743743 + "Data1": -4256707747385089647, + "Data2": -3599697000455703354 }, "Flags": 3, "Name": "blazorserver.Pages.Error", @@ -388,10 +356,8 @@ }, { "__Checksum": { - "Data1": -8949364025810877686, - "Data2": -6204355820266798211, - "Data3": -219606740975020820, - "Data4": -3752134289918550757 + "Data1": -7560652836386385687, + "Data2": -2849553873773837241 }, "Flags": 1, "Name": "blazorserver.Pages.Component1", @@ -407,10 +373,8 @@ }, { "__Checksum": { - "Data1": -4431325011461531308, - "Data2": 287197920093845323, - "Data3": -5128325585700443038, - "Data4": 6346010160324618613 + "Data1": -6762529129291316655, + "Data2": -4656150088596689894 }, "Flags": 3, "Name": "blazorserver.Pages.Component1", @@ -426,10 +390,8 @@ }, { "__Checksum": { - "Data1": -1741687981768769237, - "Data2": 8942851191697080900, - "Data3": 4282611662812252309, - "Data4": 8807166732388517589 + "Data1": -2757761348985726558, + "Data2": 1044640977254378180 }, "Flags": 1, "Name": "blazorserver.Pages.FetchData", @@ -445,10 +407,8 @@ }, { "__Checksum": { - "Data1": 1505043996726673842, - "Data2": -7321328630868175824, - "Data3": 2555886010546322633, - "Data4": 3419024817377656440 + "Data1": 778825330323765345, + "Data2": 6957588377538566870 }, "Flags": 3, "Name": "blazorserver.Pages.FetchData", @@ -464,10 +424,8 @@ }, { "__Checksum": { - "Data1": -1331252105576337113, - "Data2": 8717174405371688956, - "Data3": -4157118673360491519, - "Data4": 7152176162409214120 + "Data1": -3447056513943431698, + "Data2": -6878106828199730596 }, "Flags": 1, "Name": "blazorserver.App", @@ -483,10 +441,8 @@ }, { "__Checksum": { - "Data1": -5680771175467099372, - "Data2": -4260832645550599473, - "Data3": 4183706151606174533, - "Data4": -6760779926307366717 + "Data1": 3048637216627962660, + "Data2": 7843987202183662618 }, "Flags": 3, "Name": "blazorserver.App", @@ -502,10 +458,8 @@ }, { "__Checksum": { - "Data1": -8923441839004284958, - "Data2": 4769411823726516306, - "Data3": -806505506309018545, - "Data4": -4278359310839766972 + "Data1": -6918121077960800255, + "Data2": 6430578415597441410 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -576,10 +530,8 @@ }, { "__Checksum": { - "Data1": -6766008688608313776, - "Data2": 5138714398273893691, - "Data3": 9047724423662144362, - "Data4": -7037032865618723965 + "Data1": -6715331693788422592, + "Data2": 6754792318269636958 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -650,10 +602,8 @@ }, { "__Checksum": { - "Data1": 4635339466156227039, - "Data2": -1065953792626740807, - "Data3": -8826668428447047349, - "Data4": -5927270373448841838 + "Data1": -697794795610045296, + "Data2": -5464586836287283305 }, "Flags": 1, "Kind": 3, @@ -672,10 +622,8 @@ }, { "__Checksum": { - "Data1": 7858370705389887215, - "Data2": -5668278139284567014, - "Data3": 4411447068151629085, - "Data4": -3291306413907102752 + "Data1": 3225291279455177289, + "Data2": 1619903325249072957 }, "Flags": 3, "Kind": 3, @@ -694,10 +642,8 @@ }, { "__Checksum": { - "Data1": -3912520977611523369, - "Data2": 1156371943295400740, - "Data3": -4103967267333908152, - "Data4": 5622494179913620272 + "Data1": 6603221634260046671, + "Data2": -2235139464418158353 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -736,10 +682,8 @@ }, { "__Checksum": { - "Data1": -1897213462452413078, - "Data2": 8041546582577971857, - "Data3": 463888285572706207, - "Data4": 5221573545058819032 + "Data1": -5553973086256797728, + "Data2": 8531357905601917628 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -778,10 +722,8 @@ }, { "__Checksum": { - "Data1": 5034966037595596335, - "Data2": 807547364719758972, - "Data3": -1956842691547773373, - "Data4": -8672619676783182518 + "Data1": -9147752436549605385, + "Data2": 2387269979869265204 }, "Flags": 1, "Kind": 3, @@ -800,10 +742,8 @@ }, { "__Checksum": { - "Data1": 7070543031295243053, - "Data2": 1526306531106698416, - "Data3": -7610268657946977561, - "Data4": 1109254332500192816 + "Data1": -1034569946473308708, + "Data2": 8855949242372839020 }, "Flags": 3, "Kind": 3, @@ -822,10 +762,8 @@ }, { "__Checksum": { - "Data1": 951613705628251085, - "Data2": 7552624806635028689, - "Data3": -1412886801333125810, - "Data4": 3877327318250211511 + "Data1": 2802508670946755688, + "Data2": -7549814319767133258 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -860,10 +798,8 @@ }, { "__Checksum": { - "Data1": 3509258758839179976, - "Data2": -5121966742160122630, - "Data3": -191957844994605554, - "Data4": -3213047084443607772 + "Data1": 7062099229643648465, + "Data2": 5989407080897127716 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -898,10 +834,8 @@ }, { "__Checksum": { - "Data1": -5428193200725512537, - "Data2": 1684074524960298629, - "Data3": -7396478187797457465, - "Data4": 2906072206671305426 + "Data1": -6762051922167809105, + "Data2": 6594464373617724863 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -969,10 +903,8 @@ }, { "__Checksum": { - "Data1": -1595427273866950119, - "Data2": 3927975985454218786, - "Data3": 1973138056479141365, - "Data4": -8784907609145821297 + "Data1": 552753374732876037, + "Data2": -4548136317534528374 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -1040,10 +972,8 @@ }, { "__Checksum": { - "Data1": -2118946516792258703, - "Data2": -254305611933539626, - "Data3": -341138538772349908, - "Data4": 5626424776966263450 + "Data1": -3264352875337223297, + "Data2": -8408126918642738692 }, "Flags": 1, "Kind": 3, @@ -1073,10 +1003,8 @@ }, { "__Checksum": { - "Data1": 7954634874991754334, - "Data2": -4742598209817304226, - "Data3": -6578614555236034501, - "Data4": -6433508028592312446 + "Data1": -190175293204524996, + "Data2": 6670724718983134719 }, "Flags": 3, "Kind": 3, @@ -1106,10 +1034,8 @@ }, { "__Checksum": { - "Data1": 7914737883177932412, - "Data2": -6571402817757904949, - "Data3": -6261225902331973461, - "Data4": 3559727070096310833 + "Data1": -4627856893189544788, + "Data2": -1901970362755404233 }, "Flags": 1, "Kind": 3, @@ -1128,10 +1054,8 @@ }, { "__Checksum": { - "Data1": 2756161832110285126, - "Data2": 3496932226821148661, - "Data3": -755738105324261498, - "Data4": 1105383551779969302 + "Data1": 3547803001213495115, + "Data2": -7633980515759266346 }, "Flags": 3, "Kind": 3, @@ -1150,10 +1074,8 @@ }, { "__Checksum": { - "Data1": -3605253140095706145, - "Data2": -7783738820550854230, - "Data3": 3529449950119419225, - "Data4": -7565614239959513389 + "Data1": 5696898513772200432, + "Data2": -801821965775779418 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -1170,10 +1092,8 @@ }, { "__Checksum": { - "Data1": -26196016850210749, - "Data2": -1315572839647123837, - "Data3": 6752814469436411603, - "Data4": -2740969863678621831 + "Data1": 8726768119536611870, + "Data2": -1588627150810035320 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -1190,10 +1110,8 @@ }, { "__Checksum": { - "Data1": -7269751121684257168, - "Data2": -4634807799389964601, - "Data3": -4672827800506812095, - "Data4": -687011021786317648 + "Data1": -177523847524075331, + "Data2": 5425312640606266786 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -1293,10 +1211,8 @@ }, { "__Checksum": { - "Data1": -8672271783680923403, - "Data2": 2969158928616814279, - "Data3": -5738624299718719683, - "Data4": 1264822852111943515 + "Data1": 4114819408011462620, + "Data2": 7673531986503803922 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -1396,10 +1312,8 @@ }, { "__Checksum": { - "Data1": -2710603700682464660, - "Data2": 1694636208525918099, - "Data3": -1434628523249262962, - "Data4": 258016610383166599 + "Data1": -4692421395509391636, + "Data2": -4679044986263506399 }, "Flags": 1, "Kind": 3, @@ -1429,10 +1343,8 @@ }, { "__Checksum": { - "Data1": 3164473561009703977, - "Data2": 2290643052564536454, - "Data3": -2575385437456422571, - "Data4": 8738748685384655943 + "Data1": -498178902538734115, + "Data2": 30762191847268893 }, "Flags": 3, "Kind": 3, @@ -1462,10 +1374,8 @@ }, { "__Checksum": { - "Data1": 2774859700525692936, - "Data2": -5755790365627908563, - "Data3": -4484690352577740133, - "Data4": 4796064450069532852 + "Data1": 2889574005203633882, + "Data2": 4647392221785380589 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -1520,10 +1430,8 @@ }, { "__Checksum": { - "Data1": 4107396086773903780, - "Data2": -7324917585154161887, - "Data3": -1925939485355434834, - "Data4": -5781127904673147598 + "Data1": 6979948852981091292, + "Data2": -7165701736068820740 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -1578,10 +1486,8 @@ }, { "__Checksum": { - "Data1": 7159470186093125312, - "Data2": 7902771638439737518, - "Data3": -8739332547310531074, - "Data4": -874180243825608539 + "Data1": -2453434588776311025, + "Data2": 2954871757677109562 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -1665,10 +1571,8 @@ }, { "__Checksum": { - "Data1": -7330559001798870730, - "Data2": 169501102467146098, - "Data3": 7170900270445328491, - "Data4": -4662299916469560697 + "Data1": 6606770118482173637, + "Data2": 8773304612121835953 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -1752,10 +1656,8 @@ }, { "__Checksum": { - "Data1": -3854839724268232858, - "Data2": 4254267973545795517, - "Data3": -2983799823715444260, - "Data4": 4361952423511452732 + "Data1": -7079866121781287867, + "Data2": -1369818923563752408 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -1839,10 +1741,8 @@ }, { "__Checksum": { - "Data1": -2419994022984549610, - "Data2": -921511921219072449, - "Data3": -7747366700774461822, - "Data4": -7884842139303580579 + "Data1": 1850302372097733179, + "Data2": 3170949553831618504 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -1926,10 +1826,8 @@ }, { "__Checksum": { - "Data1": 4169425916689173523, - "Data2": -3240085525328439855, - "Data3": 3262916159784248163, - "Data4": 6970205669689453954 + "Data1": 8537234405098109837, + "Data2": -1965636833627365376 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -2017,10 +1915,8 @@ }, { "__Checksum": { - "Data1": 8883602627089886140, - "Data2": 2853532360407078303, - "Data3": 6981813441270264958, - "Data4": 9069065855460886613 + "Data1": 1745835851914963100, + "Data2": 4936223952897622445 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -2108,10 +2004,8 @@ }, { "__Checksum": { - "Data1": -8869823167034487886, - "Data2": 1189484077984142158, - "Data3": -613573245387421619, - "Data4": -7354253867593229581 + "Data1": 414615643266943127, + "Data2": -477082426821399888 }, "Flags": 1, "Kind": 3, @@ -2130,10 +2024,8 @@ }, { "__Checksum": { - "Data1": -2432799144906111465, - "Data2": 7709730677972569008, - "Data3": 7145678753430993597, - "Data4": 1618152033834758617 + "Data1": 6059122765493654328, + "Data2": -7489741696074074488 }, "Flags": 3, "Kind": 3, @@ -2152,10 +2044,8 @@ }, { "__Checksum": { - "Data1": -6588036442304836239, - "Data2": -3942548721537577766, - "Data3": 2177381158118361580, - "Data4": -1569304780002832668 + "Data1": -6326008467485486202, + "Data2": 5101377154101503400 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -2210,10 +2100,8 @@ }, { "__Checksum": { - "Data1": 2088296465902283787, - "Data2": -4690163656742060937, - "Data3": -4855043727158164768, - "Data4": -5150884642868258907 + "Data1": 4662361316347320649, + "Data2": 1188574834704815559 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -2268,10 +2156,8 @@ }, { "__Checksum": { - "Data1": 1395655334453148131, - "Data2": 7026564856819512623, - "Data3": 3513854491431870624, - "Data4": -263674254741353037 + "Data1": 1386198714762589473, + "Data2": 7405440769567294603 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -2326,10 +2212,8 @@ }, { "__Checksum": { - "Data1": -8715611139445380273, - "Data2": 601395938206927783, - "Data3": 1413827456125800630, - "Data4": 7718327778397384577 + "Data1": 6492383630456004309, + "Data2": -6512149699105607196 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -2384,10 +2268,8 @@ }, { "__Checksum": { - "Data1": 7637813654348998665, - "Data2": 5742405936219344316, - "Data3": 7362814427106137623, - "Data4": -5831230499535242818 + "Data1": -6413016870083735204, + "Data2": 4945021801412569541 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -2438,10 +2320,8 @@ }, { "__Checksum": { - "Data1": -7148881076626321593, - "Data2": 4303237500845220105, - "Data3": -6859193644043517932, - "Data4": -2160102848235949847 + "Data1": -8572095032253733113, + "Data2": 8212283743135811301 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -2492,10 +2372,8 @@ }, { "__Checksum": { - "Data1": 6244611474627004365, - "Data2": -9120958384583281419, - "Data3": 8487604890625983234, - "Data4": -759164906330625919 + "Data1": 4697835700341697446, + "Data2": 497347925811703565 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -2530,10 +2408,8 @@ }, { "__Checksum": { - "Data1": -3449757172970338934, - "Data2": -6613589734686313799, - "Data3": 10591245970903698, - "Data4": -5302577502444596275 + "Data1": 7230162328557128617, + "Data2": -7298722504304871784 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -2568,10 +2444,8 @@ }, { "__Checksum": { - "Data1": 7234246408924613100, - "Data2": -4477619350188238985, - "Data3": -5517283018677294237, - "Data4": -8659119511992860813 + "Data1": 170219961061964732, + "Data2": -4250569905414264715 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -2626,10 +2500,8 @@ }, { "__Checksum": { - "Data1": 5775999055831763409, - "Data2": 4982688411490695555, - "Data3": 3874834907476892173, - "Data4": -2041705026992106609 + "Data1": -8840354490564354540, + "Data2": -2311431364862518455 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -2684,10 +2556,8 @@ }, { "__Checksum": { - "Data1": 8727253830178899011, - "Data2": 1159663259696387442, - "Data3": -3848416845505823147, - "Data4": 2148027690590400161 + "Data1": -5828990682407725016, + "Data2": 4699017392441225499 }, "Flags": 1, "Kind": 3, @@ -2706,10 +2576,8 @@ }, { "__Checksum": { - "Data1": 8445045772570551804, - "Data2": 476246335500300242, - "Data3": -5715609184455957731, - "Data4": 6878933790817714009 + "Data1": 7403638196374951048, + "Data2": -9171430347755644924 }, "Flags": 3, "Kind": 3, @@ -2728,10 +2596,8 @@ }, { "__Checksum": { - "Data1": 4201101476272322287, - "Data2": 7604624092389934678, - "Data3": 4078263307432135055, - "Data4": 29983054857978051 + "Data1": -7576640601316340551, + "Data2": -2887521881517766645 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -2799,10 +2665,8 @@ }, { "__Checksum": { - "Data1": -4189492138328668832, - "Data2": 7308679100081131340, - "Data3": -8759577889035860822, - "Data4": -4169003647348847166 + "Data1": -404921720497644837, + "Data2": -5814963133666762686 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -2870,10 +2734,8 @@ }, { "__Checksum": { - "Data1": 1163895305395526021, - "Data2": 2651581870567460421, - "Data3": 8526937545177119803, - "Data4": -5593848051269885685 + "Data1": 4955898016436919927, + "Data2": -7017221869341745914 }, "Flags": 1, "Kind": 3, @@ -2892,10 +2754,8 @@ }, { "__Checksum": { - "Data1": -3376464956591014915, - "Data2": -6356845768450914615, - "Data3": -193839449389756075, - "Data4": 1602342531528405080 + "Data1": -7192076762389072374, + "Data2": -6665355836391309323 }, "Flags": 3, "Kind": 3, @@ -2914,10 +2774,8 @@ }, { "__Checksum": { - "Data1": -7521739482396887449, - "Data2": -375434061925116478, - "Data3": 6638942894331925750, - "Data4": -6515688123495083966 + "Data1": 2489392652059197678, + "Data2": -4055297246853630340 }, "Flags": 1, "Kind": 3, @@ -2947,10 +2805,8 @@ }, { "__Checksum": { - "Data1": 7296914515686675478, - "Data2": 7865637200883828544, - "Data3": 8284878711518209154, - "Data4": 5320980033719066965 + "Data1": 4619816926013985333, + "Data2": 2650059607467197017 }, "Flags": 3, "Kind": 3, @@ -2980,10 +2836,8 @@ }, { "__Checksum": { - "Data1": -3561061445913341087, - "Data2": -7956960177798611723, - "Data3": -9008329613495817909, - "Data4": 8902747239725001692 + "Data1": 569233483083689655, + "Data2": 7180934467921131082 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -3083,10 +2937,8 @@ }, { "__Checksum": { - "Data1": -5580468458943431329, - "Data2": 9048353802331592611, - "Data3": 8207898833650578955, - "Data4": 3014246224675242383 + "Data1": -879199276589883142, + "Data2": -5767991059951407890 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -3186,10 +3038,8 @@ }, { "__Checksum": { - "Data1": 1836891585982002894, - "Data2": 5071272740120577757, - "Data3": -6048954441542039299, - "Data4": 5110823722532546393 + "Data1": 8327439463503673548, + "Data2": -1558116024434602778 }, "Flags": 1, "Kind": 3, @@ -3219,10 +3069,8 @@ }, { "__Checksum": { - "Data1": -1768599629433341710, - "Data2": 4087282219106489138, - "Data3": -6117282106093242133, - "Data4": 3353203284217855882 + "Data1": 3601619421823372012, + "Data2": 6982202868551138092 }, "Flags": 3, "Kind": 3, @@ -3252,10 +3100,8 @@ }, { "__Checksum": { - "Data1": -4088410122350951543, - "Data2": -1612228289615750412, - "Data3": -3800356143724504498, - "Data4": -8898185723874624242 + "Data1": -4669959868410113517, + "Data2": -3675413269713728001 }, "Flags": 1, "Kind": 3, @@ -3274,10 +3120,8 @@ }, { "__Checksum": { - "Data1": 4415034173764523842, - "Data2": 18373030330922266, - "Data3": 7252679979489885806, - "Data4": -296576580652430764 + "Data1": 1042667293377532708, + "Data2": 6223818224025114659 }, "Flags": 3, "Kind": 3, @@ -3296,10 +3140,8 @@ }, { "__Checksum": { - "Data1": -2953165212740071642, - "Data2": 3220173165001439739, - "Data3": 420607087305586887, - "Data4": 3535451616943686302 + "Data1": 3787407959906426273, + "Data2": 7254816761210526077 }, "Flags": 1, "Kind": 3, @@ -3329,10 +3171,8 @@ }, { "__Checksum": { - "Data1": -5170632609522979239, - "Data2": 6811857365853307614, - "Data3": -299404776402055992, - "Data4": -4218088775173338614 + "Data1": 3619484385208068969, + "Data2": -4087070606587402202 }, "Flags": 3, "Kind": 3, @@ -3362,10 +3202,8 @@ }, { "__Checksum": { - "Data1": -5583245122294057746, - "Data2": -8303924423410431708, - "Data3": 5675053629757349039, - "Data4": -2100406260105492581 + "Data1": -5297713180905429584, + "Data2": -8467341300486033826 }, "Flags": 1, "Kind": 3, @@ -3395,10 +3233,8 @@ }, { "__Checksum": { - "Data1": -8777974710302737265, - "Data2": -5954467644406669625, - "Data3": -3986188770690757613, - "Data4": -5596404865731757598 + "Data1": -7221221885546135659, + "Data2": -5617761877704543024 }, "Flags": 3, "Kind": 3, @@ -3428,10 +3264,8 @@ }, { "__Checksum": { - "Data1": -8512084218692648024, - "Data2": 8969854629330204138, - "Data3": 7669783073285809360, - "Data4": -837635339894828455 + "Data1": -8965780324642718203, + "Data2": -6889479476351106580 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -3461,10 +3295,8 @@ }, { "__Checksum": { - "Data1": -306065013418687756, - "Data2": -260396175086884882, - "Data3": 2714160989509265891, - "Data4": -4216380840622262366 + "Data1": 4676122324036374794, + "Data2": 5074628378804687395 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -3494,10 +3326,8 @@ }, { "__Checksum": { - "Data1": -6704396174250687382, - "Data2": 5252006729258588950, - "Data3": 5566235628716037339, - "Data4": 7222917987285520471 + "Data1": -5005061146881594406, + "Data2": 6931629969982191170 }, "Flags": 1, "Kind": 3, @@ -3516,10 +3346,8 @@ }, { "__Checksum": { - "Data1": -5442141830023978044, - "Data2": -7679738406354059686, - "Data3": -8350387858413053758, - "Data4": -5115828910320209609 + "Data1": -7387473865437736701, + "Data2": 6517085609476231541 }, "Flags": 3, "Kind": 3, @@ -3538,10 +3366,8 @@ }, { "__Checksum": { - "Data1": -3722971011972317750, - "Data2": -592777304361731370, - "Data3": 8133611277289279028, - "Data4": 300049689859592947 + "Data1": 2064419758399344332, + "Data2": 6252672075713926341 }, "Flags": 5, "Kind": 4, @@ -3613,10 +3439,8 @@ }, { "__Checksum": { - "Data1": 7043247215502018870, - "Data2": 3121671333463192913, - "Data3": -571632895408142886, - "Data4": -1000808742575077773 + "Data1": -6310457977153868066, + "Data2": -8927141440571923692 }, "Flags": 5, "Kind": 4, @@ -3688,10 +3512,8 @@ }, { "__Checksum": { - "Data1": -8398242758097246755, - "Data2": 877032546735171205, - "Data3": -6261482753686256731, - "Data4": -987073166508807669 + "Data1": 4376314928824475576, + "Data2": 204133518497161154 }, "Flags": 5, "Kind": 4, @@ -3763,10 +3585,8 @@ }, { "__Checksum": { - "Data1": 6486175198017259833, - "Data2": -9045878770970767533, - "Data3": 385132702721372256, - "Data4": 8518229522095660506 + "Data1": 5043825241333321212, + "Data2": -6752646964534563054 }, "Flags": 5, "Kind": 4, @@ -3838,10 +3658,8 @@ }, { "__Checksum": { - "Data1": -8021312881779370998, - "Data2": -6894514747378301706, - "Data3": 6990135765323971956, - "Data4": 8104304545817447363 + "Data1": 2074560286302763998, + "Data2": -6792608786303187539 }, "Flags": 5, "Kind": 4, @@ -3913,10 +3731,8 @@ }, { "__Checksum": { - "Data1": -3891190013503308541, - "Data2": 1846789252772363607, - "Data3": 151210813164370833, - "Data4": 7272252623055905523 + "Data1": -2979906475624842511, + "Data2": -5415826239201651932 }, "Flags": 5, "Kind": 4, @@ -3988,10 +3804,8 @@ }, { "__Checksum": { - "Data1": 6454814231156480668, - "Data2": -8318307939505622856, - "Data3": -8086148443927495185, - "Data4": 8256776907393916604 + "Data1": -8205446951321160231, + "Data2": -3191852028201742166 }, "Flags": 5, "Kind": 4, @@ -4063,10 +3877,8 @@ }, { "__Checksum": { - "Data1": 8118417069560010966, - "Data2": 2373016150979195533, - "Data3": 7801389652673171605, - "Data4": -2867046784589541519 + "Data1": -739562959854468333, + "Data2": -5466964152435730643 }, "Flags": 5, "Kind": 4, @@ -4138,10 +3950,8 @@ }, { "__Checksum": { - "Data1": 9101802372438242419, - "Data2": 3520896710339914219, - "Data3": -7058403135151230520, - "Data4": -6051628103781612450 + "Data1": 124983440545230208, + "Data2": 5006191484831647300 }, "Flags": 5, "Kind": 4, @@ -4213,10 +4023,8 @@ }, { "__Checksum": { - "Data1": 5617082486166732656, - "Data2": -2069834419439494720, - "Data3": 3115049679856015223, - "Data4": -3759275380137406094 + "Data1": 2778513111840931685, + "Data2": 2635253983367316211 }, "Flags": 5, "Kind": 4, @@ -4288,10 +4096,8 @@ }, { "__Checksum": { - "Data1": 8040740264241579976, - "Data2": 6817379544812678040, - "Data3": 2511661885866553112, - "Data4": -3721544157668675310 + "Data1": -3309409691775521916, + "Data2": 4971208935053116929 }, "Flags": 5, "Kind": 4, @@ -4363,10 +4169,8 @@ }, { "__Checksum": { - "Data1": -2880559344786755464, - "Data2": -907762085711449062, - "Data3": -2518778878999991290, - "Data4": -7316749070091308960 + "Data1": -7656822853489209339, + "Data2": 3465433943172319359 }, "Flags": 5, "Kind": 4, @@ -4438,10 +4242,8 @@ }, { "__Checksum": { - "Data1": -1210266831355526773, - "Data2": -6685446055590984237, - "Data3": 7705826145965103335, - "Data4": -5249722340010061392 + "Data1": -5115546556541377318, + "Data2": -604943106061120207 }, "Flags": 5, "Kind": 4, @@ -4513,10 +4315,8 @@ }, { "__Checksum": { - "Data1": 1196314728664085421, - "Data2": -4175223616171607843, - "Data3": -2411394180253275124, - "Data4": -8429440105094350151 + "Data1": 5260980117161883350, + "Data2": 56111936529961610 }, "Flags": 5, "Kind": 4, @@ -4588,10 +4388,8 @@ }, { "__Checksum": { - "Data1": 2545645328309131191, - "Data2": -3816370184009681381, - "Data3": -6702098122574599510, - "Data4": 1257481785239839183 + "Data1": 3694926776168832276, + "Data2": 1755549933444267884 }, "Flags": 5, "Kind": 4, @@ -4663,10 +4461,8 @@ }, { "__Checksum": { - "Data1": 301773917002748323, - "Data2": -1700981253046273531, - "Data3": -7554759648293418335, - "Data4": 3376204753815956945 + "Data1": -7206223848705221935, + "Data2": -3453502990535844221 }, "Flags": 5, "Kind": 4, @@ -4738,10 +4534,8 @@ }, { "__Checksum": { - "Data1": -5787121060434686499, - "Data2": 1136763387091270254, - "Data3": -8236616689224323157, - "Data4": 5943278359397730370 + "Data1": -1092371940419365619, + "Data2": 3622885308954732754 }, "Flags": 5, "Kind": 4, @@ -4813,10 +4607,8 @@ }, { "__Checksum": { - "Data1": 2492509071011142460, - "Data2": 2111499312908187687, - "Data3": -6442314201107516321, - "Data4": -4120318254279265393 + "Data1": 7480025358481238159, + "Data2": -7897845603426997967 }, "Flags": 5, "Kind": 4, @@ -4888,10 +4680,8 @@ }, { "__Checksum": { - "Data1": -5801208420174981865, - "Data2": -4608188897143486194, - "Data3": 6130984815914808193, - "Data4": 8568908901951240052 + "Data1": -1414983672565348600, + "Data2": 1087643439861834950 }, "Flags": 5, "Kind": 4, @@ -4963,10 +4753,8 @@ }, { "__Checksum": { - "Data1": 3279270792329556723, - "Data2": -3381279487141676675, - "Data3": 808805848996841860, - "Data4": 6519654190220938639 + "Data1": -4504036842332139379, + "Data2": -5569454465766311523 }, "Flags": 5, "Kind": 4, @@ -5038,10 +4826,8 @@ }, { "__Checksum": { - "Data1": 3707377159739595277, - "Data2": 7193690639905448201, - "Data3": -469322050002951208, - "Data4": 4428285077237028248 + "Data1": 6663026381007714324, + "Data2": 5723499610430896571 }, "Flags": 5, "Kind": 4, @@ -5113,10 +4899,8 @@ }, { "__Checksum": { - "Data1": -753402082081552324, - "Data2": -90148350832365845, - "Data3": 3194648675318507795, - "Data4": 4592675514726319190 + "Data1": 435323083590156121, + "Data2": 3432576327066528154 }, "Flags": 5, "Kind": 4, @@ -5188,10 +4972,8 @@ }, { "__Checksum": { - "Data1": 614077131379701420, - "Data2": -7376985623620647092, - "Data3": -2794949226707642156, - "Data4": -1608276079423422961 + "Data1": -5576161755567870784, + "Data2": -4637174129855134606 }, "Flags": 5, "Kind": 4, @@ -5263,10 +5045,8 @@ }, { "__Checksum": { - "Data1": 3878874248286057788, - "Data2": 323012374981105951, - "Data3": 1413818538178244637, - "Data4": -7560347945426391493 + "Data1": -3708647181209912690, + "Data2": 3837673014999571727 }, "Flags": 5, "Kind": 4, @@ -5338,10 +5118,8 @@ }, { "__Checksum": { - "Data1": -1869901892296251645, - "Data2": 4306109085540721455, - "Data3": 6116036012770947884, - "Data4": -6514593956484246659 + "Data1": -9100075508578852232, + "Data2": -7804293436619168885 }, "Flags": 5, "Kind": 4, @@ -5413,10 +5191,8 @@ }, { "__Checksum": { - "Data1": -8834894900355434165, - "Data2": 5929268956217302716, - "Data3": -4873368573097614453, - "Data4": -5962358948028173704 + "Data1": -1109685860014398608, + "Data2": 7923985426527102193 }, "Flags": 5, "Kind": 4, @@ -5488,10 +5264,8 @@ }, { "__Checksum": { - "Data1": -3171026755325328238, - "Data2": 7779377921132129013, - "Data3": -8530952749943609889, - "Data4": -1325060369271255720 + "Data1": -2149512506351720239, + "Data2": -5372850946990803810 }, "Flags": 5, "Kind": 4, @@ -5563,10 +5337,8 @@ }, { "__Checksum": { - "Data1": -7925050506345847540, - "Data2": -463872225063765205, - "Data3": 7753990551206001879, - "Data4": -7371009887407428770 + "Data1": -6782903605737797434, + "Data2": 8779922804099941952 }, "Flags": 5, "Kind": 4, @@ -5638,10 +5410,8 @@ }, { "__Checksum": { - "Data1": 521894069359713506, - "Data2": 5595221733557097494, - "Data3": -751208756587384855, - "Data4": 7627959867642680985 + "Data1": -5284351544752465151, + "Data2": 8210763260885281056 }, "Flags": 5, "Kind": 4, @@ -5713,10 +5483,8 @@ }, { "__Checksum": { - "Data1": -2225370554796611107, - "Data2": 6529128533861933285, - "Data3": 6567738050944149849, - "Data4": 1609110514241496222 + "Data1": -4994931655895099930, + "Data2": 7709458163649943288 }, "Flags": 5, "Kind": 4, @@ -5788,10 +5556,8 @@ }, { "__Checksum": { - "Data1": -8841200237376865055, - "Data2": 78422614786481826, - "Data3": -4672048706258693109, - "Data4": -4993758712900100251 + "Data1": -7247292229077799748, + "Data2": 7874181774386396163 }, "Flags": 5, "Kind": 4, @@ -5863,10 +5629,8 @@ }, { "__Checksum": { - "Data1": -7218537233620942533, - "Data2": -7131738757307533020, - "Data3": 6467112914317417121, - "Data4": -310432776204128805 + "Data1": 4203275629193186019, + "Data2": -4133269192821658249 }, "Flags": 5, "Kind": 4, @@ -5938,10 +5702,8 @@ }, { "__Checksum": { - "Data1": 6749576066501111895, - "Data2": -532846698435059927, - "Data3": -2387491221927771190, - "Data4": -5136834710519512513 + "Data1": 5351679654270558540, + "Data2": 1946387094901419637 }, "Flags": 5, "Kind": 4, @@ -6013,10 +5775,8 @@ }, { "__Checksum": { - "Data1": 4608449935676089746, - "Data2": 4726313655472297453, - "Data3": 2683860572147505733, - "Data4": -8351261659260571347 + "Data1": -2279231766222397608, + "Data2": 2899669264970788214 }, "Flags": 5, "Kind": 4, @@ -6088,10 +5848,8 @@ }, { "__Checksum": { - "Data1": -6775730087446001826, - "Data2": 6867959566515017250, - "Data3": -3867891977696159662, - "Data4": -3005991191005247725 + "Data1": -5371992356373240069, + "Data2": -5309800191918873959 }, "Flags": 5, "Kind": 4, @@ -6163,10 +5921,8 @@ }, { "__Checksum": { - "Data1": 1799447568114235478, - "Data2": 925319954370289448, - "Data3": -8877413442477412039, - "Data4": 1222356864358699636 + "Data1": 170962090503243773, + "Data2": 1122620241801322192 }, "Flags": 5, "Kind": 4, @@ -6238,10 +5994,8 @@ }, { "__Checksum": { - "Data1": -923620560923294009, - "Data2": -8292100725792985342, - "Data3": -7481451486902108692, - "Data4": -2584571288258879064 + "Data1": -8432231385230199698, + "Data2": -302346448144235935 }, "Flags": 5, "Kind": 4, @@ -6313,10 +6067,8 @@ }, { "__Checksum": { - "Data1": -7452343823908954241, - "Data2": 5244854637068748934, - "Data3": -4865246052838868246, - "Data4": 4154666458616351130 + "Data1": 2319965437231978856, + "Data2": -2012810122778458464 }, "Flags": 5, "Kind": 4, @@ -6388,10 +6140,8 @@ }, { "__Checksum": { - "Data1": -2608326803756956146, - "Data2": -3400424288229436008, - "Data3": 7966346588951978617, - "Data4": -8234615731986278232 + "Data1": -1074701325510650800, + "Data2": -3057389434760908263 }, "Flags": 5, "Kind": 4, @@ -6463,10 +6213,8 @@ }, { "__Checksum": { - "Data1": -6396002248059706276, - "Data2": 3902092753681529547, - "Data3": 4830826328634703520, - "Data4": -1502371366177014498 + "Data1": 3300417387159807603, + "Data2": -5412050379754665571 }, "Flags": 5, "Kind": 4, @@ -6538,10 +6286,8 @@ }, { "__Checksum": { - "Data1": -5677668184206813051, - "Data2": -1160365989587340171, - "Data3": 8338489250364346393, - "Data4": 1326527802479103358 + "Data1": -2656594235825864156, + "Data2": -3766057440440606125 }, "Flags": 5, "Kind": 4, @@ -6613,10 +6359,8 @@ }, { "__Checksum": { - "Data1": -5530116835509623910, - "Data2": 4442818830577288641, - "Data3": -4222415714643011657, - "Data4": 5802868713773281629 + "Data1": -5034797643752931415, + "Data2": 2562926440166139785 }, "Flags": 5, "Kind": 4, @@ -6688,10 +6432,8 @@ }, { "__Checksum": { - "Data1": -8131529044475215903, - "Data2": -2235372294251996603, - "Data3": -8382914233801226032, - "Data4": -7521796916397988064 + "Data1": -5292773437798782908, + "Data2": 2108922321808462401 }, "Flags": 5, "Kind": 4, @@ -6763,10 +6505,8 @@ }, { "__Checksum": { - "Data1": 4308192500518087045, - "Data2": -4103184166970792645, - "Data3": -3741833222925379743, - "Data4": 5435055779732597009 + "Data1": -7350454180712276385, + "Data2": 3698038539438675226 }, "Flags": 5, "Kind": 4, @@ -6838,10 +6578,8 @@ }, { "__Checksum": { - "Data1": 8222069999722361090, - "Data2": -2142273640886855004, - "Data3": 6277927850967194465, - "Data4": -422987410663865700 + "Data1": 7934588388293887819, + "Data2": 4359761546640678766 }, "Flags": 5, "Kind": 4, @@ -6913,10 +6651,8 @@ }, { "__Checksum": { - "Data1": 6329716520147377013, - "Data2": -82407282565857478, - "Data3": 871045593024432663, - "Data4": -2677574743400614828 + "Data1": 5754242545036167523, + "Data2": 5041261726459531036 }, "Flags": 5, "Kind": 4, @@ -6988,10 +6724,8 @@ }, { "__Checksum": { - "Data1": 1017664927534357074, - "Data2": 7677528903889742986, - "Data3": 919522681420567400, - "Data4": -6360077902157564898 + "Data1": -2904281004230143513, + "Data2": 3569036751127069554 }, "Flags": 5, "Kind": 4, @@ -7063,10 +6797,8 @@ }, { "__Checksum": { - "Data1": -2875172438558105435, - "Data2": -2062019593410994872, - "Data3": -5536292090701739930, - "Data4": 3840574012881479921 + "Data1": 3579816354667505320, + "Data2": 1700985718701661423 }, "Flags": 5, "Kind": 4, @@ -7138,10 +6870,8 @@ }, { "__Checksum": { - "Data1": 748271377477268709, - "Data2": 4828720404480793405, - "Data3": 6520958015780664078, - "Data4": -1953896336970537808 + "Data1": -9148619710720972648, + "Data2": -1247821590994706159 }, "Flags": 5, "Kind": 4, @@ -7213,10 +6943,8 @@ }, { "__Checksum": { - "Data1": 355730719867725152, - "Data2": 7272199937761674975, - "Data3": -9109474244667185474, - "Data4": -4743944335619399564 + "Data1": 7206187725526057130, + "Data2": 6529218452362546560 }, "Flags": 5, "Kind": 4, @@ -7288,10 +7016,8 @@ }, { "__Checksum": { - "Data1": 1871693315708382376, - "Data2": -176190456594548767, - "Data3": 1101948725309189788, - "Data4": 2547691015676141344 + "Data1": 1927823397232115798, + "Data2": 3753118008705433568 }, "Flags": 5, "Kind": 4, @@ -7363,10 +7089,8 @@ }, { "__Checksum": { - "Data1": 5347694836516441538, - "Data2": -8193955248803809658, - "Data3": -6445265875548805529, - "Data4": 5918197142976710795 + "Data1": 1866505381197505947, + "Data2": 5567187811068204043 }, "Flags": 5, "Kind": 4, @@ -7438,10 +7162,8 @@ }, { "__Checksum": { - "Data1": -2375610150215622386, - "Data2": -1807394710647436313, - "Data3": 7754110736459765739, - "Data4": -1081466497727647101 + "Data1": 3539610697196546563, + "Data2": -8375402119442742623 }, "Flags": 5, "Kind": 4, @@ -7513,10 +7235,8 @@ }, { "__Checksum": { - "Data1": 2714058393676124375, - "Data2": -2419268378841957758, - "Data3": -4450366848560058573, - "Data4": -603759298058320356 + "Data1": 1410213719490339916, + "Data2": 7177232177392956086 }, "Flags": 5, "Kind": 4, @@ -7588,10 +7308,8 @@ }, { "__Checksum": { - "Data1": -1698489178251348642, - "Data2": -2236646257714515123, - "Data3": 5463103711020976295, - "Data4": 8664518387496319403 + "Data1": -3640749478049323094, + "Data2": 5131862132179627960 }, "Flags": 5, "Kind": 4, @@ -7663,10 +7381,8 @@ }, { "__Checksum": { - "Data1": -8605753287790553229, - "Data2": 4583444180816975869, - "Data3": 489107057096081304, - "Data4": 6636818316422457719 + "Data1": -1690319642781226677, + "Data2": -5400586069414046047 }, "Flags": 5, "Kind": 4, @@ -7738,10 +7454,8 @@ }, { "__Checksum": { - "Data1": 6755181845573193132, - "Data2": -6226668990911815814, - "Data3": 8247467022308653560, - "Data4": 5506446239761001477 + "Data1": 7353214756364388764, + "Data2": -739525047427912112 }, "Flags": 5, "Kind": 4, @@ -7813,10 +7527,8 @@ }, { "__Checksum": { - "Data1": 1153518848117228534, - "Data2": 2544141282540701661, - "Data3": 643293448498267765, - "Data4": 4651056190585220208 + "Data1": -8257699045811040123, + "Data2": 6349552388406486499 }, "Flags": 5, "Kind": 4, @@ -7888,10 +7600,8 @@ }, { "__Checksum": { - "Data1": -611322213961094942, - "Data2": -2091875469593411548, - "Data3": 4830156330130263990, - "Data4": 5936496702128262666 + "Data1": -6952049410208833505, + "Data2": -1789390020661817106 }, "Flags": 5, "Kind": 4, @@ -7963,10 +7673,8 @@ }, { "__Checksum": { - "Data1": -8634115168719277061, - "Data2": 2658711084527857631, - "Data3": 1643752626925263298, - "Data4": 8670628693104821933 + "Data1": 5327152311432566984, + "Data2": -2198594656893192765 }, "Flags": 5, "Kind": 4, @@ -8038,10 +7746,8 @@ }, { "__Checksum": { - "Data1": 752614433968596785, - "Data2": -8597881029512663396, - "Data3": -1187248467795797066, - "Data4": 9134463434926566475 + "Data1": 6847002203290781267, + "Data2": 7399801399534608413 }, "Flags": 5, "Kind": 4, @@ -8113,10 +7819,8 @@ }, { "__Checksum": { - "Data1": 4926205851776286647, - "Data2": -3680305679067875890, - "Data3": -4086937842253238448, - "Data4": -3022312857845076273 + "Data1": 6954094851066210511, + "Data2": 1636711297066890203 }, "Flags": 5, "Kind": 4, @@ -8188,10 +7892,8 @@ }, { "__Checksum": { - "Data1": -3024063486837072694, - "Data2": -7783121144561247815, - "Data3": 3426759625230479681, - "Data4": 3572908303005879822 + "Data1": -7347612585645710256, + "Data2": 8557917867593880146 }, "Flags": 5, "Kind": 4, @@ -8263,10 +7965,8 @@ }, { "__Checksum": { - "Data1": 1092468484391244582, - "Data2": -5411535253738797608, - "Data3": 7282990355985691527, - "Data4": -3678841552520977282 + "Data1": -8701987301851024900, + "Data2": -4956095613556072361 }, "Flags": 5, "Kind": 4, @@ -8338,10 +8038,8 @@ }, { "__Checksum": { - "Data1": -2284673453611556450, - "Data2": 3527246083344576306, - "Data3": -8798526974746642549, - "Data4": 4263181275928042544 + "Data1": 6552732297748174183, + "Data2": 1611975288671446490 }, "Flags": 5, "Kind": 4, @@ -8413,10 +8111,8 @@ }, { "__Checksum": { - "Data1": -2901981240570037103, - "Data2": 1655034224322979467, - "Data3": -8712662530274862533, - "Data4": 6210734850179199813 + "Data1": 2752627153252475519, + "Data2": 4369825952519748660 }, "Flags": 5, "Kind": 4, @@ -8488,10 +8184,8 @@ }, { "__Checksum": { - "Data1": 1899875720480917275, - "Data2": 4408255451889162586, - "Data3": -3819493788809080074, - "Data4": 5700618382948988995 + "Data1": -7588953424994769220, + "Data2": -537590990423994751 }, "Flags": 5, "Kind": 4, @@ -8563,10 +8257,8 @@ }, { "__Checksum": { - "Data1": 558920421096267833, - "Data2": -2946271284648148581, - "Data3": 1113321658004969137, - "Data4": -9045115345852363467 + "Data1": 8720302604707281228, + "Data2": -65822110811741169 }, "Flags": 5, "Kind": 4, @@ -8638,10 +8330,8 @@ }, { "__Checksum": { - "Data1": 6804475845375297153, - "Data2": 3758681712147750089, - "Data3": 573756825533695163, - "Data4": 7019583594949333672 + "Data1": -1368440014053698107, + "Data2": -5542206684053504068 }, "Flags": 5, "Kind": 4, @@ -8713,10 +8403,8 @@ }, { "__Checksum": { - "Data1": 2471890551069555414, - "Data2": 4003727233882554613, - "Data3": 2292297741215272541, - "Data4": 7124726965920845397 + "Data1": 1887499548828916181, + "Data2": 3476874755438616335 }, "Flags": 5, "Kind": 4, @@ -8788,10 +8476,8 @@ }, { "__Checksum": { - "Data1": 6559798479290576027, - "Data2": 4068256468967638595, - "Data3": -5038303141827234106, - "Data4": 2709270771674672750 + "Data1": -2181606139474894329, + "Data2": 5234683876811771035 }, "Flags": 5, "Kind": 4, @@ -8863,10 +8549,8 @@ }, { "__Checksum": { - "Data1": 7611786990834962400, - "Data2": -8795693132908880234, - "Data3": 1339602949141427634, - "Data4": 2696293435417054614 + "Data1": 4468734419183116102, + "Data2": -2746870076815005669 }, "Flags": 5, "Kind": 4, @@ -8938,10 +8622,8 @@ }, { "__Checksum": { - "Data1": 4321608143451245883, - "Data2": -4165250875498179354, - "Data3": 8858384112400810540, - "Data4": -7907654387658322201 + "Data1": -780100018913783110, + "Data2": -194658334625015596 }, "Flags": 5, "Kind": 4, @@ -9013,10 +8695,8 @@ }, { "__Checksum": { - "Data1": -1903878852267540542, - "Data2": -1312111038427956424, - "Data3": -7708994890778034203, - "Data4": -1513845480138789449 + "Data1": 6566881431065798256, + "Data2": -4518625933310671681 }, "Flags": 5, "Kind": 4, @@ -9088,10 +8768,8 @@ }, { "__Checksum": { - "Data1": -4860311376579045800, - "Data2": 8244756193503003272, - "Data3": -1321524324047527523, - "Data4": 1957741449665495228 + "Data1": 3886626857808754411, + "Data2": 1719134615717066249 }, "Flags": 5, "Kind": 4, @@ -9163,10 +8841,8 @@ }, { "__Checksum": { - "Data1": 5820841176950301837, - "Data2": -1552610923324056806, - "Data3": 8666933138246565013, - "Data4": -7186374866754593339 + "Data1": -3840205638226885955, + "Data2": 4282268249402526052 }, "Flags": 5, "Kind": 4, @@ -9238,10 +8914,8 @@ }, { "__Checksum": { - "Data1": -1462648617891526611, - "Data2": 387734821842041964, - "Data3": -188402486984951446, - "Data4": -4446247659614306856 + "Data1": 7548172989511915138, + "Data2": 2239518656807391371 }, "Flags": 5, "Kind": 4, @@ -9313,10 +8987,8 @@ }, { "__Checksum": { - "Data1": -297543174789246225, - "Data2": 6963154913133381119, - "Data3": 1364862873568463942, - "Data4": -2734561974828113208 + "Data1": -1587358752865286243, + "Data2": 5865621070036478510 }, "Flags": 5, "Kind": 4, @@ -9388,10 +9060,8 @@ }, { "__Checksum": { - "Data1": 2846789949243756607, - "Data2": -9217628704530625770, - "Data3": 2942760664766630446, - "Data4": -3028327176343413837 + "Data1": 5556877351064139614, + "Data2": 250596959210455592 }, "Flags": 5, "Kind": 4, @@ -9463,10 +9133,8 @@ }, { "__Checksum": { - "Data1": 5717161460526988756, - "Data2": 3651570395703216907, - "Data3": -1737854100113775589, - "Data4": 3534239227410898180 + "Data1": -4042957872115115591, + "Data2": -6833552705401993809 }, "Flags": 5, "Kind": 4, @@ -9538,10 +9206,8 @@ }, { "__Checksum": { - "Data1": -8330190191395179159, - "Data2": -4388277271409099222, - "Data3": -1664659601276503905, - "Data4": -8787561090201863277 + "Data1": 8246876886157654952, + "Data2": 5347012267277963125 }, "Flags": 5, "Kind": 4, @@ -9613,10 +9279,8 @@ }, { "__Checksum": { - "Data1": 26333900435538337, - "Data2": 1390343484352577044, - "Data3": -1041591345650616081, - "Data4": 3109372766802223751 + "Data1": -4414255076679483808, + "Data2": -9150054568325110837 }, "Flags": 5, "Kind": 4, @@ -9688,10 +9352,8 @@ }, { "__Checksum": { - "Data1": 3302408209994122266, - "Data2": 693530869543268579, - "Data3": 7481228548890584430, - "Data4": 5042269532253437393 + "Data1": -3042715215576417830, + "Data2": -4953690986565117911 }, "Flags": 5, "Kind": 4, @@ -9763,10 +9425,8 @@ }, { "__Checksum": { - "Data1": 8723412861066665131, - "Data2": 6398464903414049264, - "Data3": -9199431071911092703, - "Data4": 6966925566042847785 + "Data1": 5877312171037124160, + "Data2": -8258577685798427335 }, "Flags": 5, "Kind": 4, @@ -9838,10 +9498,8 @@ }, { "__Checksum": { - "Data1": 3852221819262014378, - "Data2": 8617818089452162635, - "Data3": 453994257865472486, - "Data4": 5446521756736866623 + "Data1": -7890971679571837226, + "Data2": 4279779213263471813 }, "Flags": 5, "Kind": 4, @@ -9913,10 +9571,8 @@ }, { "__Checksum": { - "Data1": -6935730167192950291, - "Data2": 2066986156327980125, - "Data3": -7941069164304607530, - "Data4": 2119368248234309028 + "Data1": -1752517130493400267, + "Data2": -6972905357450272082 }, "Flags": 5, "Kind": 4, @@ -9988,10 +9644,8 @@ }, { "__Checksum": { - "Data1": -8473509423859534237, - "Data2": 6526721379719575346, - "Data3": 3384644771853925493, - "Data4": 2893099311267039167 + "Data1": -6390180632547738428, + "Data2": -6913878885039632141 }, "Flags": 5, "Kind": 4, @@ -10063,10 +9717,8 @@ }, { "__Checksum": { - "Data1": -3259526421688143033, - "Data2": -6524013483011776105, - "Data3": -6447065900192650112, - "Data4": 6531738038345032457 + "Data1": -1927986893843163045, + "Data2": -7651751640761873082 }, "Flags": 5, "Kind": 4, @@ -10138,10 +9790,8 @@ }, { "__Checksum": { - "Data1": -163160812632779238, - "Data2": 7428068667145244385, - "Data3": 640459010233145959, - "Data4": -1358521324002532163 + "Data1": 59237663861724970, + "Data2": 1669311492880686905 }, "Flags": 5, "Kind": 4, @@ -10213,10 +9863,8 @@ }, { "__Checksum": { - "Data1": 1826216660043293183, - "Data2": -8040008894677079642, - "Data3": 2518388978381245440, - "Data4": 440188563843656143 + "Data1": 2602242505064495294, + "Data2": 3663891471020409565 }, "Flags": 5, "Kind": 4, @@ -10288,10 +9936,8 @@ }, { "__Checksum": { - "Data1": -5757649360120930853, - "Data2": -7647371310819405514, - "Data3": 6544835439737781820, - "Data4": -183318822361488597 + "Data1": 2556284801063898929, + "Data2": -7415064727016193078 }, "Flags": 5, "Kind": 4, @@ -10363,10 +10009,8 @@ }, { "__Checksum": { - "Data1": -1215862770330822117, - "Data2": 643018294232852998, - "Data3": -5652820682740396707, - "Data4": 3978619022053042851 + "Data1": -2118173896714999838, + "Data2": -3937578255655661675 }, "Flags": 5, "Kind": 8, @@ -10400,10 +10044,8 @@ }, { "__Checksum": { - "Data1": -3526484346542141876, - "Data2": 156679965715875766, - "Data3": -4510482087245272230, - "Data4": 5559725602893969154 + "Data1": 7670874038942715086, + "Data2": 8209275941701540534 }, "Flags": 0, "Kind": 0, @@ -10613,10 +10255,8 @@ }, { "__Checksum": { - "Data1": 6663231402802918813, - "Data2": -432279317505099660, - "Data3": -2094452779153982081, - "Data4": 3060018017229451779 + "Data1": -3926899777250492247, + "Data2": -474549370405673978 }, "Flags": 0, "Kind": 0, @@ -10733,10 +10373,8 @@ }, { "__Checksum": { - "Data1": 6105027377050314581, - "Data2": 1068597650504644525, - "Data3": -8070461633214028543, - "Data4": -4923735865111678230 + "Data1": -1658257145436180865, + "Data2": -7488375184378013309 }, "Flags": 0, "Kind": 0, @@ -10790,10 +10428,8 @@ }, { "__Checksum": { - "Data1": -8931559441477150226, - "Data2": -4804817119327995133, - "Data3": 9009613958204192112, - "Data4": 4323622212588382318 + "Data1": -6805718574946417561, + "Data2": 6591414388155766075 }, "Flags": 0, "Kind": 0, @@ -10916,10 +10552,8 @@ }, { "__Checksum": { - "Data1": 1783457205245714653, - "Data2": -2211443350452386007, - "Data3": -5436092871341998585, - "Data4": 6333391670818581289 + "Data1": -6444939885527103554, + "Data2": -8826066552881210199 }, "Flags": 0, "Kind": 0, @@ -10964,10 +10598,8 @@ }, { "__Checksum": { - "Data1": -6047372511919749040, - "Data2": 6521851240070679570, - "Data3": -4843676924627100471, - "Data4": 1866571571541969070 + "Data1": -6392045987457598262, + "Data2": 686382473131996082 }, "Flags": 0, "Kind": 0, @@ -11449,10 +11081,8 @@ }, { "__Checksum": { - "Data1": -1086145317624090840, - "Data2": -176242139492884595, - "Data3": 3834741403140367372, - "Data4": -7864034908140514209 + "Data1": 6824382010022317275, + "Data2": 919518242290942902 }, "Flags": 0, "Kind": 0, @@ -11547,10 +11177,8 @@ }, { "__Checksum": { - "Data1": 2799359396512176759, - "Data2": -5743430708970788392, - "Data3": -7289628742258610072, - "Data4": 8622175351024996328 + "Data1": 8931133990194612371, + "Data2": -8620767986254247052 }, "Flags": 0, "Kind": 0, @@ -11598,10 +11226,8 @@ }, { "__Checksum": { - "Data1": -6116926151440808505, - "Data2": 5259831475414365512, - "Data3": -3919547526751277309, - "Data4": -7211100249069003024 + "Data1": 5106608532699094087, + "Data2": -7739181833067187311 }, "Flags": 0, "Kind": 0, @@ -11669,10 +11295,8 @@ }, { "__Checksum": { - "Data1": -142313285679005271, - "Data2": 1089445342822551920, - "Data3": -8084806728939271959, - "Data4": -4279643832218620498 + "Data1": -8615525292927448246, + "Data2": -7860482029053116894 }, "Flags": 0, "Kind": 0, @@ -11707,10 +11331,8 @@ }, { "__Checksum": { - "Data1": 7619255422216104172, - "Data2": -7839311972111200722, - "Data3": -4843699465516528561, - "Data4": -6076005177774449308 + "Data1": -3633214721810215360, + "Data2": -2195097769799784367 }, "Flags": 0, "Kind": 0, @@ -11914,10 +11536,8 @@ }, { "__Checksum": { - "Data1": 6134434561829283099, - "Data2": 3607040203242166579, - "Data3": 1924097719308258582, - "Data4": -1670903751124174286 + "Data1": 352316960402577580, + "Data2": 2963293347761160956 }, "Flags": 0, "Kind": 0, @@ -11946,10 +11566,8 @@ }, { "__Checksum": { - "Data1": -4227816670418140381, - "Data2": -2769282197323899245, - "Data3": 8462708312720501632, - "Data4": -4628078330796520755 + "Data1": -8580206225353768312, + "Data2": 2659019630124838689 }, "Flags": 0, "Kind": 0, @@ -12027,10 +11645,8 @@ }, { "__Checksum": { - "Data1": -5700275153074244989, - "Data2": -6920841969683745532, - "Data3": -286726883126686777, - "Data4": -3104622056199601103 + "Data1": 6375579328340591703, + "Data2": 7397277843257329471 }, "Flags": 0, "Kind": 0, @@ -12189,10 +11805,8 @@ }, { "__Checksum": { - "Data1": -5214601611040432596, - "Data2": 2640478681600075877, - "Data3": -679076579729984851, - "Data4": -7363220701418092307 + "Data1": 7702084789419273357, + "Data2": -4768013259508160473 }, "Flags": 0, "Kind": 0, @@ -12253,10 +11867,8 @@ }, { "__Checksum": { - "Data1": 2356479554862556881, - "Data2": -8117481914237623446, - "Data3": -8924581315544269221, - "Data4": -3557662105957777301 + "Data1": -9126545014392510802, + "Data2": -3969794272059464835 }, "Flags": 0, "Kind": 0, @@ -12299,10 +11911,8 @@ }, { "__Checksum": { - "Data1": -1071177787645468809, - "Data2": -4543436784975894722, - "Data3": -5966674470571997342, - "Data4": -3220507948635496966 + "Data1": -6136369953383202165, + "Data2": 5726816903776687960 }, "Flags": 0, "Kind": 0, @@ -12337,10 +11947,8 @@ }, { "__Checksum": { - "Data1": 4534256115393951149, - "Data2": -7289415566927565551, - "Data3": -3309792021260657549, - "Data4": -3320317055258662710 + "Data1": 5414025628298936244, + "Data2": -4857501007230394912 }, "Flags": 0, "Kind": 0, @@ -12375,10 +11983,8 @@ }, { "__Checksum": { - "Data1": -8487793437515600697, - "Data2": 6338935297654652296, - "Data3": 7012082791527042791, - "Data4": -4161875269970644183 + "Data1": -6390686864974317071, + "Data2": -1503710195958105602 }, "Flags": 0, "Kind": 0, @@ -12752,10 +12358,8 @@ }, { "__Checksum": { - "Data1": 878951103015882682, - "Data2": 5773359248232579895, - "Data3": -7766084721576643128, - "Data4": 9091826568813198451 + "Data1": 462352568511715913, + "Data2": 5574485845447511528 }, "Flags": 5, "Kind": 5, @@ -12819,10 +12423,8 @@ }, { "__Checksum": { - "Data1": -4261937088157876361, - "Data2": 7205037211526471018, - "Data3": -504891852384454852, - "Data4": 7166711965917951922 + "Data1": -9087051131685648070, + "Data2": 7080281076272481552 }, "Flags": 5, "Kind": 5, @@ -12893,10 +12495,8 @@ }, { "__Checksum": { - "Data1": 4378598584347667691, - "Data2": -524513463008664552, - "Data3": -5637825002517940375, - "Data4": 1588337159806331678 + "Data1": 8033065523590731051, + "Data2": -155833069147652285 }, "Flags": 5, "Kind": 5, @@ -12967,10 +12567,8 @@ }, { "__Checksum": { - "Data1": 8483693915728046694, - "Data2": 4586524144367461324, - "Data3": 7187552254396406846, - "Data4": 5383422155588366798 + "Data1": -545302380321216651, + "Data2": -7584052301813175172 }, "Flags": 5, "Kind": 5, @@ -13048,10 +12646,8 @@ }, { "__Checksum": { - "Data1": -986506529973504742, - "Data2": 2382726630778574395, - "Data3": -3565194484223466323, - "Data4": -2933177666166846077 + "Data1": -8059971863449494833, + "Data2": -4503430289805504076 }, "Flags": 5, "Kind": 5, @@ -13130,10 +12726,8 @@ }, { "__Checksum": { - "Data1": -830835576797429957, - "Data2": 5062436875507630839, - "Data3": 8439833351488422020, - "Data4": -6194535443969094425 + "Data1": -5876219945423189720, + "Data2": -899879250368736282 }, "Flags": 5, "Kind": 5, @@ -13212,10 +12806,8 @@ }, { "__Checksum": { - "Data1": -7530262364307631246, - "Data2": -5208507590827913334, - "Data3": -4405670534130037070, - "Data4": 4952914315408501052 + "Data1": 3828981356829397528, + "Data2": 2519910164031418115 }, "Flags": 5, "Kind": 5, @@ -13294,10 +12886,8 @@ }, { "__Checksum": { - "Data1": 139814461419154127, - "Data2": -240139262347858749, - "Data3": -6605618754323349372, - "Data4": 3406888470743922277 + "Data1": -7249027217889335410, + "Data2": -5065217166177050395 }, "Flags": 5, "Kind": 5, @@ -13376,10 +12966,8 @@ }, { "__Checksum": { - "Data1": 5302089231581744398, - "Data2": -2829553322146881401, - "Data3": -3489002579382565662, - "Data4": -1033027474710163686 + "Data1": -2912640897140520516, + "Data2": 1955297734287230571 }, "Flags": 5, "Kind": 5, @@ -13458,10 +13046,8 @@ }, { "__Checksum": { - "Data1": -1706238592695823817, - "Data2": -1969189895532892301, - "Data3": 8249984381100599391, - "Data4": 2889833945804745541 + "Data1": -4839426461323516218, + "Data2": -7357964184839644190 }, "Flags": 5, "Kind": 5, @@ -13540,10 +13126,8 @@ }, { "__Checksum": { - "Data1": 7157778027393827252, - "Data2": 5058149222223879158, - "Data3": 6121970771214429711, - "Data4": -2362422628160048644 + "Data1": -7465306118457629040, + "Data2": -6056765371211499007 }, "Flags": 5, "Kind": 5, @@ -13621,10 +13205,8 @@ }, { "__Checksum": { - "Data1": -5630719908149957741, - "Data2": -6002531862796321249, - "Data3": -3854658893762733308, - "Data4": 6413666699784159826 + "Data1": -4457391773025767707, + "Data2": 6546183904323294509 }, "Flags": 5, "Kind": 5, @@ -13702,10 +13284,8 @@ }, { "__Checksum": { - "Data1": -5540987684955985298, - "Data2": -7261891357055687335, - "Data3": 4795942642892449995, - "Data4": 2208513722393600971 + "Data1": 4671713790977591968, + "Data2": 8649844530744662005 }, "Flags": 5, "Kind": 5, @@ -13783,10 +13363,8 @@ }, { "__Checksum": { - "Data1": 4951000024792845842, - "Data2": 7172423306386974723, - "Data3": 3773576261458345209, - "Data4": -6619800341225533920 + "Data1": 5387093294536841416, + "Data2": -764906339233839182 }, "Flags": 5, "Kind": 5, @@ -13865,10 +13443,8 @@ }, { "__Checksum": { - "Data1": -74803577687620993, - "Data2": -520900708601811481, - "Data3": -7103467086716433570, - "Data4": -7372881803926479393 + "Data1": 1503968869596006482, + "Data2": 1647605007837720388 }, "Flags": 5, "Kind": 5, @@ -13947,10 +13523,8 @@ }, { "__Checksum": { - "Data1": 5455419386655034927, - "Data2": 2957473262225843591, - "Data3": -5144916187087283968, - "Data4": 7286048394720785230 + "Data1": 8624482279617154258, + "Data2": -6240242640447647753 }, "Flags": 5, "Kind": 5, @@ -14021,10 +13595,8 @@ }, { "__Checksum": { - "Data1": -4493757197396969501, - "Data2": 4518874858231207033, - "Data3": 6812147389928875476, - "Data4": 6003388765037394106 + "Data1": -7974145634167951765, + "Data2": -4702144858311634723 }, "Flags": 5, "Kind": 5, @@ -14095,10 +13667,8 @@ }, { "__Checksum": { - "Data1": -7547839035330327281, - "Data2": -6009805244915295952, - "Data3": 6031758469491993599, - "Data4": -2305760910458048196 + "Data1": 7777626432735934265, + "Data2": -8190813890246372067 }, "Flags": 1, "Kind": 5, @@ -14138,10 +13708,8 @@ }, { "__Checksum": { - "Data1": -4713792741701860107, - "Data2": 3035223984465172645, - "Data3": 4407590086734513350, - "Data4": 4354355592650378775 + "Data1": -1480119499239990566, + "Data2": -1767457815921236109 }, "Flags": 3, "Kind": 5, @@ -14181,10 +13749,8 @@ }, { "__Checksum": { - "Data1": 6089807836698710017, - "Data2": 1923342791773780729, - "Data3": -3321113256482880169, - "Data4": -4598368170439043719 + "Data1": 5026524229635688896, + "Data2": -6583019087530357644 }, "Flags": 1, "Kind": 5, @@ -14224,10 +13790,8 @@ }, { "__Checksum": { - "Data1": 5013345332785108445, - "Data2": -9078802676009314781, - "Data3": -1729813463818263278, - "Data4": 2252133961174112274 + "Data1": 3109466879547940869, + "Data2": 1061750029632233177 }, "Flags": 3, "Kind": 5, @@ -14267,10 +13831,8 @@ }, { "__Checksum": { - "Data1": -7906274991127220944, - "Data2": -4113750146911802686, - "Data3": 7752270427021136582, - "Data4": -8643641312693953189 + "Data1": -4212353630628857427, + "Data2": -1019341018707167985 }, "Flags": 1, "Kind": 5, @@ -14310,10 +13872,8 @@ }, { "__Checksum": { - "Data1": 7269758082759047350, - "Data2": -7356546443504830295, - "Data3": 6050129478013815339, - "Data4": -5074600476497029699 + "Data1": 4566100773478740664, + "Data2": -1804132674536741296 }, "Flags": 3, "Kind": 5, @@ -14353,10 +13913,8 @@ }, { "__Checksum": { - "Data1": 7218179540690455941, - "Data2": -3951860283471299584, - "Data3": 6299457212117816904, - "Data4": -8313180315388037910 + "Data1": -1835534227364804016, + "Data2": 3356407428474868064 }, "Flags": 1, "Kind": 5, @@ -14396,10 +13954,8 @@ }, { "__Checksum": { - "Data1": -2056523842478744371, - "Data2": 1454554583740579802, - "Data3": 8788822717183673333, - "Data4": 7009635099139154341 + "Data1": -4327229743211727277, + "Data2": -5590043234963861978 }, "Flags": 3, "Kind": 5, @@ -14439,10 +13995,8 @@ }, { "__Checksum": { - "Data1": 5219682153750997928, - "Data2": 4538516174744865560, - "Data3": 934025114522440588, - "Data4": 3807830366126171670 + "Data1": -2095894934968865222, + "Data2": -8790443776427753359 }, "Flags": 1, "Kind": 5, @@ -14482,10 +14036,8 @@ }, { "__Checksum": { - "Data1": -2779863032386724895, - "Data2": 8733779216003305266, - "Data3": 1969741694700435209, - "Data4": -1936636121404222205 + "Data1": -1712412906930799773, + "Data2": 6649529558115327947 }, "Flags": 3, "Kind": 5, @@ -14525,10 +14077,8 @@ }, { "__Checksum": { - "Data1": 331459240213669981, - "Data2": 3873200421291993987, - "Data3": 6913134545792648289, - "Data4": 8341512001404559307 + "Data1": -6148194273056401745, + "Data2": 1738408121222537137 }, "Flags": 1, "Kind": 5, @@ -14568,10 +14118,8 @@ }, { "__Checksum": { - "Data1": 3724340368892768585, - "Data2": 1649755223735979800, - "Data3": -1893166174792121162, - "Data4": 4618085164613446038 + "Data1": -1118144591338628306, + "Data2": -4226256606856808397 }, "Flags": 3, "Kind": 5, @@ -14611,10 +14159,8 @@ }, { "__Checksum": { - "Data1": -4789415803525893115, - "Data2": -5620185862145100922, - "Data3": 2055024854313118396, - "Data4": -9194913527402574483 + "Data1": 5785117795290010483, + "Data2": 8787894690430808177 }, "Flags": 5, "Kind": 7, @@ -14648,10 +14194,8 @@ }, { "__Checksum": { - "Data1": 4072456247900910599, - "Data2": 6684783366291711703, - "Data3": -3478156761428997743, - "Data4": 7756048347756860073 + "Data1": 98029552728942696, + "Data2": 5073204014138796323 }, "Flags": 5, "Kind": 6, diff --git a/src/Shared/files/Tooling/taghelpers.json b/src/Shared/files/Tooling/taghelpers.json index bf95ce290f4..2f1373ad164 100644 --- a/src/Shared/files/Tooling/taghelpers.json +++ b/src/Shared/files/Tooling/taghelpers.json @@ -1,10 +1,8 @@ [ { "__Checksum": { - "Data1": 7203041464518978649, - "Data2": -8764843531274315818, - "Data3": 4261457565556229476, - "Data4": 727005897643540887 + "Data1": 7539308493831707155, + "Data2": -3537692671856453644 }, "Flags": 1, "Name": "Endpoints.Pages.Index", @@ -20,10 +18,8 @@ }, { "__Checksum": { - "Data1": 7512683206576917965, - "Data2": -5997856482486375184, - "Data3": 3152104747160591067, - "Data4": -6977426016503741153 + "Data1": 3983170275535771501, + "Data2": 9069007682404135377 }, "Flags": 3, "Name": "Endpoints.Pages.Index", @@ -39,10 +35,8 @@ }, { "__Checksum": { - "Data1": 5762214137632827989, - "Data2": -8563241455615309164, - "Data3": 4140078421501155012, - "Data4": 5611881995471547613 + "Data1": -8086709861066057822, + "Data2": 6252824742040040149 }, "Flags": 1, "Name": "Endpoints.Shared.MainLayout", @@ -72,10 +66,8 @@ }, { "__Checksum": { - "Data1": -3516081282501993043, - "Data2": -8096574578659866863, - "Data3": -6952362138453408292, - "Data4": 8249036956775854130 + "Data1": 7061317996224925229, + "Data2": -14221433403436349 }, "Flags": 3, "Name": "Endpoints.Shared.MainLayout", @@ -105,10 +97,8 @@ }, { "__Checksum": { - "Data1": 4045452938648243579, - "Data2": 444105661453260367, - "Data3": -3925074008142981988, - "Data4": -3290384311101392011 + "Data1": -3302447676643304017, + "Data2": -2509494625339363231 }, "Flags": 1, "Kind": 3, @@ -127,10 +117,8 @@ }, { "__Checksum": { - "Data1": -2900741042431913784, - "Data2": -3781903869979907934, - "Data3": -8113173631546638342, - "Data4": -5073550628659523042 + "Data1": 2167161707817677364, + "Data2": -7676267143789280022 }, "Flags": 3, "Kind": 3, @@ -149,10 +137,8 @@ }, { "__Checksum": { - "Data1": -1091963018046263883, - "Data2": 5495832850854241005, - "Data3": -4712740170436059866, - "Data4": 7246956927257513156 + "Data1": -3017232085919542705, + "Data2": -1744984894701869360 }, "Flags": 1, "Name": "Endpoints.Shared.NavMenu", @@ -168,10 +154,8 @@ }, { "__Checksum": { - "Data1": 5661211638003288314, - "Data2": 5063177711457174379, - "Data3": -463723576400269864, - "Data4": 5542138934393962848 + "Data1": 5432725817024116751, + "Data2": 4117053206969148653 }, "Flags": 3, "Name": "Endpoints.Shared.NavMenu", @@ -187,10 +171,8 @@ }, { "__Checksum": { - "Data1": -2993744999892680001, - "Data2": 8426309872556443997, - "Data3": 3644118846908206591, - "Data4": -6606618177670364490 + "Data1": -2073452782830541613, + "Data2": 7210571982607254113 }, "Flags": 1, "Name": "Endpoints.App", @@ -206,10 +188,8 @@ }, { "__Checksum": { - "Data1": 1592394674920057971, - "Data2": 7912748281462203182, - "Data3": -2954971777307790646, - "Data4": -244744161412844938 + "Data1": 1421900471592462748, + "Data2": 5718403086465700938 }, "Flags": 3, "Name": "Endpoints.App", @@ -225,10 +205,8 @@ }, { "__Checksum": { - "Data1": -2061840384373373838, - "Data2": 1190058466437706929, - "Data3": 1846082861170071865, - "Data4": -2349470867573850851 + "Data1": 2216148760279046147, + "Data2": 1328841504463550331 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -296,10 +274,8 @@ }, { "__Checksum": { - "Data1": -4350529693092124949, - "Data2": 3940720439296550854, - "Data3": 7119269284336475620, - "Data4": 7426326554329129150 + "Data1": -559487567815447628, + "Data2": 4809967443437857271 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", @@ -367,10 +343,8 @@ }, { "__Checksum": { - "Data1": -4943842782849950136, - "Data2": -1105201962604767678, - "Data3": 9130993078998588740, - "Data4": -1025186151021819304 + "Data1": -5351695502483390286, + "Data2": -1178826004116884548 }, "Flags": 1, "Kind": 3, @@ -389,10 +363,8 @@ }, { "__Checksum": { - "Data1": 6586965008416629564, - "Data2": -4143512132698234949, - "Data3": 9115141341655464477, - "Data4": 6735774766810778544 + "Data1": -8400521298171020511, + "Data2": -1581078531674500495 }, "Flags": 3, "Kind": 3, @@ -411,10 +383,8 @@ }, { "__Checksum": { - "Data1": 3750400373904852699, - "Data2": -6347893323856418409, - "Data3": 5087515741534881075, - "Data4": 2539833489579845195 + "Data1": -3827702977126464926, + "Data2": -4071865062116962084 }, "Flags": 1, "Kind": 3, @@ -444,10 +414,8 @@ }, { "__Checksum": { - "Data1": 661570855778320145, - "Data2": -3781626905203355800, - "Data3": -8912490044543656071, - "Data4": 4261176795787378420 + "Data1": 8963748880221271706, + "Data2": 8781627181127290294 }, "Flags": 3, "Kind": 3, @@ -477,10 +445,8 @@ }, { "__Checksum": { - "Data1": -3862880689771800302, - "Data2": -1152936872005509, - "Data3": 3512404127949123705, - "Data4": 3183506785192767310 + "Data1": -2706642759425946064, + "Data2": 1258014953569521925 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -580,10 +546,8 @@ }, { "__Checksum": { - "Data1": 462111362892913470, - "Data2": 4627423984033575517, - "Data3": 6455231861769151275, - "Data4": -7843103196920724087 + "Data1": -6863925580738794542, + "Data2": -7163749061593430073 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", @@ -683,10 +647,8 @@ }, { "__Checksum": { - "Data1": -2276078982883492421, - "Data2": -3334318495468800454, - "Data3": 2958408612835474835, - "Data4": -689707981085904753 + "Data1": -8625481131167572705, + "Data2": -7329854581702226017 }, "Flags": 1, "Kind": 3, @@ -716,10 +678,8 @@ }, { "__Checksum": { - "Data1": -1045384533256841053, - "Data2": -146202473217987553, - "Data3": 933536470952428726, - "Data4": 201800115002019953 + "Data1": 7261462291807592943, + "Data2": 3215786643734869308 }, "Flags": 3, "Kind": 3, @@ -749,10 +709,8 @@ }, { "__Checksum": { - "Data1": 1814088394929163979, - "Data2": -6646761278331709463, - "Data3": -7663104814400133573, - "Data4": -1107344847105982388 + "Data1": -7576620142748472860, + "Data2": 7808569353579599698 }, "Flags": 1, "Kind": 3, @@ -771,10 +729,8 @@ }, { "__Checksum": { - "Data1": -2378198046629525566, - "Data2": -1131303844821329236, - "Data3": 475677133366393293, - "Data4": -6967515066572368697 + "Data1": -6595872787800347159, + "Data2": 6617000305998141447 }, "Flags": 3, "Kind": 3, @@ -793,10 +749,8 @@ }, { "__Checksum": { - "Data1": 647413955507098016, - "Data2": -8778854182960018642, - "Data3": 1436540021836326836, - "Data4": -5650790134999164029 + "Data1": -1098765935226332375, + "Data2": 9151250397011064063 }, "Flags": 1, "Kind": 3, @@ -826,10 +780,8 @@ }, { "__Checksum": { - "Data1": -1731617193185327097, - "Data2": 7325321567054339515, - "Data3": 5641544705089955048, - "Data4": -5342572955301018522 + "Data1": -8551104037373337739, + "Data2": -7849388985341954423 }, "Flags": 3, "Kind": 3, @@ -859,10 +811,8 @@ }, { "__Checksum": { - "Data1": 4419842733786622443, - "Data2": -6159379292196207646, - "Data3": -6488351743077106122, - "Data4": -3003769388923842280 + "Data1": -7695114148139913538, + "Data2": 4007806563306645040 }, "Flags": 1, "Kind": 3, @@ -892,10 +842,8 @@ }, { "__Checksum": { - "Data1": -4360712776327083977, - "Data2": -4654767502481769178, - "Data3": -1472988611690871500, - "Data4": 5817472228783472878 + "Data1": 7601262471438180825, + "Data2": -2965012156716463311 }, "Flags": 3, "Kind": 3, @@ -925,10 +873,8 @@ }, { "__Checksum": { - "Data1": 8109645431380502189, - "Data2": 5032775250140086622, - "Data3": -1636016285141747118, - "Data4": -6840476977232940422 + "Data1": -6392559795621846472, + "Data2": 5389148790673368907 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -958,10 +904,8 @@ }, { "__Checksum": { - "Data1": 6135741920857584738, - "Data2": 6571192655363276963, - "Data3": -8697930197241234405, - "Data4": 4968396799496806151 + "Data1": 6640081091394942084, + "Data2": -5736482858258126963 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", @@ -991,10 +935,8 @@ }, { "__Checksum": { - "Data1": -4997653575673202123, - "Data2": 1246542043565825569, - "Data3": 8387692399165380924, - "Data4": -9112402045649467388 + "Data1": -8677111311896170377, + "Data2": -3211038453328388279 }, "Flags": 1, "Kind": 3, @@ -1013,10 +955,8 @@ }, { "__Checksum": { - "Data1": 3488278038534438660, - "Data2": 7600461511427637458, - "Data3": 4757745717709907994, - "Data4": 3821582980614178279 + "Data1": -7131614057948517348, + "Data2": 635580870947622265 }, "Flags": 3, "Kind": 3, @@ -1035,10 +975,8 @@ }, { "__Checksum": { - "Data1": 833413092886041778, - "Data2": -1327355687405530887, - "Data3": 2876515815041863479, - "Data4": 4872336486466662399 + "Data1": -8231642256271382142, + "Data2": 3954742090573521763 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -1138,10 +1076,8 @@ }, { "__Checksum": { - "Data1": -7355717443075067302, - "Data2": 2194579020965853192, - "Data3": 1443103350626237967, - "Data4": 6147046149136974751 + "Data1": -6070813211050559742, + "Data2": -3440749860692453035 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", @@ -1241,10 +1177,8 @@ }, { "__Checksum": { - "Data1": 3210660678604277403, - "Data2": -3592280048343654040, - "Data3": -3409524501306117226, - "Data4": 4517153709984330548 + "Data1": 3191308662968217769, + "Data2": 7989734047380521437 }, "Flags": 1, "Kind": 3, @@ -1274,10 +1208,8 @@ }, { "__Checksum": { - "Data1": 7889016503366415639, - "Data2": 8795172389488046882, - "Data3": -1518651222707625124, - "Data4": -7675822482446199021 + "Data1": -1548355717417647493, + "Data2": 7357265277774916782 }, "Flags": 3, "Kind": 3, @@ -1307,10 +1239,8 @@ }, { "__Checksum": { - "Data1": 2750100192054604242, - "Data2": 4133876367893641951, - "Data3": 727541562745595917, - "Data4": -3082770989136561069 + "Data1": 466135854108303847, + "Data2": -4012684911464994316 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -1365,10 +1295,8 @@ }, { "__Checksum": { - "Data1": 8470620744864940422, - "Data2": 3407436287982278922, - "Data3": 8121592189541378619, - "Data4": 8833001713130998649 + "Data1": 5474516458379519598, + "Data2": 8612652720247676704 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", @@ -1423,10 +1351,8 @@ }, { "__Checksum": { - "Data1": 7852463782509991998, - "Data2": -4595128067386966839, - "Data3": 678935138031149616, - "Data4": -5274806800758056956 + "Data1": 7200753423627755796, + "Data2": 2040315799566393452 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -1510,10 +1436,8 @@ }, { "__Checksum": { - "Data1": 8628872207621222489, - "Data2": -1957864417768703481, - "Data3": -4630792049467272034, - "Data4": 3798707314794792427 + "Data1": 5715916261214637412, + "Data2": -169143695106396735 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", @@ -1597,10 +1521,8 @@ }, { "__Checksum": { - "Data1": 7273786023751484101, - "Data2": 7701299155162412395, - "Data3": 5852315831670071175, - "Data4": 617321357137385461 + "Data1": -1968347971592629341, + "Data2": 5141710239444601228 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -1684,10 +1606,8 @@ }, { "__Checksum": { - "Data1": -835241519002109052, - "Data2": 5309892341112684991, - "Data3": -2300991986484214461, - "Data4": -394669479097607407 + "Data1": 5526093209656367674, + "Data2": 5346578927153980415 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", @@ -1771,10 +1691,8 @@ }, { "__Checksum": { - "Data1": 6830683586693314834, - "Data2": -844138087755423412, - "Data3": -8207795443234560665, - "Data4": -6725443298871675218 + "Data1": -9028229205043317936, + "Data2": 5025081819577788979 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -1862,10 +1780,8 @@ }, { "__Checksum": { - "Data1": 4136936223145310117, - "Data2": -4631427833504453585, - "Data3": 5772672410715113615, - "Data4": 7844967979399881544 + "Data1": -9056941717554973497, + "Data2": 8457598936320174535 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", @@ -1953,10 +1869,8 @@ }, { "__Checksum": { - "Data1": 3495863336972062099, - "Data2": -8995021667758881436, - "Data3": -6027123475029372260, - "Data4": -23568376906042071 + "Data1": 5516931022607696993, + "Data2": 8450292733267677741 }, "Flags": 1, "Kind": 3, @@ -1975,10 +1889,8 @@ }, { "__Checksum": { - "Data1": -1406559205596116151, - "Data2": 2347721765347299006, - "Data3": 8095143632806953396, - "Data4": 2633905044626425303 + "Data1": -6187166907370547721, + "Data2": 6662925765862819 }, "Flags": 3, "Kind": 3, @@ -1997,10 +1909,8 @@ }, { "__Checksum": { - "Data1": 4833591665422595920, - "Data2": -8955765310432113468, - "Data3": 1030126030174471391, - "Data4": -3695091502072474253 + "Data1": -852312013812375456, + "Data2": 5502968497664844454 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -2055,10 +1965,8 @@ }, { "__Checksum": { - "Data1": -4986057058499189598, - "Data2": 5419893977970060385, - "Data3": 3102126442462890359, - "Data4": -3561926764036548364 + "Data1": -885728258671824118, + "Data2": 5844756370119573472 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputText", @@ -2113,10 +2021,8 @@ }, { "__Checksum": { - "Data1": 89437745828018526, - "Data2": 8634535924619466899, - "Data3": 1141643580486745517, - "Data4": 3938583976196421597 + "Data1": 9108501366804534647, + "Data2": 8638271353683233494 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -2171,10 +2077,8 @@ }, { "__Checksum": { - "Data1": -5153071131990178900, - "Data2": -8496340799492934967, - "Data3": -8024875552401644406, - "Data4": -4815443830497803886 + "Data1": 1114151984309027378, + "Data2": -1720685921409938796 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", @@ -2229,10 +2133,8 @@ }, { "__Checksum": { - "Data1": 2097399500127221876, - "Data2": 8450963110372371872, - "Data3": -9139922390793377688, - "Data4": 7309701625808478949 + "Data1": -5790671952968278714, + "Data2": 5240122915638464558 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -2283,10 +2185,8 @@ }, { "__Checksum": { - "Data1": 7760946631147136800, - "Data2": 7201989109906094772, - "Data3": 4169001786951299931, - "Data4": -6119601772951086932 + "Data1": -7255313684463616159, + "Data2": -5830428935926714104 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", @@ -2337,10 +2237,8 @@ }, { "__Checksum": { - "Data1": -4306884899982601634, - "Data2": -8492126716364448884, - "Data3": 1622501640990734650, - "Data4": -853317612031171813 + "Data1": -8822994317938073382, + "Data2": 2716962534146142397 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -2375,10 +2273,8 @@ }, { "__Checksum": { - "Data1": 2457652425439694940, - "Data2": 3477600694138124223, - "Data3": -4494747605989904288, - "Data4": -5017129667004743808 + "Data1": 5791181129835070213, + "Data2": -3846807912069922970 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", @@ -2413,10 +2309,8 @@ }, { "__Checksum": { - "Data1": 5401611238611883074, - "Data2": -7449764158554568432, - "Data3": -7718788779749823503, - "Data4": 696994082938985306 + "Data1": -549484873053194070, + "Data2": -1602701848605720135 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -2471,10 +2365,8 @@ }, { "__Checksum": { - "Data1": 746941012468573216, - "Data2": 1232344179869135931, - "Data3": 8738133501738997821, - "Data4": 473228319963715879 + "Data1": -5722494614762574717, + "Data2": -3113804973824353979 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", @@ -2529,10 +2421,8 @@ }, { "__Checksum": { - "Data1": -5444288586770056574, - "Data2": 169997535508407934, - "Data3": 992342171960606673, - "Data4": 5540419406925247691 + "Data1": 2645346105637979373, + "Data2": -7178519843324818068 }, "Flags": 1, "Kind": 3, @@ -2551,10 +2441,8 @@ }, { "__Checksum": { - "Data1": -6742649563438092601, - "Data2": 6687979634245470336, - "Data3": -3470236226963134561, - "Data4": -5153681974655923159 + "Data1": 7761261965686255321, + "Data2": 6229536706348435238 }, "Flags": 3, "Kind": 3, @@ -2573,10 +2461,8 @@ }, { "__Checksum": { - "Data1": -4867693650653429252, - "Data2": -2698023094792738614, - "Data3": 4432680961390647041, - "Data4": -7790513193685711865 + "Data1": 1701588677090682699, + "Data2": 3589240776357621231 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -2593,10 +2479,8 @@ }, { "__Checksum": { - "Data1": -4906934009223325823, - "Data2": 7399302386236534430, - "Data3": 1274335753928031642, - "Data4": 1724080435614141455 + "Data1": -7357674198735438381, + "Data2": 6571978664802641209 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", @@ -2613,10 +2497,8 @@ }, { "__Checksum": { - "Data1": -1442207631154266706, - "Data2": 1222551853528553381, - "Data3": -9069089201024585716, - "Data4": -3141724808949561987 + "Data1": -3907087629682884063, + "Data2": 6104971476478648747 }, "Flags": 1, "Name": "Telerik.Blazor.Common.Validation.LocalizedDataAnnotationValidator", @@ -2633,10 +2515,8 @@ }, { "__Checksum": { - "Data1": 6816479478984086030, - "Data2": 6090268348480380282, - "Data3": 6760329917133319749, - "Data4": -6735894314388932826 + "Data1": -1537239905570680291, + "Data2": 5837259637437542364 }, "Flags": 3, "Name": "Telerik.Blazor.Common.Validation.LocalizedDataAnnotationValidator", @@ -2653,10 +2533,8 @@ }, { "__Checksum": { - "Data1": -7812447867393936613, - "Data2": 1799265113251158044, - "Data3": -1389651435428689432, - "Data4": 4594063488470566920 + "Data1": 4429124817158987828, + "Data2": 1896663908618328534 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikAnimationContainer", @@ -2774,10 +2652,8 @@ }, { "__Checksum": { - "Data1": 2820860684960849564, - "Data2": -2122735551818577564, - "Data3": 7497616077852574168, - "Data4": 5017155002386902473 + "Data1": -6186844257222120609, + "Data2": 3751187734279900969 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikAnimationContainer", @@ -2895,10 +2771,8 @@ }, { "__Checksum": { - "Data1": -5633888335655567207, - "Data2": 6699753998545268545, - "Data3": 9101219036507354190, - "Data4": 5274371047126143819 + "Data1": 8374704883857971461, + "Data2": -7742057245946184377 }, "Flags": 1, "Kind": 3, @@ -2916,10 +2790,8 @@ }, { "__Checksum": { - "Data1": 99629092376998212, - "Data2": -9205514317402185660, - "Data3": 9147331681671747728, - "Data4": 7150610591849447943 + "Data1": 752838457671282628, + "Data2": -6524834605150022568 }, "Flags": 3, "Kind": 3, @@ -2937,10 +2809,8 @@ }, { "__Checksum": { - "Data1": -7508350287086181782, - "Data2": 7513566962844904387, - "Data3": -8049750093424336591, - "Data4": -8319969362582942258 + "Data1": 3538944251572928125, + "Data2": 2006721402366248390 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikAutoComplete", @@ -3176,10 +3046,8 @@ }, { "__Checksum": { - "Data1": -9084585046629492778, - "Data2": -7794742786601902483, - "Data3": -8384139204089153940, - "Data4": -3180621262225900951 + "Data1": 2025173365262725529, + "Data2": 8491635644370401891 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikAutoComplete", @@ -3415,10 +3283,8 @@ }, { "__Checksum": { - "Data1": 2207480366248149336, - "Data2": 1531402102222020649, - "Data3": -9100964797622908156, - "Data4": 7632904976539537631 + "Data1": 6521036862746622382, + "Data2": 1645943386249647975 }, "Flags": 1, "Kind": 3, @@ -3437,10 +3303,8 @@ }, { "__Checksum": { - "Data1": 3094672862785629968, - "Data2": -8447833863850579771, - "Data3": -8447507710357297434, - "Data4": 3957100002902214953 + "Data1": -3614073077229412250, + "Data2": -1122658851815743317 }, "Flags": 3, "Kind": 3, @@ -3459,10 +3323,8 @@ }, { "__Checksum": { - "Data1": 5085076070543607958, - "Data2": 3334712594162562742, - "Data3": 5669974973323825438, - "Data4": 5875346215266904201 + "Data1": -639960253731653204, + "Data2": 4819541136116680387 }, "Flags": 1, "Kind": 3, @@ -3481,10 +3343,8 @@ }, { "__Checksum": { - "Data1": -2338766851828027052, - "Data2": -4724687004538265112, - "Data3": -8568100190862456008, - "Data4": 4661630546548786525 + "Data1": 4102194041036862278, + "Data2": -2462097081109438994 }, "Flags": 3, "Kind": 3, @@ -3503,10 +3363,8 @@ }, { "__Checksum": { - "Data1": 3104852172131442027, - "Data2": 2552974059574216426, - "Data3": -4287265225830333664, - "Data4": -2461161964782570694 + "Data1": 6816278720626867964, + "Data2": 5800322028670055874 }, "Flags": 1, "Kind": 3, @@ -3536,10 +3394,8 @@ }, { "__Checksum": { - "Data1": -8882264993431325716, - "Data2": -8436644799619999761, - "Data3": -7112340980243662012, - "Data4": 9094117945870210219 + "Data1": 8862434680623087763, + "Data2": -846916310242485114 }, "Flags": 3, "Kind": 3, @@ -3569,10 +3425,8 @@ }, { "__Checksum": { - "Data1": -1882814353337975576, - "Data2": -5218675558918646873, - "Data3": 5970957639500208367, - "Data4": 4531551365595926096 + "Data1": 7106167049034856581, + "Data2": -6877801863028556227 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ButtonGroupToggleButton", @@ -3713,10 +3567,8 @@ }, { "__Checksum": { - "Data1": -263191197861234840, - "Data2": -6476000338403921234, - "Data3": 9117831779750609345, - "Data4": -3885992721975869570 + "Data1": -6563185248348599645, + "Data2": -4687838879671958136 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ButtonGroupToggleButton", @@ -3857,10 +3709,8 @@ }, { "__Checksum": { - "Data1": -8348937944366300193, - "Data2": 6636366500605136611, - "Data3": -5260338334472644407, - "Data4": -5064387457646178127 + "Data1": -7226842061189611093, + "Data2": -3791192255551475532 }, "Flags": 1, "Kind": 3, @@ -3878,10 +3728,8 @@ }, { "__Checksum": { - "Data1": -2662180414173593475, - "Data2": -8419881647793944136, - "Data3": -4965178051795853998, - "Data4": -6049785251213441379 + "Data1": -3515569825546849998, + "Data2": -954981747835706601 }, "Flags": 3, "Kind": 3, @@ -3899,10 +3747,8 @@ }, { "__Checksum": { - "Data1": -9000192423349967650, - "Data2": -8323531042524253395, - "Data3": 2296390852114264504, - "Data4": 3645746532028711183 + "Data1": -5018408780603431584, + "Data2": -2748206248742703133 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikButtonGroup", @@ -3964,10 +3810,8 @@ }, { "__Checksum": { - "Data1": 4709574473868977857, - "Data2": -2435861942996635926, - "Data3": -4057930644916748104, - "Data4": -6745626912186525908 + "Data1": 5709486818271310671, + "Data2": -9048687581358493790 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikButtonGroup", @@ -4029,10 +3873,8 @@ }, { "__Checksum": { - "Data1": -7628152242502429236, - "Data2": -7653716527048800471, - "Data3": 8394577717384058013, - "Data4": 8588740353521454847 + "Data1": -2350742615264795404, + "Data2": -748033415498459184 }, "Flags": 1, "Kind": 3, @@ -4050,10 +3892,8 @@ }, { "__Checksum": { - "Data1": 2693037570789212071, - "Data2": 3778680153967791019, - "Data3": 4512344972176264130, - "Data4": 2470224023256736631 + "Data1": -5753608030242293988, + "Data2": -9211724544317062499 }, "Flags": 3, "Kind": 3, @@ -4071,10 +3911,8 @@ }, { "__Checksum": { - "Data1": -94348109574143137, - "Data2": -8201590249393328965, - "Data3": -7586885610626617145, - "Data4": 6976516391236606861 + "Data1": 4648060349225417222, + "Data2": -6332488881789828571 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikButton", @@ -4211,10 +4049,8 @@ }, { "__Checksum": { - "Data1": -4956171369479335859, - "Data2": 650462600708010428, - "Data3": 7053054175420866250, - "Data4": 3314628864556570831 + "Data1": -3991704351224225516, + "Data2": 5929311484318725330 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikButton", @@ -4351,10 +4187,8 @@ }, { "__Checksum": { - "Data1": 1827756261002217518, - "Data2": 4339681988797601235, - "Data3": 6186102021731880103, - "Data4": -4640226269253071779 + "Data1": 8582818834624530515, + "Data2": -2605933107353066728 }, "Flags": 1, "Kind": 3, @@ -4372,10 +4206,8 @@ }, { "__Checksum": { - "Data1": -6418036837737940038, - "Data2": 4041294769973060355, - "Data3": 3325405467313371027, - "Data4": -1076947430897734436 + "Data1": 1191517024904723032, + "Data2": 980285068684521168 }, "Flags": 3, "Kind": 3, @@ -4393,10 +4225,8 @@ }, { "__Checksum": { - "Data1": 8181778111693964125, - "Data2": -8185475505098797442, - "Data3": -8892739051601855304, - "Data4": 7420309245288655022 + "Data1": 3670095806171209734, + "Data2": 2957918802836975651 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikCalendar", @@ -4571,10 +4401,8 @@ }, { "__Checksum": { - "Data1": -8778829746546506551, - "Data2": -4092645364983916507, - "Data3": 2014181851932243679, - "Data4": -7175595584696415866 + "Data1": 6756195081159417023, + "Data2": -3325296771819667887 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikCalendar", @@ -4749,10 +4577,8 @@ }, { "__Checksum": { - "Data1": 8748181773675128428, - "Data2": 6194045029694672469, - "Data3": -665144243750849340, - "Data4": -6860204211974736329 + "Data1": -4532219287157460315, + "Data2": -2411792740288268145 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxes", @@ -4782,10 +4608,8 @@ }, { "__Checksum": { - "Data1": 4390612003911384224, - "Data2": 7330403681501489812, - "Data3": -3462966010766401485, - "Data4": -218830035318572032 + "Data1": -1680562793731932364, + "Data2": -3796158017396839666 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxes", @@ -4815,10 +4639,8 @@ }, { "__Checksum": { - "Data1": -1485890023267066368, - "Data2": -2729498849977653933, - "Data3": -3244622642363245922, - "Data4": 5908303385559517996 + "Data1": -7365429585849733192, + "Data2": 4437113919231041588 }, "Flags": 1, "Kind": 3, @@ -4836,10 +4658,8 @@ }, { "__Checksum": { - "Data1": -8895520504087127319, - "Data2": 8966300619702526997, - "Data3": 3130830306012529391, - "Data4": 1649902890563361383 + "Data1": -2299714110854332442, + "Data2": -2812189044902757123 }, "Flags": 3, "Kind": 3, @@ -4857,10 +4677,8 @@ }, { "__Checksum": { - "Data1": -587599783995171045, - "Data2": -7251397923014206642, - "Data3": 4418930619668136231, - "Data4": 528215081277320092 + "Data1": -6180570731477083625, + "Data2": -3874350709226526537 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxis", @@ -5001,10 +4819,8 @@ }, { "__Checksum": { - "Data1": -7120340059734550617, - "Data2": 3667371440028123022, - "Data3": -2282042715795004722, - "Data4": -92797459912816686 + "Data1": 3962823324348853140, + "Data2": 735206351761881797 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxis", @@ -5145,10 +4961,8 @@ }, { "__Checksum": { - "Data1": -7969932178660702508, - "Data2": -956625457626037768, - "Data3": -6039501582640426600, - "Data4": -8891996549148736512 + "Data1": 5682934425818685828, + "Data2": 9092000663921887624 }, "Flags": 1, "Kind": 3, @@ -5166,10 +4980,8 @@ }, { "__Checksum": { - "Data1": 2546374002536591781, - "Data2": 2816776853220595187, - "Data3": -3989329493161107379, - "Data4": 4901531941162309291 + "Data1": 7300983879197768270, + "Data2": 454609845254304610 }, "Flags": 3, "Kind": 3, @@ -5187,10 +4999,8 @@ }, { "__Checksum": { - "Data1": -2400349927815021290, - "Data2": -6181946079563772988, - "Data3": -5833084875247923566, - "Data4": -4318029469802372347 + "Data1": -3328555002023421823, + "Data2": 6580860731563063607 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisAutoBaseUnitSteps", @@ -5284,10 +5094,8 @@ }, { "__Checksum": { - "Data1": -8901390202661092704, - "Data2": 1560478316503973889, - "Data3": 5181250101398752191, - "Data4": -2139944671818130596 + "Data1": 8785370203388880332, + "Data2": -945285854450466161 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisAutoBaseUnitSteps", @@ -5381,10 +5189,8 @@ }, { "__Checksum": { - "Data1": -5323619914153308302, - "Data2": 5463047277165931559, - "Data3": -9154048474660865022, - "Data4": 5488440299841033735 + "Data1": 1136705659309084, + "Data2": -5742181336137961947 }, "Flags": 1, "Kind": 3, @@ -5402,10 +5208,8 @@ }, { "__Checksum": { - "Data1": 5145196457095673236, - "Data2": -8302114929751913610, - "Data3": 7783686654023058022, - "Data4": 3057479578879156318 + "Data1": 4618958381457316055, + "Data2": 3283166556126920109 }, "Flags": 3, "Kind": 3, @@ -5423,10 +5227,8 @@ }, { "__Checksum": { - "Data1": 2361027864371930820, - "Data2": -9143828765626839776, - "Data3": 7832075137433193993, - "Data4": 3774761009452314940 + "Data1": -3199924123365077270, + "Data2": 4387457657860662401 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabels", @@ -5536,10 +5338,8 @@ }, { "__Checksum": { - "Data1": -3400814837778253905, - "Data2": -1881750116968581056, - "Data3": -412369788399291734, - "Data4": -1728803856134313584 + "Data1": -2969336307732360833, + "Data2": -6005724768859501760 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabels", @@ -5649,10 +5449,8 @@ }, { "__Checksum": { - "Data1": 7783912374801063708, - "Data2": 5985720056511608539, - "Data3": -1472626101833606222, - "Data4": -2765003304830915046 + "Data1": 8356964446981685639, + "Data2": -814872362234658790 }, "Flags": 1, "Kind": 3, @@ -5670,10 +5468,8 @@ }, { "__Checksum": { - "Data1": 6112092591385283337, - "Data2": 7977554076484081164, - "Data3": 979148447804261641, - "Data4": -5876389291182963114 + "Data1": -3732044810949381256, + "Data2": -8268244846727185159 }, "Flags": 3, "Kind": 3, @@ -5691,10 +5487,8 @@ }, { "__Checksum": { - "Data1": 6064951069232655559, - "Data2": 6801294586007028394, - "Data3": -2688150150517711849, - "Data4": -3269485687205917923 + "Data1": 5284080096138815938, + "Data2": -5853472451416215059 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabelsBorder", @@ -5748,10 +5542,8 @@ }, { "__Checksum": { - "Data1": 2442526752467563260, - "Data2": 8252992202233493866, - "Data3": -4750011599217058773, - "Data4": 1167918430591498371 + "Data1": 1503023124796934702, + "Data2": -5049089676750453085 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabelsBorder", @@ -5805,10 +5597,8 @@ }, { "__Checksum": { - "Data1": 7590631670431957761, - "Data2": 3364744285051805245, - "Data3": 1475353241064680748, - "Data4": 2134009117597431372 + "Data1": -1805264940678424819, + "Data2": -7995973167788028086 }, "Flags": 1, "Kind": 3, @@ -5826,10 +5616,8 @@ }, { "__Checksum": { - "Data1": 5236107251799763560, - "Data2": 7796193015828320234, - "Data3": -5183918323709846212, - "Data4": 3402503529001842202 + "Data1": 1510811801493583790, + "Data2": 263042461657645366 }, "Flags": 3, "Kind": 3, @@ -5847,10 +5635,8 @@ }, { "__Checksum": { - "Data1": 773949757858893152, - "Data2": -6407981107731275088, - "Data3": 1919300491223031921, - "Data4": 1000636861770463389 + "Data1": -8614846154558295496, + "Data2": -7023120439834288788 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabelsMargin", @@ -5912,10 +5698,8 @@ }, { "__Checksum": { - "Data1": -2273269078326742578, - "Data2": -4691418157340281698, - "Data3": 7449648945631194695, - "Data4": 15349823921335482 + "Data1": 6728319400645292219, + "Data2": 5401761824667582808 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabelsMargin", @@ -5977,10 +5761,8 @@ }, { "__Checksum": { - "Data1": -3743957976673976965, - "Data2": -7649264961760634751, - "Data3": 7804110389403936654, - "Data4": -2013302134418267564 + "Data1": 2201895414584304780, + "Data2": 7033663329778016580 }, "Flags": 1, "Kind": 3, @@ -5998,10 +5780,8 @@ }, { "__Checksum": { - "Data1": 4838884190719310988, - "Data2": 1108940906262937181, - "Data3": -7185773108158183026, - "Data4": -837971799422632279 + "Data1": 163857696293700766, + "Data2": 987523541477908378 }, "Flags": 3, "Kind": 3, @@ -6019,10 +5799,8 @@ }, { "__Checksum": { - "Data1": -7098750340448971539, - "Data2": 4614214177256485703, - "Data3": 8772030080827764641, - "Data4": 715054118796901182 + "Data1": -9087576807083608853, + "Data2": -7658872564229550071 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabelsPadding", @@ -6084,10 +5862,8 @@ }, { "__Checksum": { - "Data1": -540259119918016238, - "Data2": 5923794541505419378, - "Data3": 7992780614465711425, - "Data4": -4089109058282391824 + "Data1": 2295106531554836736, + "Data2": 4637714425941832627 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabelsPadding", @@ -6149,10 +5925,8 @@ }, { "__Checksum": { - "Data1": -5784442274312710313, - "Data2": -5348920054132648865, - "Data3": 1791442931471519170, - "Data4": 5239196539157365297 + "Data1": -5516087528671603550, + "Data2": 3688276144078240472 }, "Flags": 1, "Kind": 3, @@ -6170,10 +5944,8 @@ }, { "__Checksum": { - "Data1": -745654778102454498, - "Data2": 4423902831909876096, - "Data3": -5608053657678890757, - "Data4": -4044937429266427231 + "Data1": -7374530775150696157, + "Data2": 4553593374422030379 }, "Flags": 3, "Kind": 3, @@ -6191,10 +5963,8 @@ }, { "__Checksum": { - "Data1": 3567701631867460678, - "Data2": -878543319824705905, - "Data3": -5572530009553542264, - "Data4": 6646541455043273862 + "Data1": -1093048638577147544, + "Data2": 1364810895885713825 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabelsRotation", @@ -6240,10 +6010,8 @@ }, { "__Checksum": { - "Data1": 120310717183361719, - "Data2": -5457433277390508183, - "Data3": 5363844162874027154, - "Data4": 2363154203027555074 + "Data1": 5624634981857002935, + "Data2": -3217486690351904838 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisLabelsRotation", @@ -6289,10 +6057,8 @@ }, { "__Checksum": { - "Data1": -4979615934808096068, - "Data2": -3146199764489197048, - "Data3": -2244917731518696310, - "Data4": -8543590798123561859 + "Data1": -5171011563183597299, + "Data2": -2396958881080604395 }, "Flags": 1, "Kind": 3, @@ -6310,10 +6076,8 @@ }, { "__Checksum": { - "Data1": 7244696853845022698, - "Data2": 9001532475085961417, - "Data3": 4404054435695335864, - "Data4": 7775058467494647558 + "Data1": 913110333267983925, + "Data2": 8359293699820286225 }, "Flags": 3, "Kind": 3, @@ -6331,10 +6095,8 @@ }, { "__Checksum": { - "Data1": -7761871488176967614, - "Data2": -626869271847949430, - "Data3": -7461119624836053918, - "Data4": 2335129270153056223 + "Data1": 1720096491090511959, + "Data2": 3906902213569558023 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisMajorGridLines", @@ -6412,10 +6174,8 @@ }, { "__Checksum": { - "Data1": 4692398863699823812, - "Data2": -6909342754677161345, - "Data3": -2253523249238299531, - "Data4": 2451165912682378524 + "Data1": -2602763098874460008, + "Data2": 7933505565326127781 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisMajorGridLines", @@ -6493,10 +6253,8 @@ }, { "__Checksum": { - "Data1": -9063088456039399178, - "Data2": -6986319896587682150, - "Data3": 3365561918135316692, - "Data4": 1616701868678083481 + "Data1": 7618778227182182899, + "Data2": 8147873788852352951 }, "Flags": 1, "Kind": 3, @@ -6514,10 +6272,8 @@ }, { "__Checksum": { - "Data1": 1666751749511762738, - "Data2": -3906284288989416164, - "Data3": 2313129302478593172, - "Data4": 5504891887468463063 + "Data1": 10835870182087776, + "Data2": -6579345575040078971 }, "Flags": 3, "Kind": 3, @@ -6535,10 +6291,8 @@ }, { "__Checksum": { - "Data1": 2006653753098693088, - "Data2": -4817850723686920098, - "Data3": 7132206945601273987, - "Data4": 3104178165569212013 + "Data1": 8832345978234616241, + "Data2": 2844063685468566452 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisMajorTicks", @@ -6616,10 +6370,8 @@ }, { "__Checksum": { - "Data1": -9009784954400184972, - "Data2": 786980830174747496, - "Data3": -1529355631585966700, - "Data4": -4040237024484282093 + "Data1": 3706970624982423325, + "Data2": -3897241517726925934 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisMajorTicks", @@ -6697,10 +6449,8 @@ }, { "__Checksum": { - "Data1": 456701248074748550, - "Data2": 6386565905383234542, - "Data3": 7353376886532283547, - "Data4": 2805918712974726611 + "Data1": -1854625619704142160, + "Data2": 4593578326921043707 }, "Flags": 1, "Kind": 3, @@ -6718,10 +6468,8 @@ }, { "__Checksum": { - "Data1": -589831056705398029, - "Data2": 2419274850515432107, - "Data3": 6413427954401023600, - "Data4": 384644071880056239 + "Data1": -5028416385529123047, + "Data2": 753972217736179804 }, "Flags": 3, "Kind": 3, @@ -6739,10 +6487,8 @@ }, { "__Checksum": { - "Data1": 9144492318243113120, - "Data2": -1733531711894438884, - "Data3": 2156324028174646841, - "Data4": -3778765390880305406 + "Data1": 4025857892865228025, + "Data2": 1411183943663949512 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisMinorGridLines", @@ -6820,10 +6566,8 @@ }, { "__Checksum": { - "Data1": -1945025523444488139, - "Data2": 5525749511065134404, - "Data3": -2805791606895946036, - "Data4": 377024518842037137 + "Data1": -1205808116034119676, + "Data2": 6391339797725552794 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisMinorGridLines", @@ -6901,10 +6645,8 @@ }, { "__Checksum": { - "Data1": 4176531198631152533, - "Data2": -5922282171363909137, - "Data3": -7248256755689760242, - "Data4": -6997405988809356177 + "Data1": -2744585430572282519, + "Data2": -1996479426859087154 }, "Flags": 1, "Kind": 3, @@ -6922,10 +6664,8 @@ }, { "__Checksum": { - "Data1": 6178313955012735318, - "Data2": -8309448650038019544, - "Data3": 1303255692958860672, - "Data4": 3407880443758352578 + "Data1": 5981562274035362454, + "Data2": 4625961834102729482 }, "Flags": 3, "Kind": 3, @@ -6943,10 +6683,8 @@ }, { "__Checksum": { - "Data1": -5021922734411425576, - "Data2": -3760442422040806916, - "Data3": -4906939509907116442, - "Data4": -874802785232405548 + "Data1": -8473425838268736298, + "Data2": 7341732357695805935 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisMinorTicks", @@ -7024,10 +6762,8 @@ }, { "__Checksum": { - "Data1": 7666718367425837702, - "Data2": -5214972062819622014, - "Data3": 6184573884220298915, - "Data4": 521846207799134784 + "Data1": 5331193299711172420, + "Data2": -4029198353304693856 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisMinorTicks", @@ -7105,10 +6841,8 @@ }, { "__Checksum": { - "Data1": -4222947561617738206, - "Data2": -5326061332888774051, - "Data3": -7629938879208371784, - "Data4": 4096299825473625723 + "Data1": -2285286676085834192, + "Data2": -6335651761256799565 }, "Flags": 1, "Kind": 3, @@ -7126,10 +6860,8 @@ }, { "__Checksum": { - "Data1": -3523785872483039657, - "Data2": -4103447083755368780, - "Data3": 8902910862947547969, - "Data4": 579553330344237003 + "Data1": 2316371681966604771, + "Data2": 1566004834775867906 }, "Flags": 3, "Kind": 3, @@ -7147,10 +6879,8 @@ }, { "__Checksum": { - "Data1": -7354016296422208990, - "Data2": 6961226956880117740, - "Data3": 8658821469764563457, - "Data4": -2926933388607633589 + "Data1": 6220578241278051174, + "Data2": -754250755258651298 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisTitle", @@ -7228,10 +6958,8 @@ }, { "__Checksum": { - "Data1": 2878707454946198353, - "Data2": -7174786376663944446, - "Data3": 2357951023914487865, - "Data4": 8271513355170823087 + "Data1": 4750153303423347073, + "Data2": 4193780209503513129 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisTitle", @@ -7309,10 +7037,8 @@ }, { "__Checksum": { - "Data1": 5197554547199584988, - "Data2": -8545187358150947619, - "Data3": 6520585160769370330, - "Data4": -7727460903300122933 + "Data1": -1840212019455165325, + "Data2": -4738006523556752987 }, "Flags": 1, "Kind": 3, @@ -7330,10 +7056,8 @@ }, { "__Checksum": { - "Data1": -6601479360660344622, - "Data2": 1423031892866764848, - "Data3": -2906377964770016580, - "Data4": -2364302403148187449 + "Data1": -7291305154236444415, + "Data2": -5685413623220114232 }, "Flags": 3, "Kind": 3, @@ -7351,10 +7075,8 @@ }, { "__Checksum": { - "Data1": 6167845290450995677, - "Data2": 3807472360664064060, - "Data3": -9034821469248488094, - "Data4": 7219058974479753909 + "Data1": 1424947188470668493, + "Data2": 6968161683927336791 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisTitleBorder", @@ -7408,10 +7130,8 @@ }, { "__Checksum": { - "Data1": 3481226903961229274, - "Data2": 6396346555770189425, - "Data3": -7553541283387294701, - "Data4": 6814730942238281936 + "Data1": 3287925089689908673, + "Data2": -3409918143454109460 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisTitleBorder", @@ -7465,10 +7185,8 @@ }, { "__Checksum": { - "Data1": 2314782550480313876, - "Data2": 2205026519189899994, - "Data3": -7924783422074274302, - "Data4": 3754278900197894209 + "Data1": 7672113875102383775, + "Data2": 1221241050876155042 }, "Flags": 1, "Kind": 3, @@ -7486,10 +7204,8 @@ }, { "__Checksum": { - "Data1": -923281988778972865, - "Data2": 1375601170633459954, - "Data3": -5611588424456532658, - "Data4": 3752558774011139530 + "Data1": 6384929981865879403, + "Data2": -6809585186333807342 }, "Flags": 3, "Kind": 3, @@ -7507,10 +7223,8 @@ }, { "__Checksum": { - "Data1": -764434589095962778, - "Data2": -3369329867919082834, - "Data3": -1629334222584706334, - "Data4": -4201391584676581575 + "Data1": 3681614349310792221, + "Data2": -7408454268370507755 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisTitleMargin", @@ -7572,10 +7286,8 @@ }, { "__Checksum": { - "Data1": 2812087555740931243, - "Data2": -7476083122788298210, - "Data3": 9026775734413509591, - "Data4": 3016647678690029222 + "Data1": 878951630835013651, + "Data2": 4718871289790807970 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisTitleMargin", @@ -7637,10 +7349,8 @@ }, { "__Checksum": { - "Data1": 7300057379499674161, - "Data2": 2824612880172652679, - "Data3": -1548699258239586684, - "Data4": 1623110223389652141 + "Data1": 1341377388923575452, + "Data2": 8605651835257288965 }, "Flags": 1, "Kind": 3, @@ -7658,10 +7368,8 @@ }, { "__Checksum": { - "Data1": 2588401311901089728, - "Data2": 6179120171631841229, - "Data3": -8012875145180703497, - "Data4": -4087657455009982990 + "Data1": -2426066542441835852, + "Data2": -6757497439616228851 }, "Flags": 3, "Kind": 3, @@ -7679,10 +7387,8 @@ }, { "__Checksum": { - "Data1": 1085908883738644325, - "Data2": -2252763529711907040, - "Data3": 9147120684182202143, - "Data4": -8509542151595827943 + "Data1": 1518650624467513486, + "Data2": 2415271827177079878 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartCategoryAxisTitlePadding", @@ -7744,10 +7450,8 @@ }, { "__Checksum": { - "Data1": -3415246666978789515, - "Data2": 7328035244535952705, - "Data3": 6002496185728488467, - "Data4": 1900991094623212756 + "Data1": 2920275793071791042, + "Data2": 5387393277063172166 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartCategoryAxisTitlePadding", @@ -7809,10 +7513,8 @@ }, { "__Checksum": { - "Data1": 6058621074042896842, - "Data2": -8010233358057657096, - "Data3": -6662186612797432906, - "Data4": 667496517126371444 + "Data1": -3410273662692019337, + "Data2": 8608441901653626682 }, "Flags": 1, "Kind": 3, @@ -7830,10 +7532,8 @@ }, { "__Checksum": { - "Data1": -3753976190702971038, - "Data2": 1207244523423335043, - "Data3": -1589577367236944568, - "Data4": -6047002098360421191 + "Data1": -6673869950435484774, + "Data2": 5902595120531913850 }, "Flags": 3, "Kind": 3, @@ -7851,10 +7551,8 @@ }, { "__Checksum": { - "Data1": -1186501262133174491, - "Data2": -6676424283353349688, - "Data3": -8673305425779057796, - "Data4": -57956755839909184 + "Data1": -6764947588339366840, + "Data2": -6394233262038307444 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartLegend", @@ -7972,10 +7670,8 @@ }, { "__Checksum": { - "Data1": -3208868264035267175, - "Data2": 7956095860217733831, - "Data3": 4470546428371426295, - "Data4": 6288978798484160095 + "Data1": 4388041135742708834, + "Data2": 7795614370692851542 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartLegend", @@ -8093,10 +7789,8 @@ }, { "__Checksum": { - "Data1": 2470958380568365162, - "Data2": 12447390475678348, - "Data3": 4060686734998696412, - "Data4": 6982915963311346136 + "Data1": 5349911445922651587, + "Data2": -2466771567162900957 }, "Flags": 1, "Kind": 3, @@ -8114,10 +7808,8 @@ }, { "__Checksum": { - "Data1": 2137915751222157910, - "Data2": -3886892398486183755, - "Data3": 5167853721897459175, - "Data4": -2144527669609111990 + "Data1": -7603001260592536219, + "Data2": -7546663312753619017 }, "Flags": 3, "Kind": 3, @@ -8135,10 +7827,8 @@ }, { "__Checksum": { - "Data1": -6198529212677111232, - "Data2": 2939849549476684870, - "Data3": 3046973298780142355, - "Data4": -8026842061420575582 + "Data1": 9018215452630698177, + "Data2": 6930234115904591319 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartLegendBorder", @@ -8192,10 +7882,8 @@ }, { "__Checksum": { - "Data1": -8229811855537770542, - "Data2": -3136217741468653584, - "Data3": 687925925392382908, - "Data4": 8194864684538982960 + "Data1": -9032890848744951843, + "Data2": 1803660563015737765 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartLegendBorder", @@ -8249,10 +7937,8 @@ }, { "__Checksum": { - "Data1": -3317423388023020162, - "Data2": 2900236612264856953, - "Data3": 1578610672762016837, - "Data4": 7083274755820641724 + "Data1": 3325483233745481056, + "Data2": -7734778914750880236 }, "Flags": 1, "Kind": 3, @@ -8270,10 +7956,8 @@ }, { "__Checksum": { - "Data1": 8251926758615140756, - "Data2": 1694599699327404037, - "Data3": 3447481130874734805, - "Data4": -8734978103974672844 + "Data1": -4019569583281086679, + "Data2": 6401523693435585973 }, "Flags": 3, "Kind": 3, @@ -8291,10 +7975,8 @@ }, { "__Checksum": { - "Data1": -4659566891894904359, - "Data2": -209352154704469379, - "Data3": -765263426242262130, - "Data4": -7361175959232545294 + "Data1": 6239891168089242093, + "Data2": -994458184084456359 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartLegendLabels", @@ -8348,10 +8030,8 @@ }, { "__Checksum": { - "Data1": -5746262833770689488, - "Data2": -5834823267362226638, - "Data3": 43122309813593911, - "Data4": -5779088608471278211 + "Data1": -2057092279826046157, + "Data2": -3937136821962532287 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartLegendLabels", @@ -8405,10 +8085,8 @@ }, { "__Checksum": { - "Data1": -4528229708349716698, - "Data2": 6091916091631951811, - "Data3": -6601380484429883313, - "Data4": -7618784038689376345 + "Data1": 1300669503353861591, + "Data2": 2166833953976604374 }, "Flags": 1, "Kind": 3, @@ -8426,10 +8104,8 @@ }, { "__Checksum": { - "Data1": 8023997885258079530, - "Data2": 7909451433657902, - "Data3": -2935724582989950956, - "Data4": 957511921182313632 + "Data1": -825781652263771542, + "Data2": 4281276393666342740 }, "Flags": 3, "Kind": 3, @@ -8447,10 +8123,8 @@ }, { "__Checksum": { - "Data1": -2373099828133470140, - "Data2": -7228121528224911389, - "Data3": -5135330362113514051, - "Data4": 6676321164207773595 + "Data1": -7884728902314312869, + "Data2": -4733944230566034379 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartLegendLabelsMargin", @@ -8512,10 +8186,8 @@ }, { "__Checksum": { - "Data1": 3519007854311011365, - "Data2": 1758222087849624518, - "Data3": 6759781473283338143, - "Data4": -4365912286727100104 + "Data1": 5769979537997903613, + "Data2": 2713390290011599011 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartLegendLabelsMargin", @@ -8577,10 +8249,8 @@ }, { "__Checksum": { - "Data1": -8510598231386222530, - "Data2": 180525629298592229, - "Data3": -3829448608205960072, - "Data4": -6173523496737882867 + "Data1": 7448626315028502969, + "Data2": 7538814647881534948 }, "Flags": 1, "Kind": 3, @@ -8598,10 +8268,8 @@ }, { "__Checksum": { - "Data1": 8121388313871323391, - "Data2": 2206121346927416268, - "Data3": -8298662641299011030, - "Data4": 4361276512757359008 + "Data1": 7348325995976412115, + "Data2": -6189979813588510052 }, "Flags": 3, "Kind": 3, @@ -8619,10 +8287,8 @@ }, { "__Checksum": { - "Data1": -155186205985408725, - "Data2": -4870289122653597660, - "Data3": -6668255496549935478, - "Data4": -2518733626237129121 + "Data1": 5343999397939205317, + "Data2": -1839565002572169394 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartLegendLabelsPadding", @@ -8684,10 +8350,8 @@ }, { "__Checksum": { - "Data1": 2416598183793136942, - "Data2": -2445780734835751992, - "Data3": 3031755423090479768, - "Data4": -1397021134206153152 + "Data1": 3545400205771856774, + "Data2": 5673551437279560082 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartLegendLabelsPadding", @@ -8749,10 +8413,8 @@ }, { "__Checksum": { - "Data1": 6516734615288043128, - "Data2": 7255640220842450991, - "Data3": 3995983479866692600, - "Data4": -7983688003748016465 + "Data1": 7036849612955882328, + "Data2": 8372341549155720647 }, "Flags": 1, "Kind": 3, @@ -8770,10 +8432,8 @@ }, { "__Checksum": { - "Data1": 8729132589143331301, - "Data2": -1128842751872743063, - "Data3": -6064172792063901842, - "Data4": 7448321919135813431 + "Data1": -8946855749977701403, + "Data2": 4366469798316588486 }, "Flags": 3, "Kind": 3, @@ -8791,10 +8451,8 @@ }, { "__Checksum": { - "Data1": 272060800044992003, - "Data2": 6483092690014541673, - "Data3": -3769160530939580824, - "Data4": -5965270992252523200 + "Data1": 3138876234255532178, + "Data2": 4509482459975813219 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartLegendMargin", @@ -8856,10 +8514,8 @@ }, { "__Checksum": { - "Data1": 3020946626930014293, - "Data2": 1825660491704872871, - "Data3": -3559261369470871092, - "Data4": -5201216974777065582 + "Data1": 2718139566346773948, + "Data2": 4223295903098275467 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartLegendMargin", @@ -8921,10 +8577,8 @@ }, { "__Checksum": { - "Data1": 5678838047556296752, - "Data2": 8025163914934105419, - "Data3": -720421975335308952, - "Data4": -1116803957464427830 + "Data1": -8376694372994184602, + "Data2": 3325679828502185391 }, "Flags": 1, "Kind": 3, @@ -8942,10 +8596,8 @@ }, { "__Checksum": { - "Data1": 3761255449527884046, - "Data2": 7792486755893795624, - "Data3": -1490319902738440116, - "Data4": -7314441502188106126 + "Data1": 7904227555657417616, + "Data2": -3317851688011975813 }, "Flags": 3, "Kind": 3, @@ -8963,10 +8615,8 @@ }, { "__Checksum": { - "Data1": 3794364163297398576, - "Data2": 5965550527503128950, - "Data3": 6965105864730872552, - "Data4": 252444362012009338 + "Data1": 68176341232678251, + "Data2": -8660771776435464574 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartLegendPadding", @@ -9028,10 +8678,8 @@ }, { "__Checksum": { - "Data1": 6324575877270610078, - "Data2": -5504268098213399967, - "Data3": -7780572915859614083, - "Data4": 4280531500824705676 + "Data1": 6663806381273215942, + "Data2": -6967578686512775804 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartLegendPadding", @@ -9093,10 +8741,8 @@ }, { "__Checksum": { - "Data1": -3815450380695210491, - "Data2": -463695757357074210, - "Data3": -1600287916805767551, - "Data4": -8599127016338239277 + "Data1": -2516124027275862757, + "Data2": -1435088052046420774 }, "Flags": 1, "Kind": 3, @@ -9114,10 +8760,8 @@ }, { "__Checksum": { - "Data1": 4711099132271619837, - "Data2": 2929727383893700360, - "Data3": -7328281570568669643, - "Data4": -575054456995955010 + "Data1": -7817196045104044326, + "Data2": -505980708804926428 }, "Flags": 3, "Kind": 3, @@ -9135,10 +8779,8 @@ }, { "__Checksum": { - "Data1": 7003896875754667029, - "Data2": -3182166231290901272, - "Data3": -3100103620599403008, - "Data4": -7437994083964124920 + "Data1": -5820892704227833385, + "Data2": 4739326996923979561 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeries", @@ -9471,10 +9113,8 @@ }, { "__Checksum": { - "Data1": 6366327007167571316, - "Data2": -8105718598899333518, - "Data3": -3782179737449879703, - "Data4": -4245310947914929358 + "Data1": 1761326702214749218, + "Data2": -8048022291155466316 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeries", @@ -9807,10 +9447,8 @@ }, { "__Checksum": { - "Data1": 3471464392015002487, - "Data2": -3492029593819729445, - "Data3": 8383502450224781166, - "Data4": -8664556850643335396 + "Data1": 8523023847447011369, + "Data2": 4052001424828592366 }, "Flags": 1, "Kind": 3, @@ -9828,10 +9466,8 @@ }, { "__Checksum": { - "Data1": 5504574411852392139, - "Data2": 9133827331677776771, - "Data3": 94357908272887781, - "Data4": -5715141074498465595 + "Data1": -5828394081947395474, + "Data2": -7370008626181308799 }, "Flags": 3, "Kind": 3, @@ -9849,10 +9485,8 @@ }, { "__Checksum": { - "Data1": -6190754609043392486, - "Data2": -432897899057106211, - "Data3": -3326389461453574707, - "Data4": -8112360507876506918 + "Data1": 8725028797469127667, + "Data2": -4623217295965890945 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesItems", @@ -9882,10 +9516,8 @@ }, { "__Checksum": { - "Data1": 8524992875840522976, - "Data2": -5372225419473094479, - "Data3": -2177591012901496751, - "Data4": -1524899514686049641 + "Data1": -7216127798058298358, + "Data2": -7512515391989457175 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesItems", @@ -9915,10 +9547,8 @@ }, { "__Checksum": { - "Data1": -3416489732163205937, - "Data2": 4010588367003912500, - "Data3": 5215824854619967149, - "Data4": 338613430942426616 + "Data1": 7517251727748823161, + "Data2": 3304105797500226824 }, "Flags": 1, "Kind": 3, @@ -9936,10 +9566,8 @@ }, { "__Checksum": { - "Data1": 5758242391845163078, - "Data2": -4903708127796656088, - "Data3": 7962849803771595488, - "Data4": 932265812135680126 + "Data1": 1431867259182824704, + "Data2": 8083259295529428835 }, "Flags": 3, "Kind": 3, @@ -9957,10 +9585,8 @@ }, { "__Checksum": { - "Data1": 6885143557712147670, - "Data2": -2956396083054347076, - "Data3": -6488273458571897087, - "Data4": -4340693825588435312 + "Data1": 3628977705908599083, + "Data2": 1074447470526778206 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesLabels", @@ -10070,10 +9696,8 @@ }, { "__Checksum": { - "Data1": 491985558142531815, - "Data2": 5181292052781816210, - "Data3": -1750650976708597524, - "Data4": -574598672005233997 + "Data1": 7681578922510670663, + "Data2": 3980399085505615592 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesLabels", @@ -10183,10 +9807,8 @@ }, { "__Checksum": { - "Data1": 5462131977471353128, - "Data2": 2698173598250880456, - "Data3": 939963897015616858, - "Data4": -8614074094365375657 + "Data1": 8539054853174679611, + "Data2": -3079396374905054914 }, "Flags": 1, "Kind": 3, @@ -10204,10 +9826,8 @@ }, { "__Checksum": { - "Data1": 4041609607073087750, - "Data2": -4020664770390513433, - "Data3": 7733693811335337860, - "Data4": -3153076429620858715 + "Data1": -2655070511729213038, + "Data2": 6741015132117532348 }, "Flags": 3, "Kind": 3, @@ -10225,10 +9845,8 @@ }, { "__Checksum": { - "Data1": -5725578749956105482, - "Data2": 7803085312365204924, - "Data3": 2373573370800933325, - "Data4": -4266042297226799670 + "Data1": 7257500333538072295, + "Data2": 2298346424743878838 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesLabelsBorder", @@ -10282,10 +9900,8 @@ }, { "__Checksum": { - "Data1": -5001738408094182765, - "Data2": -7073943181512673691, - "Data3": -2430760805399914537, - "Data4": -4209631762977158913 + "Data1": 5862330172230266127, + "Data2": 6186893691476838402 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesLabelsBorder", @@ -10339,10 +9955,8 @@ }, { "__Checksum": { - "Data1": -4177845398634150697, - "Data2": 8788868658760113467, - "Data3": 1667821295638015243, - "Data4": -4314038096786464712 + "Data1": -6442866267051494213, + "Data2": -5687282489424597281 }, "Flags": 1, "Kind": 3, @@ -10360,10 +9974,8 @@ }, { "__Checksum": { - "Data1": -2561035065698283899, - "Data2": -311818619468617228, - "Data3": 1492713564325851220, - "Data4": 8629719389005663278 + "Data1": -6598106661328593593, + "Data2": 3215489251729833644 }, "Flags": 3, "Kind": 3, @@ -10381,10 +9993,8 @@ }, { "__Checksum": { - "Data1": 4909479257366056979, - "Data2": 5609490200968019266, - "Data3": -8180845350557925035, - "Data4": -7607103537985317346 + "Data1": 8391238741613095695, + "Data2": -1200104672344660131 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesLabelsMargin", @@ -10446,10 +10056,8 @@ }, { "__Checksum": { - "Data1": -8406558280283274421, - "Data2": 679189282487586023, - "Data3": -2880395359908861568, - "Data4": 9064755327599235617 + "Data1": 7925888353154326364, + "Data2": -8229088306580744096 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesLabelsMargin", @@ -10511,10 +10119,8 @@ }, { "__Checksum": { - "Data1": -7246151887527288648, - "Data2": -2104020146098530157, - "Data3": 3476634986633157164, - "Data4": 4318154833044032439 + "Data1": -9068998472894249994, + "Data2": 4866255815034853148 }, "Flags": 1, "Kind": 3, @@ -10532,10 +10138,8 @@ }, { "__Checksum": { - "Data1": -5813913823369752942, - "Data2": -4510601107299040627, - "Data3": 8198506923637140955, - "Data4": 6133037569918199758 + "Data1": -6564161458791101592, + "Data2": -729273072994108740 }, "Flags": 3, "Kind": 3, @@ -10553,10 +10157,8 @@ }, { "__Checksum": { - "Data1": 5925468322773801337, - "Data2": -5554695534202345402, - "Data3": 4876302877988322440, - "Data4": -2779527395323548731 + "Data1": -4118938445843552426, + "Data2": 8480641442544825863 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesLabelsPadding", @@ -10618,10 +10220,8 @@ }, { "__Checksum": { - "Data1": -3790649254694944679, - "Data2": -2274105106593542502, - "Data3": -6944730693731592736, - "Data4": 5677604443600011638 + "Data1": 8442330859741904879, + "Data2": 7044093120535613487 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesLabelsPadding", @@ -10683,10 +10283,8 @@ }, { "__Checksum": { - "Data1": 4150850026100377832, - "Data2": -4309027987870229233, - "Data3": 5093039223964816945, - "Data4": -5253167934445835482 + "Data1": 5779424300803089336, + "Data2": 5386065159467535817 }, "Flags": 1, "Kind": 3, @@ -10704,10 +10302,8 @@ }, { "__Checksum": { - "Data1": 6050739145661025866, - "Data2": -1210560513790427770, - "Data3": -368921680158516934, - "Data4": -7702854305699993159 + "Data1": -8679204500941271858, + "Data2": -4295751818383246227 }, "Flags": 3, "Kind": 3, @@ -10725,10 +10321,8 @@ }, { "__Checksum": { - "Data1": -3923528261268967790, - "Data2": 4640804369714064888, - "Data3": -7573893359047237797, - "Data4": 2262887416321862263 + "Data1": 7130137502038063365, + "Data2": 4636027210098043813 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesLine", @@ -10790,10 +10384,8 @@ }, { "__Checksum": { - "Data1": 1203501854077465845, - "Data2": -4726555014442178457, - "Data3": 7865914857379858675, - "Data4": 4150378908179907623 + "Data1": 2562869600848745142, + "Data2": -6402010773162461938 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesLine", @@ -10855,10 +10447,8 @@ }, { "__Checksum": { - "Data1": 2062783134816519217, - "Data2": 6287131164849731411, - "Data3": 2678030113957043194, - "Data4": -7366570701896593660 + "Data1": 2884746570415868518, + "Data2": 7912177675433368879 }, "Flags": 1, "Kind": 3, @@ -10876,10 +10466,8 @@ }, { "__Checksum": { - "Data1": -8566760572790227763, - "Data2": -8892264327965335752, - "Data3": -2689067468397674841, - "Data4": -5942625897433285591 + "Data1": -3381137287751682072, + "Data2": 4812584241096532500 }, "Flags": 3, "Kind": 3, @@ -10897,10 +10485,8 @@ }, { "__Checksum": { - "Data1": -2399598696558371660, - "Data2": -6821614923952192307, - "Data3": -3559257631744483230, - "Data4": 698548732742500094 + "Data1": 8602680478823044708, + "Data2": 3989193707489948977 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesMarkers", @@ -10970,10 +10556,8 @@ }, { "__Checksum": { - "Data1": 3899776802932287650, - "Data2": -3525654112769993640, - "Data3": 6084497214345196849, - "Data4": 1564135030216289610 + "Data1": -9026083566538695311, + "Data2": 3627597364250500354 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesMarkers", @@ -11043,10 +10627,8 @@ }, { "__Checksum": { - "Data1": -2179236436688971672, - "Data2": 4617855803901528398, - "Data3": 4159043096085733634, - "Data4": -3429526193365894465 + "Data1": 6289088995012367029, + "Data2": 2837424603754630320 }, "Flags": 1, "Kind": 3, @@ -11064,10 +10646,8 @@ }, { "__Checksum": { - "Data1": -2279299008273748562, - "Data2": -3526377272102934719, - "Data3": -5699906598608410625, - "Data4": 3423810669790731435 + "Data1": 4285856724111495631, + "Data2": 7620789736448316502 }, "Flags": 3, "Kind": 3, @@ -11085,10 +10665,8 @@ }, { "__Checksum": { - "Data1": -7207387633263539709, - "Data2": -5291150322025518599, - "Data3": 841198899189038528, - "Data4": 267091184740658287 + "Data1": -3195779092055957310, + "Data2": -6446079888130884000 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesMarkersBorder", @@ -11134,10 +10712,8 @@ }, { "__Checksum": { - "Data1": -6125943443641522832, - "Data2": 5829473658923630151, - "Data3": 1995220938975178024, - "Data4": 572252638226513305 + "Data1": -954077184435411356, + "Data2": -7425267203919335656 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesMarkersBorder", @@ -11183,10 +10759,8 @@ }, { "__Checksum": { - "Data1": 7215167061448288026, - "Data2": -5056615826240172122, - "Data3": -5245049679864962401, - "Data4": 2283713525969816599 + "Data1": -724166477365150458, + "Data2": -8612835489918520855 }, "Flags": 1, "Kind": 3, @@ -11204,10 +10778,8 @@ }, { "__Checksum": { - "Data1": 4689595494775475058, - "Data2": -3836446659811672309, - "Data3": -80116002037623731, - "Data4": -6615898423022608983 + "Data1": -6423959004591050503, + "Data2": -8252326913806239001 }, "Flags": 3, "Kind": 3, @@ -11225,10 +10797,8 @@ }, { "__Checksum": { - "Data1": 4930561860184732990, - "Data2": -2301663348525395171, - "Data3": 1966667453225445564, - "Data4": -683938684166063904 + "Data1": 5156253416000596851, + "Data2": -4286468236555716044 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesNegativeValues", @@ -11274,10 +10844,8 @@ }, { "__Checksum": { - "Data1": 1114886830563168935, - "Data2": 8757530122753270383, - "Data3": 8413904678208632390, - "Data4": 7430006032919869476 + "Data1": -7492496415866583067, + "Data2": -6267353602209062311 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesNegativeValues", @@ -11323,10 +10891,8 @@ }, { "__Checksum": { - "Data1": -7449421275427013049, - "Data2": -6303783901314575597, - "Data3": -1844718836087611926, - "Data4": 4745841558048165010 + "Data1": -5904335096629035256, + "Data2": 2486374792745834546 }, "Flags": 1, "Kind": 3, @@ -11344,10 +10910,8 @@ }, { "__Checksum": { - "Data1": 9130192780332788128, - "Data2": -941848846880312411, - "Data3": -4857098727414117099, - "Data4": -3081068518942565613 + "Data1": -3691019690934352192, + "Data2": -8999369288590780957 }, "Flags": 3, "Kind": 3, @@ -11365,10 +10929,8 @@ }, { "__Checksum": { - "Data1": -4303793126327913439, - "Data2": -6469170493132100725, - "Data3": 7514285069929741546, - "Data4": -5440649948909850018 + "Data1": -1488008675192785256, + "Data2": -4017155501420067630 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesStack", @@ -11422,10 +10984,8 @@ }, { "__Checksum": { - "Data1": -7866335386727117333, - "Data2": -6507682869632612320, - "Data3": -3791262987453590850, - "Data4": -3005303778523797918 + "Data1": -9004607095533530783, + "Data2": 123709732211269520 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesStack", @@ -11479,10 +11039,8 @@ }, { "__Checksum": { - "Data1": 2420853722009405606, - "Data2": -8198294957168338598, - "Data3": 3293304302882696046, - "Data4": -8807058021882813197 + "Data1": -4691253837649422444, + "Data2": -9044851869773185934 }, "Flags": 1, "Kind": 3, @@ -11500,10 +11058,8 @@ }, { "__Checksum": { - "Data1": 4909843928594286852, - "Data2": -6813845536471978672, - "Data3": -3793698186460609997, - "Data4": 1018532001568103287 + "Data1": 759788817404839500, + "Data2": -2830247459203358616 }, "Flags": 3, "Kind": 3, @@ -11521,10 +11077,8 @@ }, { "__Checksum": { - "Data1": -5179836729318105562, - "Data2": -2460626969966585144, - "Data3": -3347616422780043997, - "Data4": -4817796755327131797 + "Data1": -8143911823021684089, + "Data2": 721809053506664345 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartSeriesTooltip", @@ -11599,10 +11153,8 @@ }, { "__Checksum": { - "Data1": 5129859609358806708, - "Data2": 7403047746108913192, - "Data3": -9162977099036277533, - "Data4": 2365997936357428451 + "Data1": 8316302115819374047, + "Data2": -2149312625253997537 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartSeriesTooltip", @@ -11677,10 +11229,8 @@ }, { "__Checksum": { - "Data1": 7694970549303232471, - "Data2": -315306068702371863, - "Data3": -2633260772385751082, - "Data4": 4808868340079982012 + "Data1": -754634951285164814, + "Data2": -2221621794275008910 }, "Flags": 1, "Kind": 3, @@ -11698,10 +11248,8 @@ }, { "__Checksum": { - "Data1": -1124026906136503975, - "Data2": -3084186456065541777, - "Data3": -4431521155800986292, - "Data4": -6072914066890631205 + "Data1": -2082900549578251535, + "Data2": 4820746549774975014 }, "Flags": 3, "Kind": 3, @@ -11719,10 +11267,8 @@ }, { "__Checksum": { - "Data1": -6156654649490105018, - "Data2": 2282995872882364690, - "Data3": 5773876569322366446, - "Data4": 1550769440870933503 + "Data1": 1838129447601039379, + "Data2": 5509040400299835649 }, "Flags": 1, "Kind": 3, @@ -11752,10 +11298,8 @@ }, { "__Checksum": { - "Data1": -2119048797917052722, - "Data2": -4897512401027485006, - "Data3": 369030075224945633, - "Data4": 2409851171581733365 + "Data1": 659015003168409559, + "Data2": 1189400732770187686 }, "Flags": 3, "Kind": 3, @@ -11785,10 +11329,8 @@ }, { "__Checksum": { - "Data1": 4726032498750304033, - "Data2": 3317603704889906818, - "Data3": -5501108377497891820, - "Data4": -5794392102187556037 + "Data1": 5629593398921691603, + "Data2": -6277841688739126796 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartTitle", @@ -11874,10 +11416,8 @@ }, { "__Checksum": { - "Data1": 3232002031824359665, - "Data2": -1944798945055003337, - "Data3": 8683908294809768193, - "Data4": -6564285923575917858 + "Data1": -4577074353915696122, + "Data2": 8648628596087960422 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartTitle", @@ -11963,10 +11503,8 @@ }, { "__Checksum": { - "Data1": -5696004384009923177, - "Data2": -539373384108680305, - "Data3": -6924541478957363709, - "Data4": 6601292104243374786 + "Data1": 7019971748346802915, + "Data2": -653870167136872226 }, "Flags": 1, "Kind": 3, @@ -11984,10 +11522,8 @@ }, { "__Checksum": { - "Data1": -501922024345241095, - "Data2": -4736509698745335086, - "Data3": -3160805261896375928, - "Data4": -2108288635284160786 + "Data1": 6635889927700334473, + "Data2": 7393831744062395124 }, "Flags": 3, "Kind": 3, @@ -12005,10 +11541,8 @@ }, { "__Checksum": { - "Data1": 4253064494311523515, - "Data2": 2781013414912556163, - "Data3": -7127755451997992177, - "Data4": -929929934176742544 + "Data1": -4384079260877620346, + "Data2": 2289121224483617301 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartTitleBorder", @@ -12062,10 +11596,8 @@ }, { "__Checksum": { - "Data1": 332856503085055843, - "Data2": -2165520627642389350, - "Data3": 6026732745302990408, - "Data4": 719857984502507223 + "Data1": 2992462510059934716, + "Data2": -5974795536696890413 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartTitleBorder", @@ -12119,10 +11651,8 @@ }, { "__Checksum": { - "Data1": -4382080302780717375, - "Data2": 6805482729874099763, - "Data3": 6785125122921747001, - "Data4": -1096522049731431720 + "Data1": 7318823325391927622, + "Data2": 4563302703304976749 }, "Flags": 1, "Kind": 3, @@ -12140,10 +11670,8 @@ }, { "__Checksum": { - "Data1": 7388989532207079014, - "Data2": 4069963926998540198, - "Data3": 3810350301625877745, - "Data4": 5315314830998841881 + "Data1": 1888509432322629106, + "Data2": 4080051290192422388 }, "Flags": 3, "Kind": 3, @@ -12161,10 +11689,8 @@ }, { "__Checksum": { - "Data1": -71581081702412533, - "Data2": 2554771319889861518, - "Data3": 8601134914556369126, - "Data4": 3778984427006334907 + "Data1": 6299532921183297734, + "Data2": 6532685301990356600 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartTitleMargin", @@ -12226,10 +11752,8 @@ }, { "__Checksum": { - "Data1": -2280332317927552791, - "Data2": -6149480929947563645, - "Data3": -789633779377575323, - "Data4": -5799751012123377669 + "Data1": -3587243037813306163, + "Data2": 7796220249725077018 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartTitleMargin", @@ -12291,10 +11815,8 @@ }, { "__Checksum": { - "Data1": -4250794452252564376, - "Data2": 4172187114264156859, - "Data3": -8077657717762259404, - "Data4": -4187774252811319848 + "Data1": 8932976587652724323, + "Data2": 16283915266336753 }, "Flags": 1, "Kind": 3, @@ -12312,10 +11834,8 @@ }, { "__Checksum": { - "Data1": 8896456946136703894, - "Data2": -3123240290428687541, - "Data3": -4468792058816189331, - "Data4": 2801635717885412672 + "Data1": -8035043494224216183, + "Data2": 220464789114725237 }, "Flags": 3, "Kind": 3, @@ -12333,10 +11853,8 @@ }, { "__Checksum": { - "Data1": 2754488842321959681, - "Data2": 3458300024860344786, - "Data3": 6535318131208901350, - "Data4": -8310920164150082980 + "Data1": -7688340831914833711, + "Data2": -2599946188162380355 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartTitlePadding", @@ -12398,10 +11916,8 @@ }, { "__Checksum": { - "Data1": -3077147768905959281, - "Data2": -1626907996628419238, - "Data3": -4152500318981378251, - "Data4": 4057723680891542601 + "Data1": 5590576945131635024, + "Data2": -4926140521916861333 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartTitlePadding", @@ -12463,10 +11979,8 @@ }, { "__Checksum": { - "Data1": 2241215111836388783, - "Data2": -5527269086981931322, - "Data3": 1968171722296498155, - "Data4": 3280235763847471536 + "Data1": -20103039794885525, + "Data2": -6933096619437072244 }, "Flags": 1, "Kind": 3, @@ -12484,10 +11998,8 @@ }, { "__Checksum": { - "Data1": -3766698252861314175, - "Data2": -341248617839049405, - "Data3": 2360304776614512610, - "Data4": 3345240363220719628 + "Data1": 8901414086975856637, + "Data2": 2931608990596905380 }, "Flags": 3, "Kind": 3, @@ -12505,10 +12017,8 @@ }, { "__Checksum": { - "Data1": 5188143644479971668, - "Data2": 6619092909895285082, - "Data3": 894359855955146053, - "Data4": 5323476840334935647 + "Data1": 8328859390350224532, + "Data2": 4435749740102113738 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartTooltip", @@ -12619,10 +12129,8 @@ }, { "__Checksum": { - "Data1": -3833296306263563891, - "Data2": -4109401326138100420, - "Data3": 6145680328772852033, - "Data4": 7047795280987055447 + "Data1": -8121244317201869686, + "Data2": -627257040026424927 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartTooltip", @@ -12733,10 +12241,8 @@ }, { "__Checksum": { - "Data1": -2995768360456919938, - "Data2": -1627016481091453193, - "Data3": -3568070125057987356, - "Data4": -7100416791221754286 + "Data1": 5745328605569653315, + "Data2": -4910910112999997407 }, "Flags": 1, "Kind": 3, @@ -12754,10 +12260,8 @@ }, { "__Checksum": { - "Data1": -5546039695844632939, - "Data2": 7661721271567268076, - "Data3": 8702615748854230460, - "Data4": 1060894937317439771 + "Data1": 1948671670102520828, + "Data2": 7770679116533491966 }, "Flags": 3, "Kind": 3, @@ -12775,10 +12279,8 @@ }, { "__Checksum": { - "Data1": -3054651358821698714, - "Data2": -8518128662188155179, - "Data3": 1872690823253743285, - "Data4": 3281268780460103212 + "Data1": -2581631918691818438, + "Data2": 2897703896135477023 }, "Flags": 1, "Kind": 3, @@ -12808,10 +12310,8 @@ }, { "__Checksum": { - "Data1": -3878141106187871186, - "Data2": -3862697084330619377, - "Data3": 8955671506775697911, - "Data4": -2321056987609013067 + "Data1": -9136676151378209949, + "Data2": -4315924613771180774 }, "Flags": 3, "Kind": 3, @@ -12841,10 +12341,8 @@ }, { "__Checksum": { - "Data1": 4471580866729582758, - "Data2": 2566221722427365666, - "Data3": -475678157530589394, - "Data4": 4833709225387320619 + "Data1": 1725108605791323522, + "Data2": 581430491227715150 }, "Flags": 1, "Kind": 3, @@ -12874,10 +12372,8 @@ }, { "__Checksum": { - "Data1": -7026118921603740246, - "Data2": -431304712502374864, - "Data3": 7604418451986139423, - "Data4": 3941550633152402774 + "Data1": 4297316729397635931, + "Data2": -5946478032301564542 }, "Flags": 3, "Kind": 3, @@ -12907,10 +12403,8 @@ }, { "__Checksum": { - "Data1": 3642432164159961733, - "Data2": 2628702167162534484, - "Data3": 7844945834526386373, - "Data4": -2838377344997557718 + "Data1": -8806807495735557578, + "Data2": -3570491004414929799 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxes", @@ -12940,10 +12434,8 @@ }, { "__Checksum": { - "Data1": -8186948443019425651, - "Data2": 1392461904303846798, - "Data3": 760435978239581081, - "Data4": -6463162911181294394 + "Data1": 2968263049754689846, + "Data2": 8921227674816063345 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxes", @@ -12973,10 +12465,8 @@ }, { "__Checksum": { - "Data1": -2216011244471122809, - "Data2": -2486432277129491877, - "Data3": -8842915504070874863, - "Data4": 2372171406980245436 + "Data1": 8830233980202526211, + "Data2": -1469409898437271007 }, "Flags": 1, "Kind": 3, @@ -12994,10 +12484,8 @@ }, { "__Checksum": { - "Data1": -3775554761818978300, - "Data2": -259838259079844171, - "Data3": -4253558062323263852, - "Data4": -3819135575016721294 + "Data1": -7580574953394712296, + "Data2": 7785481358965160889 }, "Flags": 3, "Kind": 3, @@ -13015,10 +12503,8 @@ }, { "__Checksum": { - "Data1": 8741618573230520891, - "Data2": 8495072512003782151, - "Data3": 1182033460608248458, - "Data4": -6518615349514451055 + "Data1": 7408411039229927184, + "Data2": -3260058600882928947 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxis", @@ -13143,10 +12629,8 @@ }, { "__Checksum": { - "Data1": 3657093947600502109, - "Data2": -2339289884693107787, - "Data3": -6693826731812499329, - "Data4": 3219604366806800631 + "Data1": -3445263614427382977, + "Data2": 4567234377443139024 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxis", @@ -13271,10 +12755,8 @@ }, { "__Checksum": { - "Data1": 4562711445203275787, - "Data2": 1527488310986907895, - "Data3": -1834305149289443345, - "Data4": -1564821710422340963 + "Data1": -603301968175720284, + "Data2": 1017672410232546075 }, "Flags": 1, "Kind": 3, @@ -13292,10 +12774,8 @@ }, { "__Checksum": { - "Data1": -7002433986259831998, - "Data2": 2367847829093458128, - "Data3": 2664454996395732865, - "Data4": 7362126249748397044 + "Data1": -4242914606520127523, + "Data2": -1910569079971509008 }, "Flags": 3, "Kind": 3, @@ -13313,10 +12793,8 @@ }, { "__Checksum": { - "Data1": 5095023569659613114, - "Data2": -3407872486137120622, - "Data3": -3991679121527602960, - "Data4": 685657155876489840 + "Data1": -299528026788819161, + "Data2": -8937586868521627624 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisLabels", @@ -13418,10 +12896,8 @@ }, { "__Checksum": { - "Data1": -6053484339476029081, - "Data2": -6056056868950135618, - "Data3": -3460687671617091558, - "Data4": -5516181500414386735 + "Data1": 9112973365976423775, + "Data2": -4872285002711649140 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisLabels", @@ -13523,10 +12999,8 @@ }, { "__Checksum": { - "Data1": 2415643781800010351, - "Data2": 5809436725412674576, - "Data3": 4863497141971588120, - "Data4": 6039169522140912085 + "Data1": -699859185332330056, + "Data2": -3936023811733748010 }, "Flags": 1, "Kind": 3, @@ -13544,10 +13018,8 @@ }, { "__Checksum": { - "Data1": 7394744719763607602, - "Data2": 3920819942763297544, - "Data3": -5956719314169925702, - "Data4": 674994001567458337 + "Data1": -402960631428330984, + "Data2": 891175889246030536 }, "Flags": 3, "Kind": 3, @@ -13565,10 +13037,8 @@ }, { "__Checksum": { - "Data1": 6722808391372035049, - "Data2": -6406068485231048865, - "Data3": 4466278237520004371, - "Data4": -1688980466286658927 + "Data1": 3717869439632214252, + "Data2": -5880708391138560843 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisLabelsBorder", @@ -13622,10 +13092,8 @@ }, { "__Checksum": { - "Data1": 707490835646682518, - "Data2": -5835415897595775146, - "Data3": 6013419168715197485, - "Data4": 6977534250541420997 + "Data1": 118000660587799185, + "Data2": 7629307936841220871 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisLabelsBorder", @@ -13679,10 +13147,8 @@ }, { "__Checksum": { - "Data1": 9122798890712173636, - "Data2": 6104841547701327825, - "Data3": -8096695466611679675, - "Data4": -7931422284687632624 + "Data1": -2905274050719382957, + "Data2": -6638777830747254297 }, "Flags": 1, "Kind": 3, @@ -13700,10 +13166,8 @@ }, { "__Checksum": { - "Data1": 7103336286751769607, - "Data2": 884168809376614321, - "Data3": -2872647273907610625, - "Data4": -7875699807099854313 + "Data1": 6225791396728731958, + "Data2": -1457867590055227783 }, "Flags": 3, "Kind": 3, @@ -13721,10 +13185,8 @@ }, { "__Checksum": { - "Data1": -146388576647889365, - "Data2": 4851965814880322995, - "Data3": -2652542255546814384, - "Data4": -7398641898048572339 + "Data1": -8845533692140489482, + "Data2": 1636687290978426589 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisLabelsMargin", @@ -13786,10 +13248,8 @@ }, { "__Checksum": { - "Data1": 7588630232718031238, - "Data2": 674487167858340172, - "Data3": 107833276646921761, - "Data4": 8713747955438281325 + "Data1": -7551793078621943714, + "Data2": -1271104480293677322 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisLabelsMargin", @@ -13851,10 +13311,8 @@ }, { "__Checksum": { - "Data1": 4444128592769535959, - "Data2": -5876174962529791010, - "Data3": 7386255134523183161, - "Data4": -4222394876669157865 + "Data1": -67760593821071716, + "Data2": -7519216975712128752 }, "Flags": 1, "Kind": 3, @@ -13872,10 +13330,8 @@ }, { "__Checksum": { - "Data1": 4949681890196252613, - "Data2": -6493423365097845443, - "Data3": -3930267139104476094, - "Data4": 2477127995210702144 + "Data1": -2388409498885354326, + "Data2": 257257610017354916 }, "Flags": 3, "Kind": 3, @@ -13893,10 +13349,8 @@ }, { "__Checksum": { - "Data1": 6906584187918696367, - "Data2": -3825655421724963559, - "Data3": 5414366315199985414, - "Data4": -8607742288155590138 + "Data1": 3247025556401284116, + "Data2": -8157313116880031761 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisLabelsPadding", @@ -13958,10 +13412,8 @@ }, { "__Checksum": { - "Data1": -2564683026006119088, - "Data2": -1530648916134646383, - "Data3": 7428642357789605295, - "Data4": 6614459555908779452 + "Data1": -5338979066551278060, + "Data2": 3238387375674429430 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisLabelsPadding", @@ -14023,10 +13475,8 @@ }, { "__Checksum": { - "Data1": 6196903745666862550, - "Data2": -1935638892647657660, - "Data3": -4614223626691504048, - "Data4": 4863957060786055666 + "Data1": -5437696922751430725, + "Data2": -6435999526255605756 }, "Flags": 1, "Kind": 3, @@ -14044,10 +13494,8 @@ }, { "__Checksum": { - "Data1": 7630195535721904037, - "Data2": -1943277828656524461, - "Data3": -9098604443330216320, - "Data4": -3859758199304204627 + "Data1": 8005916139409891410, + "Data2": -7594391135884927387 }, "Flags": 3, "Kind": 3, @@ -14065,10 +13513,8 @@ }, { "__Checksum": { - "Data1": -7757501678136539957, - "Data2": -2273147179462462828, - "Data3": 2135399792386674201, - "Data4": 2722072474023260079 + "Data1": 978352483587962494, + "Data2": 6811168353925361732 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisLabelsRotation", @@ -14114,10 +13560,8 @@ }, { "__Checksum": { - "Data1": 2599304491203445801, - "Data2": -3267743921479617086, - "Data3": -6537822104828980755, - "Data4": -3360205013716439538 + "Data1": 1895058591565085994, + "Data2": -6442329279750671160 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisLabelsRotation", @@ -14163,10 +13607,8 @@ }, { "__Checksum": { - "Data1": 6645139752165830919, - "Data2": -3816888093965022358, - "Data3": -8087258154025283364, - "Data4": 5695533630259028891 + "Data1": -3146769986949438246, + "Data2": 4348184811500121191 }, "Flags": 1, "Kind": 3, @@ -14184,10 +13626,8 @@ }, { "__Checksum": { - "Data1": 2413662026836282959, - "Data2": -2255077431658234529, - "Data3": 7515312600213157463, - "Data4": -5970061081356645562 + "Data1": 1026458163098023348, + "Data2": -5467957952347226318 }, "Flags": 3, "Kind": 3, @@ -14205,10 +13645,8 @@ }, { "__Checksum": { - "Data1": 1209255125466425476, - "Data2": -2746914326391213512, - "Data3": 6491189337046109962, - "Data4": -7591417189598412734 + "Data1": 6903840908866401140, + "Data2": -2606517148239816122 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisMajorGridLines", @@ -14286,10 +13724,8 @@ }, { "__Checksum": { - "Data1": -6865085036868177651, - "Data2": 6682932753260200730, - "Data3": -7560892001388251554, - "Data4": 2717072820979657534 + "Data1": -8439407569329142659, + "Data2": 8605479894762817770 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisMajorGridLines", @@ -14367,10 +13803,8 @@ }, { "__Checksum": { - "Data1": -6120948233246070290, - "Data2": -3987016793864303253, - "Data3": -368930895331137083, - "Data4": -676660412218981497 + "Data1": 8619520826359002840, + "Data2": -3413484981911482043 }, "Flags": 1, "Kind": 3, @@ -14388,10 +13822,8 @@ }, { "__Checksum": { - "Data1": -7584575968643649889, - "Data2": 2393519264589779485, - "Data3": 357068754876074164, - "Data4": -665832891808454850 + "Data1": 5588408855901352557, + "Data2": 579280990969834508 }, "Flags": 3, "Kind": 3, @@ -14409,10 +13841,8 @@ }, { "__Checksum": { - "Data1": 7030444061854383193, - "Data2": -2430320836507265890, - "Data3": 5875258784047253417, - "Data4": -5267682621454474477 + "Data1": -6931991293124356045, + "Data2": -4488776618335954452 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisMajorTicks", @@ -14482,10 +13912,8 @@ }, { "__Checksum": { - "Data1": 4573671369670878994, - "Data2": -4990501122645256304, - "Data3": -2484932871213164990, - "Data4": 8102757259069257311 + "Data1": 951467853499751991, + "Data2": 6167275178377949171 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisMajorTicks", @@ -14555,10 +13983,8 @@ }, { "__Checksum": { - "Data1": -5010130673214889885, - "Data2": -5789638650710036151, - "Data3": -7193148424699544205, - "Data4": 8403994630673026068 + "Data1": -3280413569105276871, + "Data2": 2476028053604059821 }, "Flags": 1, "Kind": 3, @@ -14576,10 +14002,8 @@ }, { "__Checksum": { - "Data1": 1144788345961973799, - "Data2": 7009845376497491920, - "Data3": 5980996895434703754, - "Data4": 4988676852075149325 + "Data1": -7132482814186645346, + "Data2": -4561232768775360729 }, "Flags": 3, "Kind": 3, @@ -14597,10 +14021,8 @@ }, { "__Checksum": { - "Data1": -2389127550126572017, - "Data2": 5579095125739424029, - "Data3": 7871831634790811656, - "Data4": -5955445180204609729 + "Data1": 7919020470308342010, + "Data2": -4621997674415103727 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisMinorGridLines", @@ -14678,10 +14100,8 @@ }, { "__Checksum": { - "Data1": 7869920136743356469, - "Data2": 3330678099153352381, - "Data3": 6201086830876508210, - "Data4": -8981569744415923802 + "Data1": -5219855607082252045, + "Data2": 8393497025451290482 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisMinorGridLines", @@ -14759,10 +14179,8 @@ }, { "__Checksum": { - "Data1": -6407661730674654521, - "Data2": -3749643813519327931, - "Data3": -1083993265411535599, - "Data4": -7320025507743732086 + "Data1": 7941125085093139709, + "Data2": -1427211481014902809 }, "Flags": 1, "Kind": 3, @@ -14780,10 +14198,8 @@ }, { "__Checksum": { - "Data1": 1882300340910128463, - "Data2": -8231770912718981994, - "Data3": 139479202829878739, - "Data4": -1153636929105509979 + "Data1": -488477255319188317, + "Data2": -1979038423481628026 }, "Flags": 3, "Kind": 3, @@ -14801,10 +14217,8 @@ }, { "__Checksum": { - "Data1": 7574297047449238724, - "Data2": 8874535494456194927, - "Data3": 145643124734286790, - "Data4": 262231052006423182 + "Data1": 6314838669789778260, + "Data2": 6085311929311085618 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisMinorTicks", @@ -14882,10 +14296,8 @@ }, { "__Checksum": { - "Data1": 2743532549411698276, - "Data2": 4580801910805948177, - "Data3": 5786405684614122395, - "Data4": 420475232866781406 + "Data1": 5594498808407010371, + "Data2": -6000143905553586070 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisMinorTicks", @@ -14963,10 +14375,8 @@ }, { "__Checksum": { - "Data1": -806774494364594131, - "Data2": -5236077753229155756, - "Data3": 4196022278857093245, - "Data4": 1714372639968612252 + "Data1": -8848016278380797128, + "Data2": -7877176618446668842 }, "Flags": 1, "Kind": 3, @@ -14984,10 +14394,8 @@ }, { "__Checksum": { - "Data1": -8059641667056504508, - "Data2": 4480021212758497515, - "Data3": 4220867100906482050, - "Data4": 3676604013583494572 + "Data1": -711972959756684615, + "Data2": 8150620035452248782 }, "Flags": 3, "Kind": 3, @@ -15005,10 +14413,8 @@ }, { "__Checksum": { - "Data1": -1593034927992142371, - "Data2": 416410313529512931, - "Data3": 2005389655277694244, - "Data4": -2100159146307685562 + "Data1": 1946073321890529119, + "Data2": 3222023909529214313 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisTitle", @@ -15094,10 +14500,8 @@ }, { "__Checksum": { - "Data1": -2046379063014947845, - "Data2": -9076875963552939332, - "Data3": -6424151715385430916, - "Data4": 3857673257859372481 + "Data1": -4873996762274094604, + "Data2": -5672288961053047147 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisTitle", @@ -15183,10 +14587,8 @@ }, { "__Checksum": { - "Data1": 33191496373641086, - "Data2": -6882446773202205406, - "Data3": -3650079282223067380, - "Data4": 391653897269303232 + "Data1": -4017939545091900288, + "Data2": -4055357480279495438 }, "Flags": 1, "Kind": 3, @@ -15204,10 +14606,8 @@ }, { "__Checksum": { - "Data1": 6712315107951533904, - "Data2": 3896351134404162055, - "Data3": -4383731023285782825, - "Data4": -3470730134073794508 + "Data1": -6239678051749477345, + "Data2": 6753059576886906462 }, "Flags": 3, "Kind": 3, @@ -15225,10 +14625,8 @@ }, { "__Checksum": { - "Data1": 7448144128483091601, - "Data2": 7566634551575254448, - "Data3": 6431028148024217305, - "Data4": -7804061705928943780 + "Data1": -6542859487066620690, + "Data2": -3281433858886207955 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisTitleBorder", @@ -15282,10 +14680,8 @@ }, { "__Checksum": { - "Data1": -3109157417403862586, - "Data2": 7019600808283915159, - "Data3": -6006811151388206577, - "Data4": 3455937928354929445 + "Data1": 4258966059534101666, + "Data2": -472744536388706299 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisTitleBorder", @@ -15339,10 +14735,8 @@ }, { "__Checksum": { - "Data1": -8985711019328179459, - "Data2": 4717305651270788776, - "Data3": 1223400181251792188, - "Data4": 4980166898254890959 + "Data1": -8526731472945823994, + "Data2": -2105946518702879401 }, "Flags": 1, "Kind": 3, @@ -15360,10 +14754,8 @@ }, { "__Checksum": { - "Data1": -7864123201552396946, - "Data2": -6507190506326121670, - "Data3": 2538270650629075009, - "Data4": 9159206783951984378 + "Data1": -8847408293639149671, + "Data2": -270432304045880842 }, "Flags": 3, "Kind": 3, @@ -15381,10 +14773,8 @@ }, { "__Checksum": { - "Data1": 1873489764514689666, - "Data2": 2320603408140279459, - "Data3": 5061117176239352990, - "Data4": -3704411237453077027 + "Data1": -8637980120860722620, + "Data2": 6309143196214432193 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisTitleMargin", @@ -15446,10 +14836,8 @@ }, { "__Checksum": { - "Data1": 2548414895146789886, - "Data2": 7317587848627323776, - "Data3": -5929974846303639010, - "Data4": 6922232124480924730 + "Data1": 288878458750955985, + "Data2": -183619843955257311 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisTitleMargin", @@ -15511,10 +14899,8 @@ }, { "__Checksum": { - "Data1": 3240489986084685121, - "Data2": 5733697966301538317, - "Data3": 4245750584319800757, - "Data4": -8394551645669999661 + "Data1": -4046025130263431927, + "Data2": -1679314969487111000 }, "Flags": 1, "Kind": 3, @@ -15532,10 +14918,8 @@ }, { "__Checksum": { - "Data1": 8086763896366812641, - "Data2": -4604395998392397520, - "Data3": -1374638066790401875, - "Data4": 6281718785450192012 + "Data1": 7024679528691378222, + "Data2": 1229434556517915271 }, "Flags": 3, "Kind": 3, @@ -15553,10 +14937,8 @@ }, { "__Checksum": { - "Data1": 8159173293096897743, - "Data2": 5359793555413088284, - "Data3": 8565336821670511975, - "Data4": 1677584242040468926 + "Data1": -1006538909885098563, + "Data2": 7901656824351261874 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartValueAxisTitlePadding", @@ -15618,10 +15000,8 @@ }, { "__Checksum": { - "Data1": -2564541928587904440, - "Data2": -9081465230546756087, - "Data3": -3359641156024597359, - "Data4": -3394797364554593870 + "Data1": 383975035035779253, + "Data2": 5284623660175099369 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartValueAxisTitlePadding", @@ -15683,10 +15063,8 @@ }, { "__Checksum": { - "Data1": -8549874419078303491, - "Data2": 6921829214421569606, - "Data3": -5274423401714150628, - "Data4": -6566961469660416202 + "Data1": 8823158856809494585, + "Data2": 8745376668666653887 }, "Flags": 1, "Kind": 3, @@ -15704,10 +15082,8 @@ }, { "__Checksum": { - "Data1": -6431221292446131391, - "Data2": -3565424701355895114, - "Data3": 1981112553196578593, - "Data4": 5794870542946055145 + "Data1": -6420497241672921258, + "Data2": 8338932326286650698 }, "Flags": 3, "Kind": 3, @@ -15725,10 +15101,8 @@ }, { "__Checksum": { - "Data1": 5702255315352812339, - "Data2": -977541426148028941, - "Data3": -3825002932072700874, - "Data4": 3538343786337571217 + "Data1": 4233194837089472359, + "Data2": -6912615602344409712 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxes", @@ -15758,10 +15132,8 @@ }, { "__Checksum": { - "Data1": -803745897838901834, - "Data2": 3592863388141926543, - "Data3": 4747883485644548570, - "Data4": 5302983746172827685 + "Data1": -3004804527437084632, + "Data2": -465295764033114509 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxes", @@ -15791,10 +15163,8 @@ }, { "__Checksum": { - "Data1": 6681198977386552826, - "Data2": -7645149702040639265, - "Data3": 7423650107897789893, - "Data4": -6219281829837046099 + "Data1": 8245773337598697523, + "Data2": -5545868700997224531 }, "Flags": 1, "Kind": 3, @@ -15812,10 +15182,8 @@ }, { "__Checksum": { - "Data1": 1805424493095434150, - "Data2": -7893658409790176535, - "Data3": 4807812897109740668, - "Data4": -7965514231992434354 + "Data1": 752784905589878792, + "Data2": -4638898304408162836 }, "Flags": 3, "Kind": 3, @@ -15833,10 +15201,8 @@ }, { "__Checksum": { - "Data1": 9063196000899595169, - "Data2": 6076418523000742507, - "Data3": 8065784430218493128, - "Data4": 7858725281345321386 + "Data1": -2150564765179699782, + "Data2": 8516521408657132270 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxis", @@ -15977,10 +15343,8 @@ }, { "__Checksum": { - "Data1": 3558832539141524962, - "Data2": -7098590043325666463, - "Data3": 8427439943129905675, - "Data4": -4292249938659858626 + "Data1": -3255427081168200514, + "Data2": 1475488314031768984 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxis", @@ -16121,10 +15485,8 @@ }, { "__Checksum": { - "Data1": 7872274017671458756, - "Data2": -7240361022378093388, - "Data3": 6591915930384809721, - "Data4": 6616952917279890710 + "Data1": 3678368886596245060, + "Data2": -818622623154596096 }, "Flags": 1, "Kind": 3, @@ -16142,10 +15504,8 @@ }, { "__Checksum": { - "Data1": -7556041254812402113, - "Data2": -1881644132886884965, - "Data3": -4451375582616910377, - "Data4": 3736811537596344460 + "Data1": -487562913259091534, + "Data2": -7616448906207501523 }, "Flags": 3, "Kind": 3, @@ -16163,10 +15523,8 @@ }, { "__Checksum": { - "Data1": -2011531269602820614, - "Data2": -962300112080971263, - "Data3": 2308106603275251247, - "Data4": 4683077283121506222 + "Data1": 4450336234966583774, + "Data2": -7609071601527984566 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisLabels", @@ -16276,10 +15634,8 @@ }, { "__Checksum": { - "Data1": 8533163834954631108, - "Data2": -1715127863932060174, - "Data3": -6968893672377870446, - "Data4": -190701887473455004 + "Data1": -7059834853463057048, + "Data2": -6302593638728929140 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisLabels", @@ -16389,10 +15745,8 @@ }, { "__Checksum": { - "Data1": 1736700882147845631, - "Data2": 9220251301947960150, - "Data3": -8224804369004943422, - "Data4": -5134511994192892775 + "Data1": -8407297855570752651, + "Data2": 7495519108411406349 }, "Flags": 1, "Kind": 3, @@ -16410,10 +15764,8 @@ }, { "__Checksum": { - "Data1": -7549606432813040196, - "Data2": -8726600471982755389, - "Data3": -5464566553967586570, - "Data4": 4702942822150395452 + "Data1": -5732555456049755928, + "Data2": -8801552501279696405 }, "Flags": 3, "Kind": 3, @@ -16431,10 +15783,8 @@ }, { "__Checksum": { - "Data1": -7943181183335637491, - "Data2": -2192599898305411257, - "Data3": -6487413284284545145, - "Data4": 8197829338713978688 + "Data1": 7530889410911508906, + "Data2": 5264594866591166513 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisLabelsBorder", @@ -16488,10 +15838,8 @@ }, { "__Checksum": { - "Data1": 4090964252809500495, - "Data2": 5724132949044456415, - "Data3": -4646450924295878452, - "Data4": 7489052501356287907 + "Data1": -3288765508494869409, + "Data2": -7580431491723633103 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisLabelsBorder", @@ -16545,10 +15893,8 @@ }, { "__Checksum": { - "Data1": -8999342528866285760, - "Data2": -45958209332421794, - "Data3": -2580730442071123931, - "Data4": -2739843876626473277 + "Data1": 542968396098922124, + "Data2": 5378845096523975023 }, "Flags": 1, "Kind": 3, @@ -16566,10 +15912,8 @@ }, { "__Checksum": { - "Data1": -929738220444296060, - "Data2": -5658244650848069163, - "Data3": -4428989933496941651, - "Data4": -6997848704182094218 + "Data1": 7812425253632882184, + "Data2": -3024466580443758671 }, "Flags": 3, "Kind": 3, @@ -16587,10 +15931,8 @@ }, { "__Checksum": { - "Data1": -5559306667929843374, - "Data2": -539651629390506562, - "Data3": 4429688582397929115, - "Data4": -7417727248850419964 + "Data1": 3904721148788482383, + "Data2": 1880363418956643187 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisLabelsMargin", @@ -16652,10 +15994,8 @@ }, { "__Checksum": { - "Data1": -4726080581570535180, - "Data2": 1000419976654693315, - "Data3": 5278738774537426027, - "Data4": 3288463219699237801 + "Data1": 396047517906993342, + "Data2": 7491418955461103875 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisLabelsMargin", @@ -16717,10 +16057,8 @@ }, { "__Checksum": { - "Data1": 5491852819826216928, - "Data2": -1311459216941267989, - "Data3": 6307332256435179930, - "Data4": 3728529958080066137 + "Data1": 8165159789134805682, + "Data2": 8416827951795961461 }, "Flags": 1, "Kind": 3, @@ -16738,10 +16076,8 @@ }, { "__Checksum": { - "Data1": 6370745247398653248, - "Data2": 1571188602705237689, - "Data3": 979453516623991147, - "Data4": 655029063612992177 + "Data1": 3631326894410169838, + "Data2": 8281464002540876459 }, "Flags": 3, "Kind": 3, @@ -16759,10 +16095,8 @@ }, { "__Checksum": { - "Data1": 6752277120243703330, - "Data2": 5883905684231148030, - "Data3": 3767761457546948566, - "Data4": 2537445394417119991 + "Data1": -5499208206242168652, + "Data2": -1620810594503657222 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisLabelsPadding", @@ -16824,10 +16158,8 @@ }, { "__Checksum": { - "Data1": 9158571619239135219, - "Data2": 5413994093911375604, - "Data3": 25999992057086224, - "Data4": -3997116004153247272 + "Data1": 6160204974106862365, + "Data2": 6493326487342078435 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisLabelsPadding", @@ -16889,10 +16221,8 @@ }, { "__Checksum": { - "Data1": 3537149711852517479, - "Data2": 8812126106055284203, - "Data3": -4700067947927290062, - "Data4": 2327275982438272229 + "Data1": 8764256489172713809, + "Data2": 6047196192096793062 }, "Flags": 1, "Kind": 3, @@ -16910,10 +16240,8 @@ }, { "__Checksum": { - "Data1": 2530230999820045366, - "Data2": -7252758984035374603, - "Data3": 7010517739641598398, - "Data4": -1394035401306907226 + "Data1": 2827998496522222485, + "Data2": -136179976469652901 }, "Flags": 3, "Kind": 3, @@ -16931,10 +16259,8 @@ }, { "__Checksum": { - "Data1": 2160301546531808775, - "Data2": 2998799430450841929, - "Data3": 6613711572597451221, - "Data4": -7702752008014803747 + "Data1": -5407036905475036996, + "Data2": 6210005246219669359 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisLabelsRotation", @@ -16980,10 +16306,8 @@ }, { "__Checksum": { - "Data1": 4653836945180010848, - "Data2": -7663339305008702287, - "Data3": 5419013640760959883, - "Data4": -5988946593562053996 + "Data1": -7802225506255187889, + "Data2": -1214762382849019690 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisLabelsRotation", @@ -17029,10 +16353,8 @@ }, { "__Checksum": { - "Data1": -3978359443553487217, - "Data2": -341389091018666378, - "Data3": -36949577887055380, - "Data4": -8170111152691468822 + "Data1": -2120301238948562553, + "Data2": 8763268948576462150 }, "Flags": 1, "Kind": 3, @@ -17050,10 +16372,8 @@ }, { "__Checksum": { - "Data1": -6767496455095421459, - "Data2": -8019210497420600704, - "Data3": -8087716276079129277, - "Data4": 653736458097004280 + "Data1": -1538007732096586202, + "Data2": -4737329567751662881 }, "Flags": 3, "Kind": 3, @@ -17071,10 +16391,8 @@ }, { "__Checksum": { - "Data1": -9131561536636763861, - "Data2": 3813229880055257177, - "Data3": 7353299178898220086, - "Data4": -809115004252602645 + "Data1": -4130748339407449567, + "Data2": 6626867394054150859 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisLine", @@ -17136,10 +16454,8 @@ }, { "__Checksum": { - "Data1": -2289752872438360697, - "Data2": -1752168996116021918, - "Data3": -3806177464838261324, - "Data4": 2370250651166415922 + "Data1": 2734317740205627608, + "Data2": 288045425034583528 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisLine", @@ -17201,10 +16517,8 @@ }, { "__Checksum": { - "Data1": -7039587895696612837, - "Data2": -7628720971324127848, - "Data3": -1413757582050064660, - "Data4": -7602935546260612753 + "Data1": -3979073824291399024, + "Data2": -6482895148487216628 }, "Flags": 1, "Kind": 3, @@ -17222,10 +16536,8 @@ }, { "__Checksum": { - "Data1": -8697813763122371009, - "Data2": -8828031551332654293, - "Data3": 4486898363481487103, - "Data4": 1197310669513638237 + "Data1": -8841719144293520958, + "Data2": -7683962616595455926 }, "Flags": 3, "Kind": 3, @@ -17243,10 +16555,8 @@ }, { "__Checksum": { - "Data1": 5230525468577207786, - "Data2": 2846790360606589476, - "Data3": -4877738989790369129, - "Data4": -3819965699851906706 + "Data1": -6182075234991655657, + "Data2": -8366250150525996133 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisMajorGridLines", @@ -17324,10 +16634,8 @@ }, { "__Checksum": { - "Data1": 8506454564397382222, - "Data2": -5350721299386224382, - "Data3": -7749881676250177765, - "Data4": -5362487251496238194 + "Data1": 2451119992716809633, + "Data2": -1817643618360926103 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisMajorGridLines", @@ -17405,10 +16713,8 @@ }, { "__Checksum": { - "Data1": 6047948799184645604, - "Data2": -8000208816904171173, - "Data3": 2028017282056720169, - "Data4": 801568307785034484 + "Data1": -1618725492710833548, + "Data2": -6660469003136934447 }, "Flags": 1, "Kind": 3, @@ -17426,10 +16732,8 @@ }, { "__Checksum": { - "Data1": -8390406966850423201, - "Data2": -3371756812202186601, - "Data3": 2730609204842334772, - "Data4": 257514633267797097 + "Data1": 4845182971478246256, + "Data2": -8240335484626623569 }, "Flags": 3, "Kind": 3, @@ -17447,10 +16751,8 @@ }, { "__Checksum": { - "Data1": -2439605044660238098, - "Data2": -8919027797599401379, - "Data3": -6228580890557732854, - "Data4": -2967124562237960449 + "Data1": 988578018646281899, + "Data2": -3654044001566631356 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisMajorTicks", @@ -17528,10 +16830,8 @@ }, { "__Checksum": { - "Data1": 562876859471619163, - "Data2": -6625188799425084534, - "Data3": 8983468026386085346, - "Data4": 5724275431842118077 + "Data1": -9125797945880351606, + "Data2": 8291641651351250625 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisMajorTicks", @@ -17609,10 +16909,8 @@ }, { "__Checksum": { - "Data1": 2427123663206189548, - "Data2": 3673593955702240170, - "Data3": 7467250379271829413, - "Data4": -2377984716252878432 + "Data1": -1343599378185344242, + "Data2": 6977179904123833955 }, "Flags": 1, "Kind": 3, @@ -17630,10 +16928,8 @@ }, { "__Checksum": { - "Data1": -6810093065386346600, - "Data2": 2347739609969320157, - "Data3": 7434879327993694543, - "Data4": -5532241718815861588 + "Data1": 3211499088158238845, + "Data2": -7557120665017564755 }, "Flags": 3, "Kind": 3, @@ -17651,10 +16947,8 @@ }, { "__Checksum": { - "Data1": 2541538786325851327, - "Data2": -4355019916326233702, - "Data3": -1971101273223032451, - "Data4": -8573482940446206130 + "Data1": 5542532119267804990, + "Data2": -311973450182556954 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisMinorGridLines", @@ -17732,10 +17026,8 @@ }, { "__Checksum": { - "Data1": -6774102745978044634, - "Data2": -4540166116405381778, - "Data3": 5661082906177474271, - "Data4": 4602570858855304110 + "Data1": 5660696748159904070, + "Data2": 1664869265020621437 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisMinorGridLines", @@ -17813,10 +17105,8 @@ }, { "__Checksum": { - "Data1": 7464344987078098352, - "Data2": -5804358405427317935, - "Data3": 5681659727373390572, - "Data4": 8326445644537087568 + "Data1": -2826729424575497025, + "Data2": 1333128567954190549 }, "Flags": 1, "Kind": 3, @@ -17834,10 +17124,8 @@ }, { "__Checksum": { - "Data1": -3035703984626032517, - "Data2": -2626172350883612751, - "Data3": -6019300836021816582, - "Data4": -971492095627952119 + "Data1": 4041166590766768789, + "Data2": -9222713006202750273 }, "Flags": 3, "Kind": 3, @@ -17855,10 +17143,8 @@ }, { "__Checksum": { - "Data1": -5375094070004771330, - "Data2": 8232942528739186892, - "Data3": -7266262952753759825, - "Data4": 819484191398650615 + "Data1": -4048966285883879661, + "Data2": -6926441836430028175 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisMinorTicks", @@ -17936,10 +17222,8 @@ }, { "__Checksum": { - "Data1": 5230599459244094199, - "Data2": 7738772054827652356, - "Data3": 4835176220077636381, - "Data4": 7330264331224716099 + "Data1": 15514424979635113, + "Data2": 6811829242766005952 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisMinorTicks", @@ -18017,10 +17301,8 @@ }, { "__Checksum": { - "Data1": 3416915244695178585, - "Data2": -1837329597521487936, - "Data3": -6875531308739142306, - "Data4": 5266185439543924078 + "Data1": 4818317251899855529, + "Data2": -563218162917807626 }, "Flags": 1, "Kind": 3, @@ -18038,10 +17320,8 @@ }, { "__Checksum": { - "Data1": 637081447815175023, - "Data2": 6725363073619911664, - "Data3": -9006914852428580990, - "Data4": 4522280668888572871 + "Data1": -3851579284793636082, + "Data2": -277291529319556046 }, "Flags": 3, "Kind": 3, @@ -18059,10 +17339,8 @@ }, { "__Checksum": { - "Data1": 5803116559615520787, - "Data2": 835959362319868216, - "Data3": 4139129783109862964, - "Data4": -5146328514322353458 + "Data1": -6498795982191983548, + "Data2": 1886194989006526414 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisTitle", @@ -18148,10 +17426,8 @@ }, { "__Checksum": { - "Data1": -145377821600841341, - "Data2": -6432829324366541706, - "Data3": 1767664118021478393, - "Data4": 8506910865679672300 + "Data1": -2977387866619267516, + "Data2": 5452841092016989894 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisTitle", @@ -18237,10 +17513,8 @@ }, { "__Checksum": { - "Data1": 5050815752907015637, - "Data2": 7277420129277500227, - "Data3": -1807733554251420386, - "Data4": 6905130026832127945 + "Data1": -117471426512096533, + "Data2": -5792249879631553535 }, "Flags": 1, "Kind": 3, @@ -18258,10 +17532,8 @@ }, { "__Checksum": { - "Data1": 8635284063591132452, - "Data2": 1154633902067318309, - "Data3": 4680140074118431311, - "Data4": 9068039715181284075 + "Data1": 3879247591973276591, + "Data2": 4936822027194432365 }, "Flags": 3, "Kind": 3, @@ -18279,10 +17551,8 @@ }, { "__Checksum": { - "Data1": -6140184259070267398, - "Data2": 4305018241835013174, - "Data3": -2546475988279278460, - "Data4": 8059606403324121611 + "Data1": 7926825376482811644, + "Data2": -3713230114847610871 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisTitleBorder", @@ -18336,10 +17606,8 @@ }, { "__Checksum": { - "Data1": 7120470307359794230, - "Data2": 9160293717041365194, - "Data3": 4273425017440972960, - "Data4": -2953609183827544340 + "Data1": -7203476257722168401, + "Data2": -3042111483326480809 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisTitleBorder", @@ -18393,10 +17661,8 @@ }, { "__Checksum": { - "Data1": -642775636980142598, - "Data2": 6354894192264294934, - "Data3": -5910307643193606346, - "Data4": 1312878311849155213 + "Data1": 4666057450973000568, + "Data2": -7676180380490561588 }, "Flags": 1, "Kind": 3, @@ -18414,10 +17680,8 @@ }, { "__Checksum": { - "Data1": 7676129294478404940, - "Data2": -4732000617748523398, - "Data3": -4917652512856164979, - "Data4": -7270335530713541750 + "Data1": -2400501783097629378, + "Data2": 6975969639974599199 }, "Flags": 3, "Kind": 3, @@ -18435,10 +17699,8 @@ }, { "__Checksum": { - "Data1": 8518860058325870640, - "Data2": -7962032477883965327, - "Data3": -7359442998470769821, - "Data4": -422578969529223816 + "Data1": -1696817541834941921, + "Data2": 1469362199329364287 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisTitleMargin", @@ -18500,10 +17762,8 @@ }, { "__Checksum": { - "Data1": -3721517789863906833, - "Data2": 1262873172711186241, - "Data3": -8577964238768248683, - "Data4": -5806860586769635348 + "Data1": -650868128450580636, + "Data2": 421469174710426507 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisTitleMargin", @@ -18565,10 +17825,8 @@ }, { "__Checksum": { - "Data1": -8985803071599459433, - "Data2": -5954725913802671447, - "Data3": 3196355366235011749, - "Data4": -3925867879904569176 + "Data1": -463317470050559552, + "Data2": 8806831123293520128 }, "Flags": 1, "Kind": 3, @@ -18586,10 +17844,8 @@ }, { "__Checksum": { - "Data1": -3530528469873634813, - "Data2": -1395927561170804757, - "Data3": -1483300454562385397, - "Data4": -6808633853573220707 + "Data1": 7490998403610343047, + "Data2": 1749185896479746978 }, "Flags": 3, "Kind": 3, @@ -18607,10 +17863,8 @@ }, { "__Checksum": { - "Data1": 6589744374217632910, - "Data2": -7372647877527658951, - "Data3": -8055978674796003341, - "Data4": -4904079147953738194 + "Data1": 7993712487613404078, + "Data2": 793949683313012279 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartXAxisTitlePadding", @@ -18672,10 +17926,8 @@ }, { "__Checksum": { - "Data1": -8661343950024123635, - "Data2": -2179000950183205900, - "Data3": 2890768945401081492, - "Data4": -8272028817037016854 + "Data1": -6072200219985662735, + "Data2": -3630554064201999550 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartXAxisTitlePadding", @@ -18737,10 +17989,8 @@ }, { "__Checksum": { - "Data1": 2184210220311787862, - "Data2": 5614095580470945474, - "Data3": -6550227647284414550, - "Data4": 5261499722135372459 + "Data1": -9071011009844465506, + "Data2": -2191067453073396756 }, "Flags": 1, "Kind": 3, @@ -18758,10 +18008,8 @@ }, { "__Checksum": { - "Data1": -8659466745375815721, - "Data2": -7116236829654552366, - "Data3": 8829138489820922248, - "Data4": 6222295291935937925 + "Data1": 2204307593196661374, + "Data2": 4667188067836187500 }, "Flags": 3, "Kind": 3, @@ -18779,10 +18027,8 @@ }, { "__Checksum": { - "Data1": 8680072450868967462, - "Data2": 5530117924956366369, - "Data3": 2116185165996604477, - "Data4": -4171642502823393119 + "Data1": 540872234603197936, + "Data2": -7194377670314666204 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxes", @@ -18812,10 +18058,8 @@ }, { "__Checksum": { - "Data1": 2959991001220694360, - "Data2": -6881342182476091625, - "Data3": 1579685402338920618, - "Data4": -5139223448348566087 + "Data1": -6437593969240497566, + "Data2": -5113245266426263736 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxes", @@ -18845,10 +18089,8 @@ }, { "__Checksum": { - "Data1": 7821161512831357777, - "Data2": 2507657585260389855, - "Data3": -5897411521857555485, - "Data4": -8448121980845876887 + "Data1": -7152282084464127364, + "Data2": 2701882931180196377 }, "Flags": 1, "Kind": 3, @@ -18866,10 +18108,8 @@ }, { "__Checksum": { - "Data1": 7895718209473944940, - "Data2": 3041822616670370126, - "Data3": 6894705927095618255, - "Data4": -5969951376635072570 + "Data1": -7332081036370600568, + "Data2": 440153462159318035 }, "Flags": 3, "Kind": 3, @@ -18887,10 +18127,8 @@ }, { "__Checksum": { - "Data1": -1941400630048200483, - "Data2": -1962150861502229685, - "Data3": -4954619062846125577, - "Data4": 3341903641128390299 + "Data1": -2109891636593326120, + "Data2": -9022455697235938395 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxis", @@ -19023,10 +18261,8 @@ }, { "__Checksum": { - "Data1": 4929870637892183464, - "Data2": -7389258174874998132, - "Data3": -4894584299918409170, - "Data4": 2142769739674743079 + "Data1": -4628451944226325690, + "Data2": 989576352419710280 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxis", @@ -19159,10 +18395,8 @@ }, { "__Checksum": { - "Data1": 3287713737355206967, - "Data2": 6902885097854065605, - "Data3": -3729342427792501890, - "Data4": 7125655005879934839 + "Data1": 4006785984833616609, + "Data2": -5727481651041326295 }, "Flags": 1, "Kind": 3, @@ -19180,10 +18414,8 @@ }, { "__Checksum": { - "Data1": -5521580339082517624, - "Data2": 5404574630617816823, - "Data3": -3600683312935989233, - "Data4": -1112338145547877318 + "Data1": -1187046850933251092, + "Data2": -8243647591585635179 }, "Flags": 3, "Kind": 3, @@ -19201,10 +18433,8 @@ }, { "__Checksum": { - "Data1": -1047563712605805387, - "Data2": -4118202727821436213, - "Data3": 4889129684812153277, - "Data4": 4992433088471179035 + "Data1": -2392665496300643754, + "Data2": 5310094143107116314 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisLabels", @@ -19314,10 +18544,8 @@ }, { "__Checksum": { - "Data1": 1373494974776278611, - "Data2": -5479064631283149306, - "Data3": 5715313738163144590, - "Data4": -2681582275933430704 + "Data1": 2386958573377070103, + "Data2": 3768431547233056202 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisLabels", @@ -19427,10 +18655,8 @@ }, { "__Checksum": { - "Data1": -6181696056879325637, - "Data2": -4463416542957626152, - "Data3": 7645739293185127987, - "Data4": -3324963712873374361 + "Data1": 3898911949822266057, + "Data2": 5696780152844266200 }, "Flags": 1, "Kind": 3, @@ -19448,10 +18674,8 @@ }, { "__Checksum": { - "Data1": 1230480401723884535, - "Data2": 6168972337606650833, - "Data3": -7724339909779402015, - "Data4": 4029994452344752451 + "Data1": 4099056183959125509, + "Data2": 3817468059313960082 }, "Flags": 3, "Kind": 3, @@ -19469,10 +18693,8 @@ }, { "__Checksum": { - "Data1": -1613849901592006660, - "Data2": 2272565946719665216, - "Data3": 886497961265015314, - "Data4": -3294003566493536791 + "Data1": -1145431650849401903, + "Data2": 7923424762646676301 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisLabelsBorder", @@ -19526,10 +18748,8 @@ }, { "__Checksum": { - "Data1": 7034333651180054019, - "Data2": -9028359748930657600, - "Data3": 7251162005643713191, - "Data4": -4677566150456085543 + "Data1": 5734583488842668975, + "Data2": -1911008416658357967 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisLabelsBorder", @@ -19583,10 +18803,8 @@ }, { "__Checksum": { - "Data1": -6120810221508748627, - "Data2": -6716290972643682817, - "Data3": 1814636046962035020, - "Data4": 878828799154081264 + "Data1": -1093323219387633838, + "Data2": -1557938201491627627 }, "Flags": 1, "Kind": 3, @@ -19604,10 +18822,8 @@ }, { "__Checksum": { - "Data1": -8313289804995577828, - "Data2": -1605910570886294992, - "Data3": 3995301622568610398, - "Data4": -1098401930425752094 + "Data1": 6826804121115627767, + "Data2": 5629646842611165529 }, "Flags": 3, "Kind": 3, @@ -19625,10 +18841,8 @@ }, { "__Checksum": { - "Data1": 6471928114914883083, - "Data2": 7187454365384735862, - "Data3": 8766816873577025036, - "Data4": -5907978290880490431 + "Data1": -992639987388219850, + "Data2": -945128355010003811 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisLabelsMargin", @@ -19690,10 +18904,8 @@ }, { "__Checksum": { - "Data1": 2568185408837395307, - "Data2": -5406965777627263363, - "Data3": -6484927496230158589, - "Data4": -5160647766424061532 + "Data1": -3181140950927572958, + "Data2": 3938574247389750860 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisLabelsMargin", @@ -19755,10 +18967,8 @@ }, { "__Checksum": { - "Data1": -4786151579805182997, - "Data2": 4842547266304745238, - "Data3": -6515429221507112318, - "Data4": -2199330600879068307 + "Data1": 7158847767550033916, + "Data2": 1412980075488203676 }, "Flags": 1, "Kind": 3, @@ -19776,10 +18986,8 @@ }, { "__Checksum": { - "Data1": 434226641311394560, - "Data2": -8488287857469234235, - "Data3": 5260677902379325496, - "Data4": -3748510033762413448 + "Data1": 1543484077348573267, + "Data2": 1890354626511082759 }, "Flags": 3, "Kind": 3, @@ -19797,10 +19005,8 @@ }, { "__Checksum": { - "Data1": 7252556991249629572, - "Data2": -5190733380157296788, - "Data3": 4769510812941978015, - "Data4": -4612963668174262834 + "Data1": 1319902612942375688, + "Data2": 8093183523040016245 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisLabelsPadding", @@ -19862,10 +19068,8 @@ }, { "__Checksum": { - "Data1": -8932684632589956259, - "Data2": -2928977526592265973, - "Data3": -7790677792869658976, - "Data4": -4851595240812328136 + "Data1": 3411854868821663273, + "Data2": -7310200683254026994 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisLabelsPadding", @@ -19927,10 +19131,8 @@ }, { "__Checksum": { - "Data1": 5278696238726272350, - "Data2": 6447352070789888965, - "Data3": 6003912234595856219, - "Data4": 7761343499053546160 + "Data1": -1055238678463635380, + "Data2": 4402918589296896760 }, "Flags": 1, "Kind": 3, @@ -19948,10 +19150,8 @@ }, { "__Checksum": { - "Data1": -8990598430637971399, - "Data2": 3222828222283396400, - "Data3": 3913282847297229142, - "Data4": 4946204329042274502 + "Data1": 1869266946585776505, + "Data2": 5684543793652816986 }, "Flags": 3, "Kind": 3, @@ -19969,10 +19169,8 @@ }, { "__Checksum": { - "Data1": 6781213592199378614, - "Data2": 6253403347866546912, - "Data3": 4123194362669816153, - "Data4": -397001635300981471 + "Data1": 8603658876471883964, + "Data2": 5373377176350525578 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisLabelsRotation", @@ -20018,10 +19216,8 @@ }, { "__Checksum": { - "Data1": 4780754148085434383, - "Data2": -1189554755371398696, - "Data3": 509853773054246938, - "Data4": 1611000132433392377 + "Data1": -1980508915686696363, + "Data2": 5638833147870645773 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisLabelsRotation", @@ -20067,10 +19263,8 @@ }, { "__Checksum": { - "Data1": -4632774358219741940, - "Data2": -9078849281160405567, - "Data3": 1598432956160457887, - "Data4": 7602249133652059317 + "Data1": 4470053901477606791, + "Data2": 4026026748629670357 }, "Flags": 1, "Kind": 3, @@ -20088,10 +19282,8 @@ }, { "__Checksum": { - "Data1": 8446349030518222155, - "Data2": 2560800132311378875, - "Data3": 4312536903683601256, - "Data4": 8861548176901472166 + "Data1": 773443227630410921, + "Data2": 116815098156608816 }, "Flags": 3, "Kind": 3, @@ -20109,10 +19301,8 @@ }, { "__Checksum": { - "Data1": -7289748867832754925, - "Data2": 8752306055805484338, - "Data3": 2274497086767661660, - "Data4": -1614041790026278923 + "Data1": 6622065481148764904, + "Data2": -5947940115954299069 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisLine", @@ -20174,10 +19364,8 @@ }, { "__Checksum": { - "Data1": 5500971479009319426, - "Data2": 789938099797941776, - "Data3": -2516706561079926287, - "Data4": -4432299020438266812 + "Data1": 2223299356818731238, + "Data2": -1687425984572408986 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisLine", @@ -20239,10 +19427,8 @@ }, { "__Checksum": { - "Data1": 597466538342968477, - "Data2": -3649884586955001958, - "Data3": 7915942773459687822, - "Data4": 1605764876376224484 + "Data1": 42648224582399396, + "Data2": -1246186670055372130 }, "Flags": 1, "Kind": 3, @@ -20260,10 +19446,8 @@ }, { "__Checksum": { - "Data1": -7938251671920691223, - "Data2": -5866902452891621065, - "Data3": 5718960095106717376, - "Data4": 3501117334982394083 + "Data1": -3594534539896682569, + "Data2": -3119178428535798836 }, "Flags": 3, "Kind": 3, @@ -20281,10 +19465,8 @@ }, { "__Checksum": { - "Data1": 5666696923935601224, - "Data2": -7768704684269091799, - "Data3": 3868438278711644201, - "Data4": -8516711580021540023 + "Data1": -4328972095648407118, + "Data2": -8036322535381477652 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisMajorGridLines", @@ -20362,10 +19544,8 @@ }, { "__Checksum": { - "Data1": 8663378682518058388, - "Data2": 7350938683309710602, - "Data3": 4436190218273424270, - "Data4": 267356639718450256 + "Data1": 9071491293001204078, + "Data2": -995048991358605126 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisMajorGridLines", @@ -20443,10 +19623,8 @@ }, { "__Checksum": { - "Data1": 4631087972476114620, - "Data2": 3960551030746773499, - "Data3": -692729421352543218, - "Data4": -3964590342178415856 + "Data1": -2886374225145520705, + "Data2": 6410131521931208793 }, "Flags": 1, "Kind": 3, @@ -20464,10 +19642,8 @@ }, { "__Checksum": { - "Data1": 6058150586103632058, - "Data2": -8726849854153938177, - "Data3": 4952253562271745912, - "Data4": -976724601052663256 + "Data1": 5849744368098742671, + "Data2": 5720857218601984190 }, "Flags": 3, "Kind": 3, @@ -20485,10 +19661,8 @@ }, { "__Checksum": { - "Data1": -7117932749068927726, - "Data2": 6341468423383996019, - "Data3": 4931971664712926020, - "Data4": -2173096697858912224 + "Data1": -5549569279161529170, + "Data2": -8853390933973645536 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisMajorTicks", @@ -20566,10 +19740,8 @@ }, { "__Checksum": { - "Data1": 7960282989984874996, - "Data2": -2049679562272866894, - "Data3": 4518632821964479640, - "Data4": -8737149118847187154 + "Data1": 2269786494716444164, + "Data2": 3428925736171707917 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisMajorTicks", @@ -20647,10 +19819,8 @@ }, { "__Checksum": { - "Data1": -8215475500721466080, - "Data2": 6215515815570793637, - "Data3": 7903840850732176686, - "Data4": -4730013346117886315 + "Data1": 95087155943902943, + "Data2": 3030344026087134921 }, "Flags": 1, "Kind": 3, @@ -20668,10 +19838,8 @@ }, { "__Checksum": { - "Data1": 5770580833264532148, - "Data2": -3774941288027434234, - "Data3": 8074175922630647069, - "Data4": -2839494119351326036 + "Data1": -753875803549121237, + "Data2": -151603066025636921 }, "Flags": 3, "Kind": 3, @@ -20689,10 +19857,8 @@ }, { "__Checksum": { - "Data1": -8252364759817461043, - "Data2": -8577525987373059956, - "Data3": 8104576835589813716, - "Data4": 1668296648482683511 + "Data1": -4925196176254156977, + "Data2": 7092067614757955408 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisMinorGridLines", @@ -20770,10 +19936,8 @@ }, { "__Checksum": { - "Data1": 7524488876715578817, - "Data2": -8098608819283741584, - "Data3": -5611431334051692603, - "Data4": -5109458337606619052 + "Data1": -4514694848102180704, + "Data2": -7646800101953051544 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisMinorGridLines", @@ -20851,10 +20015,8 @@ }, { "__Checksum": { - "Data1": -1747857483857149403, - "Data2": 1387621003770527706, - "Data3": 8200448997648544739, - "Data4": -5600227518940286489 + "Data1": 6161357777324522021, + "Data2": -214596470605548395 }, "Flags": 1, "Kind": 3, @@ -20872,10 +20034,8 @@ }, { "__Checksum": { - "Data1": 8345465555127917187, - "Data2": 1586865707464469173, - "Data3": 2162904364166392357, - "Data4": 668633254431193785 + "Data1": 8146680242862523564, + "Data2": 8952684899845832056 }, "Flags": 3, "Kind": 3, @@ -20893,10 +20053,8 @@ }, { "__Checksum": { - "Data1": 1655880127916353179, - "Data2": -4454409624963211111, - "Data3": -4436597214104024078, - "Data4": 6887577319528464457 + "Data1": 8380326439007818794, + "Data2": -4094791714306611724 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisMinorTicks", @@ -20974,10 +20132,8 @@ }, { "__Checksum": { - "Data1": -504561399610810792, - "Data2": 1263224218972125015, - "Data3": 3006719835834648587, - "Data4": -1200812466942386353 + "Data1": 4642491242980922415, + "Data2": 6081593978402891922 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisMinorTicks", @@ -21055,10 +20211,8 @@ }, { "__Checksum": { - "Data1": -4171502333814923669, - "Data2": -3445356332540647410, - "Data3": 8190868832890345514, - "Data4": -7207753338985204425 + "Data1": -3226574465780887800, + "Data2": 9154622886437335417 }, "Flags": 1, "Kind": 3, @@ -21076,10 +20230,8 @@ }, { "__Checksum": { - "Data1": 8373363557778358354, - "Data2": 3731364981937927219, - "Data3": -6714760148590613755, - "Data4": 7141420904284609294 + "Data1": -3784388956046748632, + "Data2": -3498915348136860384 }, "Flags": 3, "Kind": 3, @@ -21097,10 +20249,8 @@ }, { "__Checksum": { - "Data1": 6248427201661467244, - "Data2": -6468119462988357035, - "Data3": 784962450196603725, - "Data4": -7403540109699812638 + "Data1": -4434472101028068232, + "Data2": -1824656862533652525 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisTitle", @@ -21186,10 +20336,8 @@ }, { "__Checksum": { - "Data1": -2271305812638041378, - "Data2": -5959488476086871286, - "Data3": 4121636983156996109, - "Data4": -8177962007057220725 + "Data1": -1613071835413911077, + "Data2": 2921719963465936389 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisTitle", @@ -21275,10 +20423,8 @@ }, { "__Checksum": { - "Data1": 8011866731899507700, - "Data2": 1043094495583973141, - "Data3": 489327146537953621, - "Data4": 8508140017964060319 + "Data1": -2980573290928785311, + "Data2": 4954107810253903691 }, "Flags": 1, "Kind": 3, @@ -21296,10 +20442,8 @@ }, { "__Checksum": { - "Data1": 7161227788948398771, - "Data2": 6254897728776424275, - "Data3": -3481797162633296254, - "Data4": 4676866902134578231 + "Data1": 8697711106837478955, + "Data2": -6036531642607389399 }, "Flags": 3, "Kind": 3, @@ -21317,10 +20461,8 @@ }, { "__Checksum": { - "Data1": 8970964993538768311, - "Data2": -6298537722302567936, - "Data3": 8283493105065017180, - "Data4": 820264037363138905 + "Data1": 3746658662226857064, + "Data2": -4733646291675631525 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisTitleBorder", @@ -21374,10 +20516,8 @@ }, { "__Checksum": { - "Data1": 2290591299941401396, - "Data2": 2345471075495108171, - "Data3": -3296980938356084613, - "Data4": -6492701661506392516 + "Data1": -9170712532843115765, + "Data2": 9161668950386046569 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisTitleBorder", @@ -21431,10 +20571,8 @@ }, { "__Checksum": { - "Data1": -1473034810697532342, - "Data2": 5965668703849154676, - "Data3": 6767343903165726400, - "Data4": 6410039218034882152 + "Data1": -7023503806500851539, + "Data2": 7997584678385754114 }, "Flags": 1, "Kind": 3, @@ -21452,10 +20590,8 @@ }, { "__Checksum": { - "Data1": -1005822236325291066, - "Data2": -7038261182330787085, - "Data3": -9212618766163357134, - "Data4": -5715794392985865023 + "Data1": 1244936194538171695, + "Data2": -3527844011408675559 }, "Flags": 3, "Kind": 3, @@ -21473,10 +20609,8 @@ }, { "__Checksum": { - "Data1": -852056155206539846, - "Data2": -4821182750472248657, - "Data3": -2213177569086149073, - "Data4": -5528749797789637508 + "Data1": 893259537338245860, + "Data2": -978401668265080916 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisTitleMargin", @@ -21538,10 +20672,8 @@ }, { "__Checksum": { - "Data1": -2536640876243068505, - "Data2": 8013576709752110397, - "Data3": -4954070484970893170, - "Data4": -8922298736548365383 + "Data1": 1383158080720403409, + "Data2": 3697730904682362992 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisTitleMargin", @@ -21603,10 +20735,8 @@ }, { "__Checksum": { - "Data1": -105695119120318764, - "Data2": -1846107331434694931, - "Data3": -5654653569038818629, - "Data4": 6063605380377637497 + "Data1": 3347922174907667237, + "Data2": 5930399223147439029 }, "Flags": 1, "Kind": 3, @@ -21624,10 +20754,8 @@ }, { "__Checksum": { - "Data1": -3176773909654809749, - "Data2": -3741216027482546242, - "Data3": 3266000876474489286, - "Data4": 1150755603274024119 + "Data1": 1636446847538783567, + "Data2": -5504637002165977362 }, "Flags": 3, "Kind": 3, @@ -21645,10 +20773,8 @@ }, { "__Checksum": { - "Data1": -4219582109456765257, - "Data2": 7041012448195957758, - "Data3": 5413557827588610829, - "Data4": 8146152471938539430 + "Data1": 1699345202197856913, + "Data2": 595651422378592350 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ChartYAxisTitlePadding", @@ -21710,10 +20836,8 @@ }, { "__Checksum": { - "Data1": -8181203101687656251, - "Data2": -581374825867093456, - "Data3": 2804684369406946441, - "Data4": -6140822522158766666 + "Data1": -3820316454400240485, + "Data2": -990068914456881998 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ChartYAxisTitlePadding", @@ -21775,10 +20899,8 @@ }, { "__Checksum": { - "Data1": 3951346698743045448, - "Data2": 8307871564051610706, - "Data3": -3395699753272943120, - "Data4": 6074036509078494273 + "Data1": -4613578930372366684, + "Data2": 4154824183999028172 }, "Flags": 1, "Kind": 3, @@ -21796,10 +20918,8 @@ }, { "__Checksum": { - "Data1": -2103121579610498427, - "Data2": 3135320359701373042, - "Data3": 872222866197193764, - "Data4": 2958869319739766054 + "Data1": -5772695157489930147, + "Data2": -2840383687356573191 }, "Flags": 3, "Kind": 3, @@ -21817,10 +20937,8 @@ }, { "__Checksum": { - "Data1": -212244485817257305, - "Data2": -5394159942034460390, - "Data3": -1500377895944760253, - "Data4": 7184668234890738250 + "Data1": -1838475810225323081, + "Data2": 8183942339351305678 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikChart", @@ -21894,10 +21012,8 @@ }, { "__Checksum": { - "Data1": -6424248820487106343, - "Data2": 2890931061770979961, - "Data3": 8195360547934150814, - "Data4": -6840331223946283772 + "Data1": 6413145001999737760, + "Data2": -3269066391733338459 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikChart", @@ -21971,10 +21087,8 @@ }, { "__Checksum": { - "Data1": -3940134487707134657, - "Data2": 2745358257191375582, - "Data3": -6803833142614712111, - "Data4": 3944087909113139346 + "Data1": 193961630299485923, + "Data2": 7614143031900141103 }, "Flags": 1, "Kind": 3, @@ -21992,10 +21106,8 @@ }, { "__Checksum": { - "Data1": -1424715992552710941, - "Data2": 2265466384471865899, - "Data3": 3210258175151775778, - "Data4": 2891285412460902764 + "Data1": -159477496026509766, + "Data2": -259344088225088281 }, "Flags": 3, "Kind": 3, @@ -22013,10 +21125,8 @@ }, { "__Checksum": { - "Data1": 6033256448516371415, - "Data2": -9022091834447360978, - "Data3": -1848615640931526491, - "Data4": -5750618492916787799 + "Data1": -833899726367839915, + "Data2": 7549018289796484708 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikCheckBox", @@ -22148,10 +21258,8 @@ }, { "__Checksum": { - "Data1": 8920217985008934852, - "Data2": -8348353360263508615, - "Data3": -8102533919547336082, - "Data4": -5177296772288016610 + "Data1": 6377805079465579415, + "Data2": -4826242760949658713 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikCheckBox", @@ -22283,10 +21391,8 @@ }, { "__Checksum": { - "Data1": 3239044991246678294, - "Data2": 2060090087430245096, - "Data3": -5222448057340416339, - "Data4": -1740931240866574620 + "Data1": -6459197831399901172, + "Data2": 1683723855555401025 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikComboBox", @@ -22548,10 +21654,8 @@ }, { "__Checksum": { - "Data1": -443878098835363382, - "Data2": 3356530137425636212, - "Data3": 1912490887381887142, - "Data4": 7530236115273425787 + "Data1": 2667852715302773198, + "Data2": 8026698354712730411 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikComboBox", @@ -22813,10 +21917,8 @@ }, { "__Checksum": { - "Data1": -7039945456871850651, - "Data2": -5929475148935903786, - "Data3": -3318641841951585109, - "Data4": -5513371467913175258 + "Data1": 4543844710742816326, + "Data2": 6893100334863427903 }, "Flags": 1, "Kind": 3, @@ -22835,10 +21937,8 @@ }, { "__Checksum": { - "Data1": 7565268766103783080, - "Data2": 6368735867775866268, - "Data3": -2751406106697165258, - "Data4": 8878871224714749000 + "Data1": -6448672473134962420, + "Data2": 4157527328422669558 }, "Flags": 3, "Kind": 3, @@ -22857,10 +21957,8 @@ }, { "__Checksum": { - "Data1": -2180636477433571076, - "Data2": 7727602856933568874, - "Data3": 2922818753056586036, - "Data4": 6786991228613293410 + "Data1": 3251876112599028610, + "Data2": 7946835895752634387 }, "Flags": 1, "Kind": 3, @@ -22879,10 +21977,8 @@ }, { "__Checksum": { - "Data1": 7481244537767982224, - "Data2": 7671014217113982336, - "Data3": 1790305933420894665, - "Data4": 3364716686467485584 + "Data1": 4777847313883317288, + "Data2": -5714633015252241795 }, "Flags": 3, "Kind": 3, @@ -22901,10 +21997,8 @@ }, { "__Checksum": { - "Data1": 6421745781139962474, - "Data2": -7951242031478195316, - "Data3": -2561876584231883018, - "Data4": -4490650286405548306 + "Data1": -3752256046036963798, + "Data2": 2945015233539019672 }, "Flags": 1, "Kind": 3, @@ -22934,10 +22028,8 @@ }, { "__Checksum": { - "Data1": 708329329502224682, - "Data2": -8427437159315005476, - "Data3": 3968298655867565164, - "Data4": 7011335372466073244 + "Data1": -5700239526389633740, + "Data2": 5212441596267008190 }, "Flags": 3, "Kind": 3, @@ -22967,10 +22059,8 @@ }, { "__Checksum": { - "Data1": -242014597752011472, - "Data2": 5146402386081066823, - "Data3": -8981626565725960655, - "Data4": 3521742965009064362 + "Data1": -4967837137343986185, + "Data2": -3593025294242466307 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikIcon", @@ -23021,10 +22111,8 @@ }, { "__Checksum": { - "Data1": 115794296961581439, - "Data2": 2714285692880688985, - "Data3": 908747404526023161, - "Data4": 7279941352442610640 + "Data1": 3439401784816957712, + "Data2": 481698560185631162 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikIcon", @@ -23075,10 +22163,8 @@ }, { "__Checksum": { - "Data1": -1185568563870005287, - "Data2": 211268881750802005, - "Data3": -1450856465035162637, - "Data4": -1484038217260151776 + "Data1": 3768975871703577433, + "Data2": -1588445285999680866 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikContextMenu", @@ -23265,10 +22351,8 @@ }, { "__Checksum": { - "Data1": 5673690738193398362, - "Data2": 6135990390281422146, - "Data3": 5841684409622956148, - "Data4": 2951551611103149252 + "Data1": -630910939722757990, + "Data2": -106477947969135737 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikContextMenu", @@ -23455,10 +22539,8 @@ }, { "__Checksum": { - "Data1": 5833029256670394018, - "Data2": -8528274658579125275, - "Data3": 3810088410155967445, - "Data4": -4848987153268260620 + "Data1": 1947296486698750383, + "Data2": -6593237561621719334 }, "Flags": 1, "Kind": 3, @@ -23488,10 +22570,8 @@ }, { "__Checksum": { - "Data1": -1245751654233535799, - "Data2": -8822954968136830505, - "Data3": -2526293471980416294, - "Data4": 5392506045433736899 + "Data1": -5480192427563069313, + "Data2": -1504059939152871822 }, "Flags": 3, "Kind": 3, @@ -23521,10 +22601,8 @@ }, { "__Checksum": { - "Data1": -6424912343104316687, - "Data2": -360264288266427241, - "Data3": 7945865513159472113, - "Data4": 161521730979276713 + "Data1": 4275945700349784007, + "Data2": 1246289491119214352 }, "Flags": 1, "Kind": 3, @@ -23554,10 +22632,8 @@ }, { "__Checksum": { - "Data1": 8551508651828963884, - "Data2": 8110573527231296375, - "Data3": 2424998255997998521, - "Data4": -7755524985494971403 + "Data1": -6986809384745939759, + "Data2": -8914128235981798763 }, "Flags": 3, "Kind": 3, @@ -23587,10 +22663,8 @@ }, { "__Checksum": { - "Data1": -7970762132069307701, - "Data2": 4421092230285353679, - "Data3": 2778264523435117456, - "Data4": 3066267887155812965 + "Data1": 892878807520755708, + "Data2": -2999534111363631388 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikDateInput", @@ -23734,10 +22808,8 @@ }, { "__Checksum": { - "Data1": -1846261541945449659, - "Data2": 4393501596660218314, - "Data3": 2695772887465573617, - "Data4": 444861950306153169 + "Data1": -913577315925345601, + "Data2": 1785098271220575290 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikDateInput", @@ -23881,10 +22953,8 @@ }, { "__Checksum": { - "Data1": -192604441253401804, - "Data2": 1805806281724906749, - "Data3": 1670283161783347570, - "Data4": -2566650406163012168 + "Data1": -839787177731920387, + "Data2": 2528981230539652870 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikDatePicker", @@ -24060,10 +23130,8 @@ }, { "__Checksum": { - "Data1": 2467665730122207017, - "Data2": 4087296875605149853, - "Data3": 1619959754804898160, - "Data4": -7658442231945119941 + "Data1": -7639078794879383495, + "Data2": -5054266688639861946 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikDatePicker", @@ -24239,10 +23307,8 @@ }, { "__Checksum": { - "Data1": -2188967706837050454, - "Data2": 8170612668806840021, - "Data3": -5237448806647308378, - "Data4": 6488570467049916282 + "Data1": -3681148942844356208, + "Data2": 7931529404321386136 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikDateRangePicker", @@ -24443,10 +23509,8 @@ }, { "__Checksum": { - "Data1": 6548276266381946290, - "Data2": 7471130694442530933, - "Data3": -6808992755309872184, - "Data4": 5044046690518629073 + "Data1": -4300689612568493335, + "Data2": 2399591498134246098 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikDateRangePicker", @@ -24647,10 +23711,8 @@ }, { "__Checksum": { - "Data1": -6642233957115499632, - "Data2": -4942364289410361387, - "Data3": 8865185750246475221, - "Data4": -6871676374858511854 + "Data1": -5685965821137613273, + "Data2": -3106338145931647975 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikDateTimePicker", @@ -24786,10 +23848,8 @@ }, { "__Checksum": { - "Data1": -7990627874895552106, - "Data2": 1305346476089859841, - "Data3": -2386117404813023585, - "Data4": 5132299329889461015 + "Data1": -769551676223028606, + "Data2": -5466451444929827822 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikDateTimePicker", @@ -24925,10 +23985,8 @@ }, { "__Checksum": { - "Data1": 5916111781882687486, - "Data2": 6264203257628735086, - "Data3": 6027068148498317846, - "Data4": -3766989650233593916 + "Data1": -6465199794429304421, + "Data2": 9000277767500390271 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikDrawer", @@ -25151,10 +24209,8 @@ }, { "__Checksum": { - "Data1": 5516070058340316812, - "Data2": -656561558528981990, - "Data3": -7659742656221741922, - "Data4": -1743459906840605228 + "Data1": 5532752883844789620, + "Data2": -43274733033636341 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikDrawer", @@ -25377,10 +24433,8 @@ }, { "__Checksum": { - "Data1": -4137298193371775243, - "Data2": 7237387473161240598, - "Data3": 1030217588771850181, - "Data4": -6209129030417941752 + "Data1": 4424645048959558260, + "Data2": -975996145944558667 }, "Flags": 1, "Kind": 3, @@ -25410,10 +24464,8 @@ }, { "__Checksum": { - "Data1": -7317187456781815807, - "Data2": 4037384374287956536, - "Data3": 8561544035279680688, - "Data4": -6231908973506907748 + "Data1": 1821253515208595948, + "Data2": -6001875894368213967 }, "Flags": 3, "Kind": 3, @@ -25443,10 +24495,8 @@ }, { "__Checksum": { - "Data1": 1402553059672898510, - "Data2": 8708114472813107479, - "Data3": 1674991739395822431, - "Data4": -9163162385271540482 + "Data1": -2867067187381486711, + "Data2": 7924533522987584431 }, "Flags": 1, "Kind": 3, @@ -25476,10 +24526,8 @@ }, { "__Checksum": { - "Data1": 4554398060344840291, - "Data2": -7418301937988319862, - "Data3": -2854647089258871909, - "Data4": 7954526220556813574 + "Data1": 3430316832185947498, + "Data2": 408674989676328779 }, "Flags": 3, "Kind": 3, @@ -25509,10 +24557,8 @@ }, { "__Checksum": { - "Data1": -133346656425468223, - "Data2": -8078065440215477436, - "Data3": 4639990580251326643, - "Data4": -552225708288153691 + "Data1": 3544731578257227393, + "Data2": 7066672260259114517 }, "Flags": 1, "Kind": 3, @@ -25531,10 +24577,8 @@ }, { "__Checksum": { - "Data1": -1033698158328669290, - "Data2": -987146635117543512, - "Data3": -9016672835814351997, - "Data4": -3407224218893112644 + "Data1": -2123731738264285685, + "Data2": 2033781432628560469 }, "Flags": 3, "Kind": 3, @@ -25553,10 +24597,8 @@ }, { "__Checksum": { - "Data1": -728335264564725059, - "Data2": 2007294728717582440, - "Data3": 8307074647166770385, - "Data4": -4805929218222223681 + "Data1": -7310234610897982053, + "Data2": 4652780249565319572 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikDropDownList", @@ -25807,10 +24849,8 @@ }, { "__Checksum": { - "Data1": -4529680722861448843, - "Data2": -6599266728021375857, - "Data3": -4714535681537500609, - "Data4": 8260529934250339825 + "Data1": -4367544913310934159, + "Data2": -7942130030729651121 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikDropDownList", @@ -26061,10 +25101,8 @@ }, { "__Checksum": { - "Data1": 7535651478379369304, - "Data2": 4121386645352556214, - "Data3": 3238768067866138083, - "Data4": -5962868484986604032 + "Data1": -6346321678313763603, + "Data2": 908425962802576865 }, "Flags": 1, "Kind": 3, @@ -26094,10 +25132,8 @@ }, { "__Checksum": { - "Data1": -7423981431536203748, - "Data2": 7361773511345819979, - "Data3": 8343139263115095390, - "Data4": 6160658176149050665 + "Data1": 1215931306668628676, + "Data2": 597027927407406387 }, "Flags": 3, "Kind": 3, @@ -26127,10 +25163,8 @@ }, { "__Checksum": { - "Data1": 7437581199052296526, - "Data2": 6258455595815639792, - "Data3": -1412965901543489133, - "Data4": 4151966530323546960 + "Data1": 5151254173321853451, + "Data2": 4879863860618270009 }, "Flags": 1, "Kind": 3, @@ -26149,10 +25183,8 @@ }, { "__Checksum": { - "Data1": 7213276142731738857, - "Data2": 2143423423849575081, - "Data3": -7079182104294892332, - "Data4": 1361266362285483035 + "Data1": -192473601531460561, + "Data2": -1270507925183543208 }, "Flags": 3, "Kind": 3, @@ -26171,10 +25203,8 @@ }, { "__Checksum": { - "Data1": 1346284678364076951, - "Data2": -145229112711139418, - "Data3": -7931199434263272975, - "Data4": -4611651461561326571 + "Data1": -5966638447637422350, + "Data2": -3312851536501164927 }, "Flags": 1, "Kind": 3, @@ -26193,10 +25223,8 @@ }, { "__Checksum": { - "Data1": 2931810472003925706, - "Data2": 6744957789626083788, - "Data3": -9055382294127311931, - "Data4": 4075515333940592455 + "Data1": 1323170274340866962, + "Data2": -7788032927246216117 }, "Flags": 3, "Kind": 3, @@ -26215,10 +25243,8 @@ }, { "__Checksum": { - "Data1": 3230243010928700099, - "Data2": -9008956882075281512, - "Data3": -965615095594646576, - "Data4": 6253034431560562125 + "Data1": 4790900563519242264, + "Data2": 3368263055962566748 }, "Flags": 1, "Kind": 3, @@ -26248,10 +25274,8 @@ }, { "__Checksum": { - "Data1": 7590321525341014638, - "Data2": 4861835694206166443, - "Data3": 4437080798392831082, - "Data4": -5407227821633557221 + "Data1": -8485958115351904227, + "Data2": 5300032009358521969 }, "Flags": 3, "Kind": 3, @@ -26281,10 +25305,8 @@ }, { "__Checksum": { - "Data1": -5309038488921155254, - "Data2": 6714674953513039095, - "Data3": -7456739411104892742, - "Data4": -1808932521458967415 + "Data1": -7786889918063335905, + "Data2": 7382256762406484757 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikEditor", @@ -26407,10 +25429,8 @@ }, { "__Checksum": { - "Data1": 910881428170610832, - "Data2": 7920047625462969529, - "Data3": -648868430735790374, - "Data4": -2023680193047339377 + "Data1": -7413827776713743704, + "Data2": -3569119147802027360 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikEditor", @@ -26533,10 +25553,8 @@ }, { "__Checksum": { - "Data1": 5672169462753783474, - "Data2": -8511833889742489906, - "Data3": -4872334591701182651, - "Data4": 4307493748736321995 + "Data1": -3067238226211253826, + "Data2": 2525774457486156146 }, "Flags": 1, "Kind": 3, @@ -26555,10 +25573,8 @@ }, { "__Checksum": { - "Data1": -5343666136508259362, - "Data2": -223572529755670081, - "Data3": -5329708325892646300, - "Data4": 4137465080372223769 + "Data1": -368831469087123097, + "Data2": 343847580719848826 }, "Flags": 3, "Kind": 3, @@ -26577,10 +25593,8 @@ }, { "__Checksum": { - "Data1": 2789641772357523218, - "Data2": -8802382909554451406, - "Data3": -4101250895388896237, - "Data4": -2095471201164926297 + "Data1": -7715086947029054972, + "Data2": 102305982217036668 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridColumnMenuSettings", @@ -26631,10 +25645,8 @@ }, { "__Checksum": { - "Data1": -6547779061347342460, - "Data2": 2868127340435134207, - "Data3": 7195591887211094945, - "Data4": 3517109338573354964 + "Data1": 5166577857887556005, + "Data2": 4591253224964141017 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridColumnMenuSettings", @@ -26685,10 +25697,8 @@ }, { "__Checksum": { - "Data1": 7446602827325962298, - "Data2": 2440367907550034642, - "Data3": -4943634413658138861, - "Data4": 2603269878666086516 + "Data1": 7787541157812115851, + "Data2": -4679449314575755818 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridAutoGeneratedColumns", @@ -26715,10 +25725,8 @@ }, { "__Checksum": { - "Data1": 5307602425120415483, - "Data2": -7466198880429685367, - "Data3": -4749416693149811374, - "Data4": -6314051512853804702 + "Data1": 7139612385669255349, + "Data2": 2729539096135018817 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridAutoGeneratedColumns", @@ -26745,10 +25753,8 @@ }, { "__Checksum": { - "Data1": 2124490138590837921, - "Data2": 342214279497138197, - "Data3": -3067921713558931812, - "Data4": -826571970589719763 + "Data1": 940831807433844988, + "Data2": 8805157036952946946 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridCheckboxColumn", @@ -26862,10 +25868,8 @@ }, { "__Checksum": { - "Data1": -2868409551387639612, - "Data2": 4203416531712225307, - "Data3": -3833682415024598051, - "Data4": -2953149584902047704 + "Data1": 8986107789681184550, + "Data2": 2179234331896254079 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridCheckboxColumn", @@ -26979,10 +25983,8 @@ }, { "__Checksum": { - "Data1": 6501815959552969404, - "Data2": -2251112575375364533, - "Data3": 2115164823643344786, - "Data4": -5851944003360439682 + "Data1": 1934057523701031505, + "Data2": 1798172652752053534 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridColumn", @@ -27234,10 +26236,8 @@ }, { "__Checksum": { - "Data1": 9037388844774557457, - "Data2": 5147436190881272334, - "Data3": -2958841630531359831, - "Data4": 6163914120892198821 + "Data1": 2810374124574162154, + "Data2": -1551527747024781150 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridColumn", @@ -27489,10 +26489,8 @@ }, { "__Checksum": { - "Data1": 2809892935140235410, - "Data2": -1488425184888657582, - "Data3": -7892053704274288470, - "Data4": 9145857628423840596 + "Data1": -2599545671068875051, + "Data2": 953332732012442483 }, "Flags": 1, "Kind": 3, @@ -27522,10 +26520,8 @@ }, { "__Checksum": { - "Data1": 3130764861390419135, - "Data2": -9119970230608903683, - "Data3": 1459523759267708004, - "Data4": -3281623072213774648 + "Data1": 6216371296783967107, + "Data2": 173075604219566279 }, "Flags": 3, "Kind": 3, @@ -27555,10 +26551,8 @@ }, { "__Checksum": { - "Data1": -353031209373556653, - "Data2": 7274187598720750479, - "Data3": 4444394367505033410, - "Data4": -7680622593790892257 + "Data1": -4754216076971483117, + "Data2": 3878182743645672277 }, "Flags": 1, "Kind": 3, @@ -27588,10 +26582,8 @@ }, { "__Checksum": { - "Data1": 6513495621523011458, - "Data2": -8232858780041050184, - "Data3": 2779940295205338254, - "Data4": 2321378290530436188 + "Data1": 7725574020194607527, + "Data2": -6581495777390029174 }, "Flags": 3, "Kind": 3, @@ -27621,10 +26613,8 @@ }, { "__Checksum": { - "Data1": 2376976295392728250, - "Data2": -644379301161570326, - "Data3": 6962468116892325348, - "Data4": 5372695650844489458 + "Data1": -7370358797105684537, + "Data2": -3292896544352737205 }, "Flags": 1, "Kind": 3, @@ -27654,10 +26644,8 @@ }, { "__Checksum": { - "Data1": -7590408748513329472, - "Data2": 5290152457550966532, - "Data3": -2643401434772546248, - "Data4": 3157072429510894423 + "Data1": 2853903595509129134, + "Data2": 8372142346895653363 }, "Flags": 3, "Kind": 3, @@ -27687,10 +26675,8 @@ }, { "__Checksum": { - "Data1": -1263302901226795779, - "Data2": 4005351227558166091, - "Data3": 6930994274676386080, - "Data4": 5551417480692730176 + "Data1": -7382855769613013975, + "Data2": -5391124665651948251 }, "Flags": 1, "Kind": 3, @@ -27709,10 +26695,8 @@ }, { "__Checksum": { - "Data1": 1504784688310095417, - "Data2": -7797156538261706767, - "Data3": -1791111832919233621, - "Data4": 8729025605234282044 + "Data1": -8052296831969083579, + "Data2": 8296234527595530472 }, "Flags": 3, "Kind": 3, @@ -27731,10 +26715,8 @@ }, { "__Checksum": { - "Data1": 2699657524350839529, - "Data2": -1287937145148097774, - "Data3": -5573697277111270618, - "Data4": 2995290488227859667 + "Data1": -3706069105768454506, + "Data2": 725377107956529427 }, "Flags": 1, "Kind": 3, @@ -27764,10 +26746,8 @@ }, { "__Checksum": { - "Data1": -1768659491273811593, - "Data2": 5887469207983954499, - "Data3": -5666366846776856045, - "Data4": 1995506037003928899 + "Data1": -8270269906030797675, + "Data2": -6717149835126587893 }, "Flags": 3, "Kind": 3, @@ -27797,10 +26777,8 @@ }, { "__Checksum": { - "Data1": -4842017339872493682, - "Data2": 1880768350109864452, - "Data3": -316978269524769939, - "Data4": -1219177255528926402 + "Data1": 2849443737765515694, + "Data2": -1180313116977343971 }, "Flags": 1, "Kind": 3, @@ -27830,10 +26808,8 @@ }, { "__Checksum": { - "Data1": -6843298571512850173, - "Data2": -8863535066893920784, - "Data3": -5554147528735952453, - "Data4": -8533029007552720850 + "Data1": 1806015025981809852, + "Data2": -3686744741745519693 }, "Flags": 3, "Kind": 3, @@ -27863,10 +26839,8 @@ }, { "__Checksum": { - "Data1": 4275441462965132743, - "Data2": 1541315149607980844, - "Data3": -6383960663073649719, - "Data4": 3709369181827723905 + "Data1": 7688770417926529765, + "Data2": -5383263858315866628 }, "Flags": 1, "Kind": 3, @@ -27896,10 +26870,8 @@ }, { "__Checksum": { - "Data1": 6900178764854297739, - "Data2": 1306922988363797293, - "Data3": 1442144076347057630, - "Data4": -4430834108892787927 + "Data1": 6580718269336528531, + "Data2": 3350798633705538192 }, "Flags": 3, "Kind": 3, @@ -27929,10 +26901,8 @@ }, { "__Checksum": { - "Data1": 647664380844637960, - "Data2": 1628886851450303884, - "Data3": 858437614544532769, - "Data4": -748699541611789961 + "Data1": 2365407104648117364, + "Data2": 132155254193540088 }, "Flags": 1, "Kind": 3, @@ -27962,10 +26932,8 @@ }, { "__Checksum": { - "Data1": 5270709335697210515, - "Data2": -4537954242331182141, - "Data3": -3549838493898000711, - "Data4": -8843122528250976107 + "Data1": 4010570682839858837, + "Data2": 6913491985979813086 }, "Flags": 3, "Kind": 3, @@ -27995,10 +26963,8 @@ }, { "__Checksum": { - "Data1": 176737794848864498, - "Data2": 1997143946657513861, - "Data3": 699866710163047283, - "Data4": -527305124021235504 + "Data1": -3855738704145273049, + "Data2": 3109764456595023930 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridCommandColumn", @@ -28117,10 +27083,8 @@ }, { "__Checksum": { - "Data1": 8926090292209920970, - "Data2": 2832463929261008895, - "Data3": 5387468466981763619, - "Data4": 367780634397215943 + "Data1": -6950761466462037003, + "Data2": -553893448226303036 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridCommandColumn", @@ -28239,10 +27203,8 @@ }, { "__Checksum": { - "Data1": -1966139503830199213, - "Data2": 8836421180391431785, - "Data3": -5350304738416616403, - "Data4": -2284272963623410248 + "Data1": 9185516283221097614, + "Data2": 8679717677361142529 }, "Flags": 1, "Kind": 3, @@ -28261,10 +27223,8 @@ }, { "__Checksum": { - "Data1": 4534807827335695576, - "Data2": -3583533022424009680, - "Data3": 4129060943198549824, - "Data4": 5967913696485219993 + "Data1": -3190417019629932940, + "Data2": -8157804841637232153 }, "Flags": 3, "Kind": 3, @@ -28283,10 +27243,8 @@ }, { "__Checksum": { - "Data1": -880122141146257429, - "Data2": -3198636901013486636, - "Data3": -1526782743743485569, - "Data4": 1030067858846117402 + "Data1": 3789891785839871619, + "Data2": 7172086601096468189 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridExcelExport", @@ -28321,10 +27279,8 @@ }, { "__Checksum": { - "Data1": -4133334409946452164, - "Data2": -7339618980734409296, - "Data3": -5800278273581907999, - "Data4": 3305592885734867747 + "Data1": -3913288240456266219, + "Data2": 7885069925938809446 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridExcelExport", @@ -28359,10 +27315,8 @@ }, { "__Checksum": { - "Data1": -8213553923298306830, - "Data2": -4119097722011823975, - "Data3": 2933947126381399046, - "Data4": 1610463643694689109 + "Data1": -6820243629223683766, + "Data2": -3204550984215564721 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridCommandButton", @@ -28499,10 +27453,8 @@ }, { "__Checksum": { - "Data1": -4907021942695295331, - "Data2": 7688574110886539077, - "Data3": -6633266440632026829, - "Data4": 2565062057202736471 + "Data1": 2456910790410124838, + "Data2": -5467512782512093009 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridCommandButton", @@ -28639,10 +27591,8 @@ }, { "__Checksum": { - "Data1": 4029015256443157304, - "Data2": 8747126887640835272, - "Data3": 5105088320614467550, - "Data4": 1021116226913290590 + "Data1": 1273625084529013836, + "Data2": 8413916365570313358 }, "Flags": 1, "Kind": 3, @@ -28660,10 +27610,8 @@ }, { "__Checksum": { - "Data1": -1601347197868548663, - "Data2": 7753889067002448920, - "Data3": -6122449718024103990, - "Data4": -1072994865712687108 + "Data1": -6882266373536780725, + "Data2": 4821172489345112396 }, "Flags": 3, "Kind": 3, @@ -28681,10 +27629,8 @@ }, { "__Checksum": { - "Data1": -5822320436295103583, - "Data2": 316545779130078534, - "Data3": -873523461979083050, - "Data4": 858755835208043940 + "Data1": -5249326924002612552, + "Data2": 2879017997102113852 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridSearchBox", @@ -28727,10 +27673,8 @@ }, { "__Checksum": { - "Data1": -6827263347596410588, - "Data2": 1564306655663624720, - "Data3": -8146764669628656440, - "Data4": 6131960655901848472 + "Data1": -2635588858034415246, + "Data2": 2214358336298598623 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridSearchBox", @@ -28773,10 +27717,8 @@ }, { "__Checksum": { - "Data1": -3135045797034455481, - "Data2": 3547975788406260668, - "Data3": -6060275129380436356, - "Data4": -497052833752196944 + "Data1": 6525779646069375403, + "Data2": -8522719936131166389 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikGrid", @@ -29275,10 +28217,8 @@ }, { "__Checksum": { - "Data1": 2519828325820690135, - "Data2": -6755582884042485648, - "Data3": 7387791649502282626, - "Data4": -2101946548740981189 + "Data1": -9079495546030949146, + "Data2": -8304338616439588306 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikGrid", @@ -29777,10 +28717,8 @@ }, { "__Checksum": { - "Data1": 2997063735666176452, - "Data2": 7005969074516287876, - "Data3": -6385699339463625652, - "Data4": -238073526083203404 + "Data1": 8895670339234345446, + "Data2": -8564269816661449554 }, "Flags": 1, "Kind": 3, @@ -29799,10 +28737,8 @@ }, { "__Checksum": { - "Data1": 8565055029478442323, - "Data2": -1838704507384612518, - "Data3": 6629555562902862629, - "Data4": -3585564326781051240 + "Data1": -8633601470386254888, + "Data2": -140312244619291248 }, "Flags": 3, "Kind": 3, @@ -29821,10 +28757,8 @@ }, { "__Checksum": { - "Data1": 5289897408053822289, - "Data2": 8735328306036179357, - "Data3": 3082818080047162795, - "Data4": 3996626403562722393 + "Data1": -3772681494025656312, + "Data2": 2722410024664810254 }, "Flags": 1, "Kind": 3, @@ -29843,10 +28777,8 @@ }, { "__Checksum": { - "Data1": 7909132217183624457, - "Data2": -8173666170379227536, - "Data3": 3268730650304346305, - "Data4": -7358964573162262449 + "Data1": -6770516930659759302, + "Data2": 2909696482111860136 }, "Flags": 3, "Kind": 3, @@ -29865,10 +28797,8 @@ }, { "__Checksum": { - "Data1": -6781035830222851315, - "Data2": 82184209921200469, - "Data3": 7290818258534748594, - "Data4": 154807916738606896 + "Data1": -8953556339667510594, + "Data2": 600053164649080472 }, "Flags": 1, "Kind": 3, @@ -29887,10 +28817,8 @@ }, { "__Checksum": { - "Data1": 4350375996908097309, - "Data2": 8447881858750763416, - "Data3": -3176568368126797803, - "Data4": 5644788081114541171 + "Data1": -3693097103151180343, + "Data2": 3157212263126560891 }, "Flags": 3, "Kind": 3, @@ -29909,10 +28837,8 @@ }, { "__Checksum": { - "Data1": 4524099832898390661, - "Data2": -1653063467482778080, - "Data3": -8499379377837408846, - "Data4": 4234138285861863552 + "Data1": 1447372871548385297, + "Data2": 3716234074433127157 }, "Flags": 1, "Kind": 3, @@ -29931,10 +28857,8 @@ }, { "__Checksum": { - "Data1": -2861093170416671645, - "Data2": -5543848636498948554, - "Data3": -7637137983928193446, - "Data4": -6236879418896016755 + "Data1": -1875931067445122086, + "Data2": 189631996523680300 }, "Flags": 3, "Kind": 3, @@ -29953,10 +28877,8 @@ }, { "__Checksum": { - "Data1": 7597528691484921885, - "Data2": 6360023691796190999, - "Data3": 816319571174231842, - "Data4": 4354029725109181494 + "Data1": 1115912835023843100, + "Data2": -853245058783607366 }, "Flags": 1, "Kind": 3, @@ -29986,10 +28908,8 @@ }, { "__Checksum": { - "Data1": -5169202831066022601, - "Data2": 7748538498935547290, - "Data3": -8299515946893444889, - "Data4": 864048970246756119 + "Data1": 4179853703492482668, + "Data2": -1927181089946681692 }, "Flags": 3, "Kind": 3, @@ -30019,10 +28939,8 @@ }, { "__Checksum": { - "Data1": -5024050513433309690, - "Data2": -7871276888159561937, - "Data3": 5219204813796769431, - "Data4": -6801491743716767137 + "Data1": -5476279500578421684, + "Data2": -8261347797774308287 }, "Flags": 1, "Kind": 3, @@ -30040,10 +28958,8 @@ }, { "__Checksum": { - "Data1": 1275409592488834653, - "Data2": -8110986136257260825, - "Data3": 7848283377437726542, - "Data4": -3206457962157771330 + "Data1": 8183918903210884998, + "Data2": 6159199152483566110 }, "Flags": 3, "Kind": 3, @@ -30061,10 +28977,8 @@ }, { "__Checksum": { - "Data1": -6241936162920311958, - "Data2": 7131517044129349221, - "Data3": 2402097704799120299, - "Data4": -1948447454427414821 + "Data1": 3181279472209015382, + "Data2": 6916236398961173799 }, "Flags": 1, "Kind": 3, @@ -30094,10 +29008,8 @@ }, { "__Checksum": { - "Data1": -7737663276441977538, - "Data2": -4604504078277183482, - "Data3": -3892235127499455291, - "Data4": -7232677956135967369 + "Data1": -5061041969574751904, + "Data2": -4756594202809402396 }, "Flags": 3, "Kind": 3, @@ -30127,10 +29039,8 @@ }, { "__Checksum": { - "Data1": 6112143835934357308, - "Data2": -7901082650455788864, - "Data3": 6534818082125055982, - "Data4": -6000879697106517019 + "Data1": -8199103047072594389, + "Data2": 6298857273722442467 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ListViewCommandButton", @@ -30259,10 +29169,8 @@ }, { "__Checksum": { - "Data1": -7593280694805313507, - "Data2": 2933069906457075289, - "Data3": 2723085129809642135, - "Data4": -1585246855502423250 + "Data1": -5228378123130659202, + "Data2": -7526107594629021060 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ListViewCommandButton", @@ -30391,10 +29299,8 @@ }, { "__Checksum": { - "Data1": 3764438626591099094, - "Data2": 6684680007104026922, - "Data3": 837939446612282695, - "Data4": 5134148288158860859 + "Data1": -1841137328572742863, + "Data2": -5183002040318817260 }, "Flags": 1, "Kind": 3, @@ -30412,10 +29318,8 @@ }, { "__Checksum": { - "Data1": -1217566702914359370, - "Data2": -7331766602742200410, - "Data3": 1721858350518013566, - "Data4": 9059502800610364454 + "Data1": -8287583221059922928, + "Data2": -3517158149726253679 }, "Flags": 3, "Kind": 3, @@ -30433,10 +29337,8 @@ }, { "__Checksum": { - "Data1": -5431417032999256876, - "Data2": 1271282072890739852, - "Data3": -8073969666079541513, - "Data4": -2706801658953172135 + "Data1": -6357514471219382430, + "Data2": -8273792378623471991 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikListView", @@ -30678,10 +29580,8 @@ }, { "__Checksum": { - "Data1": -1985801316186189642, - "Data2": -7830354427353728033, - "Data3": 1704364642262922146, - "Data4": -4619637981844293362 + "Data1": -5595892848339353331, + "Data2": 8162216734042854679 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikListView", @@ -30923,10 +29823,8 @@ }, { "__Checksum": { - "Data1": -4563381777236773671, - "Data2": 1132089593781948694, - "Data3": 2104328613638888279, - "Data4": 4082371564855316732 + "Data1": -5974734890835360604, + "Data2": 4224183552893742173 }, "Flags": 1, "Kind": 3, @@ -30956,10 +29854,8 @@ }, { "__Checksum": { - "Data1": 2035286902436958554, - "Data2": 3411150557705513837, - "Data3": -5284588077676640314, - "Data4": -6141395777330658206 + "Data1": -7071817207382011007, + "Data2": -6880795543809339730 }, "Flags": 3, "Kind": 3, @@ -30989,10 +29885,8 @@ }, { "__Checksum": { - "Data1": -1178957366728708340, - "Data2": 8564149880285059578, - "Data3": -7413072525686414105, - "Data4": 6851418219988603387 + "Data1": -2872666848876803056, + "Data2": -4211422580136945957 }, "Flags": 1, "Kind": 3, @@ -31022,10 +29916,8 @@ }, { "__Checksum": { - "Data1": 6590583876550913134, - "Data2": 3846339353469710446, - "Data3": 7078545022396463062, - "Data4": 1469357059251319494 + "Data1": -5971877246916251402, + "Data2": 4776921023194373262 }, "Flags": 3, "Kind": 3, @@ -31055,10 +29947,8 @@ }, { "__Checksum": { - "Data1": -8878749817427174401, - "Data2": -8857592067531146492, - "Data3": -7542323448789548218, - "Data4": 119627283646983376 + "Data1": -2828111103639791338, + "Data2": -5426733043502800606 }, "Flags": 1, "Kind": 3, @@ -31077,10 +29967,8 @@ }, { "__Checksum": { - "Data1": 6678467435727533111, - "Data2": -7745006785188158849, - "Data3": 2731211586796332754, - "Data4": 4951597188971346267 + "Data1": 6462025639221591080, + "Data2": -4193915353177237808 }, "Flags": 3, "Kind": 3, @@ -31099,10 +29987,8 @@ }, { "__Checksum": { - "Data1": -3083676000933956176, - "Data2": -5975548166250656965, - "Data3": 9123347713676962597, - "Data4": -2405231707101605521 + "Data1": -6067182821034180541, + "Data2": 7668902898266132650 }, "Flags": 1, "Kind": 3, @@ -31121,10 +30007,8 @@ }, { "__Checksum": { - "Data1": -7039277703741325900, - "Data2": -7030572812260029126, - "Data3": -539308892518465922, - "Data4": 5968754068880009392 + "Data1": 5586922108211376092, + "Data2": -798759233664185214 }, "Flags": 3, "Kind": 3, @@ -31143,10 +30027,8 @@ }, { "__Checksum": { - "Data1": 5798116746918511197, - "Data2": -2483803831726969372, - "Data3": 2198166775896838385, - "Data4": 4919661662489860040 + "Data1": 5133008945893822665, + "Data2": 7397142272372516236 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikLoader", @@ -31205,10 +30087,8 @@ }, { "__Checksum": { - "Data1": 9164502871945453026, - "Data2": -5778238351876897122, - "Data3": 2142077016540066266, - "Data4": -5356482942265741842 + "Data1": 2191849216951620194, + "Data2": 4057655615127932695 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikLoader", @@ -31267,10 +30147,8 @@ }, { "__Checksum": { - "Data1": 356826504161697199, - "Data2": 1916924177167114616, - "Data3": 7533392796454845327, - "Data4": -8621310737531165604 + "Data1": 8891190700810648511, + "Data2": -8327397729633497516 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikMenu", @@ -31452,10 +30330,8 @@ }, { "__Checksum": { - "Data1": 2519083363299713366, - "Data2": -9180269073512083385, - "Data3": -2961470924960916935, - "Data4": -8428410798582776493 + "Data1": -386475463775747570, + "Data2": -5315262349703046944 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikMenu", @@ -31637,10 +30513,8 @@ }, { "__Checksum": { - "Data1": -6084139192054015468, - "Data2": -3879943797980762412, - "Data3": -4473749393281778631, - "Data4": -5872234648300535454 + "Data1": 2081897198882779840, + "Data2": -698336847599703986 }, "Flags": 1, "Kind": 3, @@ -31670,10 +30544,8 @@ }, { "__Checksum": { - "Data1": 2987915180986683020, - "Data2": 5986614877229817270, - "Data3": 5581848137136418149, - "Data4": -2247572024042496228 + "Data1": 2860633588077051762, + "Data2": 8367009854899953702 }, "Flags": 3, "Kind": 3, @@ -31703,10 +30575,8 @@ }, { "__Checksum": { - "Data1": -2125938381894909581, - "Data2": 8687138873024136123, - "Data3": -4885854576708396700, - "Data4": -3422910938733286263 + "Data1": -3322913945475613473, + "Data2": 2170194787881793792 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikMultiSelect", @@ -31968,10 +30838,8 @@ }, { "__Checksum": { - "Data1": 5729712198349119694, - "Data2": -8726351112164013072, - "Data3": 5040692304954678053, - "Data4": -2652164684074518212 + "Data1": 2848921591367165301, + "Data2": -4955041512337684314 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikMultiSelect", @@ -32233,10 +31101,8 @@ }, { "__Checksum": { - "Data1": -4589478561073111813, - "Data2": 2295050055507375083, - "Data3": -5218792715316384135, - "Data4": 1520506256033304423 + "Data1": 8072334819920984349, + "Data2": -3286094618671813595 }, "Flags": 1, "Kind": 3, @@ -32255,10 +31121,8 @@ }, { "__Checksum": { - "Data1": 4293312366945824657, - "Data2": 3997661275266820306, - "Data3": 6304380897417476370, - "Data4": -8249928052317871643 + "Data1": -4080938926837646339, + "Data2": 6893281478426546134 }, "Flags": 3, "Kind": 3, @@ -32277,10 +31141,8 @@ }, { "__Checksum": { - "Data1": 1537079527512045950, - "Data2": 6196239706870459248, - "Data3": 5932890771843239650, - "Data4": -8103418557012344235 + "Data1": 3524821629196896891, + "Data2": -8571780988006090387 }, "Flags": 1, "Kind": 3, @@ -32299,10 +31161,8 @@ }, { "__Checksum": { - "Data1": -61341291225867616, - "Data2": 248384176982312126, - "Data3": -7762944480080714458, - "Data4": 4239472555398243955 + "Data1": -6350089450915458483, + "Data2": -4250539474206424509 }, "Flags": 3, "Kind": 3, @@ -32321,10 +31181,8 @@ }, { "__Checksum": { - "Data1": 5399433528730317354, - "Data2": -235081647312204995, - "Data3": -3708282146510093650, - "Data4": 9105498513882832087 + "Data1": -2593237687188277470, + "Data2": -8494427350937146018 }, "Flags": 1, "Kind": 3, @@ -32354,10 +31212,8 @@ }, { "__Checksum": { - "Data1": 8622669217536415433, - "Data2": 679436764981391030, - "Data3": -1855887385863792089, - "Data4": 7236071598481207985 + "Data1": 4281795449847585071, + "Data2": 1383178639523244464 }, "Flags": 3, "Kind": 3, @@ -32387,10 +31243,8 @@ }, { "__Checksum": { - "Data1": -3509846730919618691, - "Data2": -2580933172124028850, - "Data3": -1719456024470876876, - "Data4": -58377251732259518 + "Data1": 7004378047009035709, + "Data2": 2699636598539151256 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikNumericTextBox", @@ -32562,10 +31416,8 @@ }, { "__Checksum": { - "Data1": 732634012416704127, - "Data2": 1719675002581532717, - "Data3": -4679090006723199693, - "Data4": 6104018431540021453 + "Data1": 6282363197295644385, + "Data2": -3717758414392044640 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikNumericTextBox", @@ -32737,10 +31589,8 @@ }, { "__Checksum": { - "Data1": 3406070169445429341, - "Data2": 7890694999914768322, - "Data3": -579406970804567162, - "Data4": 7409090716661263627 + "Data1": -5864159613109442795, + "Data2": 795370302192111451 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikPager", @@ -32811,10 +31661,8 @@ }, { "__Checksum": { - "Data1": -8474298954832926245, - "Data2": -5842915452503204733, - "Data3": 5082998680716179177, - "Data4": 2087998161716044063 + "Data1": 653611895240250139, + "Data2": 8430577866049845364 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikPager", @@ -32885,10 +31733,8 @@ }, { "__Checksum": { - "Data1": -6629878081399970064, - "Data2": 2897706498683274050, - "Data3": 5061605303504433274, - "Data4": -6151429855535309368 + "Data1": -3689024493442755317, + "Data2": 842028579699435108 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikRootComponent", @@ -32919,10 +31765,8 @@ }, { "__Checksum": { - "Data1": -4216722068160391265, - "Data2": 6534348960445432947, - "Data3": -5082946591458307185, - "Data4": 1344970303591426136 + "Data1": -8448130486863288283, + "Data2": 5817162633759398914 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikRootComponent", @@ -32953,10 +31797,8 @@ }, { "__Checksum": { - "Data1": 1732073622497594086, - "Data2": 7309462307692711423, - "Data3": -5066607827697987112, - "Data4": 1176451266119461336 + "Data1": -5657154620099334778, + "Data2": 5995810516006323225 }, "Flags": 1, "Kind": 3, @@ -32975,10 +31817,8 @@ }, { "__Checksum": { - "Data1": 9133907696470312841, - "Data2": -221100139345911862, - "Data3": -5052870997935183697, - "Data4": 4716088947136860857 + "Data1": -4993010215388442505, + "Data2": 6262372314186669419 }, "Flags": 3, "Kind": 3, @@ -32997,10 +31837,8 @@ }, { "__Checksum": { - "Data1": 5069736500257165889, - "Data2": -7944328881459145042, - "Data3": -6525008194894054190, - "Data4": -2764515618280582694 + "Data1": -5881270661365534268, + "Data2": -487506829797350565 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikScheduler", @@ -33279,10 +32117,8 @@ }, { "__Checksum": { - "Data1": 2380454955810580464, - "Data2": -5674642099633805912, - "Data3": -3592757802749532749, - "Data4": -7660253446988398615 + "Data1": -1943385299207479832, + "Data2": -3889080708576790812 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikScheduler", @@ -33561,10 +32397,8 @@ }, { "__Checksum": { - "Data1": -6266325980273465756, - "Data2": 3266882805879789656, - "Data3": -8097678340226331903, - "Data4": 3082686558525464690 + "Data1": 5012054050841137217, + "Data2": -3029135166167743646 }, "Flags": 1, "Kind": 3, @@ -33583,10 +32417,8 @@ }, { "__Checksum": { - "Data1": 1435191997507746696, - "Data2": -8836395863238189783, - "Data3": -675256780667661745, - "Data4": -4657513488832750163 + "Data1": -8855987483781562334, + "Data2": 6361998891313783265 }, "Flags": 3, "Kind": 3, @@ -33605,10 +32437,8 @@ }, { "__Checksum": { - "Data1": 7103029185681705534, - "Data2": 3882854863598404760, - "Data3": 3973442605712338307, - "Data4": 1446595983390214362 + "Data1": 1205606073031723024, + "Data2": 2585757084159856793 }, "Flags": 1, "Kind": 3, @@ -33627,10 +32457,8 @@ }, { "__Checksum": { - "Data1": -6988410698237983481, - "Data2": 9071346624314944670, - "Data3": -3818835720302505157, - "Data4": 4956845206674560882 + "Data1": -5310886969598842853, + "Data2": 4510626140157402668 }, "Flags": 3, "Kind": 3, @@ -33649,10 +32477,8 @@ }, { "__Checksum": { - "Data1": -2642362218837494398, - "Data2": -3580096628318764660, - "Data3": -1267769321955100518, - "Data4": 5364951081947205238 + "Data1": -3720807101641118413, + "Data2": 1802003758671006834 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxes", @@ -33682,10 +32508,8 @@ }, { "__Checksum": { - "Data1": 4667288365285410573, - "Data2": -8297053684459940544, - "Data3": -79265578632251687, - "Data4": 3725049720176375076 + "Data1": -3287585169665950257, + "Data2": -5443975418870541172 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxes", @@ -33715,10 +32539,8 @@ }, { "__Checksum": { - "Data1": -5190496859450638186, - "Data2": -8737128203194987118, - "Data3": 8112209241033984289, - "Data4": 6182610654140062707 + "Data1": 791593536300320680, + "Data2": -2980381788177225801 }, "Flags": 1, "Kind": 3, @@ -33736,10 +32558,8 @@ }, { "__Checksum": { - "Data1": 413816893910206863, - "Data2": 4978133202639379641, - "Data3": 5423521216171797581, - "Data4": -1873263837943197940 + "Data1": -6175517107162266106, + "Data2": 7210133171066275505 }, "Flags": 3, "Kind": 3, @@ -33757,10 +32577,8 @@ }, { "__Checksum": { - "Data1": 1831963816308747674, - "Data2": -5750644178547741505, - "Data3": -8018633208745042236, - "Data4": 1014468554526859724 + "Data1": 663042077698836631, + "Data2": 5595427715515786169 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxis", @@ -33877,10 +32695,8 @@ }, { "__Checksum": { - "Data1": -4663886171189842930, - "Data2": -5505919048804981539, - "Data3": -2693874064896796994, - "Data4": -3191779538490110767 + "Data1": -8558160904267276270, + "Data2": 4579996312927628298 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxis", @@ -33997,10 +32813,8 @@ }, { "__Checksum": { - "Data1": -7382466242866856847, - "Data2": -3271046278390629175, - "Data3": 2337120936863026741, - "Data4": -5034854417404654831 + "Data1": 2818593885453364093, + "Data2": -708936905428711952 }, "Flags": 1, "Kind": 3, @@ -34018,10 +32832,8 @@ }, { "__Checksum": { - "Data1": 8541255005080911473, - "Data2": 7917720325440392835, - "Data3": -4992840025043619689, - "Data4": 1339659998108583692 + "Data1": 8679373824261368935, + "Data2": -571727871347128841 }, "Flags": 3, "Kind": 3, @@ -34039,10 +32851,8 @@ }, { "__Checksum": { - "Data1": 6974942492292191089, - "Data2": 612652465636545607, - "Data3": -3836307893420446796, - "Data4": -1615851996832487100 + "Data1": -2664541721517381609, + "Data2": 4172482946964145617 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisAutoBaseUnitSteps", @@ -34120,10 +32930,8 @@ }, { "__Checksum": { - "Data1": 5131257133249767668, - "Data2": -4441508001619632129, - "Data3": -2306753171651663993, - "Data4": -5240916245989453637 + "Data1": 8874466259759089994, + "Data2": -2987701546680545888 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisAutoBaseUnitSteps", @@ -34201,10 +33009,8 @@ }, { "__Checksum": { - "Data1": -5579449883616813957, - "Data2": -191597979281542327, - "Data3": 8223436211301711976, - "Data4": -4278225408543019726 + "Data1": -201287865058973466, + "Data2": -5257537582052514468 }, "Flags": 1, "Kind": 3, @@ -34222,10 +33028,8 @@ }, { "__Checksum": { - "Data1": 6454947016836669722, - "Data2": -3670667466016357311, - "Data3": -2732988594448659412, - "Data4": -3290746299887691877 + "Data1": 1757460694265373524, + "Data2": -5905081689301380756 }, "Flags": 3, "Kind": 3, @@ -34243,10 +33047,8 @@ }, { "__Checksum": { - "Data1": 1234162931230566573, - "Data2": 7740934302679071119, - "Data3": -663671195266402595, - "Data4": 4533726185943565849 + "Data1": -4513135547866734316, + "Data2": 2095879191949406973 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisCrosshair", @@ -34308,10 +33110,8 @@ }, { "__Checksum": { - "Data1": 3115487919247002272, - "Data2": -1437093611768088468, - "Data3": 5637627615655315982, - "Data4": -9041814572693769242 + "Data1": 508825871730176265, + "Data2": 5967397601823597053 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisCrosshair", @@ -34373,10 +33173,8 @@ }, { "__Checksum": { - "Data1": -8272735535503571972, - "Data2": 25165735558060561, - "Data3": -786948200707451976, - "Data4": 7439813900617049818 + "Data1": 8931259453691904473, + "Data2": 2646243912741134821 }, "Flags": 1, "Kind": 3, @@ -34394,10 +33192,8 @@ }, { "__Checksum": { - "Data1": -5982411746912035234, - "Data2": 8318803373805892252, - "Data3": 930881469683660100, - "Data4": -4657051812977959953 + "Data1": -7524983837672920958, + "Data2": 6310221927917234749 }, "Flags": 3, "Kind": 3, @@ -34415,10 +33211,8 @@ }, { "__Checksum": { - "Data1": -3437503092493286046, - "Data2": -897202194495141044, - "Data3": 1656667300703152147, - "Data4": 78520389323723631 + "Data1": -8084313581759914239, + "Data2": 4751373423059144812 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisCrosshairTooltip", @@ -34493,10 +33287,8 @@ }, { "__Checksum": { - "Data1": 2910659407433475016, - "Data2": -3621678379933977268, - "Data3": 5638792240063605141, - "Data4": -4171950100106729130 + "Data1": -8154224056701168186, + "Data2": 1262020844913196884 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisCrosshairTooltip", @@ -34571,10 +33363,8 @@ }, { "__Checksum": { - "Data1": -2628750713893855004, - "Data2": -9172720105332657420, - "Data3": -3592218529573567594, - "Data4": 1122511137864048884 + "Data1": 2677995296760546516, + "Data2": 2514021745275247018 }, "Flags": 1, "Kind": 3, @@ -34592,10 +33382,8 @@ }, { "__Checksum": { - "Data1": 5336089631830731881, - "Data2": 802904238188445960, - "Data3": 2979934923676621066, - "Data4": -7950277445795425647 + "Data1": 3761362918073799643, + "Data2": -5307361216205870312 }, "Flags": 3, "Kind": 3, @@ -34613,10 +33401,8 @@ }, { "__Checksum": { - "Data1": -2902952219863415246, - "Data2": -5906544264039755883, - "Data3": 1937920019129429316, - "Data4": 735266103076591164 + "Data1": 542924532395116223, + "Data2": -6196315013789490571 }, "Flags": 1, "Kind": 3, @@ -34646,10 +33432,8 @@ }, { "__Checksum": { - "Data1": -8375432974530920557, - "Data2": -8109279452532252153, - "Data3": -3557514847584187467, - "Data4": -2895111867324335820 + "Data1": -2413836371429657143, + "Data2": -894382004657951947 }, "Flags": 3, "Kind": 3, @@ -34679,10 +33463,8 @@ }, { "__Checksum": { - "Data1": 545734231574100949, - "Data2": 744260650737887759, - "Data3": -3109025066615688111, - "Data4": 3270262362834785506 + "Data1": 570527615423974189, + "Data2": 8332068117122486741 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisLabels", @@ -34760,10 +33542,8 @@ }, { "__Checksum": { - "Data1": 412948309692910008, - "Data2": -4569904246955097954, - "Data3": -5981020856960271532, - "Data4": -7119783123917260166 + "Data1": -3431211969255323726, + "Data2": 660895429849594054 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisLabels", @@ -34841,10 +33621,8 @@ }, { "__Checksum": { - "Data1": 8726321817651337579, - "Data2": -4873438279570438129, - "Data3": 7533501546418407973, - "Data4": 6872645077817727396 + "Data1": 834327388717323178, + "Data2": 6396314603154710050 }, "Flags": 1, "Kind": 3, @@ -34862,10 +33640,8 @@ }, { "__Checksum": { - "Data1": -3051250792811092854, - "Data2": -7037334693140444952, - "Data3": -5859520870203674129, - "Data4": -7847359595286371505 + "Data1": -1916036325669946461, + "Data2": -924369233564049845 }, "Flags": 3, "Kind": 3, @@ -34883,10 +33659,8 @@ }, { "__Checksum": { - "Data1": -8779035298470510483, - "Data2": -6975346140434658442, - "Data3": 854029368937017684, - "Data4": -7852443338220158546 + "Data1": -6928349864694629520, + "Data2": -3617037902850673298 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisLabelsBorder", @@ -34940,10 +33714,8 @@ }, { "__Checksum": { - "Data1": -6883111911010362744, - "Data2": 8314284326994756317, - "Data3": -5152666857081342825, - "Data4": -4383319479985184076 + "Data1": 6731771967113535701, + "Data2": 3427759301622128533 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisLabelsBorder", @@ -34997,10 +33769,8 @@ }, { "__Checksum": { - "Data1": -2455038573384963776, - "Data2": -7277880426421662879, - "Data3": -4187673285524387035, - "Data4": -8412193062796761621 + "Data1": -4707688926328430678, + "Data2": -2909229515326449365 }, "Flags": 1, "Kind": 3, @@ -35018,10 +33788,8 @@ }, { "__Checksum": { - "Data1": 7793031339239872238, - "Data2": -9098513873981362289, - "Data3": -7706429327722534599, - "Data4": 9167751666471471678 + "Data1": 7529923715835440455, + "Data2": 6300143072202257842 }, "Flags": 3, "Kind": 3, @@ -35039,10 +33807,8 @@ }, { "__Checksum": { - "Data1": 7827851040304850381, - "Data2": 1319661603941578257, - "Data3": -8145826866964083324, - "Data4": -9090947150181519838 + "Data1": -5823500395959651032, + "Data2": -105581028685725957 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisLine", @@ -35104,10 +33870,8 @@ }, { "__Checksum": { - "Data1": -3121714259381737649, - "Data2": -7987634367939725204, - "Data3": 5705977122684182406, - "Data4": 3656346176498099158 + "Data1": 3986299966541876044, + "Data2": 7697027215053918397 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisLine", @@ -35169,10 +33933,8 @@ }, { "__Checksum": { - "Data1": -3976823065042250175, - "Data2": 6858975286327848314, - "Data3": 1166890915006589025, - "Data4": 1830399907708331799 + "Data1": -3815163786057745696, + "Data2": -5178235354858084869 }, "Flags": 1, "Kind": 3, @@ -35190,10 +33952,8 @@ }, { "__Checksum": { - "Data1": -1811992996106890841, - "Data2": 1054806602239406587, - "Data3": -2666071411595395477, - "Data4": -4602917553342641205 + "Data1": -967039550834664088, + "Data2": -4490224194093419845 }, "Flags": 3, "Kind": 3, @@ -35211,10 +33971,8 @@ }, { "__Checksum": { - "Data1": -6875095856519694765, - "Data2": -6749149163135372357, - "Data3": 5435589404922091440, - "Data4": -1049909357199773621 + "Data1": 1161033615311992322, + "Data2": 6650523173434581127 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisMajorGridLines", @@ -35292,10 +34050,8 @@ }, { "__Checksum": { - "Data1": -4869369874819477714, - "Data2": -3652279170631635341, - "Data3": -4849377664387881222, - "Data4": 7455176982621373829 + "Data1": -2165876853701094144, + "Data2": 5847708794735287769 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisMajorGridLines", @@ -35373,10 +34129,8 @@ }, { "__Checksum": { - "Data1": 2749602193351819803, - "Data2": 2899325853586834180, - "Data3": -1060157434335577141, - "Data4": 2489006822376889082 + "Data1": 1523500277749833141, + "Data2": -8423018411751292205 }, "Flags": 1, "Kind": 3, @@ -35394,10 +34148,8 @@ }, { "__Checksum": { - "Data1": 5892651198084119433, - "Data2": -3793118543927852715, - "Data3": -4152755910294442758, - "Data4": -143748915691803922 + "Data1": -82964625088646143, + "Data2": 5667559446561888768 }, "Flags": 3, "Kind": 3, @@ -35415,10 +34167,8 @@ }, { "__Checksum": { - "Data1": -3361380492853559913, - "Data2": -4255059169110721314, - "Data3": -6017993993160506866, - "Data4": -3834206454650823047 + "Data1": -1390686708117102136, + "Data2": 3025177140445464060 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisMajorTicks", @@ -35496,10 +34246,8 @@ }, { "__Checksum": { - "Data1": 7557469052263584565, - "Data2": 6309589909016895074, - "Data3": 1772699494813433545, - "Data4": -8598062505575722853 + "Data1": -7725759630493467967, + "Data2": -2577089788489374355 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisMajorTicks", @@ -35577,10 +34325,8 @@ }, { "__Checksum": { - "Data1": -9199636404195181026, - "Data2": -5873824129478502714, - "Data3": 4547802612553239466, - "Data4": -651466090700875873 + "Data1": -851414618544673615, + "Data2": -1498788527345355748 }, "Flags": 1, "Kind": 3, @@ -35598,10 +34344,8 @@ }, { "__Checksum": { - "Data1": -7252781218785480037, - "Data2": 3681209253004061885, - "Data3": -1502338799290989653, - "Data4": 1964571498503340118 + "Data1": 3733856347151190702, + "Data2": 190622895598601943 }, "Flags": 3, "Kind": 3, @@ -35619,10 +34363,8 @@ }, { "__Checksum": { - "Data1": 3561104664041232345, - "Data2": -3611189264339916638, - "Data3": -4568833331498404623, - "Data4": 3838054512612348161 + "Data1": 7203408014072125045, + "Data2": -169206333894613977 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisMinorGridLines", @@ -35700,10 +34442,8 @@ }, { "__Checksum": { - "Data1": 1468640782513449479, - "Data2": -5996109055937451696, - "Data3": -6820373047511904461, - "Data4": 2221458167217745016 + "Data1": 2470877057919621467, + "Data2": 1815818967292554398 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisMinorGridLines", @@ -35781,10 +34521,8 @@ }, { "__Checksum": { - "Data1": -3280547430128418712, - "Data2": -6357616522781285493, - "Data3": 1761702973555572162, - "Data4": -4035885479647000087 + "Data1": 1758671093021977207, + "Data2": 8441593663936805764 }, "Flags": 1, "Kind": 3, @@ -35802,10 +34540,8 @@ }, { "__Checksum": { - "Data1": -99698293452809520, - "Data2": -5226615969540390388, - "Data3": 942351361993079537, - "Data4": 2695765199115195322 + "Data1": 4127594168693280294, + "Data2": -4883413973005888435 }, "Flags": 3, "Kind": 3, @@ -35823,10 +34559,8 @@ }, { "__Checksum": { - "Data1": -549943387755683409, - "Data2": 3012012160376811616, - "Data3": 2482000867503809273, - "Data4": 1232683764619742959 + "Data1": -3156411649859519541, + "Data2": -1908234578847107130 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisMinorTicks", @@ -35904,10 +34638,8 @@ }, { "__Checksum": { - "Data1": -8763046246455749373, - "Data2": -5768760311218647863, - "Data3": -8597191530631264582, - "Data4": 5821124542842244510 + "Data1": 7680920771775467107, + "Data2": 6981180916441694028 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisMinorTicks", @@ -35985,10 +34717,8 @@ }, { "__Checksum": { - "Data1": 8933315363160570532, - "Data2": 4802449659304571994, - "Data3": 2213984555376633676, - "Data4": 5919101301639378979 + "Data1": 8817182301008668050, + "Data2": -1135592059919843158 }, "Flags": 1, "Kind": 3, @@ -36006,10 +34736,8 @@ }, { "__Checksum": { - "Data1": 76192431709000052, - "Data2": -310856273120828892, - "Data3": -757185073472108935, - "Data4": 8404690434586019349 + "Data1": -6570897650294735760, + "Data2": 1345113567850259750 }, "Flags": 3, "Kind": 3, @@ -36027,10 +34755,8 @@ }, { "__Checksum": { - "Data1": -6087366694996726155, - "Data2": 3512750630164891522, - "Data3": -13794495942476638, - "Data4": -1270743371116353564 + "Data1": 7098456695534188924, + "Data2": -5094404932168441835 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisTitle", @@ -36092,10 +34818,8 @@ }, { "__Checksum": { - "Data1": 334738962300152151, - "Data2": -2013743780667862081, - "Data3": 7534466972963789899, - "Data4": 692033787177941326 + "Data1": 6745406352397097287, + "Data2": 4026409127572002187 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisTitle", @@ -36157,10 +34881,8 @@ }, { "__Checksum": { - "Data1": 6895519142741332767, - "Data2": 8374256230229148777, - "Data3": -5976941512350460523, - "Data4": -6162913824509222204 + "Data1": 5453075662564572189, + "Data2": -8203109049398520766 }, "Flags": 1, "Kind": 3, @@ -36178,10 +34900,8 @@ }, { "__Checksum": { - "Data1": 4904431790449992687, - "Data2": -6952991481779910610, - "Data3": -1955644360764666520, - "Data4": -3055894255064649047 + "Data1": -4338058398136554656, + "Data2": -3727488350894255770 }, "Flags": 3, "Kind": 3, @@ -36199,10 +34919,8 @@ }, { "__Checksum": { - "Data1": -3987964435214941889, - "Data2": 7168528995224888993, - "Data3": -2029199281057770722, - "Data4": 6520811887651242299 + "Data1": -8050515698369014187, + "Data2": -7658099611642276823 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisTitleBorder", @@ -36256,10 +34974,8 @@ }, { "__Checksum": { - "Data1": 7324143594521113785, - "Data2": -2887099864993771260, - "Data3": 1352375062878331290, - "Data4": -8193260372699356549 + "Data1": 6072561349318300978, + "Data2": -6014217588068991046 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartCategoryAxisTitleBorder", @@ -36313,10 +35029,8 @@ }, { "__Checksum": { - "Data1": 2548913416662957961, - "Data2": 984901831995554520, - "Data3": -3903790829175233203, - "Data4": 4393549428958012799 + "Data1": -4046478349415476153, + "Data2": 5209615340872681519 }, "Flags": 1, "Kind": 3, @@ -36334,10 +35048,8 @@ }, { "__Checksum": { - "Data1": -4135643848423890154, - "Data2": 1942512853568091183, - "Data3": -8919047640757903825, - "Data4": -6600377690433943292 + "Data1": 3452623211421714925, + "Data2": 8129932398478853156 }, "Flags": 3, "Kind": 3, @@ -36355,10 +35067,8 @@ }, { "__Checksum": { - "Data1": -7495462782248498086, - "Data2": 1015351238710309733, - "Data3": 2751844990666513255, - "Data4": 5024192171641981785 + "Data1": -6607786105078312404, + "Data2": -7819902414674847755 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartLegend", @@ -36452,10 +35162,8 @@ }, { "__Checksum": { - "Data1": 9071412037722690799, - "Data2": 2960964410074202052, - "Data3": 2722324138144567354, - "Data4": -6110640987781638608 + "Data1": -2379895787281957442, + "Data2": -455336466679449134 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartLegend", @@ -36549,10 +35257,8 @@ }, { "__Checksum": { - "Data1": -7185817647592184749, - "Data2": 6933370526891725738, - "Data3": 3192243091905343827, - "Data4": 5969771488761104967 + "Data1": -4232567200272765997, + "Data2": 7135640533775769098 }, "Flags": 1, "Kind": 3, @@ -36570,10 +35276,8 @@ }, { "__Checksum": { - "Data1": 3898337338201823277, - "Data2": -2811463307692914697, - "Data3": 3601722523040037275, - "Data4": 6404269089226977176 + "Data1": -6256505831518001341, + "Data2": 6052714963629515963 }, "Flags": 3, "Kind": 3, @@ -36591,10 +35295,8 @@ }, { "__Checksum": { - "Data1": -4305402549106676628, - "Data2": -92644647843174089, - "Data3": 4722051117201548441, - "Data4": 6050227650477094763 + "Data1": 5161208482300311910, + "Data2": 8077053489005693922 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartLegendBorder", @@ -36648,10 +35350,8 @@ }, { "__Checksum": { - "Data1": 7453439495492592481, - "Data2": 7573065382114704502, - "Data3": 5643591469022685805, - "Data4": 4080224811863604129 + "Data1": 600791756013767520, + "Data2": 7620041487452331536 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartLegendBorder", @@ -36705,10 +35405,8 @@ }, { "__Checksum": { - "Data1": 6840185273552673549, - "Data2": -1923538789539978680, - "Data3": 3081535985693538402, - "Data4": 2554783330930931013 + "Data1": -9133815533557065724, + "Data2": 4835719329650557436 }, "Flags": 1, "Kind": 3, @@ -36726,10 +35424,8 @@ }, { "__Checksum": { - "Data1": -1237697686471059854, - "Data2": 4916308795025654285, - "Data3": -6552949469576915015, - "Data4": -2295724439215118302 + "Data1": 7652286638873556674, + "Data2": -2801960978122422479 }, "Flags": 3, "Kind": 3, @@ -36747,10 +35443,8 @@ }, { "__Checksum": { - "Data1": -5513903139537834318, - "Data2": 209957334112374287, - "Data3": 3364747477812794706, - "Data4": -1261703304800322779 + "Data1": -5195417160496350794, + "Data2": 8293591320370486453 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartLegendLabels", @@ -36788,10 +35482,8 @@ }, { "__Checksum": { - "Data1": 1006616901338071155, - "Data2": 4195674884649826463, - "Data3": -2365623496710771968, - "Data4": 441137120939547637 + "Data1": -2478806411195635018, + "Data2": -288234933559785555 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartLegendLabels", @@ -36829,10 +35521,8 @@ }, { "__Checksum": { - "Data1": -5205821250946718852, - "Data2": -2075362248209740090, - "Data3": -5201340371264646590, - "Data4": -8104290621479848726 + "Data1": 3625257912772110262, + "Data2": -5172288047562618814 }, "Flags": 1, "Kind": 3, @@ -36850,10 +35540,8 @@ }, { "__Checksum": { - "Data1": 7524335024254852843, - "Data2": -3670839334166680999, - "Data3": 2109657917541772168, - "Data4": -7385010556410237636 + "Data1": 7154540866347396169, + "Data2": 7594408835630126676 }, "Flags": 3, "Kind": 3, @@ -36871,10 +35559,8 @@ }, { "__Checksum": { - "Data1": 3748316902324424078, - "Data2": 1552718159337753478, - "Data3": -3376265963561235107, - "Data4": -2571039321170511627 + "Data1": -7871999309707551662, + "Data2": 5385041410326002716 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigator", @@ -36920,10 +35606,8 @@ }, { "__Checksum": { - "Data1": 4070334101336974926, - "Data2": 8351108119074101321, - "Data3": -5902089957710533771, - "Data4": -2473871818413405557 + "Data1": 9040477292926343034, + "Data2": -542457595904442293 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigator", @@ -36969,10 +35653,8 @@ }, { "__Checksum": { - "Data1": 5680557249025501132, - "Data2": 6787992212002706422, - "Data3": 5287214145984780113, - "Data4": -8886771294936495859 + "Data1": -3487400065652029126, + "Data2": -3219619437701942708 }, "Flags": 1, "Kind": 3, @@ -36990,10 +35672,8 @@ }, { "__Checksum": { - "Data1": -5400840506998451762, - "Data2": 9223272088334606915, - "Data3": 7239661640230081252, - "Data4": 553531931279522066 + "Data1": -1632134499085205813, + "Data2": 2281534040276834692 }, "Flags": 3, "Kind": 3, @@ -37011,10 +35691,8 @@ }, { "__Checksum": { - "Data1": 3583129209854670001, - "Data2": 8417371223650872320, - "Data3": -1585609388815535644, - "Data4": 6731545023410009126 + "Data1": -576950357373322126, + "Data2": 4127197197754437610 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxis", @@ -37140,10 +35818,8 @@ }, { "__Checksum": { - "Data1": -5421537282230325084, - "Data2": 5709737822877783526, - "Data3": -5350127605641303001, - "Data4": -7390069218957387379 + "Data1": 5402444972564589888, + "Data2": -6871125704037471006 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxis", @@ -37269,10 +35945,8 @@ }, { "__Checksum": { - "Data1": 6620605836139666386, - "Data2": -8059422836423030439, - "Data3": 5007776368034295486, - "Data4": -4804891807664550145 + "Data1": -6936543588247678971, + "Data2": 7999581181852491006 }, "Flags": 1, "Kind": 3, @@ -37290,10 +35964,8 @@ }, { "__Checksum": { - "Data1": -5805506060254910932, - "Data2": 6391694568783645411, - "Data3": 6212115583135529998, - "Data4": 2984482341080563594 + "Data1": -8548933228005010714, + "Data2": 6488933884006618680 }, "Flags": 3, "Kind": 3, @@ -37311,10 +35983,8 @@ }, { "__Checksum": { - "Data1": 1070882539782330274, - "Data2": -594513751667125259, - "Data3": 553002693496689351, - "Data4": -629350190800742428 + "Data1": -6630747555700432544, + "Data2": -2728001343324724649 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisAutoBaseUnitSteps", @@ -37400,10 +36070,8 @@ }, { "__Checksum": { - "Data1": -1616621196968057887, - "Data2": -619907393085741578, - "Data3": -2090493835514871906, - "Data4": -7605737172043857204 + "Data1": -8746907457883545540, + "Data2": -2857398532250362378 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisAutoBaseUnitSteps", @@ -37489,10 +36157,8 @@ }, { "__Checksum": { - "Data1": 2101881226084013564, - "Data2": 7782056271154700012, - "Data3": 2676156896706479283, - "Data4": 2835306573602618455 + "Data1": 8511587716770361052, + "Data2": 8393896165250786404 }, "Flags": 1, "Kind": 3, @@ -37510,10 +36176,8 @@ }, { "__Checksum": { - "Data1": -1325153071549594658, - "Data2": -1570818889132568243, - "Data3": -5114939290828843999, - "Data4": 8842101447593736020 + "Data1": -3216128303590126025, + "Data2": -7990596336641444736 }, "Flags": 3, "Kind": 3, @@ -37531,10 +36195,8 @@ }, { "__Checksum": { - "Data1": -2354286028205531726, - "Data2": 8320687032960838896, - "Data3": -1289998136829928588, - "Data4": 4787818833293885401 + "Data1": -48381907058374235, + "Data2": 6367505896946598617 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLabels", @@ -37604,10 +36266,8 @@ }, { "__Checksum": { - "Data1": -1006087713685088235, - "Data2": -1441724779405201474, - "Data3": 3321388950867473684, - "Data4": 9162178082042096673 + "Data1": -453675329443467468, + "Data2": 4087981109315340402 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLabels", @@ -37677,10 +36337,8 @@ }, { "__Checksum": { - "Data1": -7525210879057615017, - "Data2": -8838780478753443877, - "Data3": 6627343312390715826, - "Data4": -4373438245643862093 + "Data1": -3459576776525246269, + "Data2": -1990634731675022644 }, "Flags": 1, "Kind": 3, @@ -37698,10 +36356,8 @@ }, { "__Checksum": { - "Data1": 7500382802579801060, - "Data2": -7816006872274616017, - "Data3": 4600394075621168812, - "Data4": 7747979418137798093 + "Data1": 5323993545204499703, + "Data2": -2844229079691085965 }, "Flags": 3, "Kind": 3, @@ -37719,10 +36375,8 @@ }, { "__Checksum": { - "Data1": 3603381812016071067, - "Data2": 6579944339889247441, - "Data3": -8760370101557225344, - "Data4": -9002605646761632175 + "Data1": -8347351071772125015, + "Data2": 4545658052199129044 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLabelsBorder", @@ -37776,10 +36430,8 @@ }, { "__Checksum": { - "Data1": 7253341285223024407, - "Data2": -4825098828404098741, - "Data3": -8769665293881453820, - "Data4": -1836889596686004172 + "Data1": 391105552010492688, + "Data2": -1517294005505490000 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLabelsBorder", @@ -37833,10 +36485,8 @@ }, { "__Checksum": { - "Data1": 6162342141853475455, - "Data2": 8500105986438890335, - "Data3": 3106009338411658654, - "Data4": -6911612074382341914 + "Data1": 8558238015845367398, + "Data2": -64825816664513851 }, "Flags": 1, "Kind": 3, @@ -37854,10 +36504,8 @@ }, { "__Checksum": { - "Data1": 6188212764137973683, - "Data2": -7164155696343950073, - "Data3": -2698047756329537921, - "Data4": 4558947426447353072 + "Data1": -8319051758078887561, + "Data2": 177069166450484654 }, "Flags": 3, "Kind": 3, @@ -37875,10 +36523,8 @@ }, { "__Checksum": { - "Data1": -5103324117703101820, - "Data2": -3698056351590753597, - "Data3": -2119626242825392807, - "Data4": 2749155902367871757 + "Data1": -5286301755604413410, + "Data2": 3880836531832540850 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLabelsMargin", @@ -37940,10 +36586,8 @@ }, { "__Checksum": { - "Data1": 3373294953448491508, - "Data2": 1049991023867327753, - "Data3": -6680102526905867409, - "Data4": 3602197030805184642 + "Data1": -4964550028647738084, + "Data2": -3000227085209592879 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLabelsMargin", @@ -38005,10 +36649,8 @@ }, { "__Checksum": { - "Data1": -4889275170003647583, - "Data2": 9154733669510695298, - "Data3": 1168674454932824014, - "Data4": 3534987013251127654 + "Data1": 1865454783072532999, + "Data2": -8665598641101540044 }, "Flags": 1, "Kind": 3, @@ -38026,10 +36668,8 @@ }, { "__Checksum": { - "Data1": 6031347797910483554, - "Data2": 1752376045170591382, - "Data3": -6855785041412158330, - "Data4": -5592413343851487739 + "Data1": 738637108700616771, + "Data2": 3112895601609345973 }, "Flags": 3, "Kind": 3, @@ -38047,10 +36687,8 @@ }, { "__Checksum": { - "Data1": -7483956098137400458, - "Data2": -6822449549661606674, - "Data3": -7308344159075171175, - "Data4": -2436544643413931684 + "Data1": 8394659371257047135, + "Data2": -8831109807704599924 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLabelsPadding", @@ -38112,10 +36750,8 @@ }, { "__Checksum": { - "Data1": -4398591797398411544, - "Data2": -1885359560536610912, - "Data3": 2137112242436497138, - "Data4": -7734840801027795065 + "Data1": 7546187452364511481, + "Data2": 4538376686382947358 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLabelsPadding", @@ -38177,10 +36813,8 @@ }, { "__Checksum": { - "Data1": 6766651637959525455, - "Data2": 3920784974662665215, - "Data3": 5284922704902500823, - "Data4": -4794517606383034752 + "Data1": 596074568469611257, + "Data2": -3392298645731368319 }, "Flags": 1, "Kind": 3, @@ -38198,10 +36832,8 @@ }, { "__Checksum": { - "Data1": -2350248573759770728, - "Data2": 3253222880173973170, - "Data3": 2388798923466982878, - "Data4": -8974068956175295913 + "Data1": -1067460623401544011, + "Data2": -1435544128084173689 }, "Flags": 3, "Kind": 3, @@ -38219,10 +36851,8 @@ }, { "__Checksum": { - "Data1": -8603335308236103429, - "Data2": 1279044902054121290, - "Data3": -495811917061844767, - "Data4": -3634449007230979653 + "Data1": -4011813847069614349, + "Data2": -492185690492780281 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLine", @@ -38284,10 +36914,8 @@ }, { "__Checksum": { - "Data1": -1212878149545495449, - "Data2": 7739265312230951874, - "Data3": -5577117272530431144, - "Data4": 5001356550746261961 + "Data1": -4458647381738632473, + "Data2": 4910649590287375852 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisLine", @@ -38349,10 +36977,8 @@ }, { "__Checksum": { - "Data1": -6524939951433719783, - "Data2": 8816169244803981842, - "Data3": -9201778197435042984, - "Data4": 4466822162166756188 + "Data1": -3092999690616443284, + "Data2": 2579580637394283515 }, "Flags": 1, "Kind": 3, @@ -38370,10 +36996,8 @@ }, { "__Checksum": { - "Data1": 2269164992060986774, - "Data2": 3799502117449465873, - "Data3": 7006467307719146564, - "Data4": 5490969627612861387 + "Data1": 5500511705679520940, + "Data2": 4854037969633599736 }, "Flags": 3, "Kind": 3, @@ -38391,10 +37015,8 @@ }, { "__Checksum": { - "Data1": 4312924841744830912, - "Data2": 19565927051513362, - "Data3": 1957733915050325885, - "Data4": -6252968935211705381 + "Data1": -1724732495458106039, + "Data2": 3450077323325319401 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisMajorGridLines", @@ -38472,10 +37094,8 @@ }, { "__Checksum": { - "Data1": -8879315329334483746, - "Data2": -6551935112892854520, - "Data3": 1903763038501963049, - "Data4": -3455967945172637662 + "Data1": -8454476161800793966, + "Data2": -7806103567192256467 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisMajorGridLines", @@ -38553,10 +37173,8 @@ }, { "__Checksum": { - "Data1": 7194707777353480189, - "Data2": 8595031397996541046, - "Data3": 7412031389628951100, - "Data4": 2461487306974365876 + "Data1": 8668753293516592087, + "Data2": -2442292299322613534 }, "Flags": 1, "Kind": 3, @@ -38574,10 +37192,8 @@ }, { "__Checksum": { - "Data1": -7945473443905531118, - "Data2": 5703959056623862082, - "Data3": -2326024041159751233, - "Data4": -5138269192391879443 + "Data1": -273498219228755182, + "Data2": 6202386135122697518 }, "Flags": 3, "Kind": 3, @@ -38595,10 +37211,8 @@ }, { "__Checksum": { - "Data1": -6280845249836694326, - "Data2": 4578991484400722241, - "Data3": 7098254662449910654, - "Data4": 5884996634164072178 + "Data1": 8808517015349031526, + "Data2": -2436207363629825303 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisMajorTicks", @@ -38676,10 +37290,8 @@ }, { "__Checksum": { - "Data1": 7770861986952546792, - "Data2": 8888386360037134770, - "Data3": 7786281084521333033, - "Data4": -2413160192313236096 + "Data1": 1038512958612123877, + "Data2": -2736382602873780042 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisMajorTicks", @@ -38757,10 +37369,8 @@ }, { "__Checksum": { - "Data1": -7326298745680799912, - "Data2": 1682373301845341418, - "Data3": 1618709829640557229, - "Data4": 7197748037138081147 + "Data1": -7188747887127498399, + "Data2": 138686880585536476 }, "Flags": 1, "Kind": 3, @@ -38778,10 +37388,8 @@ }, { "__Checksum": { - "Data1": 8439989719497875068, - "Data2": -4696338521286542689, - "Data3": 4050718011701572792, - "Data4": -1891217276087226356 + "Data1": -8808693495492297336, + "Data2": 1089727174224732521 }, "Flags": 3, "Kind": 3, @@ -38799,10 +37407,8 @@ }, { "__Checksum": { - "Data1": 7526584496184557327, - "Data2": 6965072068483266998, - "Data3": 2656395106646680599, - "Data4": -1063418670370527730 + "Data1": -7922951863231525268, + "Data2": -7738367086458018123 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisMinorGridLines", @@ -38880,10 +37486,8 @@ }, { "__Checksum": { - "Data1": -6183564975124172968, - "Data2": 1939973458551202566, - "Data3": 5832101785668171924, - "Data4": -5161087978680694140 + "Data1": 3840530735219659031, + "Data2": 3207173411369815114 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisMinorGridLines", @@ -38961,10 +37565,8 @@ }, { "__Checksum": { - "Data1": 713312498815417364, - "Data2": -7795787077235760984, - "Data3": 7454810114391139049, - "Data4": -7398520758894859204 + "Data1": 4788004210284051142, + "Data2": 7912076526422813840 }, "Flags": 1, "Kind": 3, @@ -38982,10 +37584,8 @@ }, { "__Checksum": { - "Data1": -4030123573100395509, - "Data2": 3646894196153193917, - "Data3": 1280380471228486190, - "Data4": 8403163287022130318 + "Data1": -6146769905798549899, + "Data2": -6950956817060976626 }, "Flags": 3, "Kind": 3, @@ -39003,10 +37603,8 @@ }, { "__Checksum": { - "Data1": 3557041979635732893, - "Data2": 633030966661298782, - "Data3": -3704378218465962764, - "Data4": -76816057687258061 + "Data1": 8061831042156529309, + "Data2": 5994749954412888400 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisMinorTicks", @@ -39084,10 +37682,8 @@ }, { "__Checksum": { - "Data1": -3939454412588608623, - "Data2": 5279553710410931368, - "Data3": -3544231467802204867, - "Data4": 253325239334418654 + "Data1": -5381469403800000121, + "Data2": 3968687707084681022 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisMinorTicks", @@ -39165,10 +37761,8 @@ }, { "__Checksum": { - "Data1": 4732328896929749003, - "Data2": -6048174815130627509, - "Data3": -2045492027315615553, - "Data4": 2648152609312825237 + "Data1": 6572738707093089471, + "Data2": -1257885561230722279 }, "Flags": 1, "Kind": 3, @@ -39186,10 +37780,8 @@ }, { "__Checksum": { - "Data1": -3610798007162293620, - "Data2": 4605173170942058696, - "Data3": 5870607534894687026, - "Data4": -8652895184545214211 + "Data1": -4543351603900860578, + "Data2": 3314792823371189458 }, "Flags": 3, "Kind": 3, @@ -39207,10 +37799,8 @@ }, { "__Checksum": { - "Data1": 2780416812178598700, - "Data2": -1001718544128509620, - "Data3": -1226331837642514282, - "Data4": -6169046117121924258 + "Data1": -8632248453656385619, + "Data2": -641865717615967906 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisTitle", @@ -39280,10 +37870,8 @@ }, { "__Checksum": { - "Data1": 5225925738319458133, - "Data2": -5419233848681519133, - "Data3": 8423574840169913006, - "Data4": -3221808173944717355 + "Data1": 2027638843672097590, + "Data2": 416208137080769312 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisTitle", @@ -39353,10 +37941,8 @@ }, { "__Checksum": { - "Data1": -4563670345805497848, - "Data2": 6607487168812899661, - "Data3": 6899169497410910644, - "Data4": -6014122980565267250 + "Data1": 3100446639289759096, + "Data2": -190770750678146617 }, "Flags": 1, "Kind": 3, @@ -39374,10 +37960,8 @@ }, { "__Checksum": { - "Data1": 7135399723048825686, - "Data2": -8059209840241654365, - "Data3": -7992045454849160740, - "Data4": -2106990439836198444 + "Data1": 8180338804102853709, + "Data2": -5345668302562901590 }, "Flags": 3, "Kind": 3, @@ -39395,10 +37979,8 @@ }, { "__Checksum": { - "Data1": 1656197925196103887, - "Data2": 3331223231179900965, - "Data3": 4207522453379834661, - "Data4": -695325261260566274 + "Data1": -5789160623173507645, + "Data2": 1980985923809803709 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisTitleBorder", @@ -39452,10 +38034,8 @@ }, { "__Checksum": { - "Data1": -3517327096379051658, - "Data2": -6802549393995819543, - "Data3": -3615840553099790014, - "Data4": -605168407509351330 + "Data1": -1504677762198049487, + "Data2": -6803817132845918785 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisTitleBorder", @@ -39509,10 +38089,8 @@ }, { "__Checksum": { - "Data1": -4217737596525259386, - "Data2": -7302546964055665013, - "Data3": 5262705423792334428, - "Data4": -742252781285608975 + "Data1": 7489158204800211749, + "Data2": -6272312109785878444 }, "Flags": 1, "Kind": 3, @@ -39530,10 +38108,8 @@ }, { "__Checksum": { - "Data1": -1416600755360632088, - "Data2": 6664703272866994614, - "Data3": -1429077185607256719, - "Data4": -1281997829836497097 + "Data1": -2244292284149836198, + "Data2": 1380322682640224312 }, "Flags": 3, "Kind": 3, @@ -39551,10 +38127,8 @@ }, { "__Checksum": { - "Data1": 5359100758980462834, - "Data2": -8196797073573014811, - "Data3": -6453205367613784985, - "Data4": 954114748754732295 + "Data1": 7328385353338222439, + "Data2": 6131395064472045764 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisTitleMargin", @@ -39616,10 +38190,8 @@ }, { "__Checksum": { - "Data1": -6716493473104961200, - "Data2": -3150307546047869666, - "Data3": -3414486166483391161, - "Data4": 1920375395826317050 + "Data1": -3524736912046475543, + "Data2": 610497363034332055 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorCategoryAxisTitleMargin", @@ -39681,10 +38253,8 @@ }, { "__Checksum": { - "Data1": -8074862238483598633, - "Data2": -4823745983154399981, - "Data3": -8329312627035487436, - "Data4": -7808200828381529747 + "Data1": -17815914084901009, + "Data2": 4417660874737690778 }, "Flags": 1, "Kind": 3, @@ -39702,10 +38272,8 @@ }, { "__Checksum": { - "Data1": 7696411265740657543, - "Data2": 1318642308063631684, - "Data3": -3679354657971927539, - "Data4": 8490864694677106352 + "Data1": 2554252650499805664, + "Data2": -2235481363032316125 }, "Flags": 3, "Kind": 3, @@ -39723,10 +38291,8 @@ }, { "__Checksum": { - "Data1": -7892280604301980195, - "Data2": 6215515854462455432, - "Data3": 1985222524503877825, - "Data4": -465097876898993006 + "Data1": -5331721933281745639, + "Data2": 4823111602321792930 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorHint", @@ -39772,10 +38338,8 @@ }, { "__Checksum": { - "Data1": -5767683100720471746, - "Data2": -7545988060643081273, - "Data3": 1675098816410800902, - "Data4": -7629821235313266041 + "Data1": 3392859700498405392, + "Data2": -8824308429206162619 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorHint", @@ -39821,10 +38385,8 @@ }, { "__Checksum": { - "Data1": 9074485969848209827, - "Data2": -5457196126556753143, - "Data3": -4574869694235391363, - "Data4": -6803033662546585499 + "Data1": 5146053040167607769, + "Data2": -1540176657477668840 }, "Flags": 1, "Kind": 3, @@ -39842,10 +38404,8 @@ }, { "__Checksum": { - "Data1": -591357329144356160, - "Data2": 3842620525680814290, - "Data3": 1106565267030918292, - "Data4": 7148753723728537708 + "Data1": 7986715353069795568, + "Data2": 3571964173648697103 }, "Flags": 3, "Kind": 3, @@ -39863,10 +38423,8 @@ }, { "__Checksum": { - "Data1": 676587647608285238, - "Data2": -1162652069044322274, - "Data3": 2098653649628369883, - "Data4": 4784107306026376075 + "Data1": 3948667795505190315, + "Data2": 3730322367450012909 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSelect", @@ -39912,10 +38470,8 @@ }, { "__Checksum": { - "Data1": -4677641597244307169, - "Data2": 2621226143805807177, - "Data3": 8482765548222854009, - "Data4": -5523330920397102357 + "Data1": -6486186170271802130, + "Data2": 5015583275192778933 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSelect", @@ -39961,10 +38517,8 @@ }, { "__Checksum": { - "Data1": -398498494261643565, - "Data2": 6084633251040335970, - "Data3": -2693950283913717052, - "Data4": 2028750564387207643 + "Data1": -1569887588163876528, + "Data2": -5596256909248494068 }, "Flags": 1, "Kind": 3, @@ -39982,10 +38536,8 @@ }, { "__Checksum": { - "Data1": 2365231777512434135, - "Data2": -6568456947309842033, - "Data3": 1765815404431018506, - "Data4": 4965628228796989084 + "Data1": 2425186443309547490, + "Data2": 9085689304487393210 }, "Flags": 3, "Kind": 3, @@ -40003,10 +38555,8 @@ }, { "__Checksum": { - "Data1": -5646737011871492634, - "Data2": 7685078429394008130, - "Data3": 6913121783436820122, - "Data4": 3698017750882746733 + "Data1": -5054150530787146431, + "Data2": -474192455403615984 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSelectMousewheel", @@ -40060,10 +38610,8 @@ }, { "__Checksum": { - "Data1": 9049418860816611831, - "Data2": 2912425579731921347, - "Data3": 6492782960524502313, - "Data4": 6745569930086286680 + "Data1": 365585850785816333, + "Data2": 5834940776825007672 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSelectMousewheel", @@ -40117,10 +38665,8 @@ }, { "__Checksum": { - "Data1": -4978548824375249047, - "Data2": -6846983041230912384, - "Data3": 7244339972553613433, - "Data4": 4582226260871203680 + "Data1": -5179140401939213797, + "Data2": 7513392557589180533 }, "Flags": 1, "Kind": 3, @@ -40138,10 +38684,8 @@ }, { "__Checksum": { - "Data1": -2978924881821658120, - "Data2": -3290822258633364488, - "Data3": 4496567226883463517, - "Data4": 6024421222914019946 + "Data1": -1019004614301871812, + "Data2": -6513176743201006328 }, "Flags": 3, "Kind": 3, @@ -40159,10 +38703,8 @@ }, { "__Checksum": { - "Data1": -6173351997781229125, - "Data2": 4607733482508171571, - "Data3": 7492301475003540649, - "Data4": 5556220063640018343 + "Data1": -819844892802930056, + "Data2": 6780928007992469587 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeries", @@ -40367,10 +38909,8 @@ }, { "__Checksum": { - "Data1": 4493915728087885309, - "Data2": 8376112810840311698, - "Data3": 2838405433388909165, - "Data4": 7748908521385562002 + "Data1": 1826955040680398502, + "Data2": -5324969861268143176 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeries", @@ -40575,10 +39115,8 @@ }, { "__Checksum": { - "Data1": 8449917461455599811, - "Data2": 7248822037263586678, - "Data3": 1950863828654175253, - "Data4": 9039165428104416249 + "Data1": -195846066380572649, + "Data2": -3467668237288704689 }, "Flags": 1, "Kind": 3, @@ -40596,10 +39134,8 @@ }, { "__Checksum": { - "Data1": 1723654707675918977, - "Data2": 95943003722940219, - "Data3": 6227582894492048604, - "Data4": 1122786132521252818 + "Data1": 7563572876771684317, + "Data2": 1768621785180968438 }, "Flags": 3, "Kind": 3, @@ -40617,10 +39153,8 @@ }, { "__Checksum": { - "Data1": -7243590220232823564, - "Data2": 3765935683295503038, - "Data3": 1593819572277773835, - "Data4": 5569082776519930673 + "Data1": -1607675483640084319, + "Data2": 669583379490653708 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesItems", @@ -40650,10 +39184,8 @@ }, { "__Checksum": { - "Data1": 4279914287147578652, - "Data2": 7258241967949692515, - "Data3": 3586164153320946576, - "Data4": -6542489115558475637 + "Data1": 8389396834115799603, + "Data2": 5041287068335899747 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesItems", @@ -40683,10 +39215,8 @@ }, { "__Checksum": { - "Data1": -3529459741350721428, - "Data2": 3727141238677961308, - "Data3": 7263923512917251781, - "Data4": 6108414465764887485 + "Data1": 466114200525321775, + "Data2": -8181277452738023270 }, "Flags": 1, "Kind": 3, @@ -40704,10 +39234,8 @@ }, { "__Checksum": { - "Data1": 1094244495792801970, - "Data2": -36512368099147068, - "Data3": 3088898336876034105, - "Data4": -330653867432962858 + "Data1": -2024884698920103460, + "Data2": -5830923315378215 }, "Flags": 3, "Kind": 3, @@ -40725,10 +39253,8 @@ }, { "__Checksum": { - "Data1": -1015158580320989128, - "Data2": -7383805321874743767, - "Data3": -5523985928123824337, - "Data4": -6342259209743663594 + "Data1": -4885194065090526287, + "Data2": -1880066682121112263 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesLabels", @@ -40790,10 +39316,8 @@ }, { "__Checksum": { - "Data1": 5612000117919237134, - "Data2": 412952157634225040, - "Data3": 6443729610738682177, - "Data4": -844610030531236033 + "Data1": 2157590569728182451, + "Data2": -563634588799565692 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesLabels", @@ -40855,10 +39379,8 @@ }, { "__Checksum": { - "Data1": 7008804936231468399, - "Data2": 4831461947402616514, - "Data3": 8867662729501091643, - "Data4": -5451267397463549883 + "Data1": -6392612651462251591, + "Data2": 4981269537002751916 }, "Flags": 1, "Kind": 3, @@ -40876,10 +39398,8 @@ }, { "__Checksum": { - "Data1": -2895932200713741927, - "Data2": 2972661740849738709, - "Data3": 2930380461965469110, - "Data4": 2352794777829461392 + "Data1": -3868662277101509375, + "Data2": -2502888013882835189 }, "Flags": 3, "Kind": 3, @@ -40897,10 +39417,8 @@ }, { "__Checksum": { - "Data1": 3847005068896773582, - "Data2": 1229505777227684876, - "Data3": -1578053049331647800, - "Data4": -4077901663524712192 + "Data1": -8990603541314184935, + "Data2": -901524586335583195 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesLabelsBorder", @@ -40954,10 +39472,8 @@ }, { "__Checksum": { - "Data1": 1144016491283480827, - "Data2": -7953393696457206252, - "Data3": 8483557365349243839, - "Data4": 7014992343819360301 + "Data1": 7781262751191736773, + "Data2": -4310493575723388739 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesLabelsBorder", @@ -41011,10 +39527,8 @@ }, { "__Checksum": { - "Data1": -5524312572227558566, - "Data2": -8053190522261652355, - "Data3": -6848327896840018576, - "Data4": -3528834387655711342 + "Data1": 8478316629598927605, + "Data2": 3035830166171438720 }, "Flags": 1, "Kind": 3, @@ -41032,10 +39546,8 @@ }, { "__Checksum": { - "Data1": -3072941661207477306, - "Data2": -7084565628623142661, - "Data3": 1279625622323855421, - "Data4": 9154313431981144515 + "Data1": -7958679546322970869, + "Data2": -1735814371613035571 }, "Flags": 3, "Kind": 3, @@ -41053,10 +39565,8 @@ }, { "__Checksum": { - "Data1": -5512067075541740313, - "Data2": -6209358623718165962, - "Data3": 6374421320469250911, - "Data4": -3298278345775801654 + "Data1": -8678361045692306446, + "Data2": -8272102738585441381 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesLine", @@ -41110,10 +39620,8 @@ }, { "__Checksum": { - "Data1": 4475693918665102467, - "Data2": -5032434221357580931, - "Data3": 2676314590688607464, - "Data4": -4161890724584402542 + "Data1": 3315926318777632354, + "Data2": 587735173967361294 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesLine", @@ -41167,10 +39675,8 @@ }, { "__Checksum": { - "Data1": -6413679848639290904, - "Data2": -2871969394607688624, - "Data3": 1957310986992821602, - "Data4": 7821069911553464309 + "Data1": 827160782649965083, + "Data2": -4639308607329487527 }, "Flags": 1, "Kind": 3, @@ -41188,10 +39694,8 @@ }, { "__Checksum": { - "Data1": -888972158111426212, - "Data2": -6581033685849299501, - "Data3": 3824293108114335792, - "Data4": -7020849003513691718 + "Data1": -4291004416055222597, + "Data2": -6083287793185530257 }, "Flags": 3, "Kind": 3, @@ -41209,10 +39713,8 @@ }, { "__Checksum": { - "Data1": 1507451738278052727, - "Data2": -5415679807427167429, - "Data3": 8121874265926294579, - "Data4": 5839302998868402597 + "Data1": -7286940368880255368, + "Data2": -6209453266855609127 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesMarkers", @@ -41274,10 +39776,8 @@ }, { "__Checksum": { - "Data1": -7214557684438046656, - "Data2": -4616244192840477014, - "Data3": 1094730908685471709, - "Data4": -2265917360555469500 + "Data1": 4970149594823640341, + "Data2": 3503712977906839359 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesMarkers", @@ -41339,10 +39839,8 @@ }, { "__Checksum": { - "Data1": -4475760982894561377, - "Data2": -4228987823242607786, - "Data3": 4371523387200580296, - "Data4": -2199557214425051766 + "Data1": -8655706177222675591, + "Data2": 3301906961689736804 }, "Flags": 1, "Kind": 3, @@ -41360,10 +39858,8 @@ }, { "__Checksum": { - "Data1": 3177294232302140948, - "Data2": -5475945353495135083, - "Data3": -6957029283931124142, - "Data4": 1774781971888955971 + "Data1": 8983674272190534943, + "Data2": 7421096516519033544 }, "Flags": 3, "Kind": 3, @@ -41381,10 +39877,8 @@ }, { "__Checksum": { - "Data1": 6731497048637454666, - "Data2": 3910682639568381048, - "Data3": -5519412489965194924, - "Data4": 2474546823820170386 + "Data1": -3006752583324848151, + "Data2": -8070458672833874832 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesMarkersBorder", @@ -41430,10 +39924,8 @@ }, { "__Checksum": { - "Data1": -7916573011282165097, - "Data2": -8125112079427957172, - "Data3": -6674886533866167982, - "Data4": 6122086682388322399 + "Data1": 9039714764606049076, + "Data2": 3754843578346677744 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartNavigatorSeriesMarkersBorder", @@ -41479,10 +39971,8 @@ }, { "__Checksum": { - "Data1": -6669273448281222655, - "Data2": 864399816021350537, - "Data3": -4339628912142876156, - "Data4": 1790866523120540127 + "Data1": 7234438863481142406, + "Data2": 6318753293302004788 }, "Flags": 1, "Kind": 3, @@ -41500,10 +39990,8 @@ }, { "__Checksum": { - "Data1": -178416163839194554, - "Data2": 5677561302312636619, - "Data3": 5911095285942909306, - "Data4": -4994778895278584711 + "Data1": 7303074191275592974, + "Data2": -2430752932539028104 }, "Flags": 3, "Kind": 3, @@ -41521,10 +40009,8 @@ }, { "__Checksum": { - "Data1": 1868437391368245085, - "Data2": 6474787628265648720, - "Data3": -3376342392392893901, - "Data4": 2721173079699139750 + "Data1": 7166506822594849667, + "Data2": -1387640431725718061 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartSeries", @@ -41737,10 +40223,8 @@ }, { "__Checksum": { - "Data1": -8086607728867870534, - "Data2": 5661482275403133579, - "Data3": -4515844189550784700, - "Data4": 3501258934942872863 + "Data1": -7620133929050062096, + "Data2": -8444380369678511509 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartSeries", @@ -41953,10 +40437,8 @@ }, { "__Checksum": { - "Data1": -3950587357567459292, - "Data2": -4862277815284010441, - "Data3": -4951757332676903621, - "Data4": 2960137639908927350 + "Data1": 8745805280800758984, + "Data2": 909942338928236337 }, "Flags": 1, "Kind": 3, @@ -41974,10 +40456,8 @@ }, { "__Checksum": { - "Data1": -5967697605076912940, - "Data2": 5653740503221325796, - "Data3": 4654974059947371871, - "Data4": 1580207174533817961 + "Data1": -7078483142645710266, + "Data2": 4375558235427973801 }, "Flags": 3, "Kind": 3, @@ -41995,10 +40475,8 @@ }, { "__Checksum": { - "Data1": -2695434869936619603, - "Data2": -1457917447137931707, - "Data3": 5539228053560352628, - "Data4": -6540565914243693442 + "Data1": 7820108727710026483, + "Data2": 3318580974143541105 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartSeriesItems", @@ -42028,10 +40506,8 @@ }, { "__Checksum": { - "Data1": -581007603074253274, - "Data2": 6848107169865801518, - "Data3": -5139694780252851420, - "Data4": 3895247465656346798 + "Data1": -6421187610641213402, + "Data2": -8906496566651744874 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartSeriesItems", @@ -42061,10 +40537,8 @@ }, { "__Checksum": { - "Data1": -8192424725250391930, - "Data2": -7337942126981086044, - "Data3": -8650457878797803868, - "Data4": 8148479038561943075 + "Data1": -1060805757592940872, + "Data2": -8354668568467767064 }, "Flags": 1, "Kind": 3, @@ -42082,10 +40556,8 @@ }, { "__Checksum": { - "Data1": -1046634970283280464, - "Data2": -5369355338745711934, - "Data3": 3149863552528048660, - "Data4": 2076724825073041597 + "Data1": 4763585264311396876, + "Data2": 2780506884889096189 }, "Flags": 3, "Kind": 3, @@ -42103,10 +40575,8 @@ }, { "__Checksum": { - "Data1": -4397180900442320358, - "Data2": -2198937926372833884, - "Data3": 2480613390441846096, - "Data4": 4543295717482459911 + "Data1": -8107082989386734520, + "Data2": -4485625178525891403 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartSeriesTooltip", @@ -42181,10 +40651,8 @@ }, { "__Checksum": { - "Data1": 6451724632055566224, - "Data2": -2745505773529373367, - "Data3": -1977929448827857989, - "Data4": -8413353364483561687 + "Data1": -7388467753107630310, + "Data2": -295562080876782518 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartSeriesTooltip", @@ -42259,10 +40727,8 @@ }, { "__Checksum": { - "Data1": 2334835992954549201, - "Data2": 8796496180881236435, - "Data3": 5846686968603807917, - "Data4": 2012772981159391017 + "Data1": -2722469051566234736, + "Data2": 4322969356452171926 }, "Flags": 1, "Kind": 3, @@ -42280,10 +40746,8 @@ }, { "__Checksum": { - "Data1": 5026511063157332392, - "Data2": -254723971045443220, - "Data3": 3558688241720145709, - "Data4": -9183415599809040908 + "Data1": 8456623244218593929, + "Data2": -2588759044401937371 }, "Flags": 3, "Kind": 3, @@ -42301,10 +40765,8 @@ }, { "__Checksum": { - "Data1": 3338677858057257801, - "Data2": -7260784651993846675, - "Data3": 4857583958198023773, - "Data4": -9210190226483986588 + "Data1": -296776420427778559, + "Data2": -2132095961751791196 }, "Flags": 1, "Kind": 3, @@ -42334,10 +40796,8 @@ }, { "__Checksum": { - "Data1": 4578044823846629675, - "Data2": -2521385667024788873, - "Data3": 2614216404763203088, - "Data4": 2303164653902680238 + "Data1": -2780276263415227059, + "Data2": 4195175811000579514 }, "Flags": 3, "Kind": 3, @@ -42367,10 +40827,8 @@ }, { "__Checksum": { - "Data1": 3432917505120074977, - "Data2": -7027088649546965139, - "Data3": 7301017277026587048, - "Data4": -8035966935544896190 + "Data1": -1232379702014401276, + "Data2": -4365728485732841569 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartTitle", @@ -42448,10 +40906,8 @@ }, { "__Checksum": { - "Data1": 6575254343282476135, - "Data2": 6976703798881413745, - "Data3": 6705439748168046987, - "Data4": 3839555972042106519 + "Data1": -789658154672022782, + "Data2": -1703151912180607151 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartTitle", @@ -42529,10 +40985,8 @@ }, { "__Checksum": { - "Data1": -2961429132812592881, - "Data2": -5969606977375087871, - "Data3": -686072834603821570, - "Data4": -7373068134757777265 + "Data1": 8161985531928737969, + "Data2": 5994882419061966876 }, "Flags": 1, "Kind": 3, @@ -42550,10 +41004,8 @@ }, { "__Checksum": { - "Data1": 6465185956166903500, - "Data2": 4189668697086839897, - "Data3": 5101991291208824081, - "Data4": -6825952469092959389 + "Data1": 7604887817022485581, + "Data2": -3017786286541398340 }, "Flags": 3, "Kind": 3, @@ -42571,10 +41023,8 @@ }, { "__Checksum": { - "Data1": -2541042304439105237, - "Data2": 7169394214863284649, - "Data3": 164163662058911109, - "Data4": 1407683251238668311 + "Data1": -1541210030308882376, + "Data2": -2405785579717023401 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartTitleBorder", @@ -42628,10 +41078,8 @@ }, { "__Checksum": { - "Data1": 2754950624303639434, - "Data2": -4687545335061730939, - "Data3": -1822279786017328449, - "Data4": -2371796117021329692 + "Data1": -5799461443264165882, + "Data2": 4302492543918515171 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartTitleBorder", @@ -42685,10 +41133,8 @@ }, { "__Checksum": { - "Data1": -6177790657650118042, - "Data2": -2103074356179600805, - "Data3": -6358631469902271945, - "Data4": 3437416218564617802 + "Data1": -419830389636032053, + "Data2": 7167747068488958361 }, "Flags": 1, "Kind": 3, @@ -42706,10 +41152,8 @@ }, { "__Checksum": { - "Data1": 7958715782208587426, - "Data2": -2887095323458061927, - "Data3": 395832644162120661, - "Data4": -6797528583986088168 + "Data1": -1662736115887797943, + "Data2": 9101368179809609459 }, "Flags": 3, "Kind": 3, @@ -42727,10 +41171,8 @@ }, { "__Checksum": { - "Data1": 3313233842988297463, - "Data2": -3874619897502111365, - "Data3": 2732163059954110167, - "Data4": -754017076630914618 + "Data1": 8833271853434065314, + "Data2": 4729259301152431100 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartTooltip", @@ -42825,10 +41267,8 @@ }, { "__Checksum": { - "Data1": -5731963583108849671, - "Data2": -238185645493534574, - "Data3": 3438463795469812294, - "Data4": -5955203186769948545 + "Data1": -3635964155263659253, + "Data2": -6586347279957107807 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartTooltip", @@ -42923,10 +41363,8 @@ }, { "__Checksum": { - "Data1": 3632725723605982481, - "Data2": 6465790734608791995, - "Data3": -5980888401900220185, - "Data4": -1655196413084395835 + "Data1": 2850196176644248132, + "Data2": 1014421665416658581 }, "Flags": 1, "Kind": 3, @@ -42944,10 +41382,8 @@ }, { "__Checksum": { - "Data1": -152964418869473482, - "Data2": -4823965714014005317, - "Data3": 1447682371438998853, - "Data4": 4471597666203037043 + "Data1": -1511277153405543721, + "Data2": 3895938853723670450 }, "Flags": 3, "Kind": 3, @@ -42965,10 +41401,8 @@ }, { "__Checksum": { - "Data1": 1550262018613267948, - "Data2": 4946516152705522021, - "Data3": 3925168047217268941, - "Data4": -4506176552917077957 + "Data1": -6095075218284550411, + "Data2": 5126488751299287114 }, "Flags": 1, "Kind": 3, @@ -42998,10 +41432,8 @@ }, { "__Checksum": { - "Data1": 319593607281529850, - "Data2": -5762800456577764988, - "Data3": -2051169574894579916, - "Data4": -3925351587811442513 + "Data1": -8825998157113967869, + "Data2": -5501625534332740059 }, "Flags": 3, "Kind": 3, @@ -43031,10 +41463,8 @@ }, { "__Checksum": { - "Data1": -5443891106931630458, - "Data2": -6191421695692900833, - "Data3": 159262137904148359, - "Data4": -5471862851407041299 + "Data1": 4093590963733958371, + "Data2": -2573892011717165716 }, "Flags": 1, "Kind": 3, @@ -43064,10 +41494,8 @@ }, { "__Checksum": { - "Data1": 1636858399725580961, - "Data2": -3944186885779989659, - "Data3": 4070751772932221347, - "Data4": -6917527892188403796 + "Data1": -2786843551951765471, + "Data2": 6122510894279775849 }, "Flags": 3, "Kind": 3, @@ -43097,10 +41525,8 @@ }, { "__Checksum": { - "Data1": -8729950864326941835, - "Data2": 3817823849547383065, - "Data3": 1340617557795238511, - "Data4": -8887766309026436315 + "Data1": -8440630237096966787, + "Data2": -8185550633248107352 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxes", @@ -43130,10 +41556,8 @@ }, { "__Checksum": { - "Data1": 3279425267819412397, - "Data2": -3277531083225236113, - "Data3": -3938713006986595946, - "Data4": -6863890414768320701 + "Data1": -2985264300399941787, + "Data2": -288961569037959415 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxes", @@ -43163,10 +41587,8 @@ }, { "__Checksum": { - "Data1": 4808632866244282136, - "Data2": -9003722336161028863, - "Data3": -941114239980927570, - "Data4": -4531572876497810596 + "Data1": 6712438815659581285, + "Data2": -4619092366130573558 }, "Flags": 1, "Kind": 3, @@ -43184,10 +41606,8 @@ }, { "__Checksum": { - "Data1": -3211459683756200050, - "Data2": -6297674949323273941, - "Data3": -2112181972757575880, - "Data4": -450749153756250058 + "Data1": 5001233051876751155, + "Data2": 6798494103259933134 }, "Flags": 3, "Kind": 3, @@ -43205,10 +41625,8 @@ }, { "__Checksum": { - "Data1": 6368543464941148116, - "Data2": 7604513647946129301, - "Data3": -7753880622744923913, - "Data4": -4078508485279227615 + "Data1": -1580985124188720654, + "Data2": 5627156477810709004 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxis", @@ -43301,10 +41719,8 @@ }, { "__Checksum": { - "Data1": -995151204409261710, - "Data2": 8144350782330661654, - "Data3": -6857500454268920224, - "Data4": 806753809712171846 + "Data1": -1675146025861335242, + "Data2": -2954953460832010963 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxis", @@ -43397,10 +41813,8 @@ }, { "__Checksum": { - "Data1": -4427242148194787611, - "Data2": -2315656220378338149, - "Data3": 557410509177851367, - "Data4": -6116888841988559917 + "Data1": -6024825097398474852, + "Data2": 4339926192247512101 }, "Flags": 1, "Kind": 3, @@ -43418,10 +41832,8 @@ }, { "__Checksum": { - "Data1": 2452289327746087986, - "Data2": -8128134441418228243, - "Data3": -3452104823267072126, - "Data4": 5636113890677193625 + "Data1": -5940251961959477510, + "Data2": -1376357132333449134 }, "Flags": 3, "Kind": 3, @@ -43439,10 +41851,8 @@ }, { "__Checksum": { - "Data1": -1649113693177656047, - "Data2": 4214637171801491720, - "Data3": -5248064205468700071, - "Data4": 9092497892596648708 + "Data1": 477251073348915127, + "Data2": 1246637538929931194 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisCrosshair", @@ -43504,10 +41914,8 @@ }, { "__Checksum": { - "Data1": 2105227731019767999, - "Data2": -2000342714153008933, - "Data3": 6790595859979205973, - "Data4": 1967307497945876505 + "Data1": 1033788739830163951, + "Data2": 112654863596423591 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisCrosshair", @@ -43569,10 +41977,8 @@ }, { "__Checksum": { - "Data1": 1494822742659813744, - "Data2": -2112544282365625871, - "Data3": -1437764928983784263, - "Data4": -5562262946859982790 + "Data1": -3065945444336179527, + "Data2": 1111594745358646916 }, "Flags": 1, "Kind": 3, @@ -43590,10 +41996,8 @@ }, { "__Checksum": { - "Data1": -6495221601413075675, - "Data2": 1264023073243752288, - "Data3": 579225609298145243, - "Data4": 4895971981539313488 + "Data1": 631756661837217699, + "Data2": 5099062059690662502 }, "Flags": 3, "Kind": 3, @@ -43611,10 +42015,8 @@ }, { "__Checksum": { - "Data1": -1347234718762214521, - "Data2": 699676699835876919, - "Data3": 4633683500947111818, - "Data4": -5890314279398701387 + "Data1": 3203849533938485261, + "Data2": -4483092079106063961 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisCrosshairTooltip", @@ -43689,10 +42091,8 @@ }, { "__Checksum": { - "Data1": 2587942695866670929, - "Data2": -1779931529472147263, - "Data3": -894653200065233896, - "Data4": 1781760373481423199 + "Data1": 5850658044588631335, + "Data2": -2879667603580316133 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisCrosshairTooltip", @@ -43767,10 +42167,8 @@ }, { "__Checksum": { - "Data1": 1140809094246972347, - "Data2": 8947616789361794734, - "Data3": 6964466385197621378, - "Data4": -8785231197674489094 + "Data1": -3819919872274969704, + "Data2": 3973429376432164325 }, "Flags": 1, "Kind": 3, @@ -43788,10 +42186,8 @@ }, { "__Checksum": { - "Data1": -5743057595019389193, - "Data2": 4988795525122517617, - "Data3": 569778747472362622, - "Data4": -9134768121497621631 + "Data1": 6717334292754068487, + "Data2": -8520628215861031728 }, "Flags": 3, "Kind": 3, @@ -43809,10 +42205,8 @@ }, { "__Checksum": { - "Data1": -7034740107088868332, - "Data2": 7614577084192852247, - "Data3": 212346742123303507, - "Data4": 8214478415258930723 + "Data1": -8085147100031303396, + "Data2": 6437437563275355447 }, "Flags": 1, "Kind": 3, @@ -43842,10 +42236,8 @@ }, { "__Checksum": { - "Data1": 1512051282099007019, - "Data2": 2021303303746901643, - "Data3": -263833910077630699, - "Data4": -3604862294826714338 + "Data1": -547241861544218018, + "Data2": -8422460761655076857 }, "Flags": 3, "Kind": 3, @@ -43875,10 +42267,8 @@ }, { "__Checksum": { - "Data1": -4943764914120288647, - "Data2": -7351225435915274118, - "Data3": -4097476385477820682, - "Data4": 6798770903141256494 + "Data1": -103278911336387478, + "Data2": -6548172414471448613 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisLabels", @@ -43956,10 +42346,8 @@ }, { "__Checksum": { - "Data1": -685971428892194568, - "Data2": 4745533163321223039, - "Data3": -3685067610572163851, - "Data4": -3278205637917841418 + "Data1": 3108842950351113795, + "Data2": 6622389156968922347 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisLabels", @@ -44037,10 +42425,8 @@ }, { "__Checksum": { - "Data1": 5386611802242170038, - "Data2": -7526567222864680882, - "Data3": 3043165261374402398, - "Data4": -1128122234633043857 + "Data1": -6455131116448418754, + "Data2": 8363899283302779969 }, "Flags": 1, "Kind": 3, @@ -44058,10 +42444,8 @@ }, { "__Checksum": { - "Data1": -5639070736688234165, - "Data2": -3626185319678686885, - "Data3": 3525322990128636859, - "Data4": -7206620017723216102 + "Data1": 1760483930080211079, + "Data2": 1702380947765712579 }, "Flags": 3, "Kind": 3, @@ -44079,10 +42463,8 @@ }, { "__Checksum": { - "Data1": -1158209708835908262, - "Data2": -7658401991216269361, - "Data3": -9127871271548985461, - "Data4": 4859231398326250874 + "Data1": 8311293866876863518, + "Data2": 6035533161490727201 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisLabelsBorder", @@ -44136,10 +42518,8 @@ }, { "__Checksum": { - "Data1": -7091652990575445385, - "Data2": 7305344281223883083, - "Data3": 3666583613888957219, - "Data4": 6922126197110154839 + "Data1": 2211114015826582623, + "Data2": 7127094442321292425 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisLabelsBorder", @@ -44193,10 +42573,8 @@ }, { "__Checksum": { - "Data1": 4405351062134200033, - "Data2": 4977306890285875314, - "Data3": -4157884029573862707, - "Data4": -7682214644270433686 + "Data1": -243539812886872192, + "Data2": 8076566720153995528 }, "Flags": 1, "Kind": 3, @@ -44214,10 +42592,8 @@ }, { "__Checksum": { - "Data1": -2307728381421803540, - "Data2": 6083385127856280151, - "Data3": 7381548566035507569, - "Data4": 3711984345911491949 + "Data1": 6253097309395367935, + "Data2": -1185135415392652445 }, "Flags": 3, "Kind": 3, @@ -44235,10 +42611,8 @@ }, { "__Checksum": { - "Data1": -6498005621216167678, - "Data2": 8315072605589431926, - "Data3": -3646038624263951481, - "Data4": -5607055692613982758 + "Data1": 99190527755435209, + "Data2": 3683558052959887254 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisLine", @@ -44300,10 +42674,8 @@ }, { "__Checksum": { - "Data1": 7689244778616974877, - "Data2": -8935740141088134493, - "Data3": -4115652122714058588, - "Data4": 2711378390055180397 + "Data1": -3235058215720348016, + "Data2": -3410461467864506952 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisLine", @@ -44365,10 +42737,8 @@ }, { "__Checksum": { - "Data1": 597535217840568490, - "Data2": 9025782628400569273, - "Data3": 2576469738246571924, - "Data4": 1650909361529714429 + "Data1": -6101104864669330439, + "Data2": 1256886664132159634 }, "Flags": 1, "Kind": 3, @@ -44386,10 +42756,8 @@ }, { "__Checksum": { - "Data1": 7645095234517246908, - "Data2": -4144410772174033394, - "Data3": -3708162772521438061, - "Data4": -8413233788211417703 + "Data1": 2479737879369003855, + "Data2": -3258360107922716279 }, "Flags": 3, "Kind": 3, @@ -44407,10 +42775,8 @@ }, { "__Checksum": { - "Data1": 7735219173033474359, - "Data2": -2584290355640735625, - "Data3": -1587546446362018567, - "Data4": -8318164041545183170 + "Data1": 7306740740452900274, + "Data2": 1083872063816294254 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisMajorGridLines", @@ -44480,10 +42846,8 @@ }, { "__Checksum": { - "Data1": 7658039581439804849, - "Data2": 2258035892046449327, - "Data3": -1414750299244014380, - "Data4": 5725570297142193933 + "Data1": 6748420817721877378, + "Data2": 29082716438601277 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisMajorGridLines", @@ -44553,10 +42917,8 @@ }, { "__Checksum": { - "Data1": 2109421712468700636, - "Data2": -7253488403438675706, - "Data3": 7491420559069206577, - "Data4": 9203247484985580800 + "Data1": -3098853700307894506, + "Data2": -2774340273869541872 }, "Flags": 1, "Kind": 3, @@ -44574,10 +42936,8 @@ }, { "__Checksum": { - "Data1": 4435980087827942561, - "Data2": -1222044052933073030, - "Data3": 3702503111787453824, - "Data4": -870558411313630366 + "Data1": -7532484651332178787, + "Data2": 4126617818557118996 }, "Flags": 3, "Kind": 3, @@ -44595,10 +42955,8 @@ }, { "__Checksum": { - "Data1": 2376651085661251680, - "Data2": -5111415953889851858, - "Data3": 4874590358281086153, - "Data4": 5735295674304014932 + "Data1": -1118201180633884926, + "Data2": 4913327195243350620 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisMajorTicks", @@ -44676,10 +43034,8 @@ }, { "__Checksum": { - "Data1": 7947964419931773876, - "Data2": 6108721172016989836, - "Data3": 2550466856532940562, - "Data4": 4761947221361886615 + "Data1": -532781138129144447, + "Data2": 7485106815478791800 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisMajorTicks", @@ -44757,10 +43113,8 @@ }, { "__Checksum": { - "Data1": 6727762194452517212, - "Data2": 9138173183282063101, - "Data3": 270468034090667115, - "Data4": -1779058417393202842 + "Data1": 2618338856500398627, + "Data2": 4212183213183184186 }, "Flags": 1, "Kind": 3, @@ -44778,10 +43132,8 @@ }, { "__Checksum": { - "Data1": -7149816646259355001, - "Data2": -636725097630999395, - "Data3": 1325522752310542035, - "Data4": 1650637188799363733 + "Data1": -5659694292212619971, + "Data2": 8354530019940629099 }, "Flags": 3, "Kind": 3, @@ -44799,10 +43151,8 @@ }, { "__Checksum": { - "Data1": -5277674599557280950, - "Data2": 8253278476193204899, - "Data3": 6607260061797677415, - "Data4": 1097605892882471863 + "Data1": 46286397423970223, + "Data2": -4031834137779189123 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisMinorGridLines", @@ -44880,10 +43230,8 @@ }, { "__Checksum": { - "Data1": 5657932276817339894, - "Data2": -3929610266750845278, - "Data3": -7059675286288585115, - "Data4": -978367261961116692 + "Data1": -500644629177039060, + "Data2": -2938829844272694012 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisMinorGridLines", @@ -44961,10 +43309,8 @@ }, { "__Checksum": { - "Data1": 7382232521150720943, - "Data2": -7427976711654952245, - "Data3": -2557961787744593939, - "Data4": 5420587308790704594 + "Data1": 1849403343781056319, + "Data2": -8999179834200789887 }, "Flags": 1, "Kind": 3, @@ -44982,10 +43328,8 @@ }, { "__Checksum": { - "Data1": 4547003315352650566, - "Data2": -7318407192206742225, - "Data3": -8874697927133533705, - "Data4": -197076902480539575 + "Data1": -5104522088450076502, + "Data2": -3154969090866384658 }, "Flags": 3, "Kind": 3, @@ -45003,10 +43347,8 @@ }, { "__Checksum": { - "Data1": 7266888581224548144, - "Data2": 3418678169598123377, - "Data3": -7832263113146801917, - "Data4": 2083171392936308849 + "Data1": 5042431771386508992, + "Data2": -2371230696874198386 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisMinorTicks", @@ -45084,10 +43426,8 @@ }, { "__Checksum": { - "Data1": 9135960485157576133, - "Data2": -6522340097526752092, - "Data3": 5886819785855080531, - "Data4": 7556888105479214200 + "Data1": 653813621547812737, + "Data2": 6913100090870405164 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisMinorTicks", @@ -45165,10 +43505,8 @@ }, { "__Checksum": { - "Data1": 2323412427172182922, - "Data2": -1289507847657209690, - "Data3": 3716153461903909593, - "Data4": 4035954911635210345 + "Data1": 7705602016726743820, + "Data2": 6990482847004279020 }, "Flags": 1, "Kind": 3, @@ -45186,10 +43524,8 @@ }, { "__Checksum": { - "Data1": 924047209111486851, - "Data2": -7808323590050148486, - "Data3": 3894383244407989879, - "Data4": -8935212347308925776 + "Data1": 8928985627706566019, + "Data2": -9157085615251665561 }, "Flags": 3, "Kind": 3, @@ -45207,10 +43543,8 @@ }, { "__Checksum": { - "Data1": -887351549238137750, - "Data2": 5189035927246125144, - "Data3": 158680295379552881, - "Data4": 8929365459761465459 + "Data1": 5019325140268866497, + "Data2": -3949136913580284456 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisTitle", @@ -45280,10 +43614,8 @@ }, { "__Checksum": { - "Data1": -6239328446090535504, - "Data2": 3777986244735428738, - "Data3": 8021078894838331676, - "Data4": 771192148581269181 + "Data1": 5023621722623138676, + "Data2": 7966389947770000445 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisTitle", @@ -45353,10 +43685,8 @@ }, { "__Checksum": { - "Data1": 2963075361312815586, - "Data2": -6257703005850553694, - "Data3": 1772999346959847248, - "Data4": -187958408809280956 + "Data1": -2554831766528282919, + "Data2": 8951006208428205679 }, "Flags": 1, "Kind": 3, @@ -45374,10 +43704,8 @@ }, { "__Checksum": { - "Data1": -4233577625118378708, - "Data2": 6897428511995720611, - "Data3": 3276147986633687640, - "Data4": 7017539569966197953 + "Data1": 4296490451993623837, + "Data2": 1433752026010110078 }, "Flags": 3, "Kind": 3, @@ -45395,10 +43723,8 @@ }, { "__Checksum": { - "Data1": 1113115011936621794, - "Data2": 1480585767528197180, - "Data3": 2305756549903187116, - "Data4": -4875154695482573961 + "Data1": 8091874841287811717, + "Data2": -3843807141490671793 }, "Flags": 1, "Name": "Telerik.Blazor.Components.StockChartValueAxisTitleBorder", @@ -45452,10 +43778,8 @@ }, { "__Checksum": { - "Data1": -3233651047641091496, - "Data2": -8929540314644720753, - "Data3": -8487678582251703143, - "Data4": 1148813626223780181 + "Data1": -6267094691397649132, + "Data2": 3821314378300728558 }, "Flags": 3, "Name": "Telerik.Blazor.Components.StockChartValueAxisTitleBorder", @@ -45509,10 +43833,8 @@ }, { "__Checksum": { - "Data1": -3884492174559197433, - "Data2": -893978198062312730, - "Data3": 585923382233693258, - "Data4": -999427435408268770 + "Data1": 9046031547142065326, + "Data2": 4109112816890522323 }, "Flags": 1, "Kind": 3, @@ -45530,10 +43852,8 @@ }, { "__Checksum": { - "Data1": -8372787103461475145, - "Data2": -4023697385981839090, - "Data3": -6576890902728464109, - "Data4": -2686654391773104534 + "Data1": 6380405478231165384, + "Data2": -8869879948835498439 }, "Flags": 3, "Kind": 3, @@ -45551,10 +43871,8 @@ }, { "__Checksum": { - "Data1": -1399540417899031754, - "Data2": -5729991835239823704, - "Data3": -7973249021738609849, - "Data4": -743127705118875329 + "Data1": 3148913529835776142, + "Data2": 793358874056149063 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikStockChart", @@ -45636,10 +43954,8 @@ }, { "__Checksum": { - "Data1": 1439367399576172655, - "Data2": -342130007176227065, - "Data3": -7796910791362216557, - "Data4": 3850974359272565038 + "Data1": 7909399635163908257, + "Data2": -3966609751921636663 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikStockChart", @@ -45721,10 +44037,8 @@ }, { "__Checksum": { - "Data1": -1256482451382009711, - "Data2": -5427009809236089699, - "Data3": 5353675788304568450, - "Data4": 494695619931880848 + "Data1": 5448838302736359655, + "Data2": -1537110855442858418 }, "Flags": 1, "Kind": 3, @@ -45742,10 +44056,8 @@ }, { "__Checksum": { - "Data1": -8810521401455506128, - "Data2": -1161480889263943155, - "Data3": 6851252362979496277, - "Data4": 728778464066920026 + "Data1": 6405865277969488996, + "Data2": -6247671356362433118 }, "Flags": 3, "Kind": 3, @@ -45763,10 +44075,8 @@ }, { "__Checksum": { - "Data1": -7256846573728996493, - "Data2": 3875935602094383860, - "Data3": 7240380263277206690, - "Data4": -31471982312610360 + "Data1": -1595217029211825088, + "Data2": -5793492284759201483 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikSwitch", @@ -45902,10 +44212,8 @@ }, { "__Checksum": { - "Data1": -2985624400238452874, - "Data2": 7884012630740368940, - "Data3": 8258363835921955711, - "Data4": -2625651986816404309 + "Data1": -2603484440125931948, + "Data2": 2649786011145354844 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikSwitch", @@ -46041,10 +44349,8 @@ }, { "__Checksum": { - "Data1": 5048737006395514649, - "Data2": -5539565191641869582, - "Data3": -8436638353128951214, - "Data4": -1294263906396619626 + "Data1": 7600792993930751241, + "Data2": 7711809664070885457 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TabStripTabBase", @@ -46091,10 +44397,8 @@ }, { "__Checksum": { - "Data1": -2254683645192189570, - "Data2": 2102421279223629802, - "Data3": 6788718608412354283, - "Data4": -2559362529224527433 + "Data1": -2624381983628998557, + "Data2": -7688623149554283630 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TabStripTabBase", @@ -46141,10 +44445,8 @@ }, { "__Checksum": { - "Data1": 4352204546408474282, - "Data2": 8187302695704634805, - "Data3": 5339966940671914289, - "Data4": 3970003343437154168 + "Data1": 4012704328206324818, + "Data2": -4432021557523618879 }, "Flags": 1, "Kind": 3, @@ -46163,10 +44465,8 @@ }, { "__Checksum": { - "Data1": 7185914827345367156, - "Data2": 6490152167393775858, - "Data3": -8906313679303770077, - "Data4": -3305984603896380849 + "Data1": 6906386335520644047, + "Data2": -6169368536685427756 }, "Flags": 3, "Kind": 3, @@ -46185,10 +44485,8 @@ }, { "__Checksum": { - "Data1": 6381939486326646824, - "Data2": 1145929855562875128, - "Data3": -308664351355685448, - "Data4": 5390150151704252854 + "Data1": -1818236790611437151, + "Data2": -3618564611167493423 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikTabStrip", @@ -46246,10 +44544,8 @@ }, { "__Checksum": { - "Data1": -3333443717531842844, - "Data2": -3976622043745404092, - "Data3": 509558307352527999, - "Data4": 2816537813732372388 + "Data1": 197051373734477196, + "Data2": -2405772755280079071 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikTabStrip", @@ -46307,10 +44603,8 @@ }, { "__Checksum": { - "Data1": 1928208336571307600, - "Data2": -3327327001439441815, - "Data3": -3329005508081889850, - "Data4": -5502970621622378370 + "Data1": -2715264836784561048, + "Data2": 1686111668368013861 }, "Flags": 1, "Kind": 3, @@ -46328,10 +44622,8 @@ }, { "__Checksum": { - "Data1": 3893700049353617211, - "Data2": 2335129539779212801, - "Data3": 5189571084957311030, - "Data4": 1354439519473281680 + "Data1": -5475608135607247131, + "Data2": 7014023298637773480 }, "Flags": 3, "Kind": 3, @@ -46349,10 +44641,8 @@ }, { "__Checksum": { - "Data1": -2569871712921996245, - "Data2": -3878716252085452753, - "Data3": -8697406191223890569, - "Data4": -5019320912087591995 + "Data1": -2061855895716330080, + "Data2": 145073102614450155 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikTextBox", @@ -46507,10 +44797,8 @@ }, { "__Checksum": { - "Data1": 5767098256923798528, - "Data2": -8980658835275815794, - "Data3": -2981504909782643861, - "Data4": 2737734819763382201 + "Data1": -2157826941836950936, + "Data2": 4873028940329237646 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikTextBox", @@ -46665,10 +44953,8 @@ }, { "__Checksum": { - "Data1": -3934393775719599620, - "Data2": -4083200191160315656, - "Data3": -4546828411081840038, - "Data4": 9036446208027255666 + "Data1": -4778978739144450699, + "Data2": 1558474063710346635 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikTileLayout", @@ -46803,10 +45089,8 @@ }, { "__Checksum": { - "Data1": -2677959692250513557, - "Data2": 6747530047915298577, - "Data3": -149455482150354307, - "Data4": -1928326689551760393 + "Data1": 1250379936412705029, + "Data2": -7514140736872744804 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikTileLayout", @@ -46941,10 +45225,8 @@ }, { "__Checksum": { - "Data1": 8415745898997318179, - "Data2": 8432188878716890113, - "Data3": -8080686030578680620, - "Data4": 9051607566260731113 + "Data1": 15038537080928257, + "Data2": -6449211325928279040 }, "Flags": 1, "Kind": 3, @@ -46963,10 +45245,8 @@ }, { "__Checksum": { - "Data1": 1620919354205805784, - "Data2": -67863025815302314, - "Data3": -6218797289931824266, - "Data4": 3761820615531580569 + "Data1": -857534103710958185, + "Data2": -95080377664117431 }, "Flags": 3, "Kind": 3, @@ -46985,10 +45265,8 @@ }, { "__Checksum": { - "Data1": 1988626128238766478, - "Data2": -4985936786817576447, - "Data3": -2476995974735625346, - "Data4": 4925532308366585443 + "Data1": 9038237801703517273, + "Data2": -77690005441202587 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TileLayoutItem", @@ -47063,10 +45341,8 @@ }, { "__Checksum": { - "Data1": -1292327742586021072, - "Data2": -931185807186113655, - "Data3": -8326631065410818315, - "Data4": 4149970401305085633 + "Data1": 5046323931250952925, + "Data2": 8127766706309915009 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TileLayoutItem", @@ -47141,10 +45417,8 @@ }, { "__Checksum": { - "Data1": 9208770569222086114, - "Data2": -2853428681803427371, - "Data3": 2801524289573013060, - "Data4": 1218303429103003273 + "Data1": -8982557105960475517, + "Data2": -9116611465871253022 }, "Flags": 1, "Kind": 3, @@ -47163,10 +45437,8 @@ }, { "__Checksum": { - "Data1": -8663291410214225367, - "Data2": -2919263886756509063, - "Data3": -8404718451604402892, - "Data4": 9052410479873808892 + "Data1": -8991139119554197924, + "Data2": 4506151162226374102 }, "Flags": 3, "Kind": 3, @@ -47185,10 +45457,8 @@ }, { "__Checksum": { - "Data1": 2127044156476259929, - "Data2": 3428553713047033145, - "Data3": -3949831790101304674, - "Data4": 5500101862306748836 + "Data1": 2065380292756433302, + "Data2": -2462236618475406087 }, "Flags": 1, "Kind": 3, @@ -47207,10 +45477,8 @@ }, { "__Checksum": { - "Data1": -278736066786080384, - "Data2": -8088273529422466326, - "Data3": -1950513998600937386, - "Data4": 6484271130676748785 + "Data1": -3465720085883534580, + "Data2": 2378135514476843654 }, "Flags": 3, "Kind": 3, @@ -47229,10 +45497,8 @@ }, { "__Checksum": { - "Data1": 2105604383525528852, - "Data2": -4120959207510303248, - "Data3": -2635244405426890316, - "Data4": -4563286016415796638 + "Data1": 1968496713061725173, + "Data2": 83891970598504012 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikTimePicker", @@ -47368,10 +45634,8 @@ }, { "__Checksum": { - "Data1": -3313254752268842607, - "Data2": 5355046891646104880, - "Data3": -7148428157585751463, - "Data4": -2243986031364139139 + "Data1": -8057640757345054394, + "Data2": -1390122219319830356 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikTimePicker", @@ -47507,10 +45771,8 @@ }, { "__Checksum": { - "Data1": 2771175978254856206, - "Data2": -6470625625129346755, - "Data3": -2714846600847247262, - "Data4": 6447603415447558229 + "Data1": 5605932047240732260, + "Data2": -6436678026023224115 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikToggleButton", @@ -47643,10 +45905,8 @@ }, { "__Checksum": { - "Data1": 991956345162186415, - "Data2": -6840579171173629712, - "Data3": 7097653463312047232, - "Data4": 3612389405134495488 + "Data1": 8282203388498445067, + "Data2": 930414700249203589 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikToggleButton", @@ -47779,10 +46039,8 @@ }, { "__Checksum": { - "Data1": 4819738807279656130, - "Data2": 1581224193377454836, - "Data3": 1243825300872773745, - "Data4": 5675386672436998369 + "Data1": 7214752945199239698, + "Data2": -6449613125676821250 }, "Flags": 1, "Kind": 3, @@ -47800,10 +46058,8 @@ }, { "__Checksum": { - "Data1": -8319895870471259345, - "Data2": -7183705577700127111, - "Data3": 3240030359454854413, - "Data4": -4038858143176952687 + "Data1": 1762465509247033139, + "Data2": 2284515606788333479 }, "Flags": 3, "Kind": 3, @@ -47821,10 +46077,8 @@ }, { "__Checksum": { - "Data1": -1214948651343002551, - "Data2": -8821828566117401950, - "Data3": -3501853153988185798, - "Data4": 5989588169806871147 + "Data1": 4307422676990307301, + "Data2": 4069311503977403668 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikTooltip", @@ -47920,10 +46174,8 @@ }, { "__Checksum": { - "Data1": 6764744123958276739, - "Data2": -7494424327710979565, - "Data3": -8130493583473450469, - "Data4": 495874485989988901 + "Data1": 7083814026954102085, + "Data2": 6214733895592863141 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikTooltip", @@ -48019,10 +46271,8 @@ }, { "__Checksum": { - "Data1": 6129021041987439647, - "Data2": 6182651404673270519, - "Data3": 2783667852817388304, - "Data4": -7502114194553584711 + "Data1": 2109215699276869775, + "Data2": 2747066806512927527 }, "Flags": 1, "Kind": 3, @@ -48052,10 +46302,8 @@ }, { "__Checksum": { - "Data1": -6481589333103974249, - "Data2": -2305456959785235963, - "Data3": 290099512988332439, - "Data4": 3234920670331582995 + "Data1": 4187898299013060696, + "Data2": 6702879987750342010 }, "Flags": 3, "Kind": 3, @@ -48085,10 +46333,8 @@ }, { "__Checksum": { - "Data1": -4288626272182795275, - "Data2": -8619483463488094519, - "Data3": 1552836519214219058, - "Data4": -8496840823486436168 + "Data1": 4033700555917378078, + "Data2": -3026368461174230691 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeListAutoGeneratedColumns", @@ -48115,10 +46361,8 @@ }, { "__Checksum": { - "Data1": -300681911546261986, - "Data2": -6991186541138232314, - "Data3": -8985508236894832683, - "Data4": -683056770005674331 + "Data1": -1063550707908658345, + "Data2": 6378834666072616392 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeListAutoGeneratedColumns", @@ -48145,10 +46389,8 @@ }, { "__Checksum": { - "Data1": -2556575320233906246, - "Data2": 3309264085563367161, - "Data3": 632802809633482503, - "Data4": -5022091748489849949 + "Data1": -4943017186180465949, + "Data2": 8225584947690373756 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeListCheckboxColumn", @@ -48237,10 +46479,8 @@ }, { "__Checksum": { - "Data1": 3878318478034397298, - "Data2": 2938321848458416899, - "Data3": 8932133309081502003, - "Data4": -3945461891792832909 + "Data1": 6466311396341066649, + "Data2": -4927533155644962282 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeListCheckboxColumn", @@ -48329,10 +46569,8 @@ }, { "__Checksum": { - "Data1": -6209607029195422063, - "Data2": -763103928522678437, - "Data3": -1600215148342733963, - "Data4": -8068128552301037762 + "Data1": -9078128779370102306, + "Data2": 549974538350388520 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeListColumn", @@ -48516,10 +46754,8 @@ }, { "__Checksum": { - "Data1": 8763555176285509957, - "Data2": -3001862820285751996, - "Data3": 5108666753701039549, - "Data4": 4829102514891821552 + "Data1": 3050706088078002764, + "Data2": -894116842528247255 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeListColumn", @@ -48703,10 +46939,8 @@ }, { "__Checksum": { - "Data1": 3689008149713157367, - "Data2": -4521185480691499701, - "Data3": -7940464332072358781, - "Data4": -3016789301428334220 + "Data1": -603125069824995397, + "Data2": 5284271853244598802 }, "Flags": 1, "Kind": 3, @@ -48736,10 +46970,8 @@ }, { "__Checksum": { - "Data1": 8468428035505352453, - "Data2": 2857016353357434795, - "Data3": -6902979812795357994, - "Data4": 7827315665793282116 + "Data1": 3635918331047019765, + "Data2": 8747187523745968860 }, "Flags": 3, "Kind": 3, @@ -48769,10 +47001,8 @@ }, { "__Checksum": { - "Data1": -5538268194188029716, - "Data2": 4799217106962722333, - "Data3": -6301542445180404127, - "Data4": -983136632529000097 + "Data1": -352226444735456654, + "Data2": 4723900553798752525 }, "Flags": 1, "Kind": 3, @@ -48791,10 +47021,8 @@ }, { "__Checksum": { - "Data1": -6123041775099522471, - "Data2": -3368821813082162904, - "Data3": 168343778251486821, - "Data4": -4875515976057763869 + "Data1": -5196716997497705821, + "Data2": -2102228326515800497 }, "Flags": 3, "Kind": 3, @@ -48813,10 +47041,8 @@ }, { "__Checksum": { - "Data1": 7860874756112162161, - "Data2": 9092369886226949614, - "Data3": -1622455689521447121, - "Data4": -8449952259154239064 + "Data1": -374147919224948347, + "Data2": -6582877490812909571 }, "Flags": 1, "Kind": 3, @@ -48846,10 +47072,8 @@ }, { "__Checksum": { - "Data1": 7916079355777440856, - "Data2": 3391051114389679126, - "Data3": -3895880599613511013, - "Data4": 7861622980003014945 + "Data1": 3373815450185299226, + "Data2": 2959590855173201061 }, "Flags": 3, "Kind": 3, @@ -48879,10 +47103,8 @@ }, { "__Checksum": { - "Data1": 3564735256302657396, - "Data2": -4881901903180274100, - "Data3": -756652171599274589, - "Data4": -2675167392881542687 + "Data1": -2642744624746756078, + "Data2": 843651718372939988 }, "Flags": 1, "Kind": 3, @@ -48912,10 +47134,8 @@ }, { "__Checksum": { - "Data1": 328462595114870552, - "Data2": -6277193195047385327, - "Data3": -7594995771497076642, - "Data4": 5271462316698852054 + "Data1": 2819329430990078473, + "Data2": 5630321208083333861 }, "Flags": 3, "Kind": 3, @@ -48945,10 +47165,8 @@ }, { "__Checksum": { - "Data1": 7863078404896230304, - "Data2": -4756943149683744339, - "Data3": -8601207508609032330, - "Data4": -3471120421923271906 + "Data1": -7517951733957099429, + "Data2": -462921942305487934 }, "Flags": 1, "Kind": 3, @@ -48978,10 +47196,8 @@ }, { "__Checksum": { - "Data1": -4620672246267318708, - "Data2": -2508294437345795733, - "Data3": -4158751995772027525, - "Data4": 8111951141221529896 + "Data1": -3881480535685154027, + "Data2": -1220946635889720763 }, "Flags": 3, "Kind": 3, @@ -49011,10 +47227,8 @@ }, { "__Checksum": { - "Data1": -3340753777150704672, - "Data2": 4104250031129802560, - "Data3": -6278457637550981379, - "Data4": -585246895685655460 + "Data1": 1638960433816061117, + "Data2": 3270364729455907625 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeListCommandColumn", @@ -49101,10 +47315,8 @@ }, { "__Checksum": { - "Data1": -5865081815131240999, - "Data2": 7497251053705268619, - "Data3": 844841623214438964, - "Data4": -5439503570309303828 + "Data1": -1054696452365030854, + "Data2": 3573016902862395811 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeListCommandColumn", @@ -49191,10 +47403,8 @@ }, { "__Checksum": { - "Data1": -7959542121312873974, - "Data2": 1105118657322409929, - "Data3": 8473432969042714197, - "Data4": 3468897862180005892 + "Data1": 1928489670020188265, + "Data2": 5181438424489960217 }, "Flags": 1, "Kind": 3, @@ -49213,10 +47423,8 @@ }, { "__Checksum": { - "Data1": 1107246460945624026, - "Data2": 1706489116069558516, - "Data3": -2585725036990305176, - "Data4": -6933210092469754650 + "Data1": 1580659210003833730, + "Data2": -4492199674543213373 }, "Flags": 3, "Kind": 3, @@ -49235,10 +47443,8 @@ }, { "__Checksum": { - "Data1": -5816996743100703951, - "Data2": 4550138417443711742, - "Data3": -6802662969091684319, - "Data4": -7544122698196772495 + "Data1": -7510245465185671761, + "Data2": -8167591486172855824 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikTreeList", @@ -49607,10 +47813,8 @@ }, { "__Checksum": { - "Data1": 7101161520238310158, - "Data2": 2595808321130801331, - "Data3": -174283202259821773, - "Data4": -8598399322642981499 + "Data1": -1720026211443317264, + "Data2": -8885760098557796551 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikTreeList", @@ -49979,10 +48183,8 @@ }, { "__Checksum": { - "Data1": -8047058915886329605, - "Data2": -5010324792762758670, - "Data3": 3223612670240694387, - "Data4": -5716412970099731515 + "Data1": -8934041166279954478, + "Data2": 6311593246356159300 }, "Flags": 1, "Kind": 3, @@ -50001,10 +48203,8 @@ }, { "__Checksum": { - "Data1": -2963490297334126004, - "Data2": 8468554565714472262, - "Data3": -5118294716671520569, - "Data4": -5740189364312808190 + "Data1": -3009956801794049016, + "Data2": 759621303115806891 }, "Flags": 3, "Kind": 3, @@ -50023,10 +48223,8 @@ }, { "__Checksum": { - "Data1": -5751737000085871297, - "Data2": 1315738012599703370, - "Data3": 3153987347039552119, - "Data4": -3102250056914027480 + "Data1": -8387493084291091316, + "Data2": 5792875542340246366 }, "Flags": 1, "Kind": 3, @@ -50045,10 +48243,8 @@ }, { "__Checksum": { - "Data1": -7296079820199457574, - "Data2": -1512301773606348320, - "Data3": -5597750435696494776, - "Data4": 5440185066858930770 + "Data1": -8891032079270744852, + "Data2": 1341982468793351629 }, "Flags": 3, "Kind": 3, @@ -50067,10 +48263,8 @@ }, { "__Checksum": { - "Data1": 3072671791708062378, - "Data2": -6418817985001673424, - "Data3": 904947302023206289, - "Data4": 4628650837707184629 + "Data1": 4466823885434675827, + "Data2": -4061124320924448461 }, "Flags": 1, "Kind": 3, @@ -50100,10 +48294,8 @@ }, { "__Checksum": { - "Data1": -7991273294779123261, - "Data2": 8530476237749773648, - "Data3": -360382700259230168, - "Data4": 957799974990404018 + "Data1": 8658222789018398077, + "Data2": -2674073078335326514 }, "Flags": 3, "Kind": 3, @@ -50133,10 +48325,8 @@ }, { "__Checksum": { - "Data1": 6766652605102717848, - "Data2": 8830011931850924515, - "Data3": -5749848982160173600, - "Data4": -916481844284348039 + "Data1": -2699311330761067352, + "Data2": 196334609930102983 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeListCommandButton", @@ -50273,10 +48463,8 @@ }, { "__Checksum": { - "Data1": -2366795074339002269, - "Data2": 2394946506485315656, - "Data3": -2266983561972520651, - "Data4": 567948370076025510 + "Data1": 3206577258043758222, + "Data2": 6391756998314921640 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeListCommandButton", @@ -50413,10 +48601,8 @@ }, { "__Checksum": { - "Data1": 6728278572080137795, - "Data2": 8643622971751294801, - "Data3": -6425895381236062957, - "Data4": 7564405983295444116 + "Data1": -614603869231690703, + "Data2": 149291454879238242 }, "Flags": 1, "Kind": 3, @@ -50434,10 +48620,8 @@ }, { "__Checksum": { - "Data1": -3782362223406803939, - "Data2": 2870123691093432829, - "Data3": -8448223409494387623, - "Data4": 3628509244319223315 + "Data1": 4302445333155833372, + "Data2": 5201105905065567951 }, "Flags": 3, "Kind": 3, @@ -50455,10 +48639,8 @@ }, { "__Checksum": { - "Data1": 8644811262296744927, - "Data2": -1743642116330546528, - "Data3": 2554191490375457280, - "Data4": 8973527427433226230 + "Data1": -5544264875781991484, + "Data2": 6134652069961721833 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeListSearchBox", @@ -50501,10 +48683,8 @@ }, { "__Checksum": { - "Data1": 456255023020262025, - "Data2": 5372258253577604017, - "Data3": -8647724762879031187, - "Data4": -4504180533848046143 + "Data1": -8834352592424271108, + "Data2": 7961010561612956422 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeListSearchBox", @@ -50547,10 +48727,8 @@ }, { "__Checksum": { - "Data1": 7386650364312769360, - "Data2": -5365694340914040574, - "Data3": 9117971904810006511, - "Data4": 5064883531574671161 + "Data1": -7551884463861741299, + "Data2": 2836216237785826960 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikTreeView", @@ -50641,10 +48819,8 @@ }, { "__Checksum": { - "Data1": -3907788265897144357, - "Data2": 8909112838046365507, - "Data3": 1037931127110560803, - "Data4": -4347530603340452884 + "Data1": 2252740156452851515, + "Data2": 9190792629426260321 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikTreeView", @@ -50735,10 +48911,8 @@ }, { "__Checksum": { - "Data1": -8429326515728277290, - "Data2": -8584572938491551977, - "Data3": 4752108830142991370, - "Data4": 4275749834301006587 + "Data1": 3100714400035094763, + "Data2": 5692839017984031130 }, "Flags": 1, "Kind": 3, @@ -50757,10 +48931,8 @@ }, { "__Checksum": { - "Data1": -1924071700684673329, - "Data2": 5281424876803652457, - "Data3": -8028161065227131491, - "Data4": 7902065164597886553 + "Data1": -1266433640981121592, + "Data2": -5238495971356242526 }, "Flags": 3, "Kind": 3, @@ -50779,10 +48951,8 @@ }, { "__Checksum": { - "Data1": 4392857434125307054, - "Data2": -4715389976423152885, - "Data3": -1741035591180371782, - "Data4": -5171452901916519435 + "Data1": 5918599100548713957, + "Data2": 5215545384743098759 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikUpload", @@ -50985,10 +49155,8 @@ }, { "__Checksum": { - "Data1": -3986546764121306894, - "Data2": -6396555610787030148, - "Data3": 4697399608306754716, - "Data4": 7990145783552682760 + "Data1": -2363344572709515389, + "Data2": -4570687449952214131 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikUpload", @@ -51191,10 +49359,8 @@ }, { "__Checksum": { - "Data1": 7660219228862493247, - "Data2": 5553608962485214476, - "Data3": -255373099451689966, - "Data4": -4551242442844458066 + "Data1": -1833815312833083173, + "Data2": -8722074333822892610 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TelerikWindow", @@ -51353,10 +49519,8 @@ }, { "__Checksum": { - "Data1": 2251049155334365601, - "Data2": 5673895640537035470, - "Data3": 7697826988586764922, - "Data4": 1606980979728136724 + "Data1": -7780793531733019382, + "Data2": 1924845299843175855 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TelerikWindow", @@ -51515,10 +49679,8 @@ }, { "__Checksum": { - "Data1": -9164265296392735641, - "Data2": -1930136655827815894, - "Data3": 153178846789667483, - "Data4": 3660493657268479443 + "Data1": 4851229712901667727, + "Data2": -5627642571697719875 }, "Flags": 1, "Kind": 3, @@ -51537,10 +49699,8 @@ }, { "__Checksum": { - "Data1": 1991048059395853055, - "Data2": 7182151444025472054, - "Data3": -6268773621066233227, - "Data4": 888469399383786156 + "Data1": -776355268102786881, + "Data2": -7244807448438336768 }, "Flags": 3, "Kind": 3, @@ -51559,10 +49719,8 @@ }, { "__Checksum": { - "Data1": 8202617354956938428, - "Data2": -1535841807574151830, - "Data3": -3188369297384713578, - "Data4": 6049034925826187598 + "Data1": 3187899412842060019, + "Data2": 4061182977964861420 }, "Flags": 1, "Kind": 3, @@ -51581,10 +49739,8 @@ }, { "__Checksum": { - "Data1": 4098366698189801249, - "Data2": -496127979054212838, - "Data3": 3739008809772888231, - "Data4": 1557563479026903687 + "Data1": 1753449696548146982, + "Data2": -7321632126128256810 }, "Flags": 3, "Kind": 3, @@ -51603,10 +49759,8 @@ }, { "__Checksum": { - "Data1": -3190435407557615516, - "Data2": 8497744007874219363, - "Data3": -1507973848146310855, - "Data4": 7415670289955374767 + "Data1": -7240308357897074289, + "Data2": -2834740269239185395 }, "Flags": 1, "Kind": 3, @@ -51625,10 +49779,8 @@ }, { "__Checksum": { - "Data1": -4155436875678611456, - "Data2": 5226660408757266127, - "Data3": -5186176299866504076, - "Data4": 1901752029213193716 + "Data1": 3041406795348613285, + "Data2": 6211762519199688570 }, "Flags": 3, "Kind": 3, @@ -51647,10 +49799,8 @@ }, { "__Checksum": { - "Data1": 3788244471276932382, - "Data2": 4017150580163671645, - "Data3": 3242877754029030769, - "Data4": 8343507911550460486 + "Data1": 9178122587698880245, + "Data2": 541312762662434087 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ButtonGroupButton", @@ -51770,10 +49920,8 @@ }, { "__Checksum": { - "Data1": -4726870531382216685, - "Data2": 7818222062627280872, - "Data3": 5186690569051672426, - "Data4": -8547517237126514325 + "Data1": 6834844968898028492, + "Data2": 3191813021532866559 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ButtonGroupButton", @@ -51893,10 +50041,8 @@ }, { "__Checksum": { - "Data1": -2674017885227673628, - "Data2": -1441011753770832501, - "Data3": -2318285912633225998, - "Data4": -3694667081540848068 + "Data1": 188656687897663722, + "Data2": 4356037166429788734 }, "Flags": 1, "Kind": 3, @@ -51914,10 +50060,8 @@ }, { "__Checksum": { - "Data1": 8806842495642643853, - "Data2": 4554144676536454557, - "Data3": -444730125475571261, - "Data4": -7749866380486422494 + "Data1": 943502265612458052, + "Data2": 5940939819006092990 }, "Flags": 3, "Kind": 3, @@ -51935,10 +50079,8 @@ }, { "__Checksum": { - "Data1": 2215784072030685160, - "Data2": 2540799666490383731, - "Data3": -5237107615154580991, - "Data4": -3068190427268680378 + "Data1": -4114364557616616395, + "Data2": -7838034091201392664 }, "Flags": 1, "Name": "Telerik.Blazor.Components.GridAggregate", @@ -51972,10 +50114,8 @@ }, { "__Checksum": { - "Data1": -6356697607612138195, - "Data2": -1055628336146483252, - "Data3": 1139721016861681798, - "Data4": -5790038156971315124 + "Data1": -7452547954828812194, + "Data2": 6924155294376262724 }, "Flags": 3, "Name": "Telerik.Blazor.Components.GridAggregate", @@ -52009,10 +50149,8 @@ }, { "__Checksum": { - "Data1": -3461529937373996372, - "Data2": -1183977279843417376, - "Data3": 4380297447560075761, - "Data4": -1096061711652631695 + "Data1": 1575354696295500940, + "Data2": 9136563109031539496 }, "Flags": 1, "Name": "Telerik.Blazor.Components.SchedulerResource", @@ -52078,10 +50216,8 @@ }, { "__Checksum": { - "Data1": 7048150169170764644, - "Data2": -6593779230188819308, - "Data3": -4986376554319088812, - "Data4": -427387362994127303 + "Data1": -8106532572797141972, + "Data2": 7906037085701359134 }, "Flags": 3, "Name": "Telerik.Blazor.Components.SchedulerResource", @@ -52147,10 +50283,8 @@ }, { "__Checksum": { - "Data1": -5002366069414767849, - "Data2": 3272431184704662861, - "Data3": 8941383406285396427, - "Data4": -5893584691396526010 + "Data1": 4198285162285063085, + "Data2": -8581676495388222201 }, "Flags": 1, "Name": "Telerik.Blazor.Components.SchedulerDayView", @@ -52210,10 +50344,8 @@ }, { "__Checksum": { - "Data1": -2207156475232509052, - "Data2": -2778686389295948707, - "Data3": -2041616216049222846, - "Data4": 2738206870828060801 + "Data1": 6032268735918537239, + "Data2": -1535996495910703212 }, "Flags": 3, "Name": "Telerik.Blazor.Components.SchedulerDayView", @@ -52273,10 +50405,8 @@ }, { "__Checksum": { - "Data1": 6046443216452241774, - "Data2": -5978894786106177917, - "Data3": -4842057423819713389, - "Data4": -7918203719247344351 + "Data1": 2161961888175409700, + "Data2": -3131453236479804960 }, "Flags": 1, "Name": "Telerik.Blazor.Components.SchedulerMonthView", @@ -52292,10 +50422,8 @@ }, { "__Checksum": { - "Data1": 969231250556310552, - "Data2": -1916417195576631524, - "Data3": 2036780414375693428, - "Data4": 6540433388958379651 + "Data1": -5869020126660249133, + "Data2": -5970619831730432545 }, "Flags": 3, "Name": "Telerik.Blazor.Components.SchedulerMonthView", @@ -52311,10 +50439,8 @@ }, { "__Checksum": { - "Data1": -1497734020487887297, - "Data2": 7472004764866891384, - "Data3": -5177855135552463569, - "Data4": -1311166093028935848 + "Data1": -7516038449001172555, + "Data2": -8873093000881767352 }, "Flags": 1, "Name": "Telerik.Blazor.Components.SchedulerMultiDayView", @@ -52381,10 +50507,8 @@ }, { "__Checksum": { - "Data1": 1207361449686500228, - "Data2": -8294192409979810465, - "Data3": 5402528278192661065, - "Data4": -1392481754792454935 + "Data1": -4326425249493190297, + "Data2": -2171487398178833666 }, "Flags": 3, "Name": "Telerik.Blazor.Components.SchedulerMultiDayView", @@ -52451,10 +50575,8 @@ }, { "__Checksum": { - "Data1": 4464180868792575187, - "Data2": -7992376344466693150, - "Data3": 9133089302462746386, - "Data4": 3658794175756707868 + "Data1": -7805013195581519137, + "Data2": 7014043248514046184 }, "Flags": 1, "Name": "Telerik.Blazor.Components.SchedulerWeekView", @@ -52514,10 +50636,8 @@ }, { "__Checksum": { - "Data1": 7417356410244186832, - "Data2": 6612383578327333085, - "Data3": 1367155375994864837, - "Data4": -6164350266016811589 + "Data1": -618003932783288642, + "Data2": -298372030005338467 }, "Flags": 3, "Name": "Telerik.Blazor.Components.SchedulerWeekView", @@ -52577,10 +50697,8 @@ }, { "__Checksum": { - "Data1": -2421724447553874311, - "Data2": -3702365856721474164, - "Data3": 6818863672120030621, - "Data4": 1437865231498801363 + "Data1": -4148891308782163024, + "Data2": 7204377279094979341 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TabStripTab", @@ -52626,10 +50744,8 @@ }, { "__Checksum": { - "Data1": 7200085895577921072, - "Data2": -4801047010065713762, - "Data3": -4346285379718216770, - "Data4": 7024695454794372993 + "Data1": 2537343536662227329, + "Data2": 6435446269382735408 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TabStripTab", @@ -52675,10 +50791,8 @@ }, { "__Checksum": { - "Data1": -6117826638987851775, - "Data2": 3951940926494218787, - "Data3": -8179607381074234820, - "Data4": 6048527238035972831 + "Data1": -5330707134099125052, + "Data2": 2470780383695045296 }, "Flags": 1, "Kind": 3, @@ -52697,10 +50811,8 @@ }, { "__Checksum": { - "Data1": 9100253168055146504, - "Data2": -275257865983185353, - "Data3": 4054553464157001935, - "Data4": -4193968473930775621 + "Data1": 3602220606712646957, + "Data2": 5461965174214151628 }, "Flags": 3, "Kind": 3, @@ -52719,10 +50831,8 @@ }, { "__Checksum": { - "Data1": 8642592656242773185, - "Data2": 2622800914805900688, - "Data3": -8603003936119610378, - "Data4": -4254982201393797202 + "Data1": 8649557362359252500, + "Data2": 1963255743393643795 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeViewBinding", @@ -52849,10 +50959,8 @@ }, { "__Checksum": { - "Data1": -2365337240682355842, - "Data2": -1184829462407877687, - "Data3": -8169475643690229570, - "Data4": 8250862875157097867 + "Data1": 1400537790561855469, + "Data2": 3194562472919007223 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeViewBinding", @@ -52979,10 +51087,8 @@ }, { "__Checksum": { - "Data1": -5723982671031987629, - "Data2": 6215420122682297989, - "Data3": 7333076137615062307, - "Data4": -5086439959304751036 + "Data1": -8864408627575094746, + "Data2": 8581205138081909118 }, "Flags": 1, "Kind": 3, @@ -53012,10 +51118,8 @@ }, { "__Checksum": { - "Data1": -850626513067818969, - "Data2": -6954389265239714682, - "Data3": 802715369484848280, - "Data4": -5294646406548933775 + "Data1": 2263452198017893850, + "Data2": 7503326902564943245 }, "Flags": 3, "Kind": 3, @@ -53045,10 +51149,8 @@ }, { "__Checksum": { - "Data1": -8911991185406981967, - "Data2": -8581504409233640593, - "Data3": -462818476291875369, - "Data4": -7176029502488466481 + "Data1": 1646817199689002876, + "Data2": -181055600720645088 }, "Flags": 1, "Name": "Telerik.Blazor.Components.WindowAction", @@ -53118,10 +51220,8 @@ }, { "__Checksum": { - "Data1": 3326525836700094432, - "Data2": -5659113215286710348, - "Data3": 1129877073346644051, - "Data4": -3824620212314758647 + "Data1": -5784566801365779924, + "Data2": 5528080492694804706 }, "Flags": 3, "Name": "Telerik.Blazor.Components.WindowAction", @@ -53191,10 +51291,8 @@ }, { "__Checksum": { - "Data1": 1295321156748262863, - "Data2": 4965839237984101833, - "Data3": -3708021872675119746, - "Data4": 1316611542055820843 + "Data1": -422132806518920840, + "Data2": -2535329178977480162 }, "Flags": 1, "Name": "Telerik.Blazor.Components.WindowHeader", @@ -53237,10 +51335,8 @@ }, { "__Checksum": { - "Data1": -9138925806175793606, - "Data2": -6503009365474009160, - "Data3": -8661199398739666429, - "Data4": 8347011179307121126 + "Data1": -5956712678071067942, + "Data2": -8156664719822093192 }, "Flags": 3, "Name": "Telerik.Blazor.Components.WindowHeader", @@ -53283,10 +51379,8 @@ }, { "__Checksum": { - "Data1": -7114805762042030801, - "Data2": -3857104600168399746, - "Data3": 7457189459286260147, - "Data4": -3534642432239514967 + "Data1": -3159377463244549122, + "Data2": -8726261705924073660 }, "Flags": 1, "Kind": 3, @@ -53304,10 +51398,8 @@ }, { "__Checksum": { - "Data1": 2998972432264331935, - "Data2": 8461971279724043829, - "Data3": -2183969332706576981, - "Data4": -3184141359023762465 + "Data1": -5239458063372080003, + "Data2": 5895020371197645846 }, "Flags": 3, "Kind": 3, @@ -53325,10 +51417,8 @@ }, { "__Checksum": { - "Data1": 6916570200750190848, - "Data2": 5174573071332121196, - "Data3": -6666259326462476187, - "Data4": -2276929013221624220 + "Data1": 4473127323812106660, + "Data2": -3933992919145925022 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ButtonGroup.ButtonGroupButtonBase", @@ -53449,10 +51539,8 @@ }, { "__Checksum": { - "Data1": 6479980017396200480, - "Data2": -5351292709531380853, - "Data3": -3198728423022873273, - "Data4": 5602968850334722072 + "Data1": -9069364313303178796, + "Data2": -5044775143292306600 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ButtonGroup.ButtonGroupButtonBase", @@ -53573,10 +51661,8 @@ }, { "__Checksum": { - "Data1": -400807262000156455, - "Data2": -1917816232286503955, - "Data3": 3995751365126248697, - "Data4": -4449435990144189212 + "Data1": 5665317690898247459, + "Data2": -3484580510408940782 }, "Flags": 1, "Kind": 3, @@ -53594,10 +51680,8 @@ }, { "__Checksum": { - "Data1": -2757337995895584380, - "Data2": -3177011005727215494, - "Data3": 4263781495005381908, - "Data4": 2086597892199125690 + "Data1": -5333739572378198554, + "Data2": 6483506304576081025 }, "Flags": 3, "Kind": 3, @@ -53615,10 +51699,8 @@ }, { "__Checksum": { - "Data1": -6003802723962054928, - "Data2": 7375237177450930438, - "Data3": 3822504357503438148, - "Data4": -7279390262779389125 + "Data1": 3177604563882258944, + "Data2": -6188431323144637931 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ButtonGroup.Rendering.ButtonGroupItem", @@ -53675,10 +51757,8 @@ }, { "__Checksum": { - "Data1": 2234019428669341541, - "Data2": -8064832898074481132, - "Data3": -3298941010832105654, - "Data4": 8405066424779217462 + "Data1": 863783102302719050, + "Data2": 57199993509724653 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ButtonGroup.Rendering.ButtonGroupItem", @@ -53735,10 +51815,8 @@ }, { "__Checksum": { - "Data1": 3306523721015734124, - "Data2": -3006285222248692546, - "Data3": 7694400115181396034, - "Data4": 5472088028075628853 + "Data1": -6290418353291232719, + "Data2": 3133966732725105395 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.CalendarCell", @@ -53777,10 +51855,8 @@ }, { "__Checksum": { - "Data1": -9129240196460101947, - "Data2": 1754201781361500729, - "Data3": -4574526824622088199, - "Data4": 5501127191587500562 + "Data1": -2546613773091093194, + "Data2": 4521875115843872993 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.CalendarCell", @@ -53819,10 +51895,8 @@ }, { "__Checksum": { - "Data1": 1070492309855191219, - "Data2": -6899930390454465667, - "Data3": 1024148389854108633, - "Data4": 2282522107334108410 + "Data1": -2733993049650191779, + "Data2": 8609394743357373307 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.CalendarHeader", @@ -53922,10 +51996,8 @@ }, { "__Checksum": { - "Data1": -3380148514263478597, - "Data2": -6345321975240902863, - "Data3": 7658402217750636986, - "Data4": -107385304638895954 + "Data1": -8448431027844437724, + "Data2": -488271278057177894 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.CalendarHeader", @@ -54025,10 +52097,8 @@ }, { "__Checksum": { - "Data1": -29384768207091041, - "Data2": 7413212805528384581, - "Data3": -5091844475110492621, - "Data4": -93859036984562704 + "Data1": -6851836560289476107, + "Data2": -6241826501088083137 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.CalendarRow", @@ -54095,10 +52165,8 @@ }, { "__Checksum": { - "Data1": -1615012813267197159, - "Data2": -8825987310822500320, - "Data3": 7260108539469093572, - "Data4": 8521261764491601239 + "Data1": -1703751805310563563, + "Data2": -8321536690285645044 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.CalendarRow", @@ -54165,10 +52233,8 @@ }, { "__Checksum": { - "Data1": -8731570879242339119, - "Data2": -8329566299535561772, - "Data3": -8070389060649758925, - "Data4": -605747890506202033 + "Data1": 8408018422009232474, + "Data2": 5090012845936182593 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarBaseViewBase", @@ -54235,10 +52301,8 @@ }, { "__Checksum": { - "Data1": 4504000463132433416, - "Data2": 5155744047972075156, - "Data3": -4153919366186393124, - "Data4": -3129603290018541007 + "Data1": 3693388779084042657, + "Data2": 2213101607957296297 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarBaseViewBase", @@ -54305,10 +52369,8 @@ }, { "__Checksum": { - "Data1": 4763830188673337162, - "Data2": -6376863599017580548, - "Data3": -6807737371277363967, - "Data4": -2354345671800036639 + "Data1": 4492560243314705240, + "Data2": 2246515832887247044 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarCenturyViewBase", @@ -54375,10 +52437,8 @@ }, { "__Checksum": { - "Data1": -8893387843694701941, - "Data2": 2809426204568832072, - "Data3": 8148145754847103695, - "Data4": 1465449622403220153 + "Data1": 6379966095233894465, + "Data2": 3563957582965231130 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarCenturyViewBase", @@ -54445,10 +52505,8 @@ }, { "__Checksum": { - "Data1": 2945612242571724775, - "Data2": 8393219796273075418, - "Data3": 4111921617314152864, - "Data4": -8309818748721412288 + "Data1": -7916002186919159420, + "Data2": -8005458801637024237 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarDecadeViewBase", @@ -54515,10 +52573,8 @@ }, { "__Checksum": { - "Data1": 6390185112946207740, - "Data2": -3149790837411886338, - "Data3": 4901497167176467676, - "Data4": 8706064691224328385 + "Data1": -2261510673723407631, + "Data2": 5965157510142976304 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarDecadeViewBase", @@ -54585,10 +52641,8 @@ }, { "__Checksum": { - "Data1": 3741222183694644441, - "Data2": -8271568371906562120, - "Data3": -7662631846786490623, - "Data4": -4542129027576010541 + "Data1": -3907308541155784966, + "Data2": -8535314714414237573 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarMonthViewBase", @@ -54655,10 +52709,8 @@ }, { "__Checksum": { - "Data1": 736073715308189613, - "Data2": 1286293039357692532, - "Data3": 7290904418824259522, - "Data4": 5824305051885435428 + "Data1": -300527435836099892, + "Data2": 7925579990324369600 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarMonthViewBase", @@ -54725,10 +52777,8 @@ }, { "__Checksum": { - "Data1": 4931902807189062769, - "Data2": -7155550815637005646, - "Data3": -1570403674688452310, - "Data4": 7117004962693696663 + "Data1": 575534458392553778, + "Data2": 4498766654571377897 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarViewComponentBase", @@ -54795,10 +52845,8 @@ }, { "__Checksum": { - "Data1": 5549010906758445512, - "Data2": 9211662660244393143, - "Data3": -5761300141891542154, - "Data4": 4043640678853827151 + "Data1": -4670586423093205179, + "Data2": 7136589103950882275 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarViewComponentBase", @@ -54865,10 +52913,8 @@ }, { "__Checksum": { - "Data1": 6339056957484081960, - "Data2": 1410281233734095663, - "Data3": 3310288639665454693, - "Data4": 1807923094382933981 + "Data1": 1680073572120600485, + "Data2": 3333768727985490766 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarYearViewBase", @@ -54935,10 +52981,8 @@ }, { "__Checksum": { - "Data1": -1538511031440682902, - "Data2": -2233268593102482039, - "Data3": 3911825859202370611, - "Data4": -5426376121800498251 + "Data1": 2277761974251075682, + "Data2": 4919126350350991558 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarYearViewBase", @@ -55005,10 +53049,8 @@ }, { "__Checksum": { - "Data1": -1726857317923792780, - "Data2": -2360928715386000698, - "Data3": 8490740240400636752, - "Data4": -6069121004492316485 + "Data1": -8840613954057421343, + "Data2": -671864466205147379 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarBaseView", @@ -55075,10 +53117,8 @@ }, { "__Checksum": { - "Data1": 8557993717949525724, - "Data2": 5050263078838043841, - "Data3": -8430139000800411807, - "Data4": -884201547846046076 + "Data1": 397428039957664696, + "Data2": 9073800994310969302 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarBaseView", @@ -55145,10 +53185,8 @@ }, { "__Checksum": { - "Data1": -4245572408287347598, - "Data2": -914399460494128882, - "Data3": 166973889552434832, - "Data4": -8569196500358833034 + "Data1": -952499817487160516, + "Data2": 2781924717925982449 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarCenturyView", @@ -55215,10 +53253,8 @@ }, { "__Checksum": { - "Data1": -2135006586368212903, - "Data2": -5422905858419937781, - "Data3": 7791672718149579795, - "Data4": 8723940386809146995 + "Data1": -4921214613319170673, + "Data2": 7659303192626411803 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarCenturyView", @@ -55285,10 +53321,8 @@ }, { "__Checksum": { - "Data1": 57044526232799568, - "Data2": -516259861915673766, - "Data3": 6899433771809742977, - "Data4": 3280740587204440691 + "Data1": -4612230130478938812, + "Data2": 6551262011895931321 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarDecadeView", @@ -55355,10 +53389,8 @@ }, { "__Checksum": { - "Data1": 5263337235877112193, - "Data2": 2809267566498507254, - "Data3": 9125044550650611783, - "Data4": -7017449042829734488 + "Data1": 595812015784187460, + "Data2": -3801575551727780961 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarDecadeView", @@ -55425,10 +53457,8 @@ }, { "__Checksum": { - "Data1": 5393393278693275596, - "Data2": -3760207165791351028, - "Data3": -8263406786838636937, - "Data4": 6134560677437430672 + "Data1": -3234208229533564036, + "Data2": 5660157979233859150 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarMonthView", @@ -55495,10 +53525,8 @@ }, { "__Checksum": { - "Data1": -1041110885430002047, - "Data2": -2904729042832484850, - "Data3": -896317185921166037, - "Data4": 8720798932573531105 + "Data1": 6712073031618192789, + "Data2": -3705244888100430443 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarMonthView", @@ -55565,10 +53593,8 @@ }, { "__Checksum": { - "Data1": -137777144250991349, - "Data2": -4406728257951087594, - "Data3": -5981266064806039939, - "Data4": -2693376453796503167 + "Data1": 3456227269710504230, + "Data2": 8285158135678227802 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarYearView", @@ -55635,10 +53661,8 @@ }, { "__Checksum": { - "Data1": -3950276933605140557, - "Data2": -2926859082352866650, - "Data3": -5277297109333252477, - "Data4": 4924679637497697961 + "Data1": 5459487645106735683, + "Data2": 6198718086635682002 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Calendar.Views.CalendarYearView", @@ -55705,10 +53729,8 @@ }, { "__Checksum": { - "Data1": -4841385986199113729, - "Data2": -4997102812948235578, - "Data3": 3058317205911516452, - "Data4": -7121531435780039037 + "Data1": -2074516480329440958, + "Data2": -2170032137048101931 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.BaseComponent", @@ -55724,10 +53746,8 @@ }, { "__Checksum": { - "Data1": -1444162493960581566, - "Data2": 2163910039855057160, - "Data3": -2142601957076802554, - "Data4": -5704565714660303814 + "Data1": 7836209232838131108, + "Data2": -2611542386248864344 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.BaseComponent", @@ -55743,10 +53763,8 @@ }, { "__Checksum": { - "Data1": 8397855218696390046, - "Data2": 3136311553250995086, - "Data3": 5689276288966371400, - "Data4": 4016973533255840623 + "Data1": -6613877273469776459, + "Data2": 4838142708162352893 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.ButtonBase", @@ -55846,10 +53864,8 @@ }, { "__Checksum": { - "Data1": 8616262770095743013, - "Data2": 8065693817284433624, - "Data3": 8554106193230658819, - "Data4": 8045063856074810218 + "Data1": 4231491861915011703, + "Data2": -4198392307777215942 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.ButtonBase", @@ -55949,10 +53965,8 @@ }, { "__Checksum": { - "Data1": 2102315650458701515, - "Data2": -4580622818550754074, - "Data3": 4571146063418714330, - "Data4": -4731224580641413026 + "Data1": -5110376580536338423, + "Data2": 8661465632266176486 }, "Flags": 1, "Kind": 3, @@ -55970,10 +53984,8 @@ }, { "__Checksum": { - "Data1": -1987262705816110673, - "Data2": -1810560755947590703, - "Data3": -1552836974212927133, - "Data4": 5926614905012531913 + "Data1": -5959349746006294438, + "Data2": -1183085998547241555 }, "Flags": 3, "Kind": 3, @@ -55991,10 +54003,8 @@ }, { "__Checksum": { - "Data1": 7717585389324895938, - "Data2": -6673298477356095941, - "Data3": -7277527520044801110, - "Data4": -6902525205228697493 + "Data1": -8687321699740224320, + "Data2": -2458222625725576347 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.TelerikInputBase", @@ -56097,10 +54107,8 @@ }, { "__Checksum": { - "Data1": 4376507013911552160, - "Data2": -4537262986078698663, - "Data3": 3453823893909655520, - "Data4": -6526468258080609483 + "Data1": 1761801295646747464, + "Data2": 396622742542098134 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.TelerikInputBase", @@ -56203,10 +54211,8 @@ }, { "__Checksum": { - "Data1": -6346094668071969024, - "Data2": 7394998160620861509, - "Data3": -598768649466352783, - "Data4": 5465113288465695598 + "Data1": 7811289003464729235, + "Data2": 8240480748127521627 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.TrialMessage", @@ -56222,10 +54228,8 @@ }, { "__Checksum": { - "Data1": 3332117539654047412, - "Data2": -6157873561696556070, - "Data3": -5754653448499706999, - "Data4": -1490861628476377711 + "Data1": -5513328496592723122, + "Data2": 319210195166062329 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.TrialMessage", @@ -56241,10 +54245,8 @@ }, { "__Checksum": { - "Data1": -8729974983530069994, - "Data2": 5413157108044047010, - "Data3": -3785402775582580715, - "Data4": -625734974408839564 + "Data1": -3070294922756885493, + "Data2": -5692001846482110262 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Animation.AnimationGroupBase", @@ -56340,10 +54342,8 @@ }, { "__Checksum": { - "Data1": -1690605630471328358, - "Data2": -4003762158875959009, - "Data3": -3839892732148612167, - "Data4": -7386973587205960687 + "Data1": -1094539846422579023, + "Data2": -7708450945943753754 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Animation.AnimationGroupBase", @@ -56439,10 +54439,8 @@ }, { "__Checksum": { - "Data1": -1432225225821785830, - "Data2": 7548012230938931955, - "Data3": 7811890189197400238, - "Data4": 6248494315249162074 + "Data1": -6034640569646625823, + "Data2": 8519078688809832599 }, "Flags": 1, "Kind": 3, @@ -56460,10 +54458,8 @@ }, { "__Checksum": { - "Data1": -5906796336740956780, - "Data2": -1173798941263367586, - "Data3": 6404837414495489342, - "Data4": -2789876604628749960 + "Data1": 4387260374237340123, + "Data2": 4931949273085225400 }, "Flags": 3, "Kind": 3, @@ -56481,10 +54477,8 @@ }, { "__Checksum": { - "Data1": -3493405926235020800, - "Data2": 6166248145841504240, - "Data3": -1279322876145413432, - "Data4": 575900061030575531 + "Data1": 3595866233733711970, + "Data2": -3677084249028842891 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Animation.AnimationGroup", @@ -56579,10 +54573,8 @@ }, { "__Checksum": { - "Data1": 4917609289063147259, - "Data2": 8311779216302211891, - "Data3": 3360212494945499069, - "Data4": -5560872025446942189 + "Data1": -480359930500130771, + "Data2": -1984691792937955682 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Animation.AnimationGroup", @@ -56677,10 +54669,8 @@ }, { "__Checksum": { - "Data1": -4194609399929493275, - "Data2": 7244896607418841041, - "Data3": 4269368071638392197, - "Data4": 7335852143864296688 + "Data1": 5086132814779432146, + "Data2": -2609792539068567003 }, "Flags": 1, "Kind": 3, @@ -56698,10 +54688,8 @@ }, { "__Checksum": { - "Data1": -9099680462383473728, - "Data2": 8924612853607528442, - "Data3": 3164250658421314909, - "Data4": -6172712001326985262 + "Data1": -8304977098143697477, + "Data2": 6918497629912778082 }, "Flags": 3, "Kind": 3, @@ -56719,10 +54707,8 @@ }, { "__Checksum": { - "Data1": 41352185993429775, - "Data2": 1941318202855761593, - "Data3": -2304683966424637806, - "Data4": -1730208255580790514 + "Data1": 8093216060151391121, + "Data2": -7604164561078737198 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Charts.Tooltip.CrosshairTooltip", @@ -56747,10 +54733,8 @@ }, { "__Checksum": { - "Data1": -3971818346580003111, - "Data2": 3036642329668030882, - "Data3": -2407071964604878054, - "Data4": -8091975427412089449 + "Data1": -8916987902615021547, + "Data2": -2719711722962188115 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Charts.Tooltip.CrosshairTooltip", @@ -56775,10 +54759,8 @@ }, { "__Checksum": { - "Data1": 1858012290771668231, - "Data2": -576449351779119619, - "Data3": -5909075506967500507, - "Data4": 6400853104978622977 + "Data1": -3155143767502007743, + "Data2": 7134579461084648019 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Charts.Tooltip.SeriesTooltip", @@ -56794,10 +54776,8 @@ }, { "__Checksum": { - "Data1": 7192496609837005703, - "Data2": -5634126586024663119, - "Data3": 7054611828524749958, - "Data4": 5711687592107444073 + "Data1": 7873257440267969636, + "Data2": 813838882782183096 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Charts.Tooltip.SeriesTooltip", @@ -56813,10 +54793,8 @@ }, { "__Checksum": { - "Data1": 2125082771528163155, - "Data2": 4569583260991670539, - "Data3": 9133934816059686424, - "Data4": -4743258189518719810 + "Data1": -5123124260417774747, + "Data2": -2014634064173178934 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Charts.Tooltip.TooltipBase", @@ -56832,10 +54810,8 @@ }, { "__Checksum": { - "Data1": -2640761255319792983, - "Data2": -2075082606180617053, - "Data3": 3664312377173451455, - "Data4": 1634501992957709980 + "Data1": -7863127592597325570, + "Data2": -1877436349741597370 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Charts.Tooltip.TooltipBase", @@ -56851,10 +54827,8 @@ }, { "__Checksum": { - "Data1": -1889986033983871699, - "Data2": -2762143962884655509, - "Data3": -7804800558985996411, - "Data4": 854683846100146285 + "Data1": -3125820484967250734, + "Data2": -6285536749687170517 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenu", @@ -57034,10 +55008,8 @@ }, { "__Checksum": { - "Data1": 6982767536694945463, - "Data2": -433360951856569970, - "Data3": 8675003553978937608, - "Data4": -6305895566192602727 + "Data1": -834762789912707916, + "Data2": -3724963191818605091 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenu", @@ -57217,10 +55189,8 @@ }, { "__Checksum": { - "Data1": 7625924572604988030, - "Data2": 3917552810822494480, - "Data3": 4640706670988752902, - "Data4": -5185608311525698474 + "Data1": 8821385399939189613, + "Data2": 4458598065656683503 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuChooser", @@ -57281,10 +55251,8 @@ }, { "__Checksum": { - "Data1": 8602837921537771495, - "Data2": 6901195235636309226, - "Data3": 1270663411190822554, - "Data4": 3351975033681714275 + "Data1": -4979861972100215890, + "Data2": -3433615561879782414 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuChooser", @@ -57345,10 +55313,8 @@ }, { "__Checksum": { - "Data1": 7956000422337771246, - "Data2": -311984367777244674, - "Data3": 205736770776318973, - "Data4": -4551085046052692287 + "Data1": 7935753262769564089, + "Data2": -7502325313503388255 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuFilter", @@ -57431,10 +55397,8 @@ }, { "__Checksum": { - "Data1": 3611114329214138562, - "Data2": -3213384403754517319, - "Data3": 7951465796215390111, - "Data4": -7542474570842558233 + "Data1": -7242795239114813007, + "Data2": -4659093924133387909 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuFilter", @@ -57517,10 +55481,8 @@ }, { "__Checksum": { - "Data1": -8084618213219019622, - "Data2": 8818987136186706580, - "Data3": 3474521664059024402, - "Data4": 2929240691459039842 + "Data1": -8122844812824764121, + "Data2": -5410511301229931671 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuItem", @@ -57595,10 +55557,8 @@ }, { "__Checksum": { - "Data1": -3590574834562481499, - "Data2": -8474729272466242070, - "Data3": -629873490834895254, - "Data4": 1197301683149635504 + "Data1": -7407585909316383392, + "Data2": 2848841153275281050 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuItem", @@ -57673,10 +55633,8 @@ }, { "__Checksum": { - "Data1": -306881281931050658, - "Data2": 2938793673699237980, - "Data3": 5549933321683916537, - "Data4": -6354097229096843121 + "Data1": 3501019857637418300, + "Data2": -292241143661125925 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuItemList", @@ -57716,10 +55674,8 @@ }, { "__Checksum": { - "Data1": 6875250711360608171, - "Data2": -8695744840204204402, - "Data3": 5904429007019797637, - "Data4": 1711905324273955862 + "Data1": -4026913508468792109, + "Data2": 4367597128406010194 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuItemList", @@ -57759,10 +55715,8 @@ }, { "__Checksum": { - "Data1": 2397031618019846625, - "Data2": 8112778604067499792, - "Data3": 8013385552600382240, - "Data4": -6653045099537084711 + "Data1": -6822109570817316629, + "Data2": -3646260896258907841 }, "Flags": 1, "Kind": 3, @@ -57780,10 +55734,8 @@ }, { "__Checksum": { - "Data1": 551111315698656220, - "Data2": 4330381391202035901, - "Data3": 6696265733414178104, - "Data4": 4802484667662430195 + "Data1": -4264487181322406638, + "Data2": -7457979187348934108 }, "Flags": 3, "Kind": 3, @@ -57801,10 +55753,8 @@ }, { "__Checksum": { - "Data1": -3629283642156403765, - "Data2": -7783528936407371827, - "Data3": -246651490194940073, - "Data4": 4202648508653722698 + "Data1": 6938982013118446952, + "Data2": 4250962740455087225 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuLock", @@ -57851,10 +55801,8 @@ }, { "__Checksum": { - "Data1": -1740272011733863475, - "Data2": -6130376105018865560, - "Data3": -1882051381185905599, - "Data4": -2057725048293586636 + "Data1": 2115297708441218952, + "Data2": -3827201135947501097 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuLock", @@ -57901,10 +55849,8 @@ }, { "__Checksum": { - "Data1": -639006174816217067, - "Data2": 4290245666389549743, - "Data3": -8877598563234577122, - "Data4": -4719919356235002198 + "Data1": -8386852543604060018, + "Data2": -1422719520453584188 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuSort", @@ -57958,10 +55904,8 @@ }, { "__Checksum": { - "Data1": 2748984751372838242, - "Data2": 1827678553317032503, - "Data3": 1908060474900598270, - "Data4": -4851998111146185476 + "Data1": -1864399656832932891, + "Data2": 5453635333495414721 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.ColumnMenu.ColumnMenuSort", @@ -58015,10 +55959,8 @@ }, { "__Checksum": { - "Data1": 8926529610125425391, - "Data2": 412227197099363797, - "Data3": -4646458342517129674, - "Data4": 4097856669378373922 + "Data1": 5381554743189120359, + "Data2": 6448641163836930589 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Dropdowns.ListContainer", @@ -58094,10 +56036,8 @@ }, { "__Checksum": { - "Data1": 4547972740259172169, - "Data2": -2858666521676966316, - "Data3": -4538429564340240433, - "Data4": 7852947042214742835 + "Data1": 2372290760294756932, + "Data2": 2965950597582539706 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Dropdowns.ListContainer", @@ -58173,10 +56113,8 @@ }, { "__Checksum": { - "Data1": 7904975615944192793, - "Data2": -1527287346843806240, - "Data3": 8992793911230910346, - "Data4": 7988169360398364068 + "Data1": 1027618291662786827, + "Data2": -3249767634703113530 }, "Flags": 1, "Kind": 3, @@ -58205,10 +56143,8 @@ }, { "__Checksum": { - "Data1": 4002019635208508749, - "Data2": -4806089570832656273, - "Data3": 1398662474311275888, - "Data4": 1161469043968325667 + "Data1": 5324556853741532440, + "Data2": -6080436973483464556 }, "Flags": 3, "Kind": 3, @@ -58237,10 +56173,8 @@ }, { "__Checksum": { - "Data1": 4693175292980163629, - "Data2": 3809404356339512367, - "Data3": -6739040463758929771, - "Data4": -2085797040361367711 + "Data1": -6255593408592797287, + "Data2": 1878500927372402784 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Dropdowns.ListItem", @@ -58301,10 +56235,8 @@ }, { "__Checksum": { - "Data1": 5287286316871775429, - "Data2": -4977175423533418903, - "Data3": -7577543089715545487, - "Data4": 6667399444567158442 + "Data1": 6335295446888500987, + "Data2": -6349237532172448132 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Dropdowns.ListItem", @@ -58365,10 +56297,8 @@ }, { "__Checksum": { - "Data1": -3958009282822452188, - "Data2": -4670043814008787232, - "Data3": 8095149265804973861, - "Data4": 3017517235272934379 + "Data1": 4653049953419565521, + "Data2": -3827928841922519078 }, "Flags": 1, "Kind": 3, @@ -58386,10 +56316,8 @@ }, { "__Checksum": { - "Data1": -7585512682408661872, - "Data2": -2595568416002724674, - "Data3": -1052648857199322476, - "Data4": 183841473397758021 + "Data1": -6850586078806011732, + "Data2": -3771716800178110169 }, "Flags": 3, "Kind": 3, @@ -58407,10 +56335,8 @@ }, { "__Checksum": { - "Data1": -3864412796876302238, - "Data2": 8069851612813714579, - "Data3": -3846050428767120281, - "Data4": -8750162885440821397 + "Data1": -2446371938721335950, + "Data2": 8712301839451680152 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Dropdowns.ListItemBase", @@ -58471,10 +56397,8 @@ }, { "__Checksum": { - "Data1": 419358741845502780, - "Data2": 3523077034687325431, - "Data3": 7049900596495780049, - "Data4": -9205759548887452647 + "Data1": -2977133295379297257, + "Data2": -8420617160321783274 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Dropdowns.ListItemBase", @@ -58535,10 +56459,8 @@ }, { "__Checksum": { - "Data1": 6447694613812906175, - "Data2": -8254554142730778517, - "Data3": -5101128202065958469, - "Data4": 5344466216819686093 + "Data1": -7156528023624886320, + "Data2": -853246448265807134 }, "Flags": 1, "Kind": 3, @@ -58556,10 +56478,8 @@ }, { "__Checksum": { - "Data1": 3226181504245496258, - "Data2": -1644900880883836320, - "Data3": -941631362730678768, - "Data4": -124722939769159562 + "Data1": 7177337110627939658, + "Data2": -5793896894453369622 }, "Flags": 3, "Kind": 3, @@ -58577,10 +56497,8 @@ }, { "__Checksum": { - "Data1": 4969722082896533727, - "Data2": -5426982324495517833, - "Data3": -3878135909062749852, - "Data4": 2036609075730465481 + "Data1": 859636472264579774, + "Data2": -1780782027391151621 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Dropdowns.DefaultListItem", @@ -58641,10 +56559,8 @@ }, { "__Checksum": { - "Data1": 7567448566673080972, - "Data2": -1323258073189947776, - "Data3": 1408890417419736144, - "Data4": 4049218744345783585 + "Data1": -3914111775413418732, + "Data2": 101496673462843715 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Dropdowns.DefaultListItem", @@ -58705,10 +56621,8 @@ }, { "__Checksum": { - "Data1": -8762277120139773270, - "Data2": -4227551364553931933, - "Data3": -597593634602558293, - "Data4": 3602098861641956894 + "Data1": 2287829180090659473, + "Data2": 3171504124367125618 }, "Flags": 1, "Kind": 3, @@ -58726,10 +56640,8 @@ }, { "__Checksum": { - "Data1": -1312397186039560123, - "Data2": 1757107089837199522, - "Data3": -1783994881559032659, - "Data4": 6608118923772956624 + "Data1": -7273085944557727595, + "Data2": -4546940516926698422 }, "Flags": 3, "Kind": 3, @@ -58747,10 +56659,8 @@ }, { "__Checksum": { - "Data1": 2658407427482134586, - "Data2": 4194453301304765265, - "Data3": 4096359163086058638, - "Data4": -1261739280559669176 + "Data1": 5923842184771526819, + "Data2": -1798512083587282968 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikBooleanEditorBase", @@ -58804,10 +56714,8 @@ }, { "__Checksum": { - "Data1": -3188353073950533585, - "Data2": 5856469940383126381, - "Data3": 6849682193407671958, - "Data4": -8473886601256050506 + "Data1": -2719095469289707103, + "Data2": -2093455978028682083 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikBooleanEditorBase", @@ -58861,10 +56769,8 @@ }, { "__Checksum": { - "Data1": -7317215559867556417, - "Data2": -2616353655418948965, - "Data3": 8527868078556644443, - "Data4": 3321185110583577645 + "Data1": -5052735015343688901, + "Data2": -7303141896287720494 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikEditorBase", @@ -58930,10 +56836,8 @@ }, { "__Checksum": { - "Data1": -3760879625920468809, - "Data2": -6257064160820287731, - "Data3": 115825671976371574, - "Data4": -6024573252201631515 + "Data1": 2676772523619463339, + "Data2": -1088103952063050659 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikEditorBase", @@ -58999,10 +56903,8 @@ }, { "__Checksum": { - "Data1": -7003321680595114242, - "Data2": -3248729524185863263, - "Data3": 4893803940694378654, - "Data4": -3386390463458514847 + "Data1": 6840865370758402168, + "Data2": -6870574380713906753 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikEnumEditor", @@ -59070,10 +56972,8 @@ }, { "__Checksum": { - "Data1": 3856694585575580971, - "Data2": 196168509293513739, - "Data3": -702367229241525616, - "Data4": -4969864840463960287 + "Data1": 4341977867806366928, + "Data2": -6535734713788980226 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikEnumEditor", @@ -59141,10 +57041,8 @@ }, { "__Checksum": { - "Data1": 7261879576977241862, - "Data2": -2079230239645985608, - "Data3": -7137721834478669268, - "Data4": 72187694361164626 + "Data1": 6203254122379382033, + "Data2": 5979266290361785761 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikBooleanCheckBox", @@ -59198,10 +57096,8 @@ }, { "__Checksum": { - "Data1": 2320746455043332398, - "Data2": 8987351692801259807, - "Data3": -3823850032170801376, - "Data4": -1057728766961889938 + "Data1": -5474119650534453198, + "Data2": 8776072415797041512 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikBooleanCheckBox", @@ -59255,10 +57151,8 @@ }, { "__Checksum": { - "Data1": -9103428737575503802, - "Data2": -7240555568516635356, - "Data3": -3922463997258878178, - "Data4": 6909512648377332604 + "Data1": -5274100363356119387, + "Data2": -7814790326079649098 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikBooleanDropDownList", @@ -59312,10 +57206,8 @@ }, { "__Checksum": { - "Data1": -2866682940207449295, - "Data2": -5556599524646709096, - "Data3": -5517955273374108885, - "Data4": -1364874696345522658 + "Data1": -6712265930188623184, + "Data2": -4762828341008335958 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikBooleanDropDownList", @@ -59369,10 +57261,8 @@ }, { "__Checksum": { - "Data1": 2790809062550166058, - "Data2": -5986259875299117116, - "Data3": -8674569415400241886, - "Data4": -3245117074473548655 + "Data1": -6746601847535812599, + "Data2": 4527057187438856247 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikDateTimeEditor", @@ -59426,10 +57316,8 @@ }, { "__Checksum": { - "Data1": -4895985191379490144, - "Data2": -2887102428474796917, - "Data3": -6008256156543863680, - "Data4": -7324061744653584741 + "Data1": 2500896078759576600, + "Data2": -7409350522333592855 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikDateTimeEditor", @@ -59483,10 +57371,8 @@ }, { "__Checksum": { - "Data1": -3040329583409337588, - "Data2": -3135728520508051045, - "Data3": -7033757611731720957, - "Data4": 6305612933645031171 + "Data1": -8190613093606527090, + "Data2": 7517440548790330909 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikDecimalEditor", @@ -59540,10 +57426,8 @@ }, { "__Checksum": { - "Data1": 7410412840105802602, - "Data2": -4637833411578448801, - "Data3": -1535405945846446834, - "Data4": -5040855839942613067 + "Data1": -6266990335737729885, + "Data2": -809874462040756013 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikDecimalEditor", @@ -59597,10 +57481,8 @@ }, { "__Checksum": { - "Data1": 8629531416732001765, - "Data2": -8796933020041168992, - "Data3": 358040289367114729, - "Data4": 7544825711920500042 + "Data1": -4801451387265132498, + "Data2": 7796685834257182622 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikDoubleEditor", @@ -59654,10 +57536,8 @@ }, { "__Checksum": { - "Data1": 4466028873713736217, - "Data2": 270735092825739529, - "Data3": -4784412547646564445, - "Data4": 1833384351012773137 + "Data1": -5874821570600544513, + "Data2": 8739248842815260858 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikDoubleEditor", @@ -59711,10 +57591,8 @@ }, { "__Checksum": { - "Data1": -4894354234545227548, - "Data2": 1366949977898642787, - "Data3": -6958985774934989296, - "Data4": -4427254885560268524 + "Data1": 6054161588674914541, + "Data2": -4173756141069243463 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikEditorFactory", @@ -59789,10 +57667,8 @@ }, { "__Checksum": { - "Data1": -3623545681693747248, - "Data2": 6835294259481121269, - "Data3": -6363553360479999102, - "Data4": -4771127796007953015 + "Data1": 612438844213487445, + "Data2": -49297539087584287 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikEditorFactory", @@ -59867,10 +57743,8 @@ }, { "__Checksum": { - "Data1": -559733844480997934, - "Data2": 3172206499608972939, - "Data3": -4716850199289982667, - "Data4": 2293302815694017305 + "Data1": 2365395968744848879, + "Data2": 7796422106672023415 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikFieldEditor", @@ -59920,10 +57794,8 @@ }, { "__Checksum": { - "Data1": -8967082381745299147, - "Data2": 5559757085784611839, - "Data3": 5448722542623300885, - "Data4": -1447842765316741254 + "Data1": -1745834055414944289, + "Data2": -2300595613502113726 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikFieldEditor", @@ -59973,10 +57845,8 @@ }, { "__Checksum": { - "Data1": -3031214955752422225, - "Data2": 4984358779562807229, - "Data3": 8470621335391932349, - "Data4": 2147366859996595936 + "Data1": 3501559716073912405, + "Data2": -2286652267157500659 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikFloatEditor", @@ -60030,10 +57900,8 @@ }, { "__Checksum": { - "Data1": 7522462271394097943, - "Data2": -6477985712369939433, - "Data3": -5285512471364306286, - "Data4": 3006598148516796073 + "Data1": -7825701035325481811, + "Data2": 1669762721083435912 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikFloatEditor", @@ -60087,10 +57955,8 @@ }, { "__Checksum": { - "Data1": 4535520981194054339, - "Data2": 295063520682678048, - "Data3": 941851601743437265, - "Data4": -5356556280269199566 + "Data1": -4151681034374733819, + "Data2": 6279346681829851255 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikIntEditor", @@ -60144,10 +58010,8 @@ }, { "__Checksum": { - "Data1": -7718177439852364770, - "Data2": -1430320547493977380, - "Data3": 4657097965158678348, - "Data4": -3141745634809384107 + "Data1": 1494262873329810728, + "Data2": 4111460123966938584 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikIntEditor", @@ -60201,10 +58065,8 @@ }, { "__Checksum": { - "Data1": 5700109816927753844, - "Data2": 3991894423659770655, - "Data3": 5495931231460357463, - "Data4": 2772811177242158197 + "Data1": 1644438517552769435, + "Data2": 7476101815023929724 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikLongEditor", @@ -60258,10 +58120,8 @@ }, { "__Checksum": { - "Data1": 5891259955682149177, - "Data2": 7610068919906979403, - "Data3": 5965910646590693778, - "Data4": 1618745355058492528 + "Data1": 7865744516208252056, + "Data2": -5493272720622583029 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikLongEditor", @@ -60315,10 +58175,8 @@ }, { "__Checksum": { - "Data1": -6883053869343372627, - "Data2": 1815819707722306621, - "Data3": -4674506259175396152, - "Data4": -1957579746504162813 + "Data1": -4774413162778239329, + "Data2": -8152796977251045613 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikShortEditor", @@ -60372,10 +58230,8 @@ }, { "__Checksum": { - "Data1": -2070874459538234692, - "Data2": -4537717382861434352, - "Data3": -7253424745870823271, - "Data4": 7081460253699377815 + "Data1": -5546490450073133003, + "Data2": 8287900467655855565 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikShortEditor", @@ -60429,10 +58285,8 @@ }, { "__Checksum": { - "Data1": 1782571050897725278, - "Data2": -8682406287865059170, - "Data3": -5161105360625664659, - "Data4": -1902261019477331671 + "Data1": -8537723255739842122, + "Data2": -4553443506489714862 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikStringEditor", @@ -60486,10 +58340,8 @@ }, { "__Checksum": { - "Data1": 2850638200433601709, - "Data2": -508060693262579055, - "Data3": 7652664941792760261, - "Data4": -1706607455681947494 + "Data1": 1166720295494191430, + "Data2": 8844087437665314025 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Editors.TelerikStringEditor", @@ -60543,10 +58395,8 @@ }, { "__Checksum": { - "Data1": 5286099483958540979, - "Data2": 368660623428737694, - "Data3": 1062833707545261472, - "Data4": -3346049264706195976 + "Data1": 4120328680579114541, + "Data2": -2589096990398736089 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Filters.TelerikFilterHeader", @@ -60605,10 +58455,8 @@ }, { "__Checksum": { - "Data1": 2010076513518382556, - "Data2": -1519021121950985923, - "Data3": -7046645760494117430, - "Data4": 3636539122684273705 + "Data1": -4565232854004505122, + "Data2": 440025630595031268 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Filters.TelerikFilterHeader", @@ -60667,10 +58515,8 @@ }, { "__Checksum": { - "Data1": 8512226860104881476, - "Data2": -8459151918070862338, - "Data3": 5909938645329527837, - "Data4": -6786394007894252276 + "Data1": -163602716757263658, + "Data2": 8294292380909520057 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Filters.Filter.TelerikFilter", @@ -60707,10 +58553,8 @@ }, { "__Checksum": { - "Data1": -4397893867087540929, - "Data2": 4576496609136111000, - "Data3": -5256814418334634817, - "Data4": 2888455236653752648 + "Data1": -1898021566977832602, + "Data2": 2426561997471740407 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Filters.Filter.TelerikFilter", @@ -60747,10 +58591,8 @@ }, { "__Checksum": { - "Data1": -5782535046216401015, - "Data2": 2222963371382071881, - "Data3": 1337223508368611618, - "Data4": 7163886494608935027 + "Data1": 5821693846514474126, + "Data2": -5115709028341130471 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Filters.Filter.TelerikFilterExpression", @@ -60787,10 +58629,8 @@ }, { "__Checksum": { - "Data1": -72557391563302121, - "Data2": 2338384173957500389, - "Data3": -6625559879655991404, - "Data4": 3980108517205587846 + "Data1": -6175256735357814746, + "Data2": -7257066656308906306 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Filters.Filter.TelerikFilterExpression", @@ -60827,10 +58667,8 @@ }, { "__Checksum": { - "Data1": -6771716844581596530, - "Data2": 4858896878567164058, - "Data3": -1316609821537673194, - "Data4": -4900614904629898597 + "Data1": -6437170723933324317, + "Data2": 7013949655690601826 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Filters.FilterList.TelerikFilterList", @@ -60923,10 +58761,8 @@ }, { "__Checksum": { - "Data1": 989294436984913001, - "Data2": -9042425929927026890, - "Data3": -1533611500674576878, - "Data4": -3421840730997076058 + "Data1": 3160067846982605710, + "Data2": 2166924934206092248 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Filters.FilterList.TelerikFilterList", @@ -61019,10 +58855,8 @@ }, { "__Checksum": { - "Data1": -6489859951645667447, - "Data2": -345898813307597209, - "Data3": -569466391230094369, - "Data4": -4098248570880323904 + "Data1": -603627620558739263, + "Data2": 6743014925887202378 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Filters.FilterMenu.FilterMenuForm", @@ -61094,10 +58928,8 @@ }, { "__Checksum": { - "Data1": -826129635237708155, - "Data2": -4931959471965727588, - "Data3": -1159722159303504714, - "Data4": -882359430537470745 + "Data1": -8220456149394539911, + "Data2": 6444231862821840598 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Filters.FilterMenu.FilterMenuForm", @@ -61169,10 +59001,8 @@ }, { "__Checksum": { - "Data1": -7899388790885379487, - "Data2": -1098882647404813892, - "Data3": 448346885417107076, - "Data4": 6367419669416112095 + "Data1": 4887492125638295293, + "Data2": 6332628105882838108 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Filters.FilterMenu.FilterMenuHeader", @@ -61219,10 +59049,8 @@ }, { "__Checksum": { - "Data1": 6572622577789907784, - "Data2": -5587159840741001021, - "Data3": -4710022338933305988, - "Data4": -790956123982061397 + "Data1": -1128819813330489037, + "Data2": -8938431011958604376 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Filters.FilterMenu.FilterMenuHeader", @@ -61269,10 +59097,8 @@ }, { "__Checksum": { - "Data1": 299093743040713658, - "Data2": -4718232036592707311, - "Data3": -7646999326788265589, - "Data4": 5285080882823402119 + "Data1": 8493619348598363929, + "Data2": -8882091993029098594 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Filters.FilterMenu.TelerikFilterMenu", @@ -61345,10 +59171,8 @@ }, { "__Checksum": { - "Data1": 597164859532813680, - "Data2": 4191115184344740859, - "Data3": 785601049057860548, - "Data4": 4907190854441614624 + "Data1": 2172196870283505185, + "Data2": 9111240837119063855 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Filters.FilterMenu.TelerikFilterMenu", @@ -61421,10 +59245,8 @@ }, { "__Checksum": { - "Data1": 8973194950843456958, - "Data2": -7091584841159409755, - "Data3": 4580376656972664294, - "Data4": -643473754304054976 + "Data1": -5336714068643364313, + "Data2": -74578697554130602 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Filters.FilterMenu.TelerikFilterMenuHeader", @@ -61508,10 +59330,8 @@ }, { "__Checksum": { - "Data1": 8234010949774307185, - "Data2": -5367834892751877865, - "Data3": 5312183222896321927, - "Data4": 1774144608267254640 + "Data1": -1264123287066856321, + "Data2": 3572787822239026239 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Filters.FilterMenu.TelerikFilterMenuHeader", @@ -61595,10 +59415,8 @@ }, { "__Checksum": { - "Data1": -1362753171358928637, - "Data2": 3131168200267736649, - "Data3": 3295446241792837281, - "Data4": -246778366033006624 + "Data1": -7154154704136246545, + "Data2": 6287077617843674409 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Grid.GridEditForm", @@ -61678,10 +59496,8 @@ }, { "__Checksum": { - "Data1": -610047040147609885, - "Data2": -2919838905868318273, - "Data3": 6836379871354217073, - "Data4": 8691454573616955073 + "Data1": -2685375000135972654, + "Data2": 8682124538996589043 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Grid.GridEditForm", @@ -61761,10 +59577,8 @@ }, { "__Checksum": { - "Data1": 3528250845248631439, - "Data2": -1671210499275914684, - "Data3": 1073916658346620116, - "Data4": 8511965162073797159 + "Data1": 8058418342705126471, + "Data2": 2718473481480415704 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Layout.BindingComponentBase", @@ -61856,10 +59670,8 @@ }, { "__Checksum": { - "Data1": -3258231606757557631, - "Data2": 7231815293788135086, - "Data3": -4102970661756022694, - "Data4": -2595693866326280448 + "Data1": -6955308089143937352, + "Data2": -837057497630438061 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Layout.BindingComponentBase", @@ -61951,10 +59763,8 @@ }, { "__Checksum": { - "Data1": 2813069766477153514, - "Data2": 8784808368898501540, - "Data3": 6267759192451073421, - "Data4": -2110530760768012842 + "Data1": 4829536863103394934, + "Data2": 4193129457464642394 }, "Flags": 1, "Kind": 3, @@ -61984,10 +59794,8 @@ }, { "__Checksum": { - "Data1": -5465970032025053429, - "Data2": 8907997158632061423, - "Data3": -153489274730719847, - "Data4": -5386955666760569891 + "Data1": 5797521352376373145, + "Data2": 5235645467443054628 }, "Flags": 3, "Kind": 3, @@ -62017,10 +59825,8 @@ }, { "__Checksum": { - "Data1": 2561983526345545010, - "Data2": 9080996577976614288, - "Data3": -3804626040793387304, - "Data4": -8313964688950477578 + "Data1": 4180755858044971912, + "Data2": 9146337507443063157 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Layout.HierarchicalBindingComponentBase", @@ -62144,10 +59950,8 @@ }, { "__Checksum": { - "Data1": 6878902923669040044, - "Data2": -8893858304787325225, - "Data3": -8956879639308704983, - "Data4": 2876772836026965667 + "Data1": 5545403703433938296, + "Data2": -3109589971179669323 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Layout.HierarchicalBindingComponentBase", @@ -62271,10 +60075,8 @@ }, { "__Checksum": { - "Data1": 2949136762041497743, - "Data2": -1279957960913224136, - "Data3": 391500017923790839, - "Data4": 613683830344643902 + "Data1": 5077979241206988969, + "Data2": 1872796792816486034 }, "Flags": 1, "Kind": 3, @@ -62304,10 +60106,8 @@ }, { "__Checksum": { - "Data1": -4268367133341185902, - "Data2": -4506428769369230680, - "Data3": 9171594436535768733, - "Data4": -7314450263714403829 + "Data1": 6983300879630237936, + "Data2": -752116072657832344 }, "Flags": 3, "Kind": 3, @@ -62337,10 +60137,8 @@ }, { "__Checksum": { - "Data1": -7340742780225007576, - "Data2": -6849107371287915501, - "Data3": -9221860642981856204, - "Data4": -6751067895666204574 + "Data1": -3845157634652900732, + "Data2": 4610130049548054680 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.Layout.ItemElement", @@ -62422,10 +60220,8 @@ }, { "__Checksum": { - "Data1": 8940627048765705563, - "Data2": -3296635060307783055, - "Data3": -3699662490500679875, - "Data4": -8578954846180618592 + "Data1": 2400964388863726705, + "Data2": -2204172100312944034 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.Layout.ItemElement", @@ -62507,10 +60303,8 @@ }, { "__Checksum": { - "Data1": -5553062800410888904, - "Data2": -2446162194489719489, - "Data3": 7842634315249411615, - "Data4": 8025028141649933281 + "Data1": 6675611593476438238, + "Data2": -4661594740095395945 }, "Flags": 1, "Kind": 3, @@ -62528,10 +60322,8 @@ }, { "__Checksum": { - "Data1": -8096034126617196895, - "Data2": -8381386386693707260, - "Data3": 6907780935814640616, - "Data4": -1425328301364695260 + "Data1": -3119840495374978937, + "Data2": 8470797994882647206 }, "Flags": 3, "Kind": 3, @@ -62549,10 +60341,8 @@ }, { "__Checksum": { - "Data1": 3925986948022328786, - "Data2": 8008971601957565587, - "Data3": 4129933148830420697, - "Data4": -3956000533860304307 + "Data1": -3719704259511659870, + "Data2": -7993626356552921540 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.VirtualColumnScroller.VirtualColumnScroller", @@ -62612,10 +60402,8 @@ }, { "__Checksum": { - "Data1": -4916982207623675929, - "Data2": 8062209434207819183, - "Data3": -3535999139085938325, - "Data4": -4648317296039170518 + "Data1": -383194488542822156, + "Data2": -2752845681881823201 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.VirtualColumnScroller.VirtualColumnScroller", @@ -62675,10 +60463,8 @@ }, { "__Checksum": { - "Data1": 367356333268979065, - "Data2": 2035291526226069027, - "Data3": -6677886052098454614, - "Data4": -3543015737160453717 + "Data1": 8034845945029843572, + "Data2": 7961339066115721422 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.VirtualScroller.VirtualScrollContainer", @@ -62761,10 +60547,8 @@ }, { "__Checksum": { - "Data1": 1974376769532761568, - "Data2": 2014478493556993914, - "Data3": 4671111569916790091, - "Data4": -5003600925942895922 + "Data1": -820397878025889284, + "Data2": -4412630194273116523 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.VirtualScroller.VirtualScrollContainer", @@ -62847,10 +60631,8 @@ }, { "__Checksum": { - "Data1": -6589451531397584656, - "Data2": -4040836147455733027, - "Data3": -8139093328279326739, - "Data4": 8408453357387120711 + "Data1": -14332475350374696, + "Data2": -4525412674314045766 }, "Flags": 1, "Kind": 3, @@ -62868,10 +60650,8 @@ }, { "__Checksum": { - "Data1": 5317172335828130577, - "Data2": -7900303121858164378, - "Data3": 7540624262779861165, - "Data4": 8179274036630015452 + "Data1": -3114201751763916834, + "Data2": -2224521427814652457 }, "Flags": 3, "Kind": 3, @@ -62889,10 +60669,8 @@ }, { "__Checksum": { - "Data1": 393303546999721163, - "Data2": -7058572473251145852, - "Data3": 3644381654475099075, - "Data4": -2404881135603046575 + "Data1": -113579686913766393, + "Data2": -7419690532642429356 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Common.VirtualScroller.VirtualScroller", @@ -62950,10 +60728,8 @@ }, { "__Checksum": { - "Data1": -4571532697732198358, - "Data2": -6339470556876299490, - "Data3": 5369076544713428686, - "Data4": 5472618662263426209 + "Data1": 1698913009692879133, + "Data2": 3197975286863789921 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Common.VirtualScroller.VirtualScroller", @@ -63011,10 +60787,8 @@ }, { "__Checksum": { - "Data1": 8736773913516821897, - "Data2": 8120062729614145716, - "Data3": -3033157348478167744, - "Data4": -4784659183472235345 + "Data1": -8415151423820682160, + "Data2": 8545200064331942980 }, "Flags": 1, "Name": "Telerik.Blazor.Components.DateTimePicker.DateTimeSelector", @@ -63122,10 +60896,8 @@ }, { "__Checksum": { - "Data1": -3141329368567948264, - "Data2": -7455135531226960734, - "Data3": -6539946788004877777, - "Data4": 7449471046643111550 + "Data1": 8018990572175678546, + "Data2": -7721814483802957122 }, "Flags": 3, "Name": "Telerik.Blazor.Components.DateTimePicker.DateTimeSelector", @@ -63233,10 +61005,8 @@ }, { "__Checksum": { - "Data1": 8407059183943891309, - "Data2": 6913125137674667236, - "Data3": -6502834768748270205, - "Data4": 244360639681910006 + "Data1": 187115829334932383, + "Data2": -6889207122665465603 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Drawer.DrawerItem", @@ -63318,10 +61088,8 @@ }, { "__Checksum": { - "Data1": 5787374003327247743, - "Data2": -7575217284525146615, - "Data3": -3633668615311393145, - "Data4": -4368133768229853472 + "Data1": 7668957750991608674, + "Data2": -4342288783766761070 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Drawer.DrawerItem", @@ -63403,10 +61171,8 @@ }, { "__Checksum": { - "Data1": 62012877981995725, - "Data2": -7744902138401109416, - "Data3": -8240076626757120208, - "Data4": 3038416895938658896 + "Data1": 1266765100201530062, + "Data2": 6427229489302911421 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Editor.EditorCustomTool", @@ -63445,10 +61211,8 @@ }, { "__Checksum": { - "Data1": -8410850167027866035, - "Data2": -4264854954006207301, - "Data3": 307122207423916322, - "Data4": -4957445248174821687 + "Data1": -2895763025382586333, + "Data2": 7191273681373192696 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Editor.EditorCustomTool", @@ -63487,10 +61251,8 @@ }, { "__Checksum": { - "Data1": 7573055877366089388, - "Data2": -9193445854662367206, - "Data3": 452026372188711728, - "Data4": -4998920072762520019 + "Data1": -1859147612018820854, + "Data2": -7260865131385059919 }, "Flags": 1, "Kind": 3, @@ -63509,10 +61271,8 @@ }, { "__Checksum": { - "Data1": 6971539162100686773, - "Data2": -5502973940077701803, - "Data3": 6730853666222839151, - "Data4": 239367054516313362 + "Data1": 6528931312879028357, + "Data2": -4109938291886422 }, "Flags": 3, "Kind": 3, @@ -63531,10 +61291,8 @@ }, { "__Checksum": { - "Data1": 2564372628720012082, - "Data2": -3047473108127800802, - "Data3": -707418753909027293, - "Data4": 6319552518465403747 + "Data1": 7666559670184804917, + "Data2": -5185772588155974955 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Editor.EditorToolBar", @@ -63573,10 +61331,8 @@ }, { "__Checksum": { - "Data1": 1929134923032250402, - "Data2": 920964235679261231, - "Data3": -955572281689270893, - "Data4": -7632593185962203760 + "Data1": -7941781418726581538, + "Data2": -6792961022801567420 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Editor.EditorToolBar", @@ -63615,10 +61371,8 @@ }, { "__Checksum": { - "Data1": -7409345368962529587, - "Data2": -344362603823181504, - "Data3": 4733119869424146616, - "Data4": 2009228493550926334 + "Data1": 1908441320831498981, + "Data2": 867098402246148860 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Editor.Dialogs.InsertImageForm", @@ -63665,10 +61419,8 @@ }, { "__Checksum": { - "Data1": 9088227644826581478, - "Data2": -4298559019956593501, - "Data3": 4990137269333292354, - "Data4": -5064356472608142621 + "Data1": 4850654898047119419, + "Data2": 3229032314307919410 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Editor.Dialogs.InsertImageForm", @@ -63715,10 +61467,8 @@ }, { "__Checksum": { - "Data1": -5038485474455538587, - "Data2": 773292807339206967, - "Data3": -6465824213782670453, - "Data4": 2066601315744678996 + "Data1": -1584838403394747819, + "Data2": -5945285463977461212 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Editor.Dialogs.InsertLinkForm", @@ -63765,10 +61515,8 @@ }, { "__Checksum": { - "Data1": 6342771832775137714, - "Data2": 3626522611361503092, - "Data3": -5872953148011579739, - "Data4": -33553244787818112 + "Data1": 1228954487271197270, + "Data2": -77821281262256138 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Editor.Dialogs.InsertLinkForm", @@ -63815,10 +61563,8 @@ }, { "__Checksum": { - "Data1": -3230249255093438218, - "Data2": 6522681704243030733, - "Data3": -5555334859247725091, - "Data4": 8291991234627752020 + "Data1": -6116333956298525171, + "Data2": -3733803165280891285 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Editor.Dialogs.ViewHtmlDialog", @@ -63865,10 +61611,8 @@ }, { "__Checksum": { - "Data1": -5639424474135501568, - "Data2": -6692895334673630217, - "Data3": 2008478839481347677, - "Data4": -6129513721318735529 + "Data1": -8689599028027967013, + "Data2": 7251816165390925048 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Editor.Dialogs.ViewHtmlDialog", @@ -63915,10 +61659,8 @@ }, { "__Checksum": { - "Data1": -7134911798869724967, - "Data2": 5572278053402452917, - "Data3": 8406798129849367578, - "Data4": -4167222559751431339 + "Data1": -8137441401293930741, + "Data2": 8274463560684584676 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Editor.Dialogs.InsertTablePopup", @@ -63954,10 +61696,8 @@ }, { "__Checksum": { - "Data1": 2368837948144263849, - "Data2": 3903106767946189190, - "Data3": 4461809355109842885, - "Data4": 7004273847044657207 + "Data1": -43887404635135569, + "Data2": 1249831619348067115 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Editor.Dialogs.InsertTablePopup", @@ -63993,10 +61733,8 @@ }, { "__Checksum": { - "Data1": -1458685137897738839, - "Data2": 761329771330914956, - "Data3": -5295348268919003819, - "Data4": 2541563678780650643 + "Data1": 3640624903871026129, + "Data2": -6469763741871312993 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Editor.Dialogs.EditorDialog", @@ -64086,10 +61824,8 @@ }, { "__Checksum": { - "Data1": 7340817317503490217, - "Data2": -384968514771289891, - "Data3": -3800549929906056401, - "Data4": 6020837226287610620 + "Data1": 286168384440173301, + "Data2": 5161133232440317456 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Editor.Dialogs.EditorDialog", @@ -64179,10 +61915,8 @@ }, { "__Checksum": { - "Data1": -5463009439173831351, - "Data2": -7144264728285482764, - "Data3": -2232044095172271492, - "Data4": 9185958919695730877 + "Data1": -6192498708737423893, + "Data2": -6018687063184890237 }, "Flags": 1, "Kind": 3, @@ -64200,10 +61934,8 @@ }, { "__Checksum": { - "Data1": 909688953829165427, - "Data2": -2805807941620644886, - "Data3": 4022286681677681030, - "Data4": -7369187709665072794 + "Data1": 2077942125182430072, + "Data2": 1584810001279457333 }, "Flags": 3, "Kind": 3, @@ -64221,10 +61953,8 @@ }, { "__Checksum": { - "Data1": 4032042838006373886, - "Data2": -5008978604103835764, - "Data3": -428032966224610684, - "Data4": -1819828757175675602 + "Data1": 4259258123073279348, + "Data2": -948428919519811551 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Editor.ToolBar.EditorToolsFactory", @@ -64285,10 +62015,8 @@ }, { "__Checksum": { - "Data1": -159647437341712629, - "Data2": -5200977879784495013, - "Data3": 487892399458894851, - "Data4": 8942316835335209371 + "Data1": 498358643854705997, + "Data2": 1559380407016415029 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Editor.ToolBar.EditorToolsFactory", @@ -64349,10 +62077,8 @@ }, { "__Checksum": { - "Data1": -5189828330034407882, - "Data2": -1373097644137048701, - "Data3": 1362094887870195055, - "Data4": -1618106300571698233 + "Data1": 7898756789838766606, + "Data2": -5029336294650848008 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridCheckBoxCell", @@ -64436,10 +62162,8 @@ }, { "__Checksum": { - "Data1": 185616074332757654, - "Data2": 2095900763511775112, - "Data3": 8711429038553714132, - "Data4": -4996859054571147108 + "Data1": -8526301296884064658, + "Data2": -2655528975075498262 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridCheckBoxCell", @@ -64523,10 +62247,8 @@ }, { "__Checksum": { - "Data1": 7670089255554122572, - "Data2": 5712434635814330650, - "Data3": 1635859619398046462, - "Data4": -4626624733100802262 + "Data1": -7319159085753650062, + "Data2": -8885002586524443375 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridCommandCell", @@ -64603,10 +62325,8 @@ }, { "__Checksum": { - "Data1": -8411172514874601278, - "Data2": 1034031621072314943, - "Data3": 6814179879580853314, - "Data4": -2928882062355616544 + "Data1": -8553612737462972397, + "Data2": 2166333332023600108 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridCommandCell", @@ -64683,10 +62403,8 @@ }, { "__Checksum": { - "Data1": -5766319048649769320, - "Data2": -6758670232229677007, - "Data3": 2058262669841677560, - "Data4": -2125905366137816791 + "Data1": -5599373039079462231, + "Data2": -280215888308514839 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridContentCell", @@ -64763,10 +62481,8 @@ }, { "__Checksum": { - "Data1": -6864791507989910033, - "Data2": -6949319911580299474, - "Data3": -5883992797265039204, - "Data4": -2607339409475917656 + "Data1": -4821720750347124263, + "Data2": 780001968972267798 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridContentCell", @@ -64843,10 +62559,8 @@ }, { "__Checksum": { - "Data1": 8120491739298269891, - "Data2": 3666435846703313287, - "Data3": 192412175131623992, - "Data4": 552709709328497773 + "Data1": 5628273164247282263, + "Data2": -5368338564374453219 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridFilterCell", @@ -64948,10 +62662,8 @@ }, { "__Checksum": { - "Data1": 770893552181979200, - "Data2": 3781223906031961873, - "Data3": -8775879551310041438, - "Data4": 483027841706656259 + "Data1": -4505559398746706288, + "Data2": 963019446412698233 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridFilterCell", @@ -65053,10 +62765,8 @@ }, { "__Checksum": { - "Data1": -1224310157856609169, - "Data2": 1251472968456776841, - "Data3": 3542990725140669464, - "Data4": 2071631242676528850 + "Data1": -5851115494199509364, + "Data2": 1517735517356904088 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridFooterCell", @@ -65136,10 +62846,8 @@ }, { "__Checksum": { - "Data1": -7969780017174180698, - "Data2": 2385051241430360267, - "Data3": 6212902207723258051, - "Data4": 1964170854993722565 + "Data1": -8295060188605100238, + "Data2": -7768198929342391473 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridFooterCell", @@ -65219,10 +62927,8 @@ }, { "__Checksum": { - "Data1": -5718525595978100133, - "Data2": -5774703292060715350, - "Data3": 5236420372098151523, - "Data4": -4366967021811790341 + "Data1": 5408238306548707819, + "Data2": -3048772987747263177 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridHeaderCell", @@ -65446,10 +63152,8 @@ }, { "__Checksum": { - "Data1": 4190723931766667790, - "Data2": 1666191489609644111, - "Data3": 6633774740967560238, - "Data4": -7881915739256311620 + "Data1": 8216245254163573763, + "Data2": -4817670589285500059 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridHeaderCell", @@ -65673,10 +63377,8 @@ }, { "__Checksum": { - "Data1": 3490284016982552807, - "Data2": 981725845353264338, - "Data3": -7046502379819664706, - "Data4": 8345786403939770593 + "Data1": -7278215562928147621, + "Data2": 5936586355538697760 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.DetailRowBase", @@ -65766,10 +63468,8 @@ }, { "__Checksum": { - "Data1": 2621798801614402640, - "Data2": 3900203511579450110, - "Data3": 2487189181021911891, - "Data4": -7683354771893649102 + "Data1": 8274654675432416054, + "Data2": 1436332086098563740 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.DetailRowBase", @@ -65859,10 +63559,8 @@ }, { "__Checksum": { - "Data1": -4759878421720340866, - "Data2": -5545769310582366558, - "Data3": -7315041126815841143, - "Data4": 5391166527651288702 + "Data1": 3354842737440154474, + "Data2": -8085100441311068297 }, "Flags": 1, "Kind": 3, @@ -65891,10 +63589,8 @@ }, { "__Checksum": { - "Data1": -1633954310541328122, - "Data2": -3882502378474015528, - "Data3": 3114283406281387387, - "Data4": -4222836379106810260 + "Data1": -744178803495118685, + "Data2": -5278924112759123700 }, "Flags": 3, "Kind": 3, @@ -65923,10 +63619,8 @@ }, { "__Checksum": { - "Data1": 1058515667696702991, - "Data2": 4038316303969069001, - "Data3": 2867680799071210703, - "Data4": -7304030805734575728 + "Data1": -1098102297025257831, + "Data2": -6597215314758463276 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridFooterRow", @@ -65981,10 +63675,8 @@ }, { "__Checksum": { - "Data1": -8304474339953361602, - "Data2": 7414543482350950431, - "Data3": 8731186997606951624, - "Data4": -173937372079192149 + "Data1": -8627161496503209785, + "Data2": 2426364566528433263 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridFooterRow", @@ -66039,10 +63731,8 @@ }, { "__Checksum": { - "Data1": -2674475528583378702, - "Data2": 4337884439822684865, - "Data3": -6897427592196764386, - "Data4": -7632583584853639830 + "Data1": 2044814067146377049, + "Data2": 5986138635224002731 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridLoadingCell", @@ -66097,10 +63787,8 @@ }, { "__Checksum": { - "Data1": -5547372823394922698, - "Data2": -284305696065441140, - "Data3": 4966005163237686866, - "Data4": -398050068413214057 + "Data1": 1622213902363617605, + "Data2": 6986166857610191077 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridLoadingCell", @@ -66155,10 +63843,8 @@ }, { "__Checksum": { - "Data1": -716861169199029867, - "Data2": 2465647646718030188, - "Data3": -3005868452321123125, - "Data4": 8371449270070459005 + "Data1": -83231024189618473, + "Data2": 1943408930395361975 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridLoadingRow", @@ -66213,10 +63899,8 @@ }, { "__Checksum": { - "Data1": 8706991320610730725, - "Data2": 7692654323530259176, - "Data3": -2634402098813307598, - "Data4": -8374400413272328085 + "Data1": -3971755169406464209, + "Data2": -8384038301626479172 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridLoadingRow", @@ -66271,10 +63955,8 @@ }, { "__Checksum": { - "Data1": -138330174614312780, - "Data2": 895852808278004463, - "Data3": 311023588726535679, - "Data4": -8594495980892669888 + "Data1": 1376939018992302922, + "Data2": 6415596630020913289 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridRowBase", @@ -66425,10 +64107,8 @@ }, { "__Checksum": { - "Data1": -2034352484417646701, - "Data2": 1076920594059612420, - "Data3": -70542386175002779, - "Data4": 110500280314410890 + "Data1": 6191905332645536407, + "Data2": 2235175033312510237 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridRowBase", @@ -66579,10 +64259,8 @@ }, { "__Checksum": { - "Data1": -3008458502627926738, - "Data2": 4087019278198689547, - "Data3": 1181353997744178148, - "Data4": -4163747269357919613 + "Data1": 2814035777961639927, + "Data2": 5099865335916510469 }, "Flags": 1, "Kind": 3, @@ -66611,10 +64289,8 @@ }, { "__Checksum": { - "Data1": 2939673050976324179, - "Data2": -5736920581763446059, - "Data3": -5586431454920385540, - "Data4": -4321841904405541562 + "Data1": -5211018041797040224, + "Data2": -1940402279513234244 }, "Flags": 3, "Kind": 3, @@ -66643,10 +64319,8 @@ }, { "__Checksum": { - "Data1": -8822037571813871489, - "Data2": -3425022772093139645, - "Data3": -4977004305169293647, - "Data4": -3024129450921057447 + "Data1": 2091239093196087596, + "Data2": -6073542303452605082 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridRowCollectionBase", @@ -66705,10 +64379,8 @@ }, { "__Checksum": { - "Data1": -3032553376407330683, - "Data2": -4186873650326018406, - "Data3": -789375438377698807, - "Data4": 4362012908264648775 + "Data1": 5667782568230035923, + "Data2": -2412626658168429671 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridRowCollectionBase", @@ -66767,10 +64439,8 @@ }, { "__Checksum": { - "Data1": -8425754601377675075, - "Data2": -1613946236586773202, - "Data3": -7558726975000382283, - "Data4": -3161511136063419342 + "Data1": 9048402011923206279, + "Data2": -3214827888666450946 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridRowGroupedCollectionBase", @@ -66839,10 +64509,8 @@ }, { "__Checksum": { - "Data1": 9011173425498289762, - "Data2": -2796059224857356092, - "Data3": 721319554048120820, - "Data4": 4813192292233199626 + "Data1": -4084848708477153890, + "Data2": 7056442551024875173 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridRowGroupedCollectionBase", @@ -66911,10 +64579,8 @@ }, { "__Checksum": { - "Data1": -1347923650020427804, - "Data2": 802924992780818877, - "Data3": -2545456655311693774, - "Data4": -826742244378480619 + "Data1": 692915981757628277, + "Data2": -3795457008185809 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridToolBarItemBase", @@ -66966,10 +64632,8 @@ }, { "__Checksum": { - "Data1": -4386769929495223425, - "Data2": -7254253366007955105, - "Data3": 890607447622193953, - "Data4": 6987072041640798778 + "Data1": -5697108851103860084, + "Data2": 8132136929379454058 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridToolBarItemBase", @@ -67021,10 +64685,8 @@ }, { "__Checksum": { - "Data1": -2708575268496505049, - "Data2": -9160336038397963023, - "Data3": -7275034233310485990, - "Data4": 7835502043562037149 + "Data1": 1299320620039233700, + "Data2": 3468346719572819794 }, "Flags": 1, "Kind": 3, @@ -67042,10 +64704,8 @@ }, { "__Checksum": { - "Data1": -2294266107365361813, - "Data2": 2715256919379903265, - "Data3": -1897415876722968674, - "Data4": -2376843260040408757 + "Data1": 5136120271255242009, + "Data2": 1754148721101808827 }, "Flags": 3, "Kind": 3, @@ -67063,10 +64723,8 @@ }, { "__Checksum": { - "Data1": -4617191306352659318, - "Data2": -7967302301820725845, - "Data3": 8704056767543629389, - "Data4": 5669425478711365425 + "Data1": -2965839171256302264, + "Data2": -1825352857334384069 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridFilterRow", @@ -67154,10 +64812,8 @@ }, { "__Checksum": { - "Data1": 6041164190425839204, - "Data2": 3762055941765526781, - "Data3": -2118302910042278694, - "Data4": -7532212773150150289 + "Data1": 4740552383390388819, + "Data2": 7050375838498774328 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridFilterRow", @@ -67245,10 +64901,8 @@ }, { "__Checksum": { - "Data1": -7480784905323423954, - "Data2": -7096965755905468653, - "Data3": -8757831122829506814, - "Data4": -2459941356375984419 + "Data1": -3817043915255920045, + "Data2": 6393190398935613579 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridHeaderRowBase", @@ -67469,10 +65123,8 @@ }, { "__Checksum": { - "Data1": -4436547419722162389, - "Data2": 5990503630619374566, - "Data3": -4864517532030192076, - "Data4": 2432688385845028187 + "Data1": -6737894974761019449, + "Data2": 457801714411299557 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridHeaderRowBase", @@ -67693,10 +65345,8 @@ }, { "__Checksum": { - "Data1": -7480178367050445888, - "Data2": 3739418712283226710, - "Data3": 3473543660493075146, - "Data4": -3136740332745196484 + "Data1": 7092023245837547145, + "Data2": 4888916423635452758 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridRow", @@ -67847,10 +65497,8 @@ }, { "__Checksum": { - "Data1": 903932132913419753, - "Data2": 9148699834426823388, - "Data3": 2566334363748576466, - "Data4": 5522669358199291941 + "Data1": -5596131037470212121, + "Data2": -2791761085845893394 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridRow", @@ -68001,10 +65649,8 @@ }, { "__Checksum": { - "Data1": -448536715003631472, - "Data2": -198477261810856451, - "Data3": 8095675028848169673, - "Data4": -1587524156575618688 + "Data1": 5274589832529530107, + "Data2": 3221605757354491911 }, "Flags": 1, "Kind": 3, @@ -68033,10 +65679,8 @@ }, { "__Checksum": { - "Data1": 7930699261968644132, - "Data2": 1671152559625189308, - "Data3": 2673117518880528233, - "Data4": 7174561965850922279 + "Data1": -7129899614512444055, + "Data2": -2812253432196850469 }, "Flags": 3, "Kind": 3, @@ -68065,10 +65709,8 @@ }, { "__Checksum": { - "Data1": 9171868337257087997, - "Data2": 312882315432423685, - "Data3": -5546274701585764082, - "Data4": 7689433038520978129 + "Data1": -3659474834137041744, + "Data2": 4470430624212487758 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridRowCollection", @@ -68127,10 +65769,8 @@ }, { "__Checksum": { - "Data1": -2644342812568969894, - "Data2": 3319774813089014791, - "Data3": 4075553587777953354, - "Data4": -2634319606743986506 + "Data1": 6429579325341324577, + "Data2": -3353980086990087500 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridRowCollection", @@ -68189,10 +65829,8 @@ }, { "__Checksum": { - "Data1": 4882296992504682989, - "Data2": -4674316210959896969, - "Data3": 5623323374386065073, - "Data4": -3173060065713899876 + "Data1": 4519984155702335745, + "Data2": 1851270817171228295 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridRowGroupedCollection", @@ -68261,10 +65899,8 @@ }, { "__Checksum": { - "Data1": 7190482764044420352, - "Data2": -9007630941861033524, - "Data3": -7184234199148322435, - "Data4": -7820148148035456251 + "Data1": 1473052999557564081, + "Data2": -7048480511675493466 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridRowGroupedCollection", @@ -68333,10 +65969,8 @@ }, { "__Checksum": { - "Data1": 493982829028199579, - "Data2": -3780837114142344257, - "Data3": -8554164825666821738, - "Data4": -7077172325232194346 + "Data1": 5503495978270467115, + "Data2": 7107896236687497694 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridToolBarItem", @@ -68388,10 +66022,8 @@ }, { "__Checksum": { - "Data1": 4128372725195546220, - "Data2": -9086211986462798504, - "Data3": 3665453982497182572, - "Data4": -3220435072957031585 + "Data1": 877123305606627632, + "Data2": 3763362014086468813 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridToolBarItem", @@ -68443,10 +66075,8 @@ }, { "__Checksum": { - "Data1": -6084164427868298940, - "Data2": 5162210680071379459, - "Data3": -9203470823655189722, - "Data4": 7160378233290736436 + "Data1": 2429095458753311490, + "Data2": 1187891786787966848 }, "Flags": 1, "Kind": 3, @@ -68464,10 +66094,8 @@ }, { "__Checksum": { - "Data1": 5092390871238013022, - "Data2": -4224872513342863246, - "Data3": 1959740996059980236, - "Data4": -7272030005703388621 + "Data1": 4887789990476026350, + "Data2": 2931895112155141880 }, "Flags": 3, "Kind": 3, @@ -68485,10 +66113,8 @@ }, { "__Checksum": { - "Data1": 745622331905978081, - "Data2": 2133523989205345665, - "Data3": -1152080497166776897, - "Data4": 8702241626512962597 + "Data1": -53715887670977075, + "Data2": -3262764964254882030 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.GridHeaderRow", @@ -68709,10 +66335,8 @@ }, { "__Checksum": { - "Data1": 1305953946347316330, - "Data2": 4000609242346886670, - "Data3": 1936946320952173224, - "Data4": -3376625225555670542 + "Data1": -6769084903589819485, + "Data2": -5347712984249518287 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.GridHeaderRow", @@ -68933,10 +66557,8 @@ }, { "__Checksum": { - "Data1": -7002719804388558492, - "Data2": 8824011663162485045, - "Data3": -6870559629960529668, - "Data4": 2979867077827529232 + "Data1": 285301404106764031, + "Data2": 1051706952769800154 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.ColumnMenu.GridColumnMenuSettings", @@ -68952,10 +66574,8 @@ }, { "__Checksum": { - "Data1": -8441879918413663689, - "Data2": -3608472721216173679, - "Data3": 6102040310555757446, - "Data4": 5132727075460259318 + "Data1": 5111890976501736811, + "Data2": -3913728991643512654 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.ColumnMenu.GridColumnMenuSettings", @@ -68971,10 +66591,8 @@ }, { "__Checksum": { - "Data1": -70346866473632432, - "Data2": 4193803579731750849, - "Data3": -1048946042017765054, - "Data4": 2551385552782132961 + "Data1": -1320383065583416116, + "Data2": -6578950312781334420 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Columns.GridCheckboxColumn", @@ -68990,10 +66608,8 @@ }, { "__Checksum": { - "Data1": 4302731176706243464, - "Data2": -8154679760134724808, - "Data3": 66840381183686750, - "Data4": 1108239923742878843 + "Data1": 4183983429816686143, + "Data2": -3155595058393952357 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Columns.GridCheckboxColumn", @@ -69009,10 +66625,8 @@ }, { "__Checksum": { - "Data1": -2371347506485139838, - "Data2": -1820025973703409599, - "Data3": 8706416302278812010, - "Data4": -1289311430187325631 + "Data1": 3759581402821861856, + "Data2": 1689797009263178389 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Columns.GridColumn", @@ -69028,10 +66642,8 @@ }, { "__Checksum": { - "Data1": 358401339373603989, - "Data2": 235926406500584355, - "Data3": 8370476151621206385, - "Data4": -8390979732342896200 + "Data1": -4145917043893518139, + "Data2": -1585119984754309902 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Columns.GridColumn", @@ -69047,10 +66659,8 @@ }, { "__Checksum": { - "Data1": 6413442522713854874, - "Data2": 5421299248537526965, - "Data3": 3215496801741635444, - "Data4": -1330913873671693778 + "Data1": 4782261472420970630, + "Data2": 1428247195783235509 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Columns.GridCommandColumn", @@ -69066,10 +66676,8 @@ }, { "__Checksum": { - "Data1": -6254266171536367960, - "Data2": -5698271510726872937, - "Data3": 2486736980602283377, - "Data4": 6680004479435075850 + "Data1": -5410560568094518573, + "Data2": -3811341660684796422 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Columns.GridCommandColumn", @@ -69085,10 +66693,8 @@ }, { "__Checksum": { - "Data1": -4750744431081493143, - "Data2": -5644106668355137372, - "Data3": -4152986596751308, - "Data4": -392320906667485346 + "Data1": -8005100193122212861, + "Data2": 6611256436027747839 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.DetailTemplate.DetailCell", @@ -69172,10 +66778,8 @@ }, { "__Checksum": { - "Data1": -1553978144766140669, - "Data2": 2090951718084455436, - "Data3": -8684648805760925880, - "Data4": 2960226402928210876 + "Data1": -517558269942136560, + "Data2": 8951797681582106636 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.DetailTemplate.DetailCell", @@ -69259,10 +66863,8 @@ }, { "__Checksum": { - "Data1": 5530090921989782942, - "Data2": 3308659562780697103, - "Data3": -5949840193810863808, - "Data4": 5183121003599536843 + "Data1": -380208639332779704, + "Data2": 7269834384646943245 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.DetailTemplate.DetailColumn", @@ -69278,10 +66880,8 @@ }, { "__Checksum": { - "Data1": 26556891361799158, - "Data2": -2897526032180834692, - "Data3": 6689699300598326366, - "Data4": 689207170771026390 + "Data1": 5046628710847080936, + "Data2": 9191176657814511466 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.DetailTemplate.DetailColumn", @@ -69297,10 +66897,8 @@ }, { "__Checksum": { - "Data1": 8749220885980124973, - "Data2": 7404086148586490997, - "Data3": 1267473922296290358, - "Data4": 5354834219104740774 + "Data1": -6527395580156626261, + "Data2": -17550895953156197 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.DetailTemplate.DetailRow", @@ -69390,10 +66988,8 @@ }, { "__Checksum": { - "Data1": 2151226773954733550, - "Data2": -1473399175607415005, - "Data3": -3183464980110413195, - "Data4": -1415239241024104926 + "Data1": -460737126930632077, + "Data2": -1465441010465720108 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.DetailTemplate.DetailRow", @@ -69483,10 +67079,8 @@ }, { "__Checksum": { - "Data1": -1555168977303401555, - "Data2": 7432302901785392857, - "Data3": 5123770674418327721, - "Data4": -7990787342794219740 + "Data1": -9087337220794461573, + "Data2": 1679573313166172574 }, "Flags": 1, "Kind": 3, @@ -69515,10 +67109,8 @@ }, { "__Checksum": { - "Data1": 7586323386220535402, - "Data2": 4788683650409979282, - "Data3": -6358873414493356091, - "Data4": 2239767098929480704 + "Data1": 246279719054437229, + "Data2": 7573318383086520663 }, "Flags": 3, "Kind": 3, @@ -69547,10 +67139,8 @@ }, { "__Checksum": { - "Data1": 618024293970553724, - "Data2": -5075146530643214687, - "Data3": -5677847930518320496, - "Data4": 2159655223787008287 + "Data1": -4151277715523841059, + "Data2": -8250950209312611650 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Export.Excel.GridExcelExport", @@ -69566,10 +67156,8 @@ }, { "__Checksum": { - "Data1": -3542886877249444999, - "Data2": -900165836839345831, - "Data3": 4889694339153280429, - "Data4": 6891913232134260441 + "Data1": -5246907741006684349, + "Data2": 7146522777765618921 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Export.Excel.GridExcelExport", @@ -69585,10 +67173,8 @@ }, { "__Checksum": { - "Data1": -5783995945636189305, - "Data2": -2589313486184104686, - "Data3": 4915527436001610446, - "Data4": -454071832246623941 + "Data1": -3057521577116188660, + "Data2": -3138334783267429069 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupCellSpacerBase", @@ -69613,10 +67199,8 @@ }, { "__Checksum": { - "Data1": -5518811879507925198, - "Data2": 141025376863468802, - "Data3": -3504516351921555863, - "Data4": -4623962277132124140 + "Data1": 4962491617004311483, + "Data2": 1389703435869197687 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupCellSpacerBase", @@ -69641,10 +67225,8 @@ }, { "__Checksum": { - "Data1": -1426266173911618667, - "Data2": 6020421517006358627, - "Data3": -2180370324997696507, - "Data4": -8741279856748051781 + "Data1": -7500890616674334979, + "Data2": -3242194627801653036 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupFooter", @@ -69707,10 +67289,8 @@ }, { "__Checksum": { - "Data1": -7005380498768333467, - "Data2": -2034106942437038820, - "Data3": 4392609786242980590, - "Data4": -6192538292430181123 + "Data1": -7203606611657555380, + "Data2": -7841897598839129690 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupFooter", @@ -69773,10 +67353,8 @@ }, { "__Checksum": { - "Data1": 5318720034342127505, - "Data2": -8060585276706667915, - "Data3": 544367041070496353, - "Data4": 7704847129960370991 + "Data1": 7244434327543661435, + "Data2": 986736376097699389 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupFooterCell", @@ -69850,10 +67428,8 @@ }, { "__Checksum": { - "Data1": -1685183399450986411, - "Data2": -5607477007836731518, - "Data3": 1613142019609902684, - "Data4": 7744809174416136254 + "Data1": -3044571117085000674, + "Data2": -2567611836213446168 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupFooterCell", @@ -69927,10 +67503,8 @@ }, { "__Checksum": { - "Data1": 6076557537060325943, - "Data2": 32315078403130303, - "Data3": 3161576633528415210, - "Data4": -180931766269377248 + "Data1": 8876178780956832224, + "Data2": -7575587163385991422 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupHeader", @@ -70032,10 +67606,8 @@ }, { "__Checksum": { - "Data1": 8274344960597648385, - "Data2": -2571932382872165539, - "Data3": -5674416207134177349, - "Data4": 6675742677021785624 + "Data1": -31603840055212832, + "Data2": -1486298447155705162 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupHeader", @@ -70137,10 +67709,8 @@ }, { "__Checksum": { - "Data1": -5941480043326654787, - "Data2": -5195027942528047041, - "Data3": 1313004086346821265, - "Data4": -7686388206099535815 + "Data1": -585701002887858371, + "Data2": -3033010177376096314 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupHeaderCell", @@ -70246,10 +67816,8 @@ }, { "__Checksum": { - "Data1": -6646456139589759523, - "Data2": -8865904048081020257, - "Data3": -1643762572411213618, - "Data4": -1032389908663255252 + "Data1": -3552425343417359413, + "Data2": 6268516681983308513 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupHeaderCell", @@ -70355,10 +67923,8 @@ }, { "__Checksum": { - "Data1": -1151597523222360585, - "Data2": 3978431310100594168, - "Data3": -1467604548657609440, - "Data4": 4822231689256350199 + "Data1": -5695730034875517704, + "Data2": 3681874362645382913 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupIndicatorBase", @@ -70403,10 +67969,8 @@ }, { "__Checksum": { - "Data1": -3697882846422907304, - "Data2": -4544418556683743999, - "Data3": 8542508589574910789, - "Data4": 2560297473357773349 + "Data1": -6164430326715262358, + "Data2": -624958123149296333 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupIndicatorBase", @@ -70451,10 +68015,8 @@ }, { "__Checksum": { - "Data1": 651750497380480576, - "Data2": 162743498210458851, - "Data3": 6639640143142134804, - "Data4": 965638725645631635 + "Data1": 4376989258037552260, + "Data2": -5763384173248467501 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupPanel", @@ -70522,10 +68084,8 @@ }, { "__Checksum": { - "Data1": -3805447601676862211, - "Data2": 3131833945088491483, - "Data3": -3322097179270419573, - "Data4": 6637419541799460602 + "Data1": -3452398479500124693, + "Data2": -7063541264063581674 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupPanel", @@ -70593,10 +68153,8 @@ }, { "__Checksum": { - "Data1": -3481864587630680, - "Data2": 2550485644574117270, - "Data3": -4403808044488490070, - "Data4": 5462327414308897398 + "Data1": 524723747712903997, + "Data2": -4381040463892572801 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupCellSpacer", @@ -70621,10 +68179,8 @@ }, { "__Checksum": { - "Data1": -6955667048559322844, - "Data2": 29026899999946888, - "Data3": 2322172472928545337, - "Data4": -8437268005491727569 + "Data1": 8503326385182459685, + "Data2": 7398239976546428654 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupCellSpacer", @@ -70649,10 +68205,8 @@ }, { "__Checksum": { - "Data1": -2081927988930367692, - "Data2": -7164408217721725858, - "Data3": 7605845271898168030, - "Data4": -1462843988424547488 + "Data1": -4278155126974339875, + "Data2": 5633773597745802593 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupIndicator", @@ -70696,10 +68250,8 @@ }, { "__Checksum": { - "Data1": -529728403337281181, - "Data2": 8776943459992529040, - "Data3": -385190204546132963, - "Data4": 8726260625386707932 + "Data1": 3058852985435939701, + "Data2": 3091962735626997237 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Grid.Grouping.GroupIndicator", @@ -70743,10 +68295,8 @@ }, { "__Checksum": { - "Data1": 658114010367779920, - "Data2": -8940483707058597375, - "Data3": 2888173199650566684, - "Data4": 8048528162427753880 + "Data1": 627337296152076665, + "Data2": -4561370765429362877 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ListView.ListViewItem", @@ -70826,10 +68376,8 @@ }, { "__Checksum": { - "Data1": -1887703090026421685, - "Data2": -4575312729979469827, - "Data3": 5098562229292352820, - "Data4": -7749824904979991129 + "Data1": -6520361859121451706, + "Data2": -1639347334346495439 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ListView.ListViewItem", @@ -70909,10 +68457,8 @@ }, { "__Checksum": { - "Data1": -599830829435757254, - "Data2": -7271078372521928667, - "Data3": 4296186816876029951, - "Data4": -2433316515947051109 + "Data1": -6642204183533980767, + "Data2": 55532088516617469 }, "Flags": 1, "Kind": 3, @@ -70941,10 +68487,8 @@ }, { "__Checksum": { - "Data1": 9039313882214637185, - "Data2": -5192768372035743872, - "Data3": -425106705163948346, - "Data4": 4089727351124475472 + "Data1": -694693793700330069, + "Data2": -561184188232684521 }, "Flags": 3, "Kind": 3, @@ -70973,10 +68517,8 @@ }, { "__Checksum": { - "Data1": -19028482768859199, - "Data2": 7966214204617036500, - "Data3": 2765777236575444926, - "Data4": -8656302509778763938 + "Data1": 5845186346038793644, + "Data2": 5050888744700950166 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Menu.MenuItem", @@ -71102,10 +68644,8 @@ }, { "__Checksum": { - "Data1": 2971570633213816752, - "Data2": 8813537634119107281, - "Data3": -3814323098002793721, - "Data4": 158792243957372529 + "Data1": 7850153727840964029, + "Data2": -888646086166516431 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Menu.MenuItem", @@ -71231,10 +68771,8 @@ }, { "__Checksum": { - "Data1": -7857038482738701731, - "Data2": 7036680513028387914, - "Data3": -4908564074685027175, - "Data4": 8459896262824223738 + "Data1": 8203740921682797227, + "Data2": 1108617342962027586 }, "Flags": 1, "Name": "Telerik.Blazor.Components.MultiSelect.Tag", @@ -71284,10 +68822,8 @@ }, { "__Checksum": { - "Data1": 5799050539185755973, - "Data2": -8406209614462693039, - "Data3": -9025388088352949113, - "Data4": -3276102172274231186 + "Data1": -1351112929113256240, + "Data2": -6701509793955305475 }, "Flags": 3, "Name": "Telerik.Blazor.Components.MultiSelect.Tag", @@ -71337,10 +68873,8 @@ }, { "__Checksum": { - "Data1": -3824887299748944829, - "Data2": -6863080775854184309, - "Data3": 3873736583051398667, - "Data4": -3460016687544255838 + "Data1": -525274704347090127, + "Data2": -4158469456883438104 }, "Flags": 1, "Name": "Telerik.Blazor.Components.MultiSelect.TagList", @@ -71383,10 +68917,8 @@ }, { "__Checksum": { - "Data1": -3838569180958314706, - "Data2": 7113588429861668681, - "Data3": -8468940812771127901, - "Data4": 5227868367091803540 + "Data1": -951279069334819495, + "Data2": 3838185183369661112 }, "Flags": 3, "Name": "Telerik.Blazor.Components.MultiSelect.TagList", @@ -71429,10 +68961,8 @@ }, { "__Checksum": { - "Data1": 1012995991778021979, - "Data2": 2819095869424041640, - "Data3": 5098736270504041627, - "Data4": 1451660950660622415 + "Data1": -5657094927651207756, + "Data2": -7333350785834752674 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Pager.PagerButton", @@ -71496,10 +69026,8 @@ }, { "__Checksum": { - "Data1": 1118293924464326145, - "Data2": 4554358699230494996, - "Data3": -6244101515390100307, - "Data4": 6892171587397613893 + "Data1": -7839107193934355052, + "Data2": -5867053094453001113 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Pager.PagerButton", @@ -71563,10 +69091,8 @@ }, { "__Checksum": { - "Data1": 5185610304023416283, - "Data2": 4460030953210558307, - "Data3": 7901835323369137427, - "Data4": 7432031334199710515 + "Data1": 4080797281652542260, + "Data2": -7457182628648527944 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Pager.PagerListBase", @@ -71645,10 +69171,8 @@ }, { "__Checksum": { - "Data1": 77286755494903020, - "Data2": -1940410193686389200, - "Data3": -3377705631445201395, - "Data4": 4383026083858091698 + "Data1": -7419788889927032929, + "Data2": -1873639478598949717 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Pager.PagerListBase", @@ -71727,10 +69251,8 @@ }, { "__Checksum": { - "Data1": -2236279961642330817, - "Data2": -5176845073545825542, - "Data3": 8846176233484755025, - "Data4": 6650148808823178152 + "Data1": 5317824237088828985, + "Data2": -6065126741890679263 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Pager.PagerMoreButton", @@ -71773,10 +69295,8 @@ }, { "__Checksum": { - "Data1": -4085641194268832304, - "Data2": -7721087761616936696, - "Data3": -8422614790094919084, - "Data4": -6882509781461030545 + "Data1": -549065721299340083, + "Data2": -783290253005770762 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Pager.PagerMoreButton", @@ -71819,10 +69339,8 @@ }, { "__Checksum": { - "Data1": 5717158863286997591, - "Data2": -3126526218635122626, - "Data3": 5726305338742703545, - "Data4": 3456765397964188016 + "Data1": -5426841216589239409, + "Data2": 3702236995448158055 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Pager.PagerNumberButtonBase", @@ -71872,10 +69390,8 @@ }, { "__Checksum": { - "Data1": -5939661843511570603, - "Data2": 6428441269988819709, - "Data3": 8472875557467141068, - "Data4": -7137683472137353831 + "Data1": -5227743380940021400, + "Data2": -6049426008198500460 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Pager.PagerNumberButtonBase", @@ -71925,10 +69441,8 @@ }, { "__Checksum": { - "Data1": 4842307566046847465, - "Data2": 6119538377742666165, - "Data3": 6473128423170812891, - "Data4": -6744061411212862793 + "Data1": -4970387688752356897, + "Data2": 3399219293764303373 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Pager.PagerList", @@ -72007,10 +69521,8 @@ }, { "__Checksum": { - "Data1": -8956178627248980002, - "Data2": 8169257293696268179, - "Data3": 4313038059241630030, - "Data4": -7832579605559943445 + "Data1": 1999213779108475136, + "Data2": -3380879002445693553 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Pager.PagerList", @@ -72089,10 +69601,8 @@ }, { "__Checksum": { - "Data1": -403165553433789915, - "Data2": 5277375405563356674, - "Data3": 3276608288975449078, - "Data4": -8959963254075824196 + "Data1": 8635583015301626216, + "Data2": 2699535413563151053 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Pager.PagerNumberButton", @@ -72142,10 +69652,8 @@ }, { "__Checksum": { - "Data1": 7807372988033514961, - "Data2": 456643422728426141, - "Data3": -4067589437349474075, - "Data4": 5515785819030109615 + "Data1": 2442701073661574439, + "Data2": -6268011157364119652 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Pager.PagerNumberButton", @@ -72195,10 +69703,8 @@ }, { "__Checksum": { - "Data1": -8822902631126543481, - "Data2": -139277934658844567, - "Data3": 4662190154524540671, - "Data4": -7032632084426790449 + "Data1": -8694864141154975895, + "Data2": -1562982874445184740 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Popup.TelerikPopup", @@ -72413,10 +69919,8 @@ }, { "__Checksum": { - "Data1": -6145860321507207650, - "Data2": -7114036150392344624, - "Data3": -1293228128504242315, - "Data4": 4197714029628340153 + "Data1": -6713195932321352384, + "Data2": -216214787715926190 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Popup.TelerikPopup", @@ -72631,10 +70135,8 @@ }, { "__Checksum": { - "Data1": 2729350677609017065, - "Data2": -7531943245458097366, - "Data3": -9043208749690349457, - "Data4": 7672045520440577427 + "Data1": -7996915962729471090, + "Data2": 2143421688125660884 }, "Flags": 1, "Kind": 3, @@ -72652,10 +70154,8 @@ }, { "__Checksum": { - "Data1": -4576520109685726433, - "Data2": 97684506834390339, - "Data3": 2136675140934106746, - "Data4": 4462442763032743740 + "Data1": 5971581815055042861, + "Data2": 4579178472813684730 }, "Flags": 3, "Kind": 3, @@ -72673,10 +70173,8 @@ }, { "__Checksum": { - "Data1": -466755630855257599, - "Data2": 5609557792569287436, - "Data3": -3151341729896229011, - "Data4": 2597467292220503797 + "Data1": 159798138586620688, + "Data2": -1299062802921980377 }, "Flags": 1, "Name": "Telerik.Blazor.Components.RootComponent.TelerikFragmentContainer", @@ -72705,10 +70203,8 @@ }, { "__Checksum": { - "Data1": 3875384845169725550, - "Data2": 1589766050100454296, - "Data3": 5206888247371974676, - "Data4": 8997441696366012776 + "Data1": 6246076078204683000, + "Data2": 1957748229601906855 }, "Flags": 3, "Name": "Telerik.Blazor.Components.RootComponent.TelerikFragmentContainer", @@ -72737,10 +70233,8 @@ }, { "__Checksum": { - "Data1": -6421231583240629546, - "Data2": -8474663421163478723, - "Data3": 6131550235152376428, - "Data4": 5695955054611760406 + "Data1": 2098334508633743001, + "Data2": 6022405491733705776 }, "Flags": 1, "Kind": 3, @@ -72758,10 +70252,8 @@ }, { "__Checksum": { - "Data1": -6377136007432003881, - "Data2": -2034435676259687721, - "Data3": 113467589746122289, - "Data4": 3305002695988560914 + "Data1": 7331690743465877187, + "Data2": -8529716712283543274 }, "Flags": 3, "Kind": 3, @@ -72779,10 +70271,8 @@ }, { "__Checksum": { - "Data1": -9076090146723728210, - "Data2": 4203233382238401923, - "Data3": 7806221476298424375, - "Data4": -1061610699292416596 + "Data1": 7672217291647468557, + "Data2": -1064150571906109930 }, "Flags": 1, "Name": "Telerik.Blazor.Components.RootComponent.TelerikRootComponentFragment", @@ -72812,10 +70302,8 @@ }, { "__Checksum": { - "Data1": 6388634120180209644, - "Data2": -7954996013581435525, - "Data3": 5747813673092121088, - "Data4": 1999246617900662528 + "Data1": 6412396032514911228, + "Data2": 5985277947457253899 }, "Flags": 3, "Name": "Telerik.Blazor.Components.RootComponent.TelerikRootComponentFragment", @@ -72845,10 +70333,8 @@ }, { "__Checksum": { - "Data1": -7107889444481403948, - "Data2": -7818093935681549485, - "Data3": -134926271750811689, - "Data4": 3557089956424410977 + "Data1": 5159369195514226808, + "Data2": -4551229172862248637 }, "Flags": 1, "Kind": 3, @@ -72866,10 +70352,8 @@ }, { "__Checksum": { - "Data1": 2560208718578021357, - "Data2": 4063767192859862060, - "Data3": 4919375867971740362, - "Data4": -3344140095700607277 + "Data1": 4092941978595008956, + "Data2": -3618295024232209123 }, "Flags": 3, "Kind": 3, @@ -72887,10 +70371,8 @@ }, { "__Checksum": { - "Data1": 1872049204025671071, - "Data2": 4158885542929277507, - "Data3": -3389855106374509965, - "Data4": 4944750003362757719 + "Data1": 6725986822041852841, + "Data2": 2467017437978829764 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.RecurrenceDialog", @@ -72992,10 +70474,8 @@ }, { "__Checksum": { - "Data1": 287692429222828178, - "Data2": 6109993720717387980, - "Data3": -3140287508939808635, - "Data4": -3904342483171884176 + "Data1": -7891231558237476968, + "Data2": -9188393605685857984 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.RecurrenceDialog", @@ -73097,10 +70577,8 @@ }, { "__Checksum": { - "Data1": 7675162440205477972, - "Data2": -9187038844926319308, - "Data3": -2159536061346179787, - "Data4": -1871698233557499553 + "Data1": 3294872976744999157, + "Data2": 3522083214914189004 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerEditForm", @@ -73172,10 +70650,8 @@ }, { "__Checksum": { - "Data1": 981376092993831716, - "Data2": -2190141208624874351, - "Data3": 4045563488507653542, - "Data4": -7803969162878418462 + "Data1": 8490653746963924116, + "Data2": -5526138411359958928 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerEditForm", @@ -73247,10 +70723,8 @@ }, { "__Checksum": { - "Data1": -8846861238337787118, - "Data2": 7638363566256180416, - "Data3": -5960926502897412225, - "Data4": 5608217665102717952 + "Data1": 2241296053638720093, + "Data2": 2381926984041864847 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerFooter", @@ -73286,10 +70760,8 @@ }, { "__Checksum": { - "Data1": 2901985253827855541, - "Data2": 5218703312379863453, - "Data3": 574195121079364034, - "Data4": 8525511484384170085 + "Data1": -8921514455224554659, + "Data2": 9184382763510341578 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerFooter", @@ -73325,10 +70797,8 @@ }, { "__Checksum": { - "Data1": 5331237825829923272, - "Data2": 57414627018775295, - "Data3": -356658259206105043, - "Data4": 5278726542309790446 + "Data1": 3047713332647356156, + "Data2": -4901342867060630793 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerToolbar", @@ -73422,10 +70892,8 @@ }, { "__Checksum": { - "Data1": 5389546145406850835, - "Data2": 6499471159288160698, - "Data3": 1896998356105528218, - "Data4": 7698512237200857692 + "Data1": 5432964534632280003, + "Data2": 2800351533473148161 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerToolbar", @@ -73519,10 +70987,8 @@ }, { "__Checksum": { - "Data1": 1349335388340335010, - "Data2": 8769429135432023392, - "Data3": 749289714321773890, - "Data4": -3764620638757728145 + "Data1": 6551264309541968082, + "Data2": 7603502593265061619 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerToolbarButton", @@ -73565,10 +71031,8 @@ }, { "__Checksum": { - "Data1": 5386424985189835220, - "Data2": 4732839219269436379, - "Data3": -1991163611977179125, - "Data4": -3744702222727492990 + "Data1": -7285705959922332977, + "Data2": -905676712519645901 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerToolbarButton", @@ -73611,10 +71075,8 @@ }, { "__Checksum": { - "Data1": -4282469706133373008, - "Data2": -6802799387968572247, - "Data3": -4608995540803199034, - "Data4": -2254583883456607516 + "Data1": 6222533260014844186, + "Data2": -3385435332259771840 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerToolbarCalendar", @@ -73650,10 +71112,8 @@ }, { "__Checksum": { - "Data1": -426272082640609703, - "Data2": 9077808231418246256, - "Data3": 3005447811891741847, - "Data4": 8798018973124244471 + "Data1": -1716570610785910773, + "Data2": 5968557437937603936 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.SchedulerToolbarCalendar", @@ -73689,10 +71149,8 @@ }, { "__Checksum": { - "Data1": 4653391329127282032, - "Data2": 5701330295978859646, - "Data3": 4507359489455724581, - "Data4": -791968533204924643 + "Data1": 1299048440680110984, + "Data2": 821717720352986187 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.ByDayEditor", @@ -73724,10 +71182,8 @@ }, { "__Checksum": { - "Data1": -187437156975703520, - "Data2": 1369243552038468528, - "Data3": -1548653334668722791, - "Data4": 7780395881270903199 + "Data1": 7893372930241903491, + "Data2": 1017345554960088833 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.ByDayEditor", @@ -73759,10 +71215,8 @@ }, { "__Checksum": { - "Data1": 5330178040771327207, - "Data2": 3285738647588432504, - "Data3": 3134336836123769079, - "Data4": -7356595473268078225 + "Data1": 1771973995667964490, + "Data2": 7918304938892293910 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.ByMonthDayEditor", @@ -73794,10 +71248,8 @@ }, { "__Checksum": { - "Data1": -3140188677084976420, - "Data2": -8440059762733757348, - "Data3": -8195054191294190346, - "Data4": -7657643308275831852 + "Data1": -1068969161311889419, + "Data2": 2788263595289151161 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.ByMonthDayEditor", @@ -73829,10 +71281,8 @@ }, { "__Checksum": { - "Data1": 1505507721506960738, - "Data2": -6085115071599981707, - "Data3": -3314942902415700650, - "Data4": 5356998653538302106 + "Data1": -748769030080490082, + "Data2": -2103919133284084085 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.ByMonthEditor", @@ -73864,10 +71314,8 @@ }, { "__Checksum": { - "Data1": -1939255075408872497, - "Data2": -8305355574156035550, - "Data3": 4808380173407988476, - "Data4": -3255258164640750595 + "Data1": -2465465689781051896, + "Data2": -6617983776276938779 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.ByMonthEditor", @@ -73899,10 +71347,8 @@ }, { "__Checksum": { - "Data1": 3766175580913919103, - "Data2": -4310277597292884710, - "Data3": 9079191697287068199, - "Data4": 2841490110833949798 + "Data1": -9081933759172330102, + "Data2": 9207632765865563329 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.BySetPositionEditor", @@ -73934,10 +71380,8 @@ }, { "__Checksum": { - "Data1": -9196089594146462882, - "Data2": 2242381381998908696, - "Data3": -4443738342982929304, - "Data4": 7605165047176057112 + "Data1": -4243266070944359755, + "Data2": -2546480536544314377 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.BySetPositionEditor", @@ -73969,10 +71413,8 @@ }, { "__Checksum": { - "Data1": -6598472346059775721, - "Data2": 687939641529155654, - "Data3": 7667058578971787630, - "Data4": 4785003310260945670 + "Data1": 4920448984165223053, + "Data2": 811241875415043315 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.ToggleButton", @@ -74026,10 +71468,8 @@ }, { "__Checksum": { - "Data1": 4408561462455511217, - "Data2": -3302488785846305390, - "Data3": 4260250972302457807, - "Data4": 224496245384108732 + "Data1": 1826791942058392580, + "Data2": -8827549097952405887 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.ToggleButton", @@ -74083,10 +71523,8 @@ }, { "__Checksum": { - "Data1": 6389306123009108517, - "Data2": -3962557603497064715, - "Data3": 3411108486892917482, - "Data4": 7011339873409436099 + "Data1": 5606932592519313388, + "Data2": -9173098698251130332 }, "Flags": 1, "Kind": 3, @@ -74104,10 +71542,8 @@ }, { "__Checksum": { - "Data1": 1620366028461968925, - "Data2": 9179543050453783635, - "Data3": 803949168587781339, - "Data4": 4956717594131383331 + "Data1": 6945805404334721656, + "Data2": -2438788279392853118 }, "Flags": 3, "Kind": 3, @@ -74125,10 +71561,8 @@ }, { "__Checksum": { - "Data1": -6504972131494080385, - "Data2": -7991297131701790097, - "Data3": -4597238009022747018, - "Data4": -4356427043637445789 + "Data1": -2605215460160548935, + "Data2": -3904937883969700691 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceEditor", @@ -74171,10 +71605,8 @@ }, { "__Checksum": { - "Data1": -1380604394475448200, - "Data2": -3193777000908974669, - "Data3": -7880824400942244140, - "Data4": 4140707897610215837 + "Data1": -1191312733910585713, + "Data2": 3015332858913245762 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceEditor", @@ -74217,10 +71649,8 @@ }, { "__Checksum": { - "Data1": -7119376570438534894, - "Data2": -8125843376152275310, - "Data3": -2214259376249181579, - "Data4": 876465526313008216 + "Data1": -8240835298936832661, + "Data2": -23217986925608933 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceEndEditor", @@ -74252,10 +71682,8 @@ }, { "__Checksum": { - "Data1": -2363596906076845616, - "Data2": -934499456090540472, - "Data3": -6485769903473147090, - "Data4": 2076607579861510039 + "Data1": -8479657447573187233, + "Data2": -5345007752023586768 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceEndEditor", @@ -74287,10 +71715,8 @@ }, { "__Checksum": { - "Data1": -1204992645452115184, - "Data2": 5033367283990346469, - "Data3": 8799140136112016109, - "Data4": -1802728928017424691 + "Data1": 8917390597271564564, + "Data2": 5341471059302163644 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceFrequencyEditor", @@ -74326,10 +71752,8 @@ }, { "__Checksum": { - "Data1": 8040816450332370323, - "Data2": 3311786578468260276, - "Data3": -3689475006218517416, - "Data4": 6681080438588294840 + "Data1": 4933932998557463691, + "Data2": 2302710232107695298 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceFrequencyEditor", @@ -74365,10 +71789,8 @@ }, { "__Checksum": { - "Data1": 5067991240287445702, - "Data2": -3077861938598150459, - "Data3": -4643368940080713193, - "Data4": 1096248313352402529 + "Data1": 6900782386806839710, + "Data2": 4097986242301969854 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceIntervalEditor", @@ -74393,10 +71815,8 @@ }, { "__Checksum": { - "Data1": 4879928971985704406, - "Data2": 8135439505799675246, - "Data3": 5402009859240744921, - "Data4": 6877832766690699944 + "Data1": -9182805463182506155, + "Data2": 422410163689225817 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceIntervalEditor", @@ -74421,10 +71841,8 @@ }, { "__Checksum": { - "Data1": -8453489408111340642, - "Data2": -3711883051025894025, - "Data3": 1471173504028173829, - "Data4": -4157430479761659639 + "Data1": -7048993823687652690, + "Data2": -5926296661098177320 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceMonthlyEditor", @@ -74449,10 +71867,8 @@ }, { "__Checksum": { - "Data1": 5291055266234554134, - "Data2": -5296369060223014969, - "Data3": -7345571954590845957, - "Data4": -2860282025610132954 + "Data1": 8117908279276960823, + "Data2": 4673716669732381412 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceMonthlyEditor", @@ -74477,10 +71893,8 @@ }, { "__Checksum": { - "Data1": 7013202911019725760, - "Data2": -4690053598542128570, - "Data3": -4768492942901888828, - "Data4": -3296646766760368394 + "Data1": -4172276124213511772, + "Data2": 7877788825006199676 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceWeeklyEditor", @@ -74505,10 +71919,8 @@ }, { "__Checksum": { - "Data1": -6869105863505278251, - "Data2": 685729243649398141, - "Data3": -8859668396257858933, - "Data4": 1543455697559973242 + "Data1": 1161925602115080091, + "Data2": -4780867892392749829 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceWeeklyEditor", @@ -74533,10 +71945,8 @@ }, { "__Checksum": { - "Data1": -6964803607069732103, - "Data2": -4260017665815264123, - "Data3": -7211993797273081921, - "Data4": 3861229469871377211 + "Data1": 6411764522613722449, + "Data2": -5304852288710160704 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceYearlyEditor", @@ -74561,10 +71971,8 @@ }, { "__Checksum": { - "Data1": -6139128580553380319, - "Data2": -4489386901359958517, - "Data3": -5004298395060420833, - "Data4": 110957394661212630 + "Data1": -7309521124717205054, + "Data2": 5282986948707794208 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.EditForm.RecurrenceEditor.RecurrenceYearlyEditor", @@ -74589,10 +71997,8 @@ }, { "__Checksum": { - "Data1": -6783407641438439093, - "Data2": -1581382161295814528, - "Data3": -3492488348289741915, - "Data4": 7376594166725969342 + "Data1": 447176280425865248, + "Data2": -6103823762987191545 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.DateHeader", @@ -74635,10 +72041,8 @@ }, { "__Checksum": { - "Data1": -4941905729544490448, - "Data2": 5734861146110883987, - "Data3": 3507070128425607887, - "Data4": 9008308979158178141 + "Data1": 3403571690375354576, + "Data2": 86584527653417800 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.DateHeader", @@ -74681,10 +72085,8 @@ }, { "__Checksum": { - "Data1": 3556319554354322381, - "Data2": 9177458111420540460, - "Data3": 4485016940172563567, - "Data4": -1683173016321518618 + "Data1": 5034005428381076178, + "Data2": -1042057089623844716 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.DayAppointment", @@ -74756,10 +72158,8 @@ }, { "__Checksum": { - "Data1": -7339011254187892782, - "Data2": -8781637957194702487, - "Data3": 8363538954160016036, - "Data4": -1978933532212474436 + "Data1": -512292664965793927, + "Data2": -4808431295985206676 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.DayAppointment", @@ -74831,10 +72231,8 @@ }, { "__Checksum": { - "Data1": -7670613199858722424, - "Data2": -5085980656077244611, - "Data3": -3877248875129702659, - "Data4": -7060169568289859765 + "Data1": 3102628426683747864, + "Data2": 4737027028915529070 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.SchedulerContentTable", @@ -74933,10 +72331,8 @@ }, { "__Checksum": { - "Data1": -7776655819855934112, - "Data2": 3034009115143791341, - "Data3": -8120621219157014283, - "Data4": -596918131949996697 + "Data1": 6703234128904938904, + "Data2": 2160489957454302502 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.SchedulerContentTable", @@ -75035,10 +72431,8 @@ }, { "__Checksum": { - "Data1": 4328591181398917260, - "Data2": -7605263563193240910, - "Data3": 1531084849880119072, - "Data4": -6820858153470860470 + "Data1": 6568881075447315671, + "Data2": -5877792180257275133 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.DayView.DayTable", @@ -75137,10 +72531,8 @@ }, { "__Checksum": { - "Data1": 446189739634999948, - "Data2": 8769903990077988482, - "Data3": 2752854667374784848, - "Data4": -1342368859900693375 + "Data1": 4670081009412110505, + "Data2": 7091910385905251448 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.DayView.DayTable", @@ -75239,10 +72631,8 @@ }, { "__Checksum": { - "Data1": 7379662019149800720, - "Data2": -1690912048520851106, - "Data3": -8524703717990090805, - "Data4": -3360984822738093758 + "Data1": -6151718545874245251, + "Data2": -4231845486313801763 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.MonthView.MonthTable", @@ -75341,10 +72731,8 @@ }, { "__Checksum": { - "Data1": -344295187570677577, - "Data2": 6932695669430148555, - "Data3": 4950622292627906832, - "Data4": 2515157758557121334 + "Data1": 4121389685588396769, + "Data2": -2270543869743699630 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Scheduler.Rendering.MonthView.MonthTable", @@ -75443,10 +72831,8 @@ }, { "__Checksum": { - "Data1": -8971999778153259214, - "Data2": -8761139183840727398, - "Data3": 3751608841793343967, - "Data4": -7767339589566984999 + "Data1": 2293486641355557848, + "Data2": 4918201304344417606 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TabStrip.TabContent", @@ -75478,10 +72864,8 @@ }, { "__Checksum": { - "Data1": -8578722074783767787, - "Data2": -3581237370277299896, - "Data3": 922359049569031132, - "Data4": 3605587275184750915 + "Data1": 8917641907220863881, + "Data2": 8441868691941028148 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TabStrip.TabContent", @@ -75513,10 +72897,8 @@ }, { "__Checksum": { - "Data1": 2231795647641448418, - "Data2": -1969536538466935414, - "Data3": -9023202906510006475, - "Data4": 6497534569737791834 + "Data1": -3765982151075196311, + "Data2": -7410793219476977347 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TimePicker.TimeSelectorBase", @@ -75609,10 +72991,8 @@ }, { "__Checksum": { - "Data1": -6443256717345849716, - "Data2": -5873517024483648460, - "Data3": -3091648292147323102, - "Data4": 7834097436588731725 + "Data1": -3978872434351448507, + "Data2": -3981161507851002696 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TimePicker.TimeSelectorBase", @@ -75705,10 +73085,8 @@ }, { "__Checksum": { - "Data1": 2748124136276661725, - "Data2": 7357076027959381831, - "Data3": 3563828980051785655, - "Data4": 2709991706673562848 + "Data1": -7412035049792371379, + "Data2": 6296112180770785173 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TimePicker.TimeSelectorCarouselBase", @@ -75784,10 +73162,8 @@ }, { "__Checksum": { - "Data1": -2274664845420533477, - "Data2": 4790905722942370008, - "Data3": -2557292452073238084, - "Data4": -4275523207263997288 + "Data1": -482008223207780113, + "Data2": 5119779145010947446 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TimePicker.TimeSelectorCarouselBase", @@ -75863,10 +73239,8 @@ }, { "__Checksum": { - "Data1": 3109088414177992982, - "Data2": 3586935070047952029, - "Data3": -1417690433446621941, - "Data4": 6562339626428687041 + "Data1": 2515549196883846442, + "Data2": -400086869785820890 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TimePicker.TimeSelector", @@ -75958,10 +73332,8 @@ }, { "__Checksum": { - "Data1": 502964370277758366, - "Data2": -7675673479025332727, - "Data3": -5576152659814493852, - "Data4": 4666199828077268017 + "Data1": -9046503216750021272, + "Data2": 2475433292697948834 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TimePicker.TimeSelector", @@ -76053,10 +73425,8 @@ }, { "__Checksum": { - "Data1": 8453752042641104010, - "Data2": 2850935499714720275, - "Data3": 8571871772253347495, - "Data4": -2093018092871749461 + "Data1": 3827357555595894920, + "Data2": -2419620677722287971 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TimePicker.TimeSelectorCarousel", @@ -76131,10 +73501,8 @@ }, { "__Checksum": { - "Data1": -5292925881551815382, - "Data2": 3463964332992256179, - "Data3": -6607235268445258541, - "Data4": -1892943009994582741 + "Data1": -2660808557457375281, + "Data2": 4232477112637059773 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TimePicker.TimeSelectorCarousel", @@ -76209,10 +73577,8 @@ }, { "__Checksum": { - "Data1": 507378441055764179, - "Data2": -4893938128041709387, - "Data3": 1840228497788710264, - "Data4": -4280313742136254364 + "Data1": -5594774974337356652, + "Data2": 4288957939493962413 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarButtonBase", @@ -76315,10 +73681,8 @@ }, { "__Checksum": { - "Data1": 1341327307407609860, - "Data2": -9152407534365371673, - "Data3": 99891035719712312, - "Data4": 1794701353516235143 + "Data1": 3052656480924566400, + "Data2": -7584949326420168585 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarButtonBase", @@ -76421,10 +73785,8 @@ }, { "__Checksum": { - "Data1": -842676432896734193, - "Data2": 1242396357295051266, - "Data3": 6653809164443727328, - "Data4": 427549222149874139 + "Data1": -1676895403827149925, + "Data2": 937366243730170723 }, "Flags": 1, "Kind": 3, @@ -76442,10 +73804,8 @@ }, { "__Checksum": { - "Data1": -8097681573635559976, - "Data2": 3665788892900850406, - "Data3": -8969911961708599981, - "Data4": 629722658636191447 + "Data1": 1802360429497601442, + "Data2": -3832496695041305282 }, "Flags": 3, "Kind": 3, @@ -76463,10 +73823,8 @@ }, { "__Checksum": { - "Data1": 6502371934252491332, - "Data2": -3333751119334675947, - "Data3": 6079254211537754097, - "Data4": 587753707746222410 + "Data1": -8594631638477463326, + "Data2": 8287890598466466067 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarItemBase", @@ -76491,10 +73849,8 @@ }, { "__Checksum": { - "Data1": 7325767622894272150, - "Data2": -5068024426030023273, - "Data3": 5961054708954848329, - "Data4": 3002808352127649161 + "Data1": -8075298341414060989, + "Data2": 8955210305328764487 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarItemBase", @@ -76519,10 +73875,8 @@ }, { "__Checksum": { - "Data1": 6131717327319962399, - "Data2": 5001257031583928449, - "Data3": 2606014046097648855, - "Data4": 4347878514800093346 + "Data1": 6877564316628024638, + "Data2": -2446792055057813568 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarButtonGroup", @@ -76586,10 +73940,8 @@ }, { "__Checksum": { - "Data1": 8952948516533143413, - "Data2": 8624883816863749213, - "Data3": 5446809679679656444, - "Data4": 5541031620758221053 + "Data1": -7534645530132536916, + "Data2": -5018745531588187406 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarButtonGroup", @@ -76653,10 +74005,8 @@ }, { "__Checksum": { - "Data1": -516702762325909737, - "Data2": 8809350244675179092, - "Data3": -2744754123548654792, - "Data4": 1067263589455487388 + "Data1": -6410673444944903654, + "Data2": -8699387834293018677 }, "Flags": 1, "Kind": 3, @@ -76674,10 +74024,8 @@ }, { "__Checksum": { - "Data1": 2297375569993510883, - "Data2": 2492643391929835062, - "Data3": 6835916410863170252, - "Data4": 2399318766926708529 + "Data1": 6518146908248882444, + "Data2": 3763321209541941976 }, "Flags": 3, "Kind": 3, @@ -76695,10 +74043,8 @@ }, { "__Checksum": { - "Data1": -4482520181522102324, - "Data2": -1749021367495057813, - "Data3": 6532542218316824696, - "Data4": 8207122665091428052 + "Data1": 1888345887484792778, + "Data2": 7173117984587225452 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarTemplateItem", @@ -76734,10 +74080,8 @@ }, { "__Checksum": { - "Data1": 1306699386197581214, - "Data2": -3762078815947355144, - "Data3": 2086563199513410640, - "Data4": 3788967430857681641 + "Data1": -4120692229779897509, + "Data2": 1597071916319819053 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarTemplateItem", @@ -76773,10 +74117,8 @@ }, { "__Checksum": { - "Data1": -4233657095189292450, - "Data2": -453510935766610841, - "Data3": -4885248116517723339, - "Data4": 8449844333157663577 + "Data1": -8181269119495451448, + "Data2": 477585557240824834 }, "Flags": 1, "Kind": 3, @@ -76794,10 +74136,8 @@ }, { "__Checksum": { - "Data1": 5754303559915345659, - "Data2": 6386607572419685173, - "Data3": -1586103413221216572, - "Data4": -1944091097683873740 + "Data1": -7681747940434423893, + "Data2": -7871701547840690348 }, "Flags": 3, "Kind": 3, @@ -76815,10 +74155,8 @@ }, { "__Checksum": { - "Data1": -4396532758464394161, - "Data2": -5355261790039168783, - "Data3": -1761580399739917414, - "Data4": 4351958939148273987 + "Data1": -388427328263652484, + "Data2": -6980351790127199659 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarToggleButton", @@ -76940,10 +74278,8 @@ }, { "__Checksum": { - "Data1": 6947589037768975039, - "Data2": 8292317624420229153, - "Data3": 1936145886645584803, - "Data4": 5605353532379309488 + "Data1": 2991336244655026141, + "Data2": -1362003086491982889 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarToggleButton", @@ -77065,10 +74401,8 @@ }, { "__Checksum": { - "Data1": -9121863566920138117, - "Data2": 7636375552006032789, - "Data3": -1546588249519308256, - "Data4": -6299812904796060138 + "Data1": -3297474468933462351, + "Data2": -4417932925770673880 }, "Flags": 1, "Kind": 3, @@ -77086,10 +74420,8 @@ }, { "__Checksum": { - "Data1": -6043797138167640932, - "Data2": 4604452489812249680, - "Data3": -8418513588152392275, - "Data4": 9012482522089959465 + "Data1": 2571502010094689136, + "Data2": 8073613348208700661 }, "Flags": 3, "Kind": 3, @@ -77107,10 +74439,8 @@ }, { "__Checksum": { - "Data1": 6854196324673115792, - "Data2": 6578884867693351736, - "Data3": 635576324790949955, - "Data4": 3882006725152194638 + "Data1": -6873843806947332111, + "Data2": -8629566301964342795 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ToolBar.TelerikToolBar", @@ -77147,10 +74477,8 @@ }, { "__Checksum": { - "Data1": 7558128592210441334, - "Data2": 1135472701073588190, - "Data3": -8153794268608741303, - "Data4": -1619410321716773102 + "Data1": 1550893771943148144, + "Data2": 1303762390425033212 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ToolBar.TelerikToolBar", @@ -77187,10 +74515,8 @@ }, { "__Checksum": { - "Data1": -1678094432865465151, - "Data2": -1187416913908172841, - "Data3": -8101365400150323339, - "Data4": 8884950059319244029 + "Data1": -4091332157109951088, + "Data2": -268488884502341075 }, "Flags": 1, "Kind": 3, @@ -77208,10 +74534,8 @@ }, { "__Checksum": { - "Data1": 4375655906039895341, - "Data2": -3364430666260092721, - "Data3": -4632264552971959738, - "Data4": 1688459437284848409 + "Data1": 1752080101880591732, + "Data2": -1980899918713398472 }, "Flags": 3, "Kind": 3, @@ -77229,10 +74553,8 @@ }, { "__Checksum": { - "Data1": 7992643148393462268, - "Data2": 763645093342309997, - "Data3": 1777943311129670823, - "Data4": 2498549647866566033 + "Data1": -900188577834759195, + "Data2": -4624324302716977574 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarButton", @@ -77335,10 +74657,8 @@ }, { "__Checksum": { - "Data1": -524545661827124709, - "Data2": 5246050779559919392, - "Data3": -6843416738951819730, - "Data4": -6643581524088151292 + "Data1": 8040275149655946128, + "Data2": -7644790741756986380 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarButton", @@ -77441,10 +74761,8 @@ }, { "__Checksum": { - "Data1": 4277659885362586839, - "Data2": 5036985282169591708, - "Data3": -1521430641678566545, - "Data4": -3029433618773079518 + "Data1": -6582348198217923692, + "Data2": -6498841006204863552 }, "Flags": 1, "Kind": 3, @@ -77462,10 +74780,8 @@ }, { "__Checksum": { - "Data1": -5640174488199011013, - "Data2": -546868175874223188, - "Data3": 4222162091412595338, - "Data4": -5863470140266604679 + "Data1": -2665980137959998304, + "Data2": 527207740535976916 }, "Flags": 3, "Kind": 3, @@ -77483,10 +74799,8 @@ }, { "__Checksum": { - "Data1": 6770747635722856916, - "Data2": 4973373000092416015, - "Data3": -563937504391793745, - "Data4": -2494124878608003367 + "Data1": -8146840040698107858, + "Data2": -614439602673553057 }, "Flags": 1, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarToolsFactory", @@ -77511,10 +74825,8 @@ }, { "__Checksum": { - "Data1": 8825878723807597642, - "Data2": -2789646229814323752, - "Data3": 6773964413506688710, - "Data4": 8037093172741583217 + "Data1": -5441887583312296637, + "Data2": 2871458609188707894 }, "Flags": 3, "Name": "Telerik.Blazor.Components.ToolBar.ToolBarToolsFactory", @@ -77539,10 +74851,8 @@ }, { "__Checksum": { - "Data1": -3282466173887691116, - "Data2": -2292175813638084334, - "Data3": -5039323453104514, - "Data4": 5348405291794156350 + "Data1": -3361306393542157067, + "Data2": -3073757941552807637 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListCheckBoxCell", @@ -77633,10 +74943,8 @@ }, { "__Checksum": { - "Data1": 6096893960153752225, - "Data2": -2972939830961467424, - "Data3": 3636387510101896260, - "Data4": 8157823668163027178 + "Data1": -5447014946937086299, + "Data2": -8376946715150923145 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListCheckBoxCell", @@ -77727,10 +75035,8 @@ }, { "__Checksum": { - "Data1": 8656399845555091796, - "Data2": -6891355889682082923, - "Data3": -7620336067731582674, - "Data4": -4850953753089830656 + "Data1": 8195714965952786502, + "Data2": 1252679271194668083 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListCommandCell", @@ -77814,10 +75120,8 @@ }, { "__Checksum": { - "Data1": 4496301370838980522, - "Data2": 5426839180629645731, - "Data3": -4869023828252743323, - "Data4": 1418847251378372571 + "Data1": 2848756898056580265, + "Data2": 5017788334325399320 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListCommandCell", @@ -77901,10 +75205,8 @@ }, { "__Checksum": { - "Data1": -8506786296092480024, - "Data2": 6373064718039030781, - "Data3": 8088581163258537280, - "Data4": -6364652113758333029 + "Data1": -8371424820220141862, + "Data2": -6523371176616360361 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListContentCell", @@ -77988,10 +75290,8 @@ }, { "__Checksum": { - "Data1": 5794537085894986668, - "Data2": -3542783427373063437, - "Data3": -4021787384191663690, - "Data4": -8032467713857607408 + "Data1": 1917297578202546946, + "Data2": -4697774591835050632 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListContentCell", @@ -78075,10 +75375,8 @@ }, { "__Checksum": { - "Data1": -6164332362881126353, - "Data2": -1735483225911915486, - "Data3": -3650082620377787914, - "Data4": 8472862491578764996 + "Data1": 2277171655031928407, + "Data2": 2239270431246850051 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListFilterCell", @@ -78187,10 +75485,8 @@ }, { "__Checksum": { - "Data1": -2037723450616207209, - "Data2": 2545247312700217747, - "Data3": 8712198205685931570, - "Data4": 5350178634754567297 + "Data1": 386930601835233448, + "Data2": 179173251032170175 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListFilterCell", @@ -78299,10 +75595,8 @@ }, { "__Checksum": { - "Data1": -4373191958818981680, - "Data2": 6581406885013163532, - "Data3": 6526747269587805442, - "Data4": -3874503137968542213 + "Data1": 6388494355977330787, + "Data2": 1260724284464666276 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListFilterRow", @@ -78390,10 +75684,8 @@ }, { "__Checksum": { - "Data1": -897359661248214535, - "Data2": 622861478897693135, - "Data3": -7067914982417908753, - "Data4": -168378145115456408 + "Data1": -5922916646671090533, + "Data2": 7736917935309439813 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListFilterRow", @@ -78481,10 +75773,8 @@ }, { "__Checksum": { - "Data1": -2309565718091629378, - "Data2": -8406532151206209558, - "Data3": 5320246214300298825, - "Data4": 1680072084492904958 + "Data1": 7779413464431550822, + "Data2": -1952618181257028170 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListHeaderCell", @@ -78661,10 +75951,8 @@ }, { "__Checksum": { - "Data1": -7316997804504708347, - "Data2": -1529548746973576148, - "Data3": 5074688732444386019, - "Data4": -4117667531833854111 + "Data1": 6886429215841407457, + "Data2": 2223144051590084951 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListHeaderCell", @@ -78841,10 +76129,8 @@ }, { "__Checksum": { - "Data1": -8325685973770628024, - "Data2": -4927352181459434085, - "Data3": -7202598051459240338, - "Data4": 7057279854118424162 + "Data1": 6012701549867721333, + "Data2": -8376129083568510279 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListHeaderRow", @@ -78997,10 +76283,8 @@ }, { "__Checksum": { - "Data1": -308952472235848292, - "Data2": 7354622085576174918, - "Data3": -7301594878452579381, - "Data4": 6061780167941711296 + "Data1": 7513631941595582754, + "Data2": -9203163998846016746 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListHeaderRow", @@ -79153,10 +76437,8 @@ }, { "__Checksum": { - "Data1": -3862814751275608226, - "Data2": 5618807874863588952, - "Data3": -1111740314936431848, - "Data4": -2397161981132747295 + "Data1": 4308117522199767332, + "Data2": 2192149853475868198 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListToolBarContainer", @@ -79208,10 +76490,8 @@ }, { "__Checksum": { - "Data1": -1635502305015317949, - "Data2": 8127059293252666849, - "Data3": -3679336792516452333, - "Data4": -7549309713310581559 + "Data1": 5393678754658323205, + "Data2": -3545447139503233448 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListToolBarContainer", @@ -79263,10 +76543,8 @@ }, { "__Checksum": { - "Data1": 8955322055695680214, - "Data2": 5470755532679220672, - "Data3": -7762177188841677307, - "Data4": -8480243955961255022 + "Data1": -4599889235038610967, + "Data2": 5451643592905700281 }, "Flags": 1, "Kind": 3, @@ -79284,10 +76562,8 @@ }, { "__Checksum": { - "Data1": -4000240811558647341, - "Data2": -4551171172200850601, - "Data3": 3344539255217056372, - "Data4": -5664515479515916179 + "Data1": -1161039229360454645, + "Data2": -4070230937138901894 }, "Flags": 3, "Kind": 3, @@ -79305,10 +76581,8 @@ }, { "__Checksum": { - "Data1": 3897530374806471586, - "Data2": 3956128455694006583, - "Data3": 1551247744260755097, - "Data4": -837780216016033782 + "Data1": 9199723813009273900, + "Data2": 7790481063492331538 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.TreeListRow", @@ -79410,10 +76684,8 @@ }, { "__Checksum": { - "Data1": -1868962218381390144, - "Data2": -320744319217890894, - "Data3": 1996570018662812953, - "Data4": 2380188142956235418 + "Data1": -7492200723179263239, + "Data2": 8380511374814018575 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.TreeListRow", @@ -79515,10 +76787,8 @@ }, { "__Checksum": { - "Data1": -3197839571528696033, - "Data2": 2086723547500164830, - "Data3": 8182960442883103017, - "Data4": -7038806697556178180 + "Data1": 1880391977497976002, + "Data2": -2609472075056950092 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.Columns.TreeListCheckboxColumn", @@ -79534,10 +76804,8 @@ }, { "__Checksum": { - "Data1": 7822570186937192826, - "Data2": -7744232417813833389, - "Data3": 6918942249395394161, - "Data4": -427466599855369048 + "Data1": 6302317820454213024, + "Data2": 1720189026307665146 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.Columns.TreeListCheckboxColumn", @@ -79553,10 +76821,8 @@ }, { "__Checksum": { - "Data1": 1957611538780674198, - "Data2": 3243189451098145008, - "Data3": -1545772565160508884, - "Data4": -1606556962127629023 + "Data1": -6527350609173339097, + "Data2": -6023288767952391354 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.Columns.TreeListColumn", @@ -79572,10 +76838,8 @@ }, { "__Checksum": { - "Data1": -8891192260397012628, - "Data2": 2550763999801279059, - "Data3": 6765171015894221323, - "Data4": 7074917465019254321 + "Data1": 8981858498408289852, + "Data2": -2030066617549658445 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.Columns.TreeListColumn", @@ -79591,10 +76855,8 @@ }, { "__Checksum": { - "Data1": -7528187836421985596, - "Data2": -6432557904777722900, - "Data3": 8868833244856396432, - "Data4": -3397406063094647723 + "Data1": -7887951427693956853, + "Data2": -4724785259022088865 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeList.Columns.TreeListCommandColumn", @@ -79610,10 +76872,8 @@ }, { "__Checksum": { - "Data1": 2363531702482095561, - "Data2": -5819154917260148950, - "Data3": -8100762853223343125, - "Data4": 1189423260026288181 + "Data1": -7330531720701749722, + "Data2": -4247018552095792377 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeList.Columns.TreeListCommandColumn", @@ -79629,10 +76889,8 @@ }, { "__Checksum": { - "Data1": -5890610428625165180, - "Data2": -116889292102925426, - "Data3": -2684363904618342988, - "Data4": 5980674618466661883 + "Data1": -455119157360692841, + "Data2": 3096906136160551429 }, "Flags": 1, "Name": "Telerik.Blazor.Components.TreeView.TreeViewNode", @@ -79730,10 +76988,8 @@ }, { "__Checksum": { - "Data1": -4427685501971993594, - "Data2": 7910706919456414387, - "Data3": -8056594382393732571, - "Data4": 8233675687568214494 + "Data1": -5165250220879626563, + "Data2": -8272034032334760547 }, "Flags": 3, "Name": "Telerik.Blazor.Components.TreeView.TreeViewNode", @@ -79831,10 +77087,8 @@ }, { "__Checksum": { - "Data1": -8661902474112862461, - "Data2": -4506464062451984382, - "Data3": 6520633711004748492, - "Data4": 3271898893405132194 + "Data1": -4566525129730548773, + "Data2": 2037810601133568836 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Upload.UploadFileList", @@ -79896,10 +77150,8 @@ }, { "__Checksum": { - "Data1": 563121246685501977, - "Data2": -6948081264057770145, - "Data3": 3065774788875761260, - "Data4": -5442473966309599171 + "Data1": -5671395780268525408, + "Data2": 8325937291475393735 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Upload.UploadFileList", @@ -79961,10 +77213,8 @@ }, { "__Checksum": { - "Data1": -7587004902018516451, - "Data2": -8449773429122562948, - "Data3": -3054492589497213863, - "Data4": 4607676126547291938 + "Data1": -5638138092016222423, + "Data2": 7179015050420172318 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Upload.UploadFileListItem", @@ -80026,10 +77276,8 @@ }, { "__Checksum": { - "Data1": 6284805897714997121, - "Data2": -5436373987614949946, - "Data3": -242467195123000708, - "Data4": 6423210503775596858 + "Data1": -648875519073010801, + "Data2": -6865660301900263373 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Upload.UploadFileListItem", @@ -80091,10 +77339,8 @@ }, { "__Checksum": { - "Data1": -2595473236508508583, - "Data2": -3280359525859861158, - "Data3": -2872150391957388593, - "Data4": -3252731837812025458 + "Data1": -3309831310167713348, + "Data2": 7112921949718114545 }, "Flags": 1, "Name": "Telerik.Blazor.Components.Upload.UploadInput", @@ -80128,10 +77374,8 @@ }, { "__Checksum": { - "Data1": -6779835622632440586, - "Data2": 3285343874580727332, - "Data3": -1350934892708369253, - "Data4": 9147071927965256278 + "Data1": 1038511739886998783, + "Data2": 8864750463611896664 }, "Flags": 3, "Name": "Telerik.Blazor.Components.Upload.UploadInput", @@ -80165,10 +77409,8 @@ }, { "__Checksum": { - "Data1": 2388634433561703064, - "Data2": 2859062649898684681, - "Data3": 9186697754677704172, - "Data4": -721312842239459753 + "Data1": 8121394924930193612, + "Data2": 6770533150828275637 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -80239,10 +77481,8 @@ }, { "__Checksum": { - "Data1": 7451064772658646776, - "Data2": -7104888356894347505, - "Data3": -6827991917588226011, - "Data4": 6237093148443024511 + "Data1": 1879044455264217746, + "Data2": -3926934105550877453 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.CascadingValue", @@ -80313,10 +77553,8 @@ }, { "__Checksum": { - "Data1": -4242953774371301143, - "Data2": 2442292568253594667, - "Data3": 9032024878256947451, - "Data4": -10446313520517352 + "Data1": -9072771633281882686, + "Data2": -872604328827005247 }, "Flags": 1, "Kind": 3, @@ -80335,10 +77573,8 @@ }, { "__Checksum": { - "Data1": -3054044070220001468, - "Data2": 3059647205883380215, - "Data3": 4469299243890899965, - "Data4": 7278695884131957667 + "Data1": -2194105637835042316, + "Data2": 8134468899512776703 }, "Flags": 3, "Kind": 3, @@ -80357,10 +77593,8 @@ }, { "__Checksum": { - "Data1": -3417403824890257571, - "Data2": -4048242327381410898, - "Data3": 8034179396392028277, - "Data4": 1024394887385008130 + "Data1": -774783905234024093, + "Data2": 7189302081397623216 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -80399,10 +77633,8 @@ }, { "__Checksum": { - "Data1": 3540115718779541269, - "Data2": -1755712602345091009, - "Data3": 167380406728142743, - "Data4": 7301930765979580693 + "Data1": -7305954906732851073, + "Data2": -2303660917011063431 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.LayoutView", @@ -80441,10 +77673,8 @@ }, { "__Checksum": { - "Data1": -3694563395209223227, - "Data2": 2685924213850058042, - "Data3": 6711243033197114863, - "Data4": -7266234621791183038 + "Data1": 7484896396317673045, + "Data2": -9211311719025902734 }, "Flags": 1, "Kind": 3, @@ -80463,10 +77693,8 @@ }, { "__Checksum": { - "Data1": -5824949731886442089, - "Data2": -76396924308276663, - "Data3": -1362413863283210297, - "Data4": -5832467172669512276 + "Data1": -5806851882591501130, + "Data2": -8005286817761731772 }, "Flags": 3, "Kind": 3, @@ -80485,10 +77713,8 @@ }, { "__Checksum": { - "Data1": 3424975430818500213, - "Data2": 7405772883058515467, - "Data3": -139264220547521803, - "Data4": -2327588085940045034 + "Data1": -7883441394066781768, + "Data2": 3603747247347369502 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -80523,10 +77749,8 @@ }, { "__Checksum": { - "Data1": -6544656346101148076, - "Data2": -8076177342017509693, - "Data3": 4351553264982530451, - "Data4": 235067483961940266 + "Data1": 5050865738275552435, + "Data2": 4674553575950145348 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.RouteView", @@ -80561,10 +77785,8 @@ }, { "__Checksum": { - "Data1": 4542911787027421551, - "Data2": 8428110926302708185, - "Data3": -1749107555630947109, - "Data4": -6147585784150450715 + "Data1": 1732648772521646793, + "Data2": -4797649669560517420 }, "Flags": 1, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -80632,10 +77854,8 @@ }, { "__Checksum": { - "Data1": 264402309321367233, - "Data2": -2323704544773355399, - "Data3": -4015473313377079604, - "Data4": -1524660760349750594 + "Data1": -7768765363829112871, + "Data2": 7864076836915829974 }, "Flags": 3, "Name": "Microsoft.AspNetCore.Components.Routing.Router", @@ -80703,10 +77923,8 @@ }, { "__Checksum": { - "Data1": 2455738920587519018, - "Data2": -5583604156885480436, - "Data3": -1867001394272824103, - "Data4": -5353514221280958913 + "Data1": 6861503034974277911, + "Data2": -7561967856904825521 }, "Flags": 1, "Kind": 3, @@ -80725,10 +77943,8 @@ }, { "__Checksum": { - "Data1": 8799248991135267302, - "Data2": 8545859154143562588, - "Data3": -7116486572391429763, - "Data4": -3012193722237699779 + "Data1": -66827346233897920, + "Data2": 1818151018702475024 }, "Flags": 3, "Kind": 3, @@ -80747,10 +77963,8 @@ }, { "__Checksum": { - "Data1": -2573342795082588597, - "Data2": -4269310309661986686, - "Data3": -7633256439839931388, - "Data4": -6673015278030627244 + "Data1": -2449932741151179649, + "Data2": -9100129425491877926 }, "Flags": 1, "Kind": 3, @@ -80780,10 +77994,8 @@ }, { "__Checksum": { - "Data1": 3642209045936131358, - "Data2": -5537954367197613710, - "Data3": -7472399493572795951, - "Data4": 778817494135370148 + "Data1": 3681833351515204374, + "Data2": -2359179439644603299 }, "Flags": 3, "Kind": 3, @@ -80813,10 +78025,8 @@ }, { "__Checksum": { - "Data1": 1286133681153357976, - "Data2": -2883545583271698424, - "Data3": 5376762633252230249, - "Data4": -387030064612221440 + "Data1": -8831555450915091058, + "Data2": 2187987757069635457 }, "Flags": 5, "Kind": 4, @@ -80888,10 +78098,8 @@ }, { "__Checksum": { - "Data1": -8091024886000519136, - "Data2": -8242689700767728364, - "Data3": 4345123614232288869, - "Data4": 97831229853557815 + "Data1": -2429153062548192125, + "Data2": -82330045620292587 }, "Flags": 5, "Kind": 4, @@ -80963,10 +78171,8 @@ }, { "__Checksum": { - "Data1": -5481883009199409088, - "Data2": -8494270501522333911, - "Data3": -3081175051664875858, - "Data4": -1808236403492282365 + "Data1": -6799849370359362315, + "Data2": 2252419713291881225 }, "Flags": 5, "Kind": 4, @@ -81038,10 +78244,8 @@ }, { "__Checksum": { - "Data1": -4568505711390207619, - "Data2": 6010553657093108342, - "Data3": 4404316495056668854, - "Data4": -3772572894238588686 + "Data1": -2578095945874936039, + "Data2": 1748782715699694235 }, "Flags": 5, "Kind": 4, @@ -81113,10 +78317,8 @@ }, { "__Checksum": { - "Data1": -4954082767082330138, - "Data2": 5168258063914673993, - "Data3": -3286544799820671895, - "Data4": -5838433261570202821 + "Data1": -210418953936994990, + "Data2": 119638030493746564 }, "Flags": 5, "Kind": 4, @@ -81188,10 +78390,8 @@ }, { "__Checksum": { - "Data1": 8343369136909571934, - "Data2": 8746190420585644454, - "Data3": 6005365998570877897, - "Data4": -7042294778734864150 + "Data1": 7141604372399892818, + "Data2": -8792840376515140171 }, "Flags": 5, "Kind": 4, @@ -81263,10 +78463,8 @@ }, { "__Checksum": { - "Data1": 9063328959533978768, - "Data2": 5676852070192638171, - "Data3": 6476759612322195485, - "Data4": 7281362292463409165 + "Data1": 4544553583355804421, + "Data2": -5544406739835923 }, "Flags": 5, "Kind": 4, @@ -81338,10 +78536,8 @@ }, { "__Checksum": { - "Data1": 6928827161857787274, - "Data2": 2577606037925893484, - "Data3": -8061272923372158068, - "Data4": 4019351369037677753 + "Data1": -5194772373415847492, + "Data2": -6949762945368421563 }, "Flags": 5, "Kind": 4, @@ -81413,10 +78609,8 @@ }, { "__Checksum": { - "Data1": -4768480836875307114, - "Data2": 7593380112951271821, - "Data3": 2485336827811066294, - "Data4": 2935408325057319128 + "Data1": -6479802192111522175, + "Data2": 5899764972772150668 }, "Flags": 5, "Kind": 4, @@ -81488,10 +78682,8 @@ }, { "__Checksum": { - "Data1": 6076175070314289900, - "Data2": 8116453956146027547, - "Data3": -9205128233585883727, - "Data4": 599402081460140354 + "Data1": -6071528004217024265, + "Data2": -4024671486831221004 }, "Flags": 5, "Kind": 4, @@ -81563,10 +78755,8 @@ }, { "__Checksum": { - "Data1": 9056437013382794691, - "Data2": 1905669258787158788, - "Data3": 6904593417242381824, - "Data4": -167388842137424532 + "Data1": -3564507620469426030, + "Data2": 6547650247821623341 }, "Flags": 5, "Kind": 4, @@ -81638,10 +78828,8 @@ }, { "__Checksum": { - "Data1": -6921368229573980568, - "Data2": 9039799295181452861, - "Data3": 777298679559104410, - "Data4": -7548637030415650937 + "Data1": -6558676407039504470, + "Data2": 8393342316212244041 }, "Flags": 5, "Kind": 4, @@ -81713,10 +78901,8 @@ }, { "__Checksum": { - "Data1": -3531342238281373351, - "Data2": -1046837342137749831, - "Data3": 3385074460734798430, - "Data4": 3206857274801089393 + "Data1": -8355243465181181971, + "Data2": -1637939251676672906 }, "Flags": 5, "Kind": 4, @@ -81788,10 +78974,8 @@ }, { "__Checksum": { - "Data1": -823178553758588132, - "Data2": 3938585442765083740, - "Data3": 8091857046006799255, - "Data4": -7487007980424294144 + "Data1": -1834040369439020551, + "Data2": 6925977515645934033 }, "Flags": 5, "Kind": 4, @@ -81863,10 +79047,8 @@ }, { "__Checksum": { - "Data1": 3952838231665143507, - "Data2": 1352795100912228558, - "Data3": 3778150234384943325, - "Data4": 5452774589811466189 + "Data1": -8490633641127025400, + "Data2": -2109645386808258781 }, "Flags": 5, "Kind": 4, @@ -81938,10 +79120,8 @@ }, { "__Checksum": { - "Data1": 1183792729199018109, - "Data2": 9068225527351536934, - "Data3": 4825193820975230654, - "Data4": -6005813703537881670 + "Data1": -6529232819841989867, + "Data2": 151773967991031657 }, "Flags": 5, "Kind": 4, @@ -82013,10 +79193,8 @@ }, { "__Checksum": { - "Data1": 4121920144071600923, - "Data2": 44384263028353846, - "Data3": -5291119113298726248, - "Data4": -7635262552628357676 + "Data1": 7026043589111397051, + "Data2": -8568529295097582239 }, "Flags": 5, "Kind": 4, @@ -82088,10 +79266,8 @@ }, { "__Checksum": { - "Data1": -3491737108456053352, - "Data2": 2108748743716287372, - "Data3": 2016738652890632476, - "Data4": -1762039575906157907 + "Data1": 5377531882889702238, + "Data2": 4161992187396477409 }, "Flags": 5, "Kind": 4, @@ -82163,10 +79339,8 @@ }, { "__Checksum": { - "Data1": -8855163587248169932, - "Data2": -4112749067340434611, - "Data3": -1539496278809252861, - "Data4": 7330419228664843213 + "Data1": -8584536466729196838, + "Data2": -4423568613730380884 }, "Flags": 5, "Kind": 4, @@ -82238,10 +79412,8 @@ }, { "__Checksum": { - "Data1": -8944984270497131003, - "Data2": -7613371009132849845, - "Data3": -7637009071485563935, - "Data4": 6894446963762017702 + "Data1": 226748352338629546, + "Data2": 3706840767271289197 }, "Flags": 5, "Kind": 4, @@ -82313,10 +79485,8 @@ }, { "__Checksum": { - "Data1": 6241194013686972075, - "Data2": -6336082105096296405, - "Data3": -7181666300952960606, - "Data4": 2113086401878534763 + "Data1": -1074004282144959987, + "Data2": -3873355076386089457 }, "Flags": 5, "Kind": 4, @@ -82388,10 +79558,8 @@ }, { "__Checksum": { - "Data1": -50341168502589344, - "Data2": -3812706319527134152, - "Data3": -3636680768172895291, - "Data4": 3700485806783479168 + "Data1": -4699581398419767272, + "Data2": -4766490083354812776 }, "Flags": 5, "Kind": 4, @@ -82463,10 +79631,8 @@ }, { "__Checksum": { - "Data1": -604276278753653179, - "Data2": -4148704781025134246, - "Data3": -7192680602436033922, - "Data4": 2890237849922611438 + "Data1": 785989716678981519, + "Data2": -1198016421276855266 }, "Flags": 5, "Kind": 4, @@ -82538,10 +79704,8 @@ }, { "__Checksum": { - "Data1": -4402905714450096495, - "Data2": -1447340694195753229, - "Data3": -143858079768503847, - "Data4": 6688872755821700614 + "Data1": -4938271451420971713, + "Data2": 8807224623256312306 }, "Flags": 5, "Kind": 4, @@ -82613,10 +79777,8 @@ }, { "__Checksum": { - "Data1": 6537010034962759652, - "Data2": 2181608752555862352, - "Data3": 2708879596049430056, - "Data4": -4484210660046407431 + "Data1": 2849670676852914346, + "Data2": -8558639811483052475 }, "Flags": 5, "Kind": 4, @@ -82688,10 +79850,8 @@ }, { "__Checksum": { - "Data1": 917466886043781781, - "Data2": -5483957530394018849, - "Data3": -5531596240656460953, - "Data4": -5811811978659305877 + "Data1": 2801258767796389458, + "Data2": -5881680778887504153 }, "Flags": 5, "Kind": 4, @@ -82763,10 +79923,8 @@ }, { "__Checksum": { - "Data1": -8698793432703948667, - "Data2": -7515616597506028092, - "Data3": -8763459358715263156, - "Data4": 4645017862942700790 + "Data1": -4262498800775320152, + "Data2": 4431355900352220025 }, "Flags": 5, "Kind": 4, @@ -82838,10 +79996,8 @@ }, { "__Checksum": { - "Data1": 4202522214982996716, - "Data2": -1268034898190405664, - "Data3": -1857122645408665014, - "Data4": 5289883733479199108 + "Data1": 2671449836034619767, + "Data2": 7235791578945512374 }, "Flags": 5, "Kind": 4, @@ -82913,10 +80069,8 @@ }, { "__Checksum": { - "Data1": 1555430877159902800, - "Data2": 8253642973829695595, - "Data3": -2143980381513075157, - "Data4": -5435065325023121553 + "Data1": -4478217937632484759, + "Data2": 3044590949362492374 }, "Flags": 5, "Kind": 4, @@ -82988,10 +80142,8 @@ }, { "__Checksum": { - "Data1": -3688892811875162918, - "Data2": 7463337225973314931, - "Data3": -6071957072207632737, - "Data4": -7952949618426253733 + "Data1": 7963168688198245542, + "Data2": 8226175571453750900 }, "Flags": 5, "Kind": 4, @@ -83063,10 +80215,8 @@ }, { "__Checksum": { - "Data1": -7391296900772773118, - "Data2": -2956261020766966776, - "Data3": 8976561795977362945, - "Data4": 6021840961712547645 + "Data1": -2591288358495852681, + "Data2": -2876200703483484394 }, "Flags": 5, "Kind": 4, @@ -83138,10 +80288,8 @@ }, { "__Checksum": { - "Data1": -2086744881062654073, - "Data2": -4016682664169143325, - "Data3": 4757751999089351381, - "Data4": -2989059297293985406 + "Data1": -5697387757183130428, + "Data2": 7945646056372899544 }, "Flags": 5, "Kind": 4, @@ -83213,10 +80361,8 @@ }, { "__Checksum": { - "Data1": 4066126811346281996, - "Data2": 831477706554567104, - "Data3": -3750282318155882235, - "Data4": 931702099424325272 + "Data1": -8185479061680359559, + "Data2": -1028910236940547332 }, "Flags": 5, "Kind": 4, @@ -83288,10 +80434,8 @@ }, { "__Checksum": { - "Data1": -2471815126744250823, - "Data2": 5813417415796476603, - "Data3": 6767404629043075615, - "Data4": 5387069703490361695 + "Data1": 8131327722247638664, + "Data2": -5303891840377634168 }, "Flags": 5, "Kind": 4, @@ -83363,10 +80507,8 @@ }, { "__Checksum": { - "Data1": -2963652391312310965, - "Data2": 4201005702999411378, - "Data3": 4291370409577882017, - "Data4": 1631734100351558769 + "Data1": -7420930682351538434, + "Data2": -7458560972882771544 }, "Flags": 5, "Kind": 4, @@ -83438,10 +80580,8 @@ }, { "__Checksum": { - "Data1": 1807977616748030678, - "Data2": 8928944394281470590, - "Data3": 1475575191204501172, - "Data4": 4842365706622325292 + "Data1": 6671678787965882963, + "Data2": 6190351867775553469 }, "Flags": 5, "Kind": 4, @@ -83513,10 +80653,8 @@ }, { "__Checksum": { - "Data1": -5735389321789204298, - "Data2": -5002377148411438141, - "Data3": -5931751409405818001, - "Data4": 645445965620984097 + "Data1": 1653250687585080415, + "Data2": -6107792327588302586 }, "Flags": 5, "Kind": 4, @@ -83588,10 +80726,8 @@ }, { "__Checksum": { - "Data1": -4794881479379746826, - "Data2": -2025001680219901480, - "Data3": -3049867644142476617, - "Data4": -8628242589802066908 + "Data1": -3192564708106307957, + "Data2": 2080372192042367845 }, "Flags": 5, "Kind": 4, @@ -83663,10 +80799,8 @@ }, { "__Checksum": { - "Data1": 8833524972940333197, - "Data2": -4895967365944985449, - "Data3": 7417739657515316771, - "Data4": 2152712727540330794 + "Data1": -5455403845576105145, + "Data2": 2335153469721445949 }, "Flags": 5, "Kind": 4, @@ -83738,10 +80872,8 @@ }, { "__Checksum": { - "Data1": -7088179147258651452, - "Data2": 7406914636785754348, - "Data3": -7774643871260026549, - "Data4": 6044743856893027676 + "Data1": -8647462984775339593, + "Data2": 3773867189707698844 }, "Flags": 5, "Kind": 4, @@ -83813,10 +80945,8 @@ }, { "__Checksum": { - "Data1": 7390030822787388672, - "Data2": 5572837254627495537, - "Data3": 6296347266620400572, - "Data4": 658887194474997085 + "Data1": -2255642964320770339, + "Data2": -7212519834178484439 }, "Flags": 5, "Kind": 4, @@ -83888,10 +81018,8 @@ }, { "__Checksum": { - "Data1": 4904816839154203690, - "Data2": -7909189921369732693, - "Data3": 76098350435292007, - "Data4": 1010914416530380568 + "Data1": -8059826697344254584, + "Data2": -1018996908926347313 }, "Flags": 5, "Kind": 4, @@ -83963,10 +81091,8 @@ }, { "__Checksum": { - "Data1": -4707710692394251775, - "Data2": -1345013824663876730, - "Data3": -6050692813820852644, - "Data4": -878710135322533146 + "Data1": -1892427965088429944, + "Data2": -8454043948152525491 }, "Flags": 5, "Kind": 4, @@ -84038,10 +81164,8 @@ }, { "__Checksum": { - "Data1": -6150422384948280063, - "Data2": -7528469565596022948, - "Data3": -2999844328826773954, - "Data4": 6916793034160834389 + "Data1": 1532754484084647452, + "Data2": 1874888616018961031 }, "Flags": 5, "Kind": 4, @@ -84113,10 +81237,8 @@ }, { "__Checksum": { - "Data1": -2484434216831232185, - "Data2": 4272077383938085468, - "Data3": -4766952508018463514, - "Data4": -8110202966924930184 + "Data1": -2986221814157827899, + "Data2": -8444672866282451027 }, "Flags": 5, "Kind": 4, @@ -84188,10 +81310,8 @@ }, { "__Checksum": { - "Data1": -2790801670621570741, - "Data2": -2007976712571820076, - "Data3": 1624201475944414835, - "Data4": -8089542697526064399 + "Data1": -770601632675965051, + "Data2": 2235676030043973582 }, "Flags": 5, "Kind": 4, @@ -84263,10 +81383,8 @@ }, { "__Checksum": { - "Data1": 2703982460008880650, - "Data2": -6720063392566470216, - "Data3": 1004292576234487038, - "Data4": 3802444437106372531 + "Data1": -600116492176354323, + "Data2": 1825878872450356370 }, "Flags": 5, "Kind": 4, @@ -84338,10 +81456,8 @@ }, { "__Checksum": { - "Data1": 5785211675104301853, - "Data2": 4808742115546884664, - "Data3": -6578715264874059462, - "Data4": 1164291435797754229 + "Data1": -5669622647419457378, + "Data2": 4249091706316234559 }, "Flags": 5, "Kind": 4, @@ -84413,10 +81529,8 @@ }, { "__Checksum": { - "Data1": 2812874772740623924, - "Data2": -1955747256058179732, - "Data3": -311324527496889677, - "Data4": -6956559796463682850 + "Data1": 2406256172447004636, + "Data2": 6396942362245753241 }, "Flags": 5, "Kind": 4, @@ -84488,10 +81602,8 @@ }, { "__Checksum": { - "Data1": 7537752240577816488, - "Data2": -7916532136366821993, - "Data3": 1687433686049548330, - "Data4": 3406220305190790688 + "Data1": 353822585476697708, + "Data2": 1403095220117958334 }, "Flags": 5, "Kind": 4, @@ -84563,10 +81675,8 @@ }, { "__Checksum": { - "Data1": -665663157287288385, - "Data2": -9063568475059516093, - "Data3": -8064263237214866208, - "Data4": 767169929072784295 + "Data1": 5114546371407331137, + "Data2": -7014458100345800034 }, "Flags": 5, "Kind": 4, @@ -84638,10 +81748,8 @@ }, { "__Checksum": { - "Data1": 8291016508772300437, - "Data2": 9220112195654056819, - "Data3": 5231938901705893754, - "Data4": -4902485475081471861 + "Data1": -5432521590306703035, + "Data2": -7027309816322831955 }, "Flags": 5, "Kind": 4, @@ -84713,10 +81821,8 @@ }, { "__Checksum": { - "Data1": 2529918602474127513, - "Data2": 8898606944475883925, - "Data3": 7560915526692280174, - "Data4": 4835512255954992281 + "Data1": -6316922099410785026, + "Data2": -5495569419117403788 }, "Flags": 5, "Kind": 4, @@ -84788,10 +81894,8 @@ }, { "__Checksum": { - "Data1": -6565567430511866286, - "Data2": 804516757728903664, - "Data3": -7354225818252023591, - "Data4": -3568333888518596570 + "Data1": -5219294055623622923, + "Data2": 524980423834274053 }, "Flags": 5, "Kind": 4, @@ -84863,10 +81967,8 @@ }, { "__Checksum": { - "Data1": 4917248004670026877, - "Data2": -2084476315697128866, - "Data3": 1705953435351800564, - "Data4": 5722747509234183454 + "Data1": 652225956958434777, + "Data2": -5487788407705825469 }, "Flags": 5, "Kind": 4, @@ -84938,10 +82040,8 @@ }, { "__Checksum": { - "Data1": 3974576053803681328, - "Data2": -7367877540138328974, - "Data3": 2311516803808872077, - "Data4": 8878818932806675844 + "Data1": 6078466127880592512, + "Data2": -6511945513186199176 }, "Flags": 5, "Kind": 4, @@ -85013,10 +82113,8 @@ }, { "__Checksum": { - "Data1": -3474445462949689379, - "Data2": -6937324002060648542, - "Data3": -3155226684965570978, - "Data4": -7428308049157092612 + "Data1": -1162423892024366901, + "Data2": -3428137550906173090 }, "Flags": 5, "Kind": 4, @@ -85088,10 +82186,8 @@ }, { "__Checksum": { - "Data1": 567959807055553106, - "Data2": 5191794985177822691, - "Data3": -4110109870366099329, - "Data4": -1377802640425549947 + "Data1": -8199077373731311483, + "Data2": 154205072843936077 }, "Flags": 5, "Kind": 4, @@ -85163,10 +82259,8 @@ }, { "__Checksum": { - "Data1": 8950159403900184415, - "Data2": 665216072598595284, - "Data3": -8959962481075943677, - "Data4": 6730875718308005052 + "Data1": 6113598678382402754, + "Data2": -2399731680181922424 }, "Flags": 5, "Kind": 4, @@ -85238,10 +82332,8 @@ }, { "__Checksum": { - "Data1": -2079304752003395081, - "Data2": -3015971460759779818, - "Data3": 4294843958733500449, - "Data4": 6763658996136380388 + "Data1": -5283292502571206433, + "Data2": 4745858190263615689 }, "Flags": 5, "Kind": 4, @@ -85313,10 +82405,8 @@ }, { "__Checksum": { - "Data1": -4361978406040347900, - "Data2": 8963767136340695210, - "Data3": -3210869535984042610, - "Data4": 35871613159331312 + "Data1": -8356197794624697038, + "Data2": 4892069320961568500 }, "Flags": 5, "Kind": 4, @@ -85388,10 +82478,8 @@ }, { "__Checksum": { - "Data1": -1818892525421680525, - "Data2": -430781927793474862, - "Data3": -1320494815708931128, - "Data4": 1443912585157093927 + "Data1": -3864323074816581315, + "Data2": -3965536520655282961 }, "Flags": 5, "Kind": 4, @@ -85463,10 +82551,8 @@ }, { "__Checksum": { - "Data1": 8524424032208765270, - "Data2": 8050947623282086533, - "Data3": 4595633010780515745, - "Data4": -2934223950274264099 + "Data1": 8965034356599136719, + "Data2": -5404310763847116832 }, "Flags": 5, "Kind": 4, @@ -85538,10 +82624,8 @@ }, { "__Checksum": { - "Data1": 8340302921809623502, - "Data2": 8765969118855887202, - "Data3": 992507427142283584, - "Data4": -6694338704140206277 + "Data1": -5807928992075384196, + "Data2": 8783263967977066151 }, "Flags": 5, "Kind": 4, @@ -85613,10 +82697,8 @@ }, { "__Checksum": { - "Data1": -4901725037430777649, - "Data2": -5314966787827028322, - "Data3": -6778991237615472429, - "Data4": -1244076392289046906 + "Data1": -8534723055373426542, + "Data2": 6031678586444802201 }, "Flags": 5, "Kind": 4, @@ -85688,10 +82770,8 @@ }, { "__Checksum": { - "Data1": -1256524489747572113, - "Data2": -1102420350970581880, - "Data3": 1457448052706900486, - "Data4": 7394910147586044477 + "Data1": 7415031490540551005, + "Data2": 263257325562750423 }, "Flags": 5, "Kind": 4, @@ -85763,10 +82843,8 @@ }, { "__Checksum": { - "Data1": -4572792855277238117, - "Data2": -5076278080079232080, - "Data3": 6372309830207544377, - "Data4": 3484252001467065085 + "Data1": -138921107481446017, + "Data2": -7365938062031701594 }, "Flags": 5, "Kind": 4, @@ -85838,10 +82916,8 @@ }, { "__Checksum": { - "Data1": 6679848707938734398, - "Data2": -6744597632230832920, - "Data3": 7513512855394389298, - "Data4": 5031283599865578451 + "Data1": 2033006903377707795, + "Data2": 1024294546763851292 }, "Flags": 5, "Kind": 4, @@ -85913,10 +82989,8 @@ }, { "__Checksum": { - "Data1": 6219279016933653292, - "Data2": -2313342951890298933, - "Data3": -2339100166462464557, - "Data4": 7974982299524693217 + "Data1": -1124273776085288681, + "Data2": 4614233868749579718 }, "Flags": 5, "Kind": 4, @@ -85988,10 +83062,8 @@ }, { "__Checksum": { - "Data1": 8915581285328775369, - "Data2": 3849638801929603161, - "Data3": 8780247018984301340, - "Data4": -6613366701973019134 + "Data1": 33852038413032563, + "Data2": 8254663129016990551 }, "Flags": 5, "Kind": 4, @@ -86063,10 +83135,8 @@ }, { "__Checksum": { - "Data1": -1556983334014959189, - "Data2": -5215787256576876409, - "Data3": 2240244242255206723, - "Data4": -7764916597260571890 + "Data1": -301877939244548683, + "Data2": -7131268956529125521 }, "Flags": 5, "Kind": 4, @@ -86138,10 +83208,8 @@ }, { "__Checksum": { - "Data1": 2539672129562734109, - "Data2": 6311986443202481994, - "Data3": 2412238911848324049, - "Data4": 1821413802581108619 + "Data1": -8932412078609993081, + "Data2": 1557487748788675585 }, "Flags": 5, "Kind": 4, @@ -86213,10 +83281,8 @@ }, { "__Checksum": { - "Data1": 4938130604764137889, - "Data2": 7991821737148036693, - "Data3": -6238900850528327326, - "Data4": -9070115703660919730 + "Data1": -7457982169428657626, + "Data2": 8154282194496374778 }, "Flags": 5, "Kind": 4, @@ -86288,10 +83354,8 @@ }, { "__Checksum": { - "Data1": 4013143121366741552, - "Data2": 832234175565819614, - "Data3": -5665943064791420511, - "Data4": -9220477712718825016 + "Data1": 1991268252033327442, + "Data2": -309727408900261416 }, "Flags": 5, "Kind": 4, @@ -86363,10 +83427,8 @@ }, { "__Checksum": { - "Data1": -2146887288501631511, - "Data2": 6268283238263415706, - "Data3": 7516241080409835428, - "Data4": -6955212283441306784 + "Data1": -5026738011080494498, + "Data2": -8497837261979143930 }, "Flags": 5, "Kind": 4, @@ -86438,10 +83500,8 @@ }, { "__Checksum": { - "Data1": 6134892742135474156, - "Data2": 6091754294569632537, - "Data3": 6526266171084065905, - "Data4": -5767113290177064885 + "Data1": -3828822716475453932, + "Data2": -8726846876360865993 }, "Flags": 5, "Kind": 4, @@ -86513,10 +83573,8 @@ }, { "__Checksum": { - "Data1": -8152556896544367268, - "Data2": -7612738773188941278, - "Data3": 6956742545767903050, - "Data4": -6076791424712247733 + "Data1": -471288724543532702, + "Data2": -4497694005110781250 }, "Flags": 5, "Kind": 4, @@ -86588,10 +83646,8 @@ }, { "__Checksum": { - "Data1": 8776274310089471336, - "Data2": 7206220542788734495, - "Data3": 294539839484993026, - "Data4": -4751977888723451110 + "Data1": 8868252503942532964, + "Data2": 3526775846054589115 }, "Flags": 5, "Kind": 4, @@ -86663,10 +83719,8 @@ }, { "__Checksum": { - "Data1": 230341859942642094, - "Data2": 5888523682102366248, - "Data3": -4664248416209633447, - "Data4": -3517569908672999191 + "Data1": -4379611262451406967, + "Data2": -3973975594788809727 }, "Flags": 5, "Kind": 4, @@ -86738,10 +83792,8 @@ }, { "__Checksum": { - "Data1": 7120524766907449950, - "Data2": 4247261947764329800, - "Data3": 5918198534201328084, - "Data4": -1849898914630395950 + "Data1": -2156232654752315023, + "Data2": 9009263519590954947 }, "Flags": 5, "Kind": 4, @@ -86813,10 +83865,8 @@ }, { "__Checksum": { - "Data1": -102413997669130760, - "Data2": -4792138848899208868, - "Data3": 4772396982321589134, - "Data4": -868694350391992957 + "Data1": -4831606469807806584, + "Data2": -1029873700970426481 }, "Flags": 5, "Kind": 4, @@ -86888,10 +83938,8 @@ }, { "__Checksum": { - "Data1": -5970596292912715553, - "Data2": 1910627567825506612, - "Data3": 2149572100077452363, - "Data4": 7099580162464457795 + "Data1": 7056944882395553805, + "Data2": 298721713218928284 }, "Flags": 5, "Kind": 4, @@ -86963,10 +84011,8 @@ }, { "__Checksum": { - "Data1": -8256077962605812757, - "Data2": 3423519077190799067, - "Data3": -5222369973237333773, - "Data4": 1098051479863939047 + "Data1": -7527095923208258301, + "Data2": -5483133547909968406 }, "Flags": 5, "Kind": 4, @@ -87038,10 +84084,8 @@ }, { "__Checksum": { - "Data1": -1092416170526650563, - "Data2": 1852586730646047341, - "Data3": -1598885618257426792, - "Data4": 6217161242167908260 + "Data1": 139938277292674085, + "Data2": 8257615901225885258 }, "Flags": 5, "Kind": 4, @@ -87113,10 +84157,8 @@ }, { "__Checksum": { - "Data1": 3553529385170433470, - "Data2": 5449310752810248566, - "Data3": 5077354295841749842, - "Data4": 1671181299228733825 + "Data1": 2524930223152966813, + "Data2": 4051847822442821360 }, "Flags": 5, "Kind": 4, @@ -87188,10 +84230,8 @@ }, { "__Checksum": { - "Data1": -8479697880898875384, - "Data2": 2646533697913983339, - "Data3": -675523901234587050, - "Data4": 3809616580734210462 + "Data1": -3707988318829032279, + "Data2": -2802240214678817314 }, "Flags": 5, "Kind": 4, @@ -87263,10 +84303,8 @@ }, { "__Checksum": { - "Data1": 5664422830138144769, - "Data2": 8610398094083381157, - "Data3": -6289798877807887363, - "Data4": 6384613653233690260 + "Data1": -7919135273491287433, + "Data2": 4898055778447594456 }, "Flags": 5, "Kind": 4, @@ -87338,10 +84376,8 @@ }, { "__Checksum": { - "Data1": 4991052738536779272, - "Data2": 6132628136886697061, - "Data3": 7608279256075304626, - "Data4": -1221024120818706626 + "Data1": 3444040923195035721, + "Data2": 2238141875727783085 }, "Flags": 5, "Kind": 4, @@ -87413,10 +84449,8 @@ }, { "__Checksum": { - "Data1": 6566779449813134239, - "Data2": -3621340000344700068, - "Data3": -3644922904451215468, - "Data4": 1779993726110527234 + "Data1": -2266888441937526332, + "Data2": 91787635270778478 }, "Flags": 5, "Kind": 4, @@ -87488,10 +84522,8 @@ }, { "__Checksum": { - "Data1": 3536249474307153905, - "Data2": -3903891339505497336, - "Data3": 3910076744530583666, - "Data4": -5870655828135217090 + "Data1": 8218535024195815245, + "Data2": 4934678287758175183 }, "Flags": 5, "Kind": 4, @@ -87563,10 +84595,8 @@ }, { "__Checksum": { - "Data1": -4883747803885024803, - "Data2": 3109679831170485859, - "Data3": -2436532304290670904, - "Data4": 6421595870262029608 + "Data1": 4076267235224435119, + "Data2": -4954453643671913415 }, "Flags": 5, "Kind": 4, @@ -87638,10 +84668,8 @@ }, { "__Checksum": { - "Data1": 5713488522614951349, - "Data2": 1249162579789178641, - "Data3": -4566833739485838820, - "Data4": 2127885599043769811 + "Data1": -2474318992447774720, + "Data2": -337433957135428650 }, "Flags": 5, "Kind": 4, @@ -87679,10 +84707,8 @@ }, { "__Checksum": { - "Data1": 1254655660835100835, - "Data2": 2533553287190151422, - "Data3": 5277809526490525625, - "Data4": 2384594130901248418 + "Data1": -8651706611174504339, + "Data2": -4144810004328493889 }, "Flags": 5, "Kind": 4, @@ -87720,10 +84746,8 @@ }, { "__Checksum": { - "Data1": -3209441156454573320, - "Data2": -5919889476113287088, - "Data3": -4667691286321047275, - "Data4": 1917292539941921420 + "Data1": -6070395666417735854, + "Data2": -5545714407473476158 }, "Flags": 5, "Kind": 8, @@ -87757,10 +84781,8 @@ }, { "__Checksum": { - "Data1": -8936025315230058126, - "Data2": 4345962254682369401, - "Data3": 1691956022974049364, - "Data4": 9202471356449839450 + "Data1": 2578831058437832510, + "Data2": 4585710671900699185 }, "Flags": 0, "Kind": 0, @@ -88134,10 +85156,8 @@ }, { "__Checksum": { - "Data1": 5986011997306480406, - "Data2": -7018055885577479830, - "Data3": -3413848424215470003, - "Data4": 8722791606723548920 + "Data1": 446833649475423284, + "Data2": -6497986431641074503 }, "Flags": 0, "Kind": 0, @@ -88347,10 +85367,8 @@ }, { "__Checksum": { - "Data1": -1970616212127053001, - "Data2": 4249776316434573874, - "Data3": 3369288160249576747, - "Data4": 1731746605635798932 + "Data1": -3441048411853297810, + "Data2": -7699302829775781976 }, "Flags": 0, "Kind": 0, @@ -88467,10 +85485,8 @@ }, { "__Checksum": { - "Data1": 556924828801137828, - "Data2": 2442605745884779222, - "Data3": 2320877182309203113, - "Data4": -442815732323878344 + "Data1": -5297050148439251127, + "Data2": -3028528310049729547 }, "Flags": 0, "Kind": 0, @@ -88524,10 +85540,8 @@ }, { "__Checksum": { - "Data1": -7958906838924854317, - "Data2": -7518840654281028220, - "Data3": 1722064880847306534, - "Data4": 5275798956177836549 + "Data1": 8466710668155364567, + "Data2": 7973909746412473331 }, "Flags": 0, "Kind": 0, @@ -88650,10 +85664,8 @@ }, { "__Checksum": { - "Data1": 7550732588666821736, - "Data2": 8247693518628146504, - "Data3": -3989732738160918603, - "Data4": 4034891982323941265 + "Data1": 3874918235179715521, + "Data2": 2885698909527056038 }, "Flags": 0, "Kind": 0, @@ -88698,10 +85710,8 @@ }, { "__Checksum": { - "Data1": -4704080066398199839, - "Data2": 5381811025882559074, - "Data3": -3715082010189287199, - "Data4": -6463897658791153897 + "Data1": -1437727091553938195, + "Data2": -6024576910704181563 }, "Flags": 0, "Kind": 0, @@ -89183,10 +86193,8 @@ }, { "__Checksum": { - "Data1": 454086711601531990, - "Data2": -4299611728156068515, - "Data3": -6082638317784887230, - "Data4": 6615021952615458409 + "Data1": -1231453789101543790, + "Data2": -5910110712962886108 }, "Flags": 0, "Kind": 0, @@ -89281,10 +86289,8 @@ }, { "__Checksum": { - "Data1": 2147006268138902950, - "Data2": 2980490183201203614, - "Data3": 1772629303581571328, - "Data4": -374559851968401852 + "Data1": -2063237122725675557, + "Data2": -6915016161367970786 }, "Flags": 0, "Kind": 0, @@ -89332,10 +86338,8 @@ }, { "__Checksum": { - "Data1": 6335868256341083449, - "Data2": 7739981731375074206, - "Data3": 1324428447195436947, - "Data4": -9116114776323495607 + "Data1": 9061773008505986967, + "Data2": 7922101930023873171 }, "Flags": 0, "Kind": 0, @@ -89403,10 +86407,8 @@ }, { "__Checksum": { - "Data1": 3198547902562791516, - "Data2": -5251540589591704127, - "Data3": 4722201924076285739, - "Data4": -7937377393411186874 + "Data1": 3862690986348859034, + "Data2": 13812953819243155 }, "Flags": 0, "Kind": 0, @@ -89441,10 +86443,8 @@ }, { "__Checksum": { - "Data1": -5510476536054716176, - "Data2": 1001360116927609358, - "Data3": 5696975694772775340, - "Data4": -9094685244549618990 + "Data1": 771091010776445381, + "Data2": -5007845174182252770 }, "Flags": 0, "Kind": 0, @@ -89648,10 +86648,8 @@ }, { "__Checksum": { - "Data1": 3191074701796553485, - "Data2": 7857787045869705911, - "Data3": 2307607713145657554, - "Data4": -1718765920729590544 + "Data1": 5709054145546214750, + "Data2": 4423580953508021439 }, "Flags": 0, "Kind": 0, @@ -89680,10 +86678,8 @@ }, { "__Checksum": { - "Data1": 5260991853294710484, - "Data2": 5665832245467983681, - "Data3": -8515121013398698592, - "Data4": -7866170270463791201 + "Data1": 2127543201650369146, + "Data2": -4242930553553912328 }, "Flags": 0, "Kind": 0, @@ -89761,10 +86757,8 @@ }, { "__Checksum": { - "Data1": 8886705431339170722, - "Data2": -1102844714842837166, - "Data3": 5019915311772799918, - "Data4": 1788819237481515671 + "Data1": 2085713964647578511, + "Data2": -3077252009352540535 }, "Flags": 0, "Kind": 0, @@ -89923,10 +86917,8 @@ }, { "__Checksum": { - "Data1": 7108710709233073202, - "Data2": 9151506159398492824, - "Data3": 2872047983188082017, - "Data4": -713275628073349989 + "Data1": 155620134700750808, + "Data2": 10446531320885866 }, "Flags": 0, "Kind": 0, @@ -89987,10 +86979,8 @@ }, { "__Checksum": { - "Data1": -6868484639868016984, - "Data2": 1192974918328791295, - "Data3": 6309537056171541794, - "Data4": 941344711809714882 + "Data1": 4355543362432319976, + "Data2": -7546302763391525027 }, "Flags": 0, "Kind": 0, @@ -90033,10 +87023,8 @@ }, { "__Checksum": { - "Data1": 8084477593316293365, - "Data2": -2949088736151729607, - "Data3": 3097649451648331761, - "Data4": -5687951113353914759 + "Data1": 741756200406241280, + "Data2": 1471907122262804069 }, "Flags": 0, "Kind": 0, @@ -90071,10 +87059,8 @@ }, { "__Checksum": { - "Data1": -7292499980890122841, - "Data2": -5578955300003902227, - "Data3": -7681195352123386505, - "Data4": -3259787915162205855 + "Data1": -3833968003507096084, + "Data2": 908338176474076680 }, "Flags": 0, "Kind": 0, @@ -90109,10 +87095,8 @@ }, { "__Checksum": { - "Data1": 3395966855362701679, - "Data2": -5712809920951680707, - "Data3": 4509922547714835808, - "Data4": -4609553594148685887 + "Data1": -7692481639529955388, + "Data2": -6024875238909119779 }, "Flags": 5, "Kind": 5, @@ -90176,10 +87160,8 @@ }, { "__Checksum": { - "Data1": 3139601340305507580, - "Data2": 6988723883558795555, - "Data3": -3030510332335134306, - "Data4": 5383135919165185010 + "Data1": -8162299728145443258, + "Data2": 1664691128932526323 }, "Flags": 5, "Kind": 5, @@ -90250,10 +87232,8 @@ }, { "__Checksum": { - "Data1": -8406346895588250251, - "Data2": 1590531350782734450, - "Data3": -2287121367222964513, - "Data4": 4519257548642296688 + "Data1": -8446537936527082438, + "Data2": 596930237674117503 }, "Flags": 5, "Kind": 5, @@ -90324,10 +87304,8 @@ }, { "__Checksum": { - "Data1": -5452233857723849218, - "Data2": 8568457072200835839, - "Data3": -2832324182110777052, - "Data4": 440893562658643135 + "Data1": -4622945368753976675, + "Data2": 470786165297527786 }, "Flags": 5, "Kind": 5, @@ -90405,10 +87383,8 @@ }, { "__Checksum": { - "Data1": -5809175648903176940, - "Data2": -4499020783064138812, - "Data3": 7964461181005599374, - "Data4": 4359830968167005179 + "Data1": 768472962813111405, + "Data2": -2123390155018920352 }, "Flags": 5, "Kind": 5, @@ -90486,10 +87462,8 @@ }, { "__Checksum": { - "Data1": 8441737924752524437, - "Data2": 8851013322187482430, - "Data3": -7462753051212646909, - "Data4": -4475299436523371855 + "Data1": -816203597765237667, + "Data2": 9046003601562144750 }, "Flags": 5, "Kind": 5, @@ -90567,10 +87541,8 @@ }, { "__Checksum": { - "Data1": -586590457739139678, - "Data2": -7651373011507919013, - "Data3": -1851839742747738911, - "Data4": 2087531256423093123 + "Data1": 74130144142750756, + "Data2": -1283759042376335997 }, "Flags": 5, "Kind": 5, @@ -90648,10 +87620,8 @@ }, { "__Checksum": { - "Data1": -590227965991760473, - "Data2": 8515652289796614162, - "Data3": -6587664867869649435, - "Data4": 3612729263327887373 + "Data1": 7532666520144926584, + "Data2": -431904911677840548 }, "Flags": 5, "Kind": 5, @@ -90730,10 +87700,8 @@ }, { "__Checksum": { - "Data1": -5549774777980741319, - "Data2": -3644279406554554101, - "Data3": -3117659034237281155, - "Data4": 3996895740936344256 + "Data1": -6878779294581601775, + "Data2": 6617692000465302254 }, "Flags": 5, "Kind": 5, @@ -90812,10 +87780,8 @@ }, { "__Checksum": { - "Data1": -6132872798497238244, - "Data2": 3802233403438952786, - "Data3": -5196966156403445392, - "Data4": 5051836154841357625 + "Data1": 771135869856762793, + "Data2": 453016327683775789 }, "Flags": 5, "Kind": 5, @@ -90894,10 +87860,8 @@ }, { "__Checksum": { - "Data1": -8051120903192557902, - "Data2": 5881563316455895062, - "Data3": 8900495774173922291, - "Data4": 4668537134483862768 + "Data1": -1607654568640058748, + "Data2": 4386007262311408984 }, "Flags": 5, "Kind": 5, @@ -90976,10 +87940,8 @@ }, { "__Checksum": { - "Data1": -6917814311546012194, - "Data2": 5359682400593966624, - "Data3": 8305926088194261162, - "Data4": -7839956816776982778 + "Data1": 7633941565279401513, + "Data2": -2809062232664880252 }, "Flags": 5, "Kind": 5, @@ -91058,10 +88020,8 @@ }, { "__Checksum": { - "Data1": -3557697718634353195, - "Data2": -7403217703048923566, - "Data3": 5761011107861366801, - "Data4": 3881484416779189753 + "Data1": -1872882270238752991, + "Data2": -8418773148086176130 }, "Flags": 5, "Kind": 5, @@ -91140,10 +88100,8 @@ }, { "__Checksum": { - "Data1": -364921630092790966, - "Data2": -3198985894048688466, - "Data3": -3931631932772432719, - "Data4": 7431229845903515821 + "Data1": 5691194941512718143, + "Data2": 8085984978883675041 }, "Flags": 5, "Kind": 5, @@ -91222,10 +88180,8 @@ }, { "__Checksum": { - "Data1": -8417639829925519997, - "Data2": -1293248804248739421, - "Data3": 8268304932365896412, - "Data4": 6151682298918425837 + "Data1": -3305883053209011685, + "Data2": -686301133074171757 }, "Flags": 5, "Kind": 5, @@ -91304,10 +88260,8 @@ }, { "__Checksum": { - "Data1": 3696075450752277537, - "Data2": -9186556994938837989, - "Data3": 2310035633812219238, - "Data4": -7806756895560012726 + "Data1": 8432563597668118121, + "Data2": -9071262789464305299 }, "Flags": 5, "Kind": 5, @@ -91378,10 +88332,8 @@ }, { "__Checksum": { - "Data1": -6589939040088878109, - "Data2": 6361964229849823152, - "Data3": 8574774049426351822, - "Data4": -339175249637902048 + "Data1": 3115893044011410026, + "Data2": -219483102290873081 }, "Flags": 5, "Kind": 5, @@ -91452,10 +88404,8 @@ }, { "__Checksum": { - "Data1": -3019369204956142021, - "Data2": 7322753390558466048, - "Data3": -5909573159728748730, - "Data4": 2004414109042772176 + "Data1": 3961414589545398610, + "Data2": -4614630900519107067 }, "Flags": 1, "Kind": 5, @@ -91495,10 +88445,8 @@ }, { "__Checksum": { - "Data1": 1012934240011144617, - "Data2": 7688555560240693911, - "Data3": -7442480275785572256, - "Data4": -8757861141758835044 + "Data1": -1185597158371564444, + "Data2": 3502081678717138598 }, "Flags": 3, "Kind": 5, @@ -91538,10 +88486,8 @@ }, { "__Checksum": { - "Data1": 1621948243804965013, - "Data2": -7355831137956255035, - "Data3": -965290260061111960, - "Data4": 3325747910889067982 + "Data1": 8612681760317971056, + "Data2": -5249784324870089788 }, "Flags": 1, "Kind": 5, @@ -91581,10 +88527,8 @@ }, { "__Checksum": { - "Data1": 2161647125848993029, - "Data2": 8243634769886840802, - "Data3": 8823457354928908867, - "Data4": -2608178901862253593 + "Data1": 1210579133434600731, + "Data2": -486999501903155740 }, "Flags": 3, "Kind": 5, @@ -91624,10 +88568,8 @@ }, { "__Checksum": { - "Data1": -4511397165212390905, - "Data2": 615125743669527246, - "Data3": -2694230445993864422, - "Data4": 2708546168105477029 + "Data1": -6536087159740738120, + "Data2": -5490017966081195128 }, "Flags": 1, "Kind": 5, @@ -91667,10 +88609,8 @@ }, { "__Checksum": { - "Data1": -4737548280111615631, - "Data2": 6562986293576387720, - "Data3": -6538348188059572861, - "Data4": -3396058274288470199 + "Data1": -8054405984046734553, + "Data2": -1593654587859841157 }, "Flags": 3, "Kind": 5, @@ -91710,10 +88650,8 @@ }, { "__Checksum": { - "Data1": -7053480258940985486, - "Data2": -5089847001901874081, - "Data3": 6359832516637165239, - "Data4": -8425254025295733065 + "Data1": -576220018587362925, + "Data2": -7263057627967704928 }, "Flags": 1, "Kind": 5, @@ -91753,10 +88691,8 @@ }, { "__Checksum": { - "Data1": -3142317649662893901, - "Data2": -1743695798620649123, - "Data3": -3204679393721900932, - "Data4": 3280044373881595553 + "Data1": -3074504098859805330, + "Data2": 460739215823742660 }, "Flags": 3, "Kind": 5, @@ -91796,10 +88732,8 @@ }, { "__Checksum": { - "Data1": 5317539624156062766, - "Data2": -2064017134831516400, - "Data3": 5951757527744761234, - "Data4": 9106424622550726051 + "Data1": 1807506143087175908, + "Data2": 6350292547099121944 }, "Flags": 1, "Kind": 5, @@ -91839,10 +88773,8 @@ }, { "__Checksum": { - "Data1": -8709001360642823206, - "Data2": -4729224240751747337, - "Data3": -4699593314188893528, - "Data4": 1734284440403701349 + "Data1": -2778483699251366081, + "Data2": 2161196612142772013 }, "Flags": 3, "Kind": 5, @@ -91882,10 +88814,8 @@ }, { "__Checksum": { - "Data1": 4449744607226932590, - "Data2": 8119458027246730067, - "Data3": -4667020901898826285, - "Data4": 6795867758859236570 + "Data1": 1593891822282460120, + "Data2": -9064486127441293418 }, "Flags": 1, "Kind": 5, @@ -91925,10 +88855,8 @@ }, { "__Checksum": { - "Data1": 94041786076976285, - "Data2": -7237078514332307062, - "Data3": -954258282176377901, - "Data4": -3692879809838119413 + "Data1": 5079215280893168334, + "Data2": -588802725242142969 }, "Flags": 3, "Kind": 5, @@ -91968,10 +88896,8 @@ }, { "__Checksum": { - "Data1": 6474146974377834275, - "Data2": -7128458080724139064, - "Data3": -6694016027223103740, - "Data4": -7741075446925879003 + "Data1": -8384876961455945733, + "Data2": -1502258099728767304 }, "Flags": 1, "Kind": 5, @@ -92011,10 +88937,8 @@ }, { "__Checksum": { - "Data1": 2695020646063224419, - "Data2": 4112663943734335680, - "Data3": -7992998355274116518, - "Data4": 312888619960331679 + "Data1": 8869768679341509320, + "Data2": -1082989645737947120 }, "Flags": 3, "Kind": 5, @@ -92054,10 +88978,8 @@ }, { "__Checksum": { - "Data1": 6794955125875064229, - "Data2": -1891868095801225579, - "Data3": 4403093395142000611, - "Data4": -8077884748331421647 + "Data1": -5531810780647044494, + "Data2": 4053099174769527014 }, "Flags": 1, "Kind": 5, @@ -92096,10 +89018,8 @@ }, { "__Checksum": { - "Data1": -7823839838255521676, - "Data2": 6333080330741726500, - "Data3": -161996441020080292, - "Data4": 6292240267113059261 + "Data1": -3379571714434516674, + "Data2": 7582987986115425328 }, "Flags": 3, "Kind": 5, @@ -92138,10 +89058,8 @@ }, { "__Checksum": { - "Data1": -1685335752322139860, - "Data2": 8273543092763261947, - "Data3": 8957910818290122570, - "Data4": 1215060789041310580 + "Data1": 7172266044139558925, + "Data2": 8020514639103144971 }, "Flags": 1, "Kind": 5, @@ -92180,10 +89098,8 @@ }, { "__Checksum": { - "Data1": -7139811439478151596, - "Data2": -1150402214124320812, - "Data3": -4284024076202044956, - "Data4": 6233019839983632970 + "Data1": 1825741647816773735, + "Data2": -5434401803282888948 }, "Flags": 1, "Kind": 5, @@ -92222,10 +89138,8 @@ }, { "__Checksum": { - "Data1": 7605955090538841578, - "Data2": -8803661361155673606, - "Data3": 2257777349572445935, - "Data4": 5652216134261359390 + "Data1": -4040796487900127908, + "Data2": -525462594569978890 }, "Flags": 1, "Kind": 5, @@ -92264,10 +89178,8 @@ }, { "__Checksum": { - "Data1": 6346082724512860559, - "Data2": 2389873456184235231, - "Data3": -5275390881399155713, - "Data4": 7482753657811829902 + "Data1": -7715452396905535396, + "Data2": 6684126467955123592 }, "Flags": 1, "Kind": 5, @@ -92306,10 +89218,8 @@ }, { "__Checksum": { - "Data1": 3138866894870982693, - "Data2": 367378085779915773, - "Data3": 8602620573988628863, - "Data4": 423714114380072340 + "Data1": 3289620681120245409, + "Data2": -6487499869602206715 }, "Flags": 1, "Kind": 5, @@ -92348,10 +89258,8 @@ }, { "__Checksum": { - "Data1": 5088365985569712548, - "Data2": -7882953706605206321, - "Data3": 693883832298916855, - "Data4": 1947767801236324628 + "Data1": -8401250672107576783, + "Data2": 6939993539080232294 }, "Flags": 3, "Kind": 5, @@ -92390,10 +89298,8 @@ }, { "__Checksum": { - "Data1": -5039452843177074375, - "Data2": 8910878181712319425, - "Data3": 8644188306552071472, - "Data4": -7996213910160522494 + "Data1": -3901307578958173837, + "Data2": -4864334212189098040 }, "Flags": 3, "Kind": 5, @@ -92432,10 +89338,8 @@ }, { "__Checksum": { - "Data1": -8304418492186247800, - "Data2": -5450912363498518657, - "Data3": -7872228122577388400, - "Data4": -3256170742682117704 + "Data1": -8776593715504937590, + "Data2": -5509679871729452490 }, "Flags": 3, "Kind": 5, @@ -92474,10 +89378,8 @@ }, { "__Checksum": { - "Data1": -6349016106135697763, - "Data2": 512358910909656473, - "Data3": 3967290330381366537, - "Data4": -8824632712002096624 + "Data1": 7016955359087975179, + "Data2": 1431277040139138226 }, "Flags": 3, "Kind": 5, @@ -92516,10 +89418,8 @@ }, { "__Checksum": { - "Data1": -7181731377717525210, - "Data2": 8779185098925276691, - "Data3": -7313239416378122070, - "Data4": -6390613132417875774 + "Data1": 6910681247492820584, + "Data2": -518824529015333106 }, "Flags": 3, "Kind": 5, @@ -92558,10 +89458,8 @@ }, { "__Checksum": { - "Data1": 2120796284546834510, - "Data2": 7090678568328693396, - "Data3": -3548326510267470903, - "Data4": 1536831954848103686 + "Data1": 8247285287600452375, + "Data2": -1178037401627404759 }, "Flags": 1, "Kind": 5, @@ -92600,10 +89498,8 @@ }, { "__Checksum": { - "Data1": 9051077333990983130, - "Data2": -5462755301221366531, - "Data3": -5629939648524782006, - "Data4": 8769561165069459057 + "Data1": -1330848411673481016, + "Data2": -8250560049917889205 }, "Flags": 1, "Kind": 5, @@ -92643,10 +89539,8 @@ }, { "__Checksum": { - "Data1": 5299155224894600925, - "Data2": 7583076801461620665, - "Data3": -5644089343366986783, - "Data4": -7424097622646984040 + "Data1": -2935518049695220712, + "Data2": 2076721044691270580 }, "Flags": 3, "Kind": 5, @@ -92685,10 +89579,8 @@ }, { "__Checksum": { - "Data1": 7504983403075697192, - "Data2": -2811176250341816293, - "Data3": -421573542610359261, - "Data4": 2730855769412881803 + "Data1": -1658624771414077640, + "Data2": 358357981226874109 }, "Flags": 3, "Kind": 5, @@ -92728,10 +89620,8 @@ }, { "__Checksum": { - "Data1": -7404772852820557591, - "Data2": -6056349118002215624, - "Data3": 687679789129777885, - "Data4": -7992136756647733923 + "Data1": -784226584160634856, + "Data2": 8704344791543072754 }, "Flags": 1, "Kind": 5, @@ -92771,10 +89661,8 @@ }, { "__Checksum": { - "Data1": 1138019125629565666, - "Data2": -5664158724440456082, - "Data3": -4819129605297850727, - "Data4": 600169093627505095 + "Data1": -5825807025534251556, + "Data2": -8013469336725668973 }, "Flags": 3, "Kind": 5, @@ -92814,10 +89702,8 @@ }, { "__Checksum": { - "Data1": 40215821037763050, - "Data2": -6125639280158887019, - "Data3": 5588096746822726213, - "Data4": -8747312314039586982 + "Data1": 7964303102762126625, + "Data2": 7416607167950498728 }, "Flags": 1, "Kind": 5, @@ -92857,10 +89743,8 @@ }, { "__Checksum": { - "Data1": 1330695462887713055, - "Data2": -4300751635145557195, - "Data3": -7424578137071285059, - "Data4": -7049753560383797444 + "Data1": -5836070680486405489, + "Data2": -5420050377610796251 }, "Flags": 3, "Kind": 5, @@ -92900,10 +89784,8 @@ }, { "__Checksum": { - "Data1": -4995526981768244957, - "Data2": -6930450473786166718, - "Data3": -1770817319173308684, - "Data4": 8071456320915810582 + "Data1": -6603017214168509237, + "Data2": 4496119475928774582 }, "Flags": 1, "Kind": 5, @@ -92943,10 +89825,8 @@ }, { "__Checksum": { - "Data1": 3191040628831935083, - "Data2": -6820937300289064404, - "Data3": -4453789880311831400, - "Data4": 7074123545370591516 + "Data1": 4535302322733721819, + "Data2": -3534782099461713489 }, "Flags": 3, "Kind": 5, @@ -92986,10 +89866,8 @@ }, { "__Checksum": { - "Data1": -5802978640713467770, - "Data2": 5303509616880592080, - "Data3": -3226884840132391986, - "Data4": 6039316541692028019 + "Data1": 4167493388238305935, + "Data2": -5593552389335154844 }, "Flags": 1, "Kind": 5, @@ -93029,10 +89907,8 @@ }, { "__Checksum": { - "Data1": 7868045890807408408, - "Data2": -614993759422728782, - "Data3": 303728990839338157, - "Data4": 7818515804306963198 + "Data1": 299017690395343270, + "Data2": 1969375701843155887 }, "Flags": 1, "Kind": 5, @@ -93072,10 +89948,8 @@ }, { "__Checksum": { - "Data1": 1084309191462171888, - "Data2": -8043642580490648672, - "Data3": -5786124999538221380, - "Data4": 5690816960899194094 + "Data1": -794811450163854413, + "Data2": 1098440431772461299 }, "Flags": 1, "Kind": 5, @@ -93114,10 +89988,8 @@ }, { "__Checksum": { - "Data1": 392399693257438913, - "Data2": -3989631922879606079, - "Data3": 3525743369181298847, - "Data4": 7545520233723888149 + "Data1": 7525741761961305134, + "Data2": -6409743122620528739 }, "Flags": 3, "Kind": 5, @@ -93157,10 +90029,8 @@ }, { "__Checksum": { - "Data1": -1298084890215214353, - "Data2": -3109934682688134761, - "Data3": -4934907161730803056, - "Data4": -7804818160850973814 + "Data1": -5240291895818881169, + "Data2": -2987922999673422824 }, "Flags": 3, "Kind": 5, @@ -93200,10 +90070,8 @@ }, { "__Checksum": { - "Data1": -23967191409033363, - "Data2": -3971033410314099076, - "Data3": 3442074032161978733, - "Data4": 3978826076884649537 + "Data1": 5874995154948305793, + "Data2": -46906775770071051 }, "Flags": 3, "Kind": 5, @@ -93242,10 +90110,8 @@ }, { "__Checksum": { - "Data1": -4519892995241819719, - "Data2": 4341731526791110458, - "Data3": 6937449503911589075, - "Data4": -6590435852392768136 + "Data1": 597094637041112074, + "Data2": 1452881327119704190 }, "Flags": 1, "Kind": 5, @@ -93285,10 +90151,8 @@ }, { "__Checksum": { - "Data1": 8328772489441951614, - "Data2": -5134382175339579467, - "Data3": 2153187192774415323, - "Data4": 4106378186851827745 + "Data1": -3429384126539608679, + "Data2": 5986981475317862160 }, "Flags": 3, "Kind": 5, @@ -93328,10 +90192,8 @@ }, { "__Checksum": { - "Data1": -1727295763585475613, - "Data2": 8118396176993419312, - "Data3": -6726899797087566762, - "Data4": 4801625800568535123 + "Data1": 2108838050489373723, + "Data2": -1097972111192570252 }, "Flags": 1, "Kind": 5, @@ -93370,10 +90232,8 @@ }, { "__Checksum": { - "Data1": 4329909595321822402, - "Data2": -8541882711671505717, - "Data3": 1228367693600871978, - "Data4": -7247961398966207553 + "Data1": -3917759483458103472, + "Data2": 2418545861484944096 }, "Flags": 1, "Kind": 5, @@ -93412,10 +90272,8 @@ }, { "__Checksum": { - "Data1": 7666235019256580621, - "Data2": 6075640795221498679, - "Data3": 4062051004551121472, - "Data4": 8507280196571199515 + "Data1": 6727842912083829374, + "Data2": -9166177836405924913 }, "Flags": 3, "Kind": 5, @@ -93454,10 +90312,8 @@ }, { "__Checksum": { - "Data1": 3732753070383032503, - "Data2": 1481315709268494561, - "Data3": -1497958075917535813, - "Data4": -1007652814608235657 + "Data1": 935323443178403187, + "Data2": -7346547185207611723 }, "Flags": 3, "Kind": 5, @@ -93496,10 +90352,8 @@ }, { "__Checksum": { - "Data1": -4112427903111680708, - "Data2": -9171914026290448796, - "Data3": -1257139472144556961, - "Data4": 5209853400704811630 + "Data1": -1628099595610943031, + "Data2": 4254862371382950502 }, "Flags": 1, "Kind": 5, @@ -93539,10 +90393,8 @@ }, { "__Checksum": { - "Data1": 791521019538688269, - "Data2": -6846771692558942895, - "Data3": -4689859460833019952, - "Data4": -8923878110769957386 + "Data1": 1774819651800136650, + "Data2": 2441660761374813132 }, "Flags": 3, "Kind": 5, @@ -93582,10 +90434,8 @@ }, { "__Checksum": { - "Data1": -2800740843750140672, - "Data2": -1545060022852407119, - "Data3": 6762935192797691429, - "Data4": -8849059571653233660 + "Data1": -3955219468144380382, + "Data2": 3245027639983802709 }, "Flags": 1, "Kind": 5, @@ -93625,10 +90475,8 @@ }, { "__Checksum": { - "Data1": 7823772301128826846, - "Data2": 4897830730954978646, - "Data3": 5845248105708242261, - "Data4": -8617675667468513753 + "Data1": -5501737511743144276, + "Data2": 6313225467547217249 }, "Flags": 3, "Kind": 5, @@ -93668,10 +90516,8 @@ }, { "__Checksum": { - "Data1": 1667344556569056614, - "Data2": 7103890980784914606, - "Data3": 8686816908334700614, - "Data4": 8573221552636620081 + "Data1": 1540433384835247102, + "Data2": -391341047939430843 }, "Flags": 1, "Kind": 5, @@ -93710,10 +90556,8 @@ }, { "__Checksum": { - "Data1": -1398254653727443451, - "Data2": -3118000488938479102, - "Data3": 8781509521845679562, - "Data4": -3561970308148203422 + "Data1": 1028883442242519427, + "Data2": -6483033869272206737 }, "Flags": 1, "Kind": 5, @@ -93752,10 +90596,8 @@ }, { "__Checksum": { - "Data1": 6619714198671899030, - "Data2": 4344167420692720785, - "Data3": 4393137754631676617, - "Data4": -5115946137243927450 + "Data1": -6939497432442632238, + "Data2": -6286060796021551633 }, "Flags": 3, "Kind": 5, @@ -93794,10 +90636,8 @@ }, { "__Checksum": { - "Data1": 1938936379622563620, - "Data2": 4281953302474974870, - "Data3": 4973658983808689385, - "Data4": -7762943638634047918 + "Data1": -6171976475184628388, + "Data2": -7690830471109667540 }, "Flags": 3, "Kind": 5, @@ -93836,10 +90676,8 @@ }, { "__Checksum": { - "Data1": 4484316455177898280, - "Data2": 6707519973343774028, - "Data3": -1353309887402882169, - "Data4": 3286657303543009149 + "Data1": -6455368955981564849, + "Data2": -2209586399146149918 }, "Flags": 1, "Kind": 5, @@ -93878,10 +90716,8 @@ }, { "__Checksum": { - "Data1": -7167538719710854713, - "Data2": -2608146517518952197, - "Data3": 884073693303711498, - "Data4": -2188086482645566492 + "Data1": 6383813863918532504, + "Data2": -2344234564617351993 }, "Flags": 3, "Kind": 5, @@ -93920,10 +90756,8 @@ }, { "__Checksum": { - "Data1": -6794925424858055959, - "Data2": -4099604721431239413, - "Data3": -8522329088434090629, - "Data4": -4684258126127754719 + "Data1": -8624798623908860681, + "Data2": -5056316981433856111 }, "Flags": 1, "Kind": 5, @@ -93963,10 +90797,8 @@ }, { "__Checksum": { - "Data1": -6084460931044771761, - "Data2": 5518423028207187349, - "Data3": 5181309116589018968, - "Data4": 4327436083928447104 + "Data1": -2320162117879620012, + "Data2": -1809060054465655885 }, "Flags": 3, "Kind": 5, @@ -94006,10 +90838,8 @@ }, { "__Checksum": { - "Data1": 8141205255246975182, - "Data2": -5974717762913357153, - "Data3": -174014473222786685, - "Data4": 3817960751884049693 + "Data1": 8586499302167778872, + "Data2": 2956295131112163754 }, "Flags": 1, "Kind": 5, @@ -94049,10 +90879,8 @@ }, { "__Checksum": { - "Data1": -4357308031349239598, - "Data2": -1161883842577616412, - "Data3": 259155139034338614, - "Data4": -3792214915269093299 + "Data1": 1470751419500565959, + "Data2": -7060649373428506490 }, "Flags": 3, "Kind": 5, @@ -94092,10 +90920,8 @@ }, { "__Checksum": { - "Data1": 2013200466445036746, - "Data2": -1899885602386803921, - "Data3": 7512541534848993927, - "Data4": -4920008493099644936 + "Data1": -6423655686168202999, + "Data2": 5448633066638821078 }, "Flags": 1, "Kind": 5, @@ -94134,10 +90960,8 @@ }, { "__Checksum": { - "Data1": 7538034482577819162, - "Data2": -4317009708462081194, - "Data3": -1364791333377263059, - "Data4": 3144874426618784369 + "Data1": 3425643190671939235, + "Data2": 7949174709660146675 }, "Flags": 3, "Kind": 5, @@ -94176,10 +91000,8 @@ }, { "__Checksum": { - "Data1": -6342246297768123925, - "Data2": 7034054434097682948, - "Data3": -7184665353150321279, - "Data4": 1909520195197060802 + "Data1": -2139477673061027354, + "Data2": 3669882089613100957 }, "Flags": 1, "Kind": 5, @@ -94218,10 +91040,8 @@ }, { "__Checksum": { - "Data1": 2739947923370784609, - "Data2": 9069424480228509918, - "Data3": -5405068995129533145, - "Data4": -6388501122234707597 + "Data1": -9009254034854359333, + "Data2": -729368534235568185 }, "Flags": 1, "Kind": 5, @@ -94260,10 +91080,8 @@ }, { "__Checksum": { - "Data1": 4045678075755164376, - "Data2": -7219146323540315535, - "Data3": -5162715948813805338, - "Data4": 8199107744017615676 + "Data1": 2427460111397738882, + "Data2": 4821536880709274286 }, "Flags": 3, "Kind": 5, @@ -94302,10 +91120,8 @@ }, { "__Checksum": { - "Data1": -7585969977762648961, - "Data2": -2803606252008730180, - "Data3": -1153225056346394090, - "Data4": 5349187681263394840 + "Data1": -6733138793683324409, + "Data2": 660377029379144736 }, "Flags": 3, "Kind": 5, @@ -94344,10 +91160,8 @@ }, { "__Checksum": { - "Data1": -3433742487425065013, - "Data2": -3338479626699985665, - "Data3": 8483440465381479869, - "Data4": 981573687920928572 + "Data1": -2798804586072942464, + "Data2": -7195910996699486825 }, "Flags": 1, "Kind": 5, @@ -94387,10 +91201,8 @@ }, { "__Checksum": { - "Data1": -7470644749900066903, - "Data2": 8569851665744019009, - "Data3": 437950943137463799, - "Data4": -4474149888959007252 + "Data1": 6351720509460999661, + "Data2": 8640334998613652807 }, "Flags": 3, "Kind": 5, @@ -94430,10 +91242,8 @@ }, { "__Checksum": { - "Data1": -2675916835658935389, - "Data2": -4520533052927472412, - "Data3": -1184479703617635471, - "Data4": 2447772616094284246 + "Data1": 3603287383962998663, + "Data2": 5547224458920507202 }, "Flags": 1, "Kind": 5, @@ -94472,10 +91282,8 @@ }, { "__Checksum": { - "Data1": 330787713749949982, - "Data2": 4264244570169319570, - "Data3": -7104778144154234498, - "Data4": 2208044913934917848 + "Data1": -7758187882246121689, + "Data2": 1220152898280374381 }, "Flags": 3, "Kind": 5, @@ -94514,10 +91322,8 @@ }, { "__Checksum": { - "Data1": 924839464211357522, - "Data2": 5692872924726692517, - "Data3": 7717292096319759033, - "Data4": 1075796360791715478 + "Data1": 3481054212598050032, + "Data2": -14654616736031157 }, "Flags": 1, "Kind": 5, @@ -94557,10 +91363,8 @@ }, { "__Checksum": { - "Data1": -3965248548478593502, - "Data2": -5524327343504422594, - "Data3": 2354163168636962752, - "Data4": -1052929666847803079 + "Data1": 7925718004319146813, + "Data2": 5989783420492809994 }, "Flags": 3, "Kind": 5, @@ -94600,10 +91404,8 @@ }, { "__Checksum": { - "Data1": -2182305261240271176, - "Data2": -8180002434273835285, - "Data3": -156162589748325250, - "Data4": 9215056512531638398 + "Data1": -6078971754556524941, + "Data2": 227341865813651186 }, "Flags": 1, "Kind": 5, @@ -94643,10 +91445,8 @@ }, { "__Checksum": { - "Data1": 3721090377751971685, - "Data2": 6839077314444639015, - "Data3": -3560085096530024744, - "Data4": 7307973913631019360 + "Data1": 7600075818137913012, + "Data2": -7776475845171392525 }, "Flags": 3, "Kind": 5, @@ -94686,10 +91486,8 @@ }, { "__Checksum": { - "Data1": -4700580872321803363, - "Data2": 742950965567375754, - "Data3": -2589149814053674329, - "Data4": -2625651175259139913 + "Data1": 7804012048186964565, + "Data2": 7650754975973452413 }, "Flags": 1, "Kind": 5, @@ -94728,10 +91526,8 @@ }, { "__Checksum": { - "Data1": -4450137597307019342, - "Data2": -4410122291895340018, - "Data3": -3654899181297811213, - "Data4": -4961778380587541737 + "Data1": -3576444651725084128, + "Data2": 4060805409441641422 }, "Flags": 3, "Kind": 5, @@ -94770,10 +91566,8 @@ }, { "__Checksum": { - "Data1": -207579600251646139, - "Data2": -2614726743849371963, - "Data3": -4413012777139910864, - "Data4": -3606456179646266154 + "Data1": 4325544388492144354, + "Data2": -5384405909364338056 }, "Flags": 1, "Kind": 5, @@ -94812,10 +91606,8 @@ }, { "__Checksum": { - "Data1": 8215178085283414754, - "Data2": 5815451578455207779, - "Data3": -611005010244052195, - "Data4": 8076898995265834 + "Data1": -7154640970828736434, + "Data2": 8687306957035822312 }, "Flags": 1, "Kind": 5, @@ -94854,10 +91646,8 @@ }, { "__Checksum": { - "Data1": 7739968878470252625, - "Data2": 6559886804140724031, - "Data3": -379742792097530554, - "Data4": 3022020996553028793 + "Data1": 1717760763802889861, + "Data2": 2561804085245548546 }, "Flags": 3, "Kind": 5, @@ -94896,10 +91686,8 @@ }, { "__Checksum": { - "Data1": 2888797565425774407, - "Data2": 2330366825906009286, - "Data3": -2722294847804192033, - "Data4": -7687744101741012170 + "Data1": -4901609644172898304, + "Data2": 7108351866686132694 }, "Flags": 3, "Kind": 5, @@ -94938,10 +91726,8 @@ }, { "__Checksum": { - "Data1": 9083126966144220679, - "Data2": -4749832466471503608, - "Data3": 2258337751072039151, - "Data4": -4713380913436185692 + "Data1": -1222619188563286050, + "Data2": 1781632254900304159 }, "Flags": 1, "Kind": 5, @@ -94980,10 +91766,8 @@ }, { "__Checksum": { - "Data1": 4644121911006790393, - "Data2": 5866998398537606141, - "Data3": -7932134528198489878, - "Data4": 758950472585683959 + "Data1": 2148519643872906108, + "Data2": -8647034394527797607 }, "Flags": 3, "Kind": 5, @@ -95022,10 +91806,8 @@ }, { "__Checksum": { - "Data1": 157242304251270315, - "Data2": -322109332581598498, - "Data3": 6626741333937124208, - "Data4": -8601548000659683043 + "Data1": -1838126878123393688, + "Data2": -5001451041450647989 }, "Flags": 1, "Kind": 5, @@ -95064,10 +91846,8 @@ }, { "__Checksum": { - "Data1": -2033898557312148982, - "Data2": -6019137099820342483, - "Data3": 1386540740052142349, - "Data4": -5462574276390201235 + "Data1": 1009657038521103634, + "Data2": -2288710801832465808 }, "Flags": 1, "Kind": 5, @@ -95106,10 +91886,8 @@ }, { "__Checksum": { - "Data1": 971238249125291037, - "Data2": -3827298527187328486, - "Data3": 1273284517032677027, - "Data4": 4310150854722970776 + "Data1": -4375353695097989720, + "Data2": -6925332858077371858 }, "Flags": 3, "Kind": 5, @@ -95148,10 +91926,8 @@ }, { "__Checksum": { - "Data1": 182613902377995836, - "Data2": -5053427382138196722, - "Data3": -3139776703016569147, - "Data4": 2392327876919120173 + "Data1": -8938402604575765559, + "Data2": 5231132558298857524 }, "Flags": 3, "Kind": 5, @@ -95190,10 +91966,8 @@ }, { "__Checksum": { - "Data1": -6876596980084434510, - "Data2": 8807335676094954705, - "Data3": 8606835382685425665, - "Data4": 6376102589884967361 + "Data1": 5311785564210127457, + "Data2": -6336110494020501925 }, "Flags": 1, "Kind": 5, @@ -95233,10 +92007,8 @@ }, { "__Checksum": { - "Data1": 2883065458145343101, - "Data2": 7570640567210138882, - "Data3": 5990392277401914124, - "Data4": 7703105813080473692 + "Data1": -3039561213392347741, + "Data2": 281185464695178549 }, "Flags": 3, "Kind": 5, @@ -95276,10 +92048,8 @@ }, { "__Checksum": { - "Data1": 5309776975127727669, - "Data2": -2329091767749169775, - "Data3": 4885495151689218227, - "Data4": -4502924602294318205 + "Data1": -1662940887735426630, + "Data2": -3593192554192727401 }, "Flags": 1, "Kind": 5, @@ -95318,10 +92088,8 @@ }, { "__Checksum": { - "Data1": 7135091805294749582, - "Data2": 7721694096130180009, - "Data3": 1778854345062008614, - "Data4": -4317693154869730654 + "Data1": -255181697539934195, + "Data2": -235575073817923080 }, "Flags": 3, "Kind": 5, @@ -95360,10 +92128,8 @@ }, { "__Checksum": { - "Data1": 95889961819114901, - "Data2": -1727304648144804330, - "Data3": 1355322023456448369, - "Data4": -7130687276015621757 + "Data1": -2382704713708234597, + "Data2": 4746374684976589677 }, "Flags": 1, "Kind": 5, @@ -95402,10 +92168,8 @@ }, { "__Checksum": { - "Data1": 4928522512211176782, - "Data2": 6874779523497491376, - "Data3": -7587040068600922845, - "Data4": -9042713651110259863 + "Data1": 281049536587645620, + "Data2": -3850352981991003323 }, "Flags": 3, "Kind": 5, @@ -95444,10 +92208,8 @@ }, { "__Checksum": { - "Data1": 3466726427941949914, - "Data2": 6910313816236442510, - "Data3": -2814643353523072417, - "Data4": 4570667427148212742 + "Data1": 7035010252777133437, + "Data2": -4040377175604370306 }, "Flags": 1, "Kind": 5, @@ -95486,10 +92248,8 @@ }, { "__Checksum": { - "Data1": -1417089343188580608, - "Data2": 6163314365918347123, - "Data3": -8689599449082934003, - "Data4": 4079022518541806995 + "Data1": -364111944763529132, + "Data2": 7783111651487513116 }, "Flags": 3, "Kind": 5, @@ -95528,10 +92288,8 @@ }, { "__Checksum": { - "Data1": -4593733543149679439, - "Data2": 1165981915338469724, - "Data3": -8599041127973966925, - "Data4": 6847469052903951820 + "Data1": 8035630383241351062, + "Data2": -3161419282979773779 }, "Flags": 1, "Kind": 5, @@ -95570,10 +92328,8 @@ }, { "__Checksum": { - "Data1": -4893037580566906311, - "Data2": 4472552170775045093, - "Data3": 5907097292317460377, - "Data4": -8390905063060492875 + "Data1": 8175930582636338567, + "Data2": -3523375707955425191 }, "Flags": 3, "Kind": 5, @@ -95612,10 +92368,8 @@ }, { "__Checksum": { - "Data1": 8906141236274911948, - "Data2": 6178070552661697994, - "Data3": -4455360795008870962, - "Data4": -1422432912621193124 + "Data1": 4783651242550582845, + "Data2": -6793242225312506797 }, "Flags": 1, "Kind": 5, @@ -95654,10 +92408,8 @@ }, { "__Checksum": { - "Data1": 4629932130178682725, - "Data2": -3322515887378802550, - "Data3": -1379808724728933211, - "Data4": -4028753180931805336 + "Data1": -4136102394486677351, + "Data2": -6060199331810058655 }, "Flags": 3, "Kind": 5, @@ -95696,10 +92448,8 @@ }, { "__Checksum": { - "Data1": 2778294815490930706, - "Data2": -4539806389319427751, - "Data3": -4341440368877664086, - "Data4": -4004603621826124486 + "Data1": -7946450822044106728, + "Data2": 841998493338009712 }, "Flags": 1, "Kind": 5, @@ -95738,10 +92488,8 @@ }, { "__Checksum": { - "Data1": -7831904364372087466, - "Data2": -8957464379631960883, - "Data3": -2116813768276863162, - "Data4": 9205681615344227914 + "Data1": 8913507346209175343, + "Data2": -664696958817495505 }, "Flags": 3, "Kind": 5, @@ -95780,10 +92528,8 @@ }, { "__Checksum": { - "Data1": 5767010618098305573, - "Data2": -8036177014693372354, - "Data3": 872911914721973605, - "Data4": 8800303475497113385 + "Data1": -2112990081582807821, + "Data2": 503207738231264186 }, "Flags": 1, "Kind": 5, @@ -95822,10 +92568,8 @@ }, { "__Checksum": { - "Data1": 6249002321708301449, - "Data2": 4349199754649043296, - "Data3": 8124820982153627410, - "Data4": -777526482046565472 + "Data1": 6964141028945714158, + "Data2": -8521768726523670638 }, "Flags": 3, "Kind": 5, @@ -95864,10 +92608,8 @@ }, { "__Checksum": { - "Data1": -1354701138221630705, - "Data2": -9103817446770512834, - "Data3": -6505367416646235586, - "Data4": 6930141947461164139 + "Data1": 4870846600361359792, + "Data2": -6054638676712095335 }, "Flags": 1, "Kind": 5, @@ -95906,10 +92648,8 @@ }, { "__Checksum": { - "Data1": -7712578024405802471, - "Data2": -9184338286370174126, - "Data3": -5799958676801126509, - "Data4": 1531631572246048450 + "Data1": -4108711460720897628, + "Data2": -1567695998974171367 }, "Flags": 3, "Kind": 5, @@ -95948,10 +92688,8 @@ }, { "__Checksum": { - "Data1": 4352595509332106268, - "Data2": -7355263719180275390, - "Data3": -1641462844162725312, - "Data4": -6249909358509976534 + "Data1": -2130639335448614722, + "Data2": -587496723024260561 }, "Flags": 1, "Kind": 5, @@ -95990,10 +92728,8 @@ }, { "__Checksum": { - "Data1": -1380815563052145998, - "Data2": -493629815481037964, - "Data3": 3271832898381300202, - "Data4": -772253369290464706 + "Data1": -1507182406441520812, + "Data2": 1874301166512660603 }, "Flags": 3, "Kind": 5, @@ -96032,10 +92768,8 @@ }, { "__Checksum": { - "Data1": -9020454962776591205, - "Data2": -7774022359971223955, - "Data3": -6820590014565106783, - "Data4": -7177817128032869582 + "Data1": -3216826514878927891, + "Data2": 1342657542526415468 }, "Flags": 1, "Kind": 5, @@ -96074,10 +92808,8 @@ }, { "__Checksum": { - "Data1": 3660959178298960206, - "Data2": 360297258506154250, - "Data3": 620593493894744947, - "Data4": -6668951302417594412 + "Data1": -2714011138779007952, + "Data2": 8915924158461744928 }, "Flags": 3, "Kind": 5, @@ -96116,10 +92848,8 @@ }, { "__Checksum": { - "Data1": -2169087220019594251, - "Data2": 5211791562861243675, - "Data3": 4965512142231410131, - "Data4": -2443233025370023181 + "Data1": 1187837259498169042, + "Data2": -4159112713624985010 }, "Flags": 1, "Kind": 5, @@ -96158,10 +92888,8 @@ }, { "__Checksum": { - "Data1": -6353198501480343058, - "Data2": -3760536388790330203, - "Data3": 9189950409417497315, - "Data4": -3854702067461436958 + "Data1": -4444680780019470363, + "Data2": -8817247993333658912 }, "Flags": 3, "Kind": 5, @@ -96200,10 +92928,8 @@ }, { "__Checksum": { - "Data1": -6023624966509757536, - "Data2": -1649398057440035660, - "Data3": -369686494864802898, - "Data4": 7664210716940340252 + "Data1": -738896566175285413, + "Data2": 99230896738134107 }, "Flags": 1, "Kind": 5, @@ -96242,10 +92968,8 @@ }, { "__Checksum": { - "Data1": 6037782176476523936, - "Data2": 9185456152661896904, - "Data3": 321947905849324455, - "Data4": -3023199905309397105 + "Data1": 8630814814192103395, + "Data2": 6196342667926707539 }, "Flags": 3, "Kind": 5, @@ -96284,10 +93008,8 @@ }, { "__Checksum": { - "Data1": -4709455131434413384, - "Data2": 2139094616427607979, - "Data3": 4060108602106659899, - "Data4": -646313119539886511 + "Data1": 4315263914337263786, + "Data2": 9065246166200091247 }, "Flags": 1, "Kind": 5, @@ -96326,10 +93048,8 @@ }, { "__Checksum": { - "Data1": 7605601720697310255, - "Data2": -5928568688703890063, - "Data3": -4950678037036057216, - "Data4": -5820413095669652370 + "Data1": 3101786180258552827, + "Data2": -2918797734862026650 }, "Flags": 3, "Kind": 5, @@ -96368,10 +93088,8 @@ }, { "__Checksum": { - "Data1": -7368803353059753188, - "Data2": -3147600559467892152, - "Data3": 1078389034861265231, - "Data4": -5101353353845075936 + "Data1": -6276510355697064073, + "Data2": 5309830286426527889 }, "Flags": 1, "Kind": 5, @@ -96410,10 +93128,8 @@ }, { "__Checksum": { - "Data1": -9012448443401715798, - "Data2": 2473703120967987128, - "Data3": -2808625391880834328, - "Data4": -5066576388497676475 + "Data1": 5861258095983697972, + "Data2": -4693159548394614606 }, "Flags": 3, "Kind": 5, @@ -96452,10 +93168,8 @@ }, { "__Checksum": { - "Data1": -1103708202413465695, - "Data2": 1526327008779662561, - "Data3": -2995199169879955019, - "Data4": 2345108993142762024 + "Data1": -8177942662392673289, + "Data2": -2941893623447885788 }, "Flags": 1, "Kind": 5, @@ -96494,10 +93208,8 @@ }, { "__Checksum": { - "Data1": 4033621095288443667, - "Data2": -4104474258564606982, - "Data3": -4054473283800868579, - "Data4": 4780968166692173568 + "Data1": 5987460164771781693, + "Data2": -8311239569603995491 }, "Flags": 3, "Kind": 5, @@ -96536,10 +93248,8 @@ }, { "__Checksum": { - "Data1": -3511956384740319510, - "Data2": 911792363101780738, - "Data3": 2364420311470882571, - "Data4": 4898240470290926030 + "Data1": -3112759101651425385, + "Data2": -8867584677733005442 }, "Flags": 1, "Kind": 5, @@ -96578,10 +93288,8 @@ }, { "__Checksum": { - "Data1": 5247572363304912700, - "Data2": -7731706200362281727, - "Data3": -8480067748952816811, - "Data4": -7604716600203441018 + "Data1": -7221998338773209873, + "Data2": -6318909618432149844 }, "Flags": 3, "Kind": 5, @@ -96620,10 +93328,8 @@ }, { "__Checksum": { - "Data1": 7870489510304786001, - "Data2": 2479868514942917710, - "Data3": -2910225555250519744, - "Data4": 208157111832462101 + "Data1": -7075183849703364725, + "Data2": 8761818734080999674 }, "Flags": 1, "Kind": 5, @@ -96662,10 +93368,8 @@ }, { "__Checksum": { - "Data1": -4265521314887121170, - "Data2": 2468822685393362908, - "Data3": -8993007678717426327, - "Data4": -3845951165003184659 + "Data1": -1853384032043804140, + "Data2": -3917809253541593511 }, "Flags": 3, "Kind": 5, @@ -96704,10 +93408,8 @@ }, { "__Checksum": { - "Data1": -494725298055265136, - "Data2": 615506464994560739, - "Data3": 4246896988126663094, - "Data4": 507834442227567117 + "Data1": -8723446584257357362, + "Data2": 1260517884913687435 }, "Flags": 1, "Kind": 5, @@ -96746,10 +93448,8 @@ }, { "__Checksum": { - "Data1": 593328192011653, - "Data2": -3885246213533060377, - "Data3": -931432116583342042, - "Data4": 6421512203492270868 + "Data1": -8670209156169999103, + "Data2": 8532513044307144485 }, "Flags": 3, "Kind": 5, @@ -96788,10 +93488,8 @@ }, { "__Checksum": { - "Data1": -8923966919557603421, - "Data2": 685784236072693212, - "Data3": -3537269842382151071, - "Data4": 7606867876189017401 + "Data1": -5955457572819774118, + "Data2": -8908341143816681260 }, "Flags": 1, "Kind": 5, @@ -96830,10 +93528,8 @@ }, { "__Checksum": { - "Data1": 586501897559816855, - "Data2": 1838178272002043372, - "Data3": 1675691262413701073, - "Data4": 723433316784590214 + "Data1": 3994643002653443488, + "Data2": 4646130491201804012 }, "Flags": 3, "Kind": 5, @@ -96872,10 +93568,8 @@ }, { "__Checksum": { - "Data1": 1769030406454646275, - "Data2": -1203099486864521356, - "Data3": -732409623407131049, - "Data4": 4025238061809636741 + "Data1": 2026219988075202571, + "Data2": 1875996007826210365 }, "Flags": 1, "Kind": 5, @@ -96914,10 +93608,8 @@ }, { "__Checksum": { - "Data1": 6358605368246500545, - "Data2": 4016124579837348736, - "Data3": 7658621677373391580, - "Data4": 1201333466067602724 + "Data1": -8340112843319737333, + "Data2": 4363073213264588837 }, "Flags": 3, "Kind": 5, @@ -96956,10 +93648,8 @@ }, { "__Checksum": { - "Data1": -8970525942457936060, - "Data2": -1826035288730848119, - "Data3": -4722947458573338538, - "Data4": 4496498506192755119 + "Data1": -1290756181421331897, + "Data2": 1149451460586232859 }, "Flags": 1, "Kind": 5, @@ -96998,10 +93688,8 @@ }, { "__Checksum": { - "Data1": 8567454260419155015, - "Data2": 7193425210371928840, - "Data3": 9129619036763134480, - "Data4": 1548613009511145670 + "Data1": -968877199355920266, + "Data2": 300321030788237213 }, "Flags": 3, "Kind": 5, @@ -97040,10 +93728,8 @@ }, { "__Checksum": { - "Data1": -2642114207535373897, - "Data2": -1139548558505990359, - "Data3": -8568461616431637128, - "Data4": -5759591272686126862 + "Data1": -14742228543532060, + "Data2": -6179615141747898148 }, "Flags": 1, "Kind": 5, @@ -97082,10 +93768,8 @@ }, { "__Checksum": { - "Data1": 4776237265708176648, - "Data2": 1793180267482979303, - "Data3": -1327371440176567201, - "Data4": -489805790950379330 + "Data1": -5655140445083848117, + "Data2": 6659591469986004408 }, "Flags": 3, "Kind": 5, @@ -97124,10 +93808,8 @@ }, { "__Checksum": { - "Data1": -7412698740843909159, - "Data2": 40381815088203366, - "Data3": -8966789124839621085, - "Data4": -7164917336317903937 + "Data1": 3433874398607115911, + "Data2": -8171313381650940686 }, "Flags": 1, "Kind": 5, @@ -97166,10 +93848,8 @@ }, { "__Checksum": { - "Data1": 11287337963118386, - "Data2": -2688792849618316754, - "Data3": -9071782884576329754, - "Data4": -5870426853938491265 + "Data1": -1396616842605434196, + "Data2": 350129576460734350 }, "Flags": 3, "Kind": 5, @@ -97208,10 +93888,8 @@ }, { "__Checksum": { - "Data1": -3377623994846590463, - "Data2": -1197996146392486626, - "Data3": 2075741684984566438, - "Data4": 885164267653077486 + "Data1": -1256782338409864267, + "Data2": 7755437644091462662 }, "Flags": 1, "Kind": 5, @@ -97250,10 +93928,8 @@ }, { "__Checksum": { - "Data1": -1606592714049829378, - "Data2": 4944558113987316319, - "Data3": 3014399451629398407, - "Data4": -3573189838388517410 + "Data1": 5595344749039588899, + "Data2": 5979644147365284674 }, "Flags": 3, "Kind": 5, @@ -97292,10 +93968,8 @@ }, { "__Checksum": { - "Data1": 1146734836226505305, - "Data2": -2430643504409630248, - "Data3": -8845861103237784575, - "Data4": 5394323892016690112 + "Data1": -6290638582360938801, + "Data2": 8703543745505876427 }, "Flags": 1, "Kind": 5, @@ -97334,10 +94008,8 @@ }, { "__Checksum": { - "Data1": -7558555543656533159, - "Data2": -7329184190773230019, - "Data3": -1144805322776182339, - "Data4": 2427742459354839588 + "Data1": -5806111597201114851, + "Data2": 3653087935021184638 }, "Flags": 3, "Kind": 5, @@ -97376,10 +94048,8 @@ }, { "__Checksum": { - "Data1": 4528490579668844290, - "Data2": -3178367943239035123, - "Data3": -8574201305068837923, - "Data4": 4775808029168401365 + "Data1": -7501497462644125068, + "Data2": -5231752147591701043 }, "Flags": 1, "Kind": 5, @@ -97418,10 +94088,8 @@ }, { "__Checksum": { - "Data1": -6103410811797973249, - "Data2": 2263619195019991486, - "Data3": 1452457837212265233, - "Data4": -1538163354448631936 + "Data1": 9099584206939546858, + "Data2": -2075423828908455272 }, "Flags": 3, "Kind": 5, @@ -97460,10 +94128,8 @@ }, { "__Checksum": { - "Data1": -630980147143422974, - "Data2": -2085824459885544066, - "Data3": -1472913060947836869, - "Data4": 2997187098583774464 + "Data1": 1127365697747577685, + "Data2": 2550824266096516503 }, "Flags": 1, "Kind": 5, @@ -97502,10 +94168,8 @@ }, { "__Checksum": { - "Data1": 3486076652811987614, - "Data2": -3068458454516743714, - "Data3": -5424367910298065781, - "Data4": 3814798509147990289 + "Data1": 8740110767114692135, + "Data2": 1217073425813092011 }, "Flags": 3, "Kind": 5, @@ -97544,10 +94208,8 @@ }, { "__Checksum": { - "Data1": -8365377723842533764, - "Data2": -4921150021904374614, - "Data3": -3557387251429394162, - "Data4": -1092968163560459700 + "Data1": 1884461616288004136, + "Data2": 1567352730216474941 }, "Flags": 1, "Kind": 5, @@ -97586,10 +94248,8 @@ }, { "__Checksum": { - "Data1": 7848755390986933698, - "Data2": -7912972132207973224, - "Data3": 5666977723008891649, - "Data4": 3576599070172403621 + "Data1": -1483260214152548319, + "Data2": -3046438032906550907 }, "Flags": 1, "Kind": 5, @@ -97628,10 +94288,8 @@ }, { "__Checksum": { - "Data1": -5332533311369433047, - "Data2": 6329412729675705562, - "Data3": -6785121348327743805, - "Data4": 1650399385333142854 + "Data1": -1155986000056820928, + "Data2": 7138705870599030426 }, "Flags": 3, "Kind": 5, @@ -97670,10 +94328,8 @@ }, { "__Checksum": { - "Data1": -3624103202444245681, - "Data2": 2965452631436732713, - "Data3": -8158640209385409389, - "Data4": -5620672609039633277 + "Data1": 5324336438087930236, + "Data2": 7091273496553164906 }, "Flags": 3, "Kind": 5, @@ -97712,10 +94368,8 @@ }, { "__Checksum": { - "Data1": -4810755414157506082, - "Data2": 5872263933082281594, - "Data3": -1208104125273776459, - "Data4": 1772732740642063907 + "Data1": 572667823504766028, + "Data2": -1973670354900575978 }, "Flags": 1, "Kind": 5, @@ -97754,10 +94408,8 @@ }, { "__Checksum": { - "Data1": 6067247846441449706, - "Data2": -7925206396123085944, - "Data3": 5354432627446823889, - "Data4": 7944525918583882904 + "Data1": -5712274638236441956, + "Data2": 6937926523685475275 }, "Flags": 3, "Kind": 5, @@ -97796,10 +94448,8 @@ }, { "__Checksum": { - "Data1": -7643801828808626868, - "Data2": -1655916364646076901, - "Data3": 6448416475450113463, - "Data4": -3129548989505283748 + "Data1": -4416506154956428877, + "Data2": 4873830025168849166 }, "Flags": 1, "Kind": 5, @@ -97838,10 +94488,8 @@ }, { "__Checksum": { - "Data1": -3167552194469998287, - "Data2": -8784916602236010228, - "Data3": 7787168440336318189, - "Data4": 7770300148069858769 + "Data1": 1080046351127463102, + "Data2": -5994126132704206592 }, "Flags": 3, "Kind": 5, @@ -97880,10 +94528,8 @@ }, { "__Checksum": { - "Data1": 3897839125587875104, - "Data2": 8926689085109802403, - "Data3": -7530339059289239206, - "Data4": 7411615793747374487 + "Data1": 4501554872998302773, + "Data2": -1727960531152598544 }, "Flags": 1, "Kind": 5, @@ -97922,10 +94568,8 @@ }, { "__Checksum": { - "Data1": 4237655925027558148, - "Data2": -1192877207301195646, - "Data3": 2319910822460926037, - "Data4": 3565178417863587543 + "Data1": -8178154158326229120, + "Data2": 8956618680291310986 }, "Flags": 3, "Kind": 5, @@ -97964,10 +94608,8 @@ }, { "__Checksum": { - "Data1": -1407674697382275785, - "Data2": -3593079649095691819, - "Data3": 3786454447175727284, - "Data4": -6613459733952277854 + "Data1": -8158926313228168755, + "Data2": -4533076477619044332 }, "Flags": 1, "Kind": 5, @@ -98006,10 +94648,8 @@ }, { "__Checksum": { - "Data1": 8460304494836276873, - "Data2": 5544558585404031310, - "Data3": 2308957463521313842, - "Data4": -7470368637523573143 + "Data1": -8528861885472109465, + "Data2": -3766336645655822523 }, "Flags": 3, "Kind": 5, @@ -98048,10 +94688,8 @@ }, { "__Checksum": { - "Data1": -6188305297845902578, - "Data2": -9114218187562321197, - "Data3": -832657117922075873, - "Data4": -2878693330993491741 + "Data1": -6249346208268147218, + "Data2": 6847111588523112888 }, "Flags": 1, "Kind": 5, @@ -98090,10 +94728,8 @@ }, { "__Checksum": { - "Data1": -4693382357413439834, - "Data2": -6884029862854363590, - "Data3": 3849319111874266829, - "Data4": 532762812237790980 + "Data1": -1267114074469102220, + "Data2": -6828175811445940071 }, "Flags": 3, "Kind": 5, @@ -98132,10 +94768,8 @@ }, { "__Checksum": { - "Data1": -1243501910840747578, - "Data2": 6181390888242312531, - "Data3": 8991226894312138233, - "Data4": 3277112005368097676 + "Data1": 4642269054090625863, + "Data2": -3493390895368450849 }, "Flags": 1, "Kind": 5, @@ -98174,10 +94808,8 @@ }, { "__Checksum": { - "Data1": -5558104852210965689, - "Data2": 6659126859488812586, - "Data3": 5608048649487032078, - "Data4": -4219085857907732386 + "Data1": -3089902718165733454, + "Data2": -3589808043294790547 }, "Flags": 3, "Kind": 5, @@ -98216,10 +94848,8 @@ }, { "__Checksum": { - "Data1": 7547994389116535925, - "Data2": 7711967716542003254, - "Data3": -3035379785392471079, - "Data4": 2688245259750352689 + "Data1": 6195489178252639238, + "Data2": -9061864386882475727 }, "Flags": 1, "Kind": 5, @@ -98258,10 +94888,8 @@ }, { "__Checksum": { - "Data1": -8960511549635729641, - "Data2": 8731006849141777763, - "Data3": -6718597606947132742, - "Data4": 6376583143023706094 + "Data1": -3647388135519153654, + "Data2": -1550329668952320620 }, "Flags": 3, "Kind": 5, @@ -98300,10 +94928,8 @@ }, { "__Checksum": { - "Data1": 6155995300756279042, - "Data2": -2763680139982422060, - "Data3": -6577800182680811869, - "Data4": 1901552277014909806 + "Data1": -4238454527586619186, + "Data2": -5262114149037905875 }, "Flags": 5, "Kind": 7, @@ -98337,10 +94963,8 @@ }, { "__Checksum": { - "Data1": 8410575180255974042, - "Data2": 5251983218593368511, - "Data3": 7992326431139891019, - "Data4": 7263014956978031794 + "Data1": -4450783394546654595, + "Data2": 3565916675346929921 }, "Flags": 5, "Kind": 6, diff --git a/start-code.cmd b/start-code.cmd index 3f584e34e7b..7bfbf48d682 100644 --- a/start-code.cmd +++ b/start-code.cmd @@ -16,9 +16,6 @@ IF ["%vscode%"] == [""] ( SET DOTNET_ROOT=%~dp0.dotnet SET DOTNET_ROOT(x86)=%~dp0.dotnet\x86 -:: This tells .NET Core not to go looking for .NET Core in other places -SET DOTNET_MULTILEVEL_LOOKUP=0 - :: Put our local dotnet.exe on PATH first so Visual Studio knows which one to use SET PATH=%DOTNET_ROOT%;%PATH% diff --git a/startvs.ps1 b/startvs.ps1 index e74bb5f225d..e0d46e78990 100644 --- a/startvs.ps1 +++ b/startvs.ps1 @@ -3,7 +3,7 @@ Param( [Parameter( Position=0, Mandatory=$false, - HelpMessage="Solution file to open. The default is 'Razor.sln'.")] + HelpMessage="Solution file to open. The default is 'Razor.slnx'.")] [string]$solutionFile=$null, [Parameter( @@ -28,7 +28,7 @@ Param( ) if ($solutionFile -eq "") { - $solutionFile = "Razor.sln" + $solutionFile = "Razor.slnx" } if ($includeRoslynDeps) { @@ -43,9 +43,6 @@ $dotnetPath = Join-Path (Get-Location) ".dotnet" $env:DOTNET_ROOT = $dotnetPath ${env:DOTNET_ROOT(x86)} = Join-Path $dotnetPath "x86" -# This tells .NET Core not to go looking for .NET Core in other places -$env:DOTNET_MULTILEVEL_LOOKUP = 0 - # Put our local dotnet.exe on PATH first so Visual Studio knows which one to use $env:PATH = $env:DOTNET_ROOT + ";" + $env:PATH @@ -73,8 +70,13 @@ if ($chooseVS) { $channelId = $vsInstall.installedChannelId $lastDotIndex = $channelId.LastIndexOf(".") $channelName = $channelId.Substring($lastDotIndex + 1); + $nickName = $vsInstall.properties.nickname + if ($nickName.Length -gt 0) + { + $nickName = " - '$nickName'" + } - Write-Host " $($index) - $($vsInstall.displayName) ($($vsInstall.installationVersion) - $($channelName))" + Write-Host " $($index) - $($vsInstall.displayName) ($($vsInstall.installationVersion) - $($channelName))$($nickName)" $index += 1 }