Skip to content

[Bug] .NET API bug GenerateExtensionMethods NullReferenceException #10655

@caunt

Description

@caunt

Describe the bug
When running docfx docfx.json --serve on a project containing a generic extension method with allows ref struct, DocFX throws a NullReferenceException.

To Reproduce

  1. Create .NET 9 project, paste this code:
namespace MyNamespace;

public static class TestClass
{
    public ref struct TestStruct;
    public static byte TestMethod<TRefStruct>(this TRefStruct value) where TRefStruct : allows ref struct => 1;
}
  1. Initialize docfx with docfx init
  2. Run docfx docfx.json --serve

(or use this C# project as playground)
Playground.zip

Expected behavior
Generated API.

Context (please complete the following information):

  • OS: Windows 11

  • Docfx version: 2.78.3

  • .NET version: .NET 9.0

  • docfx.json config

{
  "$schema": "https://raw.githubusercontent.com/dotnet/docfx/main/schemas/docfx.schema.json",
  "metadata": [
    {
      "src": [
        {
          "src": "../",
          "files": [
            "**/*.csproj"
          ]
        }
      ],
      "dest": "api"
    }
  ],
  "build": {
    "content": [
      {
        "files": [
          "**/*.{md,yml}"
        ],
        "exclude": [
          "_site/**"
        ]
      }
    ],
    "resource": [
      {
        "files": [
          "images/**"
        ]
      }
    ],
    "output": "_site",
    "template": [
      "default",
      "modern"
    ],
    "globalMetadata": {
      "_appName": "mysite",
      "_appTitle": "mysite",
      "_enableSearch": true,
      "pdf": true
    }
  }
}
  • Exceptions
NullReferenceException: Object reference not set to an instance of an object.
  at bool CheckBasicConstraints(Symbol containingSymbol, in CheckConstraintsArgs args, TypeParameterSymbol typeParameter, TypeWithAnnotations typeArgument, ArrayBuilder<TypeParameterDiagnosticInfo> diagnosticsBuilder, ArrayBuilder<TypeParameterDiagnosticInfo> nullabilityDiagnosticsBuilderOpt, ref
     ArrayBuilder<TypeParameterDiagnosticInfo> useSiteDiagnosticsBuilder)
  at bool CheckConstraints(Symbol containingSymbol, in CheckConstraintsArgs args, TypeMap substitution, TypeParameterSymbol typeParameter, TypeWithAnnotations typeArgument, ArrayBuilder<TypeParameterDiagnosticInfo> diagnosticsBuilder, ArrayBuilder<TypeParameterDiagnosticInfo> nullabilityDiagnosticsBuilderOpt, ref
     ArrayBuilder<TypeParameterDiagnosticInfo> useSiteDiagnosticsBuilder, HashSet<TypeParameterSymbol> ignoreTypeConstraintsDependentOnTypeParametersOpt)
  at bool CheckConstraints(Symbol containingSymbol, in CheckConstraintsArgs args, TypeMap substitution, ImmutableArray<TypeParameterSymbol> typeParameters, ImmutableArray<TypeWithAnnotations> typeArguments, ArrayBuilder<TypeParameterDiagnosticInfo> diagnosticsBuilder, ArrayBuilder<TypeParameterDiagnosticInfo>
     nullabilityDiagnosticsBuilderOpt, ref ArrayBuilder<TypeParameterDiagnosticInfo> useSiteDiagnosticsBuilder, BitVector skipParameters, HashSet<TypeParameterSymbol> ignoreTypeConstraintsDependentOnTypeParametersOpt)
  at MethodSymbol InferExtensionMethodTypeArguments(MethodSymbol method, TypeSymbol thisType, CSharpCompilation compilation, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, out bool wasFullyInferred)
  at MethodSymbol Create(MethodSymbol method, TypeSymbol receiverType, CSharpCompilation compilation, out bool wasFullyInferred)
  at MethodSymbol ReduceExtensionMethod(TypeSymbol receiverType, CSharpCompilation compilation, out bool wasFullyInferred)
  at MethodSymbol ReduceExtensionMethod(TypeSymbol receiverType, CSharpCompilation compilation)
  at IMethodSymbol ReduceExtensionMethod(ITypeSymbol receiverType)
  at void GenerateExtensionMethods(INamedTypeSymbol symbol, MetadataItem item) in SymbolVisitorAdapter.cs:640
  at MetadataItem VisitNamedType(INamedTypeSymbol symbol) in SymbolVisitorAdapter.cs:153
  at TResult Accept<TResult>(SymbolVisitor<TResult> visitor)
  at TResult Accept<TResult>(SymbolVisitor<TResult> visitor)
  at List<MetadataItem> VisitDescendants<T>(IEnumerable<T> children, Func<T, IEnumerable<T>> getChildren, Func<T, bool> filter) in SymbolVisitorAdapter.cs:512
  at MetadataItem VisitNamespace(INamespaceSymbol symbol) in SymbolVisitorAdapter.cs:133
  at TResult Accept<TResult>(SymbolVisitor<TResult> visitor)
  at TResult Accept<TResult>(SymbolVisitor<TResult> visitor)
  at List<MetadataItem> VisitDescendants<T>(IEnumerable<T> children, Func<T, IEnumerable<T>> getChildren, Func<T, bool> filter) in SymbolVisitorAdapter.cs:512
  at MetadataItem VisitAssembly(IAssemblySymbol symbol) in SymbolVisitorAdapter.cs:117
  at TResult Accept<TResult>(SymbolVisitor<TResult> visitor)
  at TResult Accept<TResult>(SymbolVisitor<TResult> visitor)
  at void CreateManagedReference((ValueTuple<IAssemblySymbol, Compilation> symbol) assemblies, ExtractMetadataConfig config, DotnetApiOptions options) in DotnetApiCatalog.ManagedReference.cs:25
  at async Task <Exec>g__Build|6_0(ExtractMetadataConfig config, DotnetApiOptions options) in DotnetApiCatalog.cs:111
  at async Task Exec(MetadataJsonConfig config, DotnetApiOptions options, string configDirectory, string outputDirectory) in DotnetApiCatalog.cs:71
  at void <Execute>b__0() in DefaultCommand.cs:45
  at int Run(LogOptions options, Action run) in CommandHelper.cs:48
  at int Execute(CommandContext context, Options options, CancellationToken cancellationToken) in DefaultCommand.cs:31
  at int Execute(CommandContext context, TSettings settings) in CancellableCommandBase.cs:24
  at Task<int> Execute(CommandContext context, CommandSettings settings) in CommandOfT.cs:40
  at async Task<int> Execute(CommandTree leaf, CommandTree tree, CommandContext context, ITypeResolver resolver, IConfiguration configuration) in CommandExecutor.cs:166
  • .NET info
.NET SDK:
 Version:           9.0.300-preview.0.25177.5
 Commit:            3d5b396331
 Workload version:  9.0.300-manifests.1e5233e8
 MSBuild version:   17.14.0-preview-25175-08+5880e1c75

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.22631
 OS Platform: Windows
 RID:         win-x64
 Base Path:   C:\Program Files\dotnet\sdk\9.0.300-preview.0.25177.5\

.NET workloads installed:
 [tvos]
   Installation Source: VS 17.14.36017.23
   Manifest Version:    18.4.9288/9.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\9.0.100\microsoft.net.sdk.tvos\18.4.9288\WorkloadManifest.json
   Install Type:              Msi

 [macos]
   Installation Source: VS 17.14.36017.23
   Manifest Version:    15.4.9288/9.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\9.0.100\microsoft.net.sdk.macos\15.4.9288\WorkloadManifest.json
   Install Type:              Msi

 [android]
   Installation Source: VS 17.14.36017.23
   Manifest Version:    35.0.61/9.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\9.0.100\microsoft.net.sdk.android\35.0.61\WorkloadManifest.json
   Install Type:              Msi

 [wasm-tools]
   Installation Source: VS 17.14.36017.23
   Manifest Version:    9.0.4/9.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\9.0.100\microsoft.net.workload.mono.toolchain.current\9.0.4\WorkloadManifest.json
   Install Type:              Msi

 [aspire]
   Installation Source: VS 17.14.36017.23
   Manifest Version:    8.2.2/8.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.aspire\8.2.2\WorkloadManifest.json
   Install Type:              Msi

 [maui-windows]
   Installation Source: VS 17.14.36017.23
   Manifest Version:    9.0.14/9.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\9.0.100\microsoft.net.sdk.maui\9.0.14\WorkloadManifest.json
   Install Type:              Msi

 [maccatalyst]
   Installation Source: VS 17.14.36017.23
   Manifest Version:    18.4.9288/9.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\9.0.100\microsoft.net.sdk.maccatalyst\18.4.9288\WorkloadManifest.json
   Install Type:              Msi

 [ios]
   Installation Source: VS 17.14.36017.23
   Manifest Version:    18.4.9288/9.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\9.0.100\microsoft.net.sdk.ios\18.4.9288\WorkloadManifest.json
   Install Type:              Msi

Configured to use loose manifests when installing new manifests.

Host:
  Version:      9.0.4
  Architecture: x64
  Commit:       f57e6dc747

.NET SDKs installed:
  9.0.105 [C:\Program Files\dotnet\sdk]
  9.0.203 [C:\Program Files\dotnet\sdk]
  9.0.300-preview.0.25177.5 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 8.0.14 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 9.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 9.0.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 8.0.14 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 8.0.15 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 9.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 9.0.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 8.0.14 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 8.0.15 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 9.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 9.0.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  x86   [C:\Program Files (x86)\dotnet]
    registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

Metadata

Metadata

Assignees

Labels

dotnetGenerate .NET API reference docs

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions