Skip to content

Upgrade FastExpressionCompiler and internalize stable Type.ToCode formatting#2022

Draft
Copilot wants to merge 3 commits into
mainfrom
copilot/bump-fastexpressioncompiler-version
Draft

Upgrade FastExpressionCompiler and internalize stable Type.ToCode formatting#2022
Copilot wants to merge 3 commits into
mainfrom
copilot/bump-fastexpressioncompiler-version

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 22, 2026

DotVVM was pinned to an older FastExpressionCompiler and relied on its Type.ToCode extension behavior, which made output formatting vulnerable to library-version changes. This PR updates the dependency and moves ToCode behavior under DotVVM control.

  • Dependency update

    • Bumped FastExpressionCompiler in DotVVM.Framework.csproj from 3.3.3 to 5.4.1.
  • DotVVM-owned Type.ToCode implementation

    • Added DotVVM.Framework.Utils.TypeCodeExtensions with a framework-owned ToCode implementation.
    • Handles framework-relevant formatting cases consistently: C# keywords, nullable types, arrays, nested types, generic types (including nested generic argument scoping), pointers/by-ref, and namespace stripping.
  • Callsite migration away from external ToCode

    • Rewired framework and test callsites to use DotVVM’s ToCode behavior.
    • Removed using FastExpressionCompiler; where it was only present for ToCode, while keeping it in files that still use FEC APIs (CompileFast, code-printing helpers).
  • Focused regression coverage for formatting stability

    • Extended ReflectionUtilsTests with explicit ToCode output assertions for generic/nested/array scenarios and stripNamespace behavior.
public static string ToCode(this Type? type, bool stripNamespace = false)
{
    if (type is null) return "null";
    return ToCodeCore(type, stripNamespace);
}

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 0t3vsblobprodcus362.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Compilation/Javascript/JsViewModelPropertyAdjuster.cs --global /home/REDACTED/.dotnet/tools/git committer.name (dns block)
  • 1p7vsblobprodcus324.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
  • 1s1vsblobprodcus386.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Compilation/Javascript/JsViewModelPropertyAdjuster.cs --global /home/REDACTED/.dotnet/tools/git committer.name (dns block)
  • 2kmvsblobprodcus39.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/F7D2419353110B6F32053972B32A361D/missingpackages_workingdir --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/nugetconfig/nuget.config --force conf�� wModelSerializat/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages --global ndor/bin/git copilot.originaldotnet (dns block)
  • 4m6vsblobprodcus384.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
  • cflvsblobprodcus383.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Compilation/Javascript/JsViewModelPropertyAdjuster.cs --global /home/REDACTED/.dotnet/tools/git committer.name (dns block)
  • jd4vsblobprodcus366.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Compilation/Javascript/JsViewModelPropertyAdjuster.cs --global /home/REDACTED/.dotnet/tools/git committer.name (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/Samples/Tests/Tests/DotVVM.Samples.Tests.csproj --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Diagnostics/JsonSizeAnalyzer.cs user.name bash (dns block)
  • m6xvsblobprodcus342.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/DotVVM.Crossplatform.slnf (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Compilation/Javascript/JsViewModelPropertyAdjuster.cs --global /home/REDACTED/.dotnet/tools/git committer.name (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/Samples/Tests/Tests/DotVVM.Samples.Tests.csproj --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Diagnostics/JsonSizeAnalyzer.cs user.name bash (dns block)
  • pdfvsblobprodcus380.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Compilation/Javascript/JsViewModelPropertyAdjuster.cs --global /home/REDACTED/.dotnet/tools/git committer.name (dns block)
  • pe3vsblobprodcus354.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/DotVVM.Crossplatform.slnf (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true conf�� /Compilation/Javascript/JsViewModelPropertyAdjuster.cs --global /home/REDACTED/.dotnet/tools/git committer.name (dns block)
  • yttvsblobprodcus357.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI linked an issue Apr 22, 2026 that may be closed by this pull request
Copilot AI changed the title [WIP] Bump FastExpressionCompiler to latest version Upgrade FastExpressionCompiler and internalize stable Type.ToCode formatting Apr 22, 2026
Copilot AI requested a review from tomasherceg April 22, 2026 08:13
@tomasherceg
Copy link
Copy Markdown
Member

@copilot The ToCode_IsStable test fails - look at the problem and fix it.

Agent-Logs-Url: https://github.com/riganti/dotvvm/sessions/1958af72-420d-410d-8538-395fcad24000

Co-authored-by: tomasherceg <5599524+tomasherceg@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 22, 2026

@copilot The ToCode_IsStable test fails - look at the problem and fix it.

Fixed in 36c16e1. The failing expectation in ToCode_IsStable was for stripNamespace: true on a nested type; it now correctly expects ReflectionUtilsTests.Outer<int>.Inner<string>[], which matches the current stable ToCode behavior.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 0t3vsblobprodcus362.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • 1p7vsblobprodcus324.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj -p:IsTestProject=true (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • 1s1vsblobprodcus386.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • 2kmvsblobprodcus39.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/F7D2419353110B6F32053972B32A361D/missingpackages_workingdir --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • jd4vsblobprodcus366.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • k4kvsblobprodcus344.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • m6xvsblobprodcus342.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • pdfvsblobprodcus380.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj -p:IsTestProject=true (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bump FastExpressionCompiler

2 participants