dotnet/roslyn

Misleading completion for cref in inheritdoc

Open

#76,579 opened on Dec 29, 2024

View on GitHub
 (2 comments) (0 reactions) (0 assignees)C# (4,257 forks)batch import
Area-IDEBughelp wanted

Repository metrics

Stars
 (20,414 stars)
PR merge metrics
 (Avg merge 6d 17h) (256 merged PRs in 30d)

Description

Version Used: VS 17.13 Preview 1

Steps to Reproduce:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <GenerateDocumentationFile>true</GenerateDocumentationFile> <!-- important for repro -->
  </PropertyGroup>

</Project>

Console.WriteLine();

public class C
{
    /// <summary>Whatever</summary>
    public static void M1<T>(T? expected)
    {
    }

    /// <inheritdoc cref="M1$$" />
    public static void M2()
    {
    }
}

Trigger completion in place of $$, it completes to M1{T}(T?) which produces:

CS1574 XML comment has cref attribute 'M1{T}(T?)' that could not be resolved

It should have completed to M1{T}(T) (unless the completion is correct and this is a compiler bug?)

NOTE: Some scenarios that are working currently correctly but need to be taken with care to not regress them

If you have:

/// <summary>Whatever</summary>
public static void M1<T>(T? expected) where T : struct
{
}

/// <summary>Whatever 2</summary>
public static void M1<T>(T expected) where T : struct
{
}

Then completion for both T and T? should be offered (and is currently the case that should not be regressed).

Similarly, even if only this overload exists:

/// <summary>Whatever</summary>
public static void M1<T>(T? expected) where T : struct
{
}

The completion should use T?

Contributor guide