dotnet / dotnet/docfx

[Bug] .NET API bug GenerateExtensionMethods NullReferenceException

Open
#10,655 0 comments 1 reaction 1 assignee Assigned to @Copilot View on GitHub
dotnet
Dominant language
C#
Stars
4.4k
Forks
890
Avg merge
2h 11m
Merged PRs (30d)
10

Description

**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:
```csharp
namespace MyNamespace;

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

(or use this C# project as playground)
[**Playground.zip**](https://github.com/user-attachments/files/20016991/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

```json
{
"$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

```csharp
NullReferenceException: Object reference not set to an instance of an object.
at bool CheckBasicConstraints(Symbol containingSymbol, in CheckConstraintsArgs args, TypeParameterSymbol typeParameter, TypeWithAnnotations typeArgument, ArrayBuilder diagnosticsBuilder, ArrayBuilder nullabilityDiagnosticsBuilderOpt, ref
ArrayBuilder useSiteDiagnosticsBuilder)
at bool CheckConstraints(Symbol containingSymbol, in CheckConstraintsArgs args, TypeMap substitution, TypeParameterSymbol typeParameter, TypeWithAnnotations typeArgument, ArrayBuilder diagnosticsBuilder, ArrayBuilder nullabilityDiagnosticsBuilderOpt, ref
ArrayBuilder useSiteDiagnosticsBuilder, HashSet ignoreTypeConstraintsDependentOnTypeParametersOpt)
at bool CheckConstraints(Symbol containingSymbol, in CheckConstraintsArgs args, TypeMap substitution, ImmutableArray typeParameters, ImmutableArray typeArguments, ArrayBuilder diagnosticsBuilder, ArrayBuilder
nullabilityDiagnosticsBuilderOpt, ref ArrayBuilder useSiteDiagnosticsBuilder, BitVector skipParameters, HashSet ignoreTypeConstraintsDependentOnTypeParametersOpt)
at MethodSymbol InferExtensionMethodTypeArguments(MethodSymbol method, TypeSymbol thisType, CSharpCompilation compilation, ref CompoundUseSiteInfo 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(SymbolVisitor visitor)
at TResult Accept(SymbolVisitor visitor)
at List VisitDescendants(IEnumerable children, Func> getChildren, Func filter) in SymbolVisitorAdapter.cs:512
at MetadataItem VisitNamespace(INamespaceSymbol symbol) in SymbolVisitorAdapter.cs:133
at TResult Accept(SymbolVisitor visitor)
at TResult Accept(SymbolVisitor visitor)
at List VisitDescendants(IEnumerable children, Func> getChildren, Func filter) in SymbolVisitorAdapter.cs:512
at MetadataItem VisitAssembly(IAssemblySymbol symbol) in SymbolVisitorAdapter.cs:117
at TResult Accept(SymbolVisitor visitor)
at TResult Accept(SymbolVisitor visitor)
at void CreateManagedReference((ValueTuple symbol) assemblies, ExtractMetadataConfig config, DotnetApiOptions options) in DotnetApiCatalog.ManagedReference.cs:25
at async Task 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 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 Execute(CommandContext context, CommandSettings settings) in CommandOfT.cs:40
at async Task Execute(CommandTree leaf, CommandTree tree, CommandContext context, ITypeResolver resolver, IConfiguration configuration) in CommandExecutor.cs:166
```

- .NET info

```csharp
.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
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.