Skip to content

Exception in ChangeSignatureCodeRefactoringProvider after wrong automatic closing brace placement #65298

Description

@jhinder

Version Used: VS 2022 17.4.0

Steps to Reproduce:

  1. Place the cursor at the marked location
  2. Insert {.
  3. Press the Return key.

Note that the parentheses are balanced at the start.

namespace N;

internal class C
{
    private void M()
    {
        M1(x => M2("a", y => M3<int>(z => $$)));
    }

    private void M1(Action<object> a) { }

    private void M2(string a, Action<object> e) { }

    private void M3<T>(Action<T> a) { }
}

Expected Behavior:

  1. The closing brace is placed at the correct location, forming an empty statement block:
    M1(x => M2("a", y => M3(z => { })));
  2. The refactoring does not crash due to the malformed syntax.

Actual Behavior:

  1. The closing brace is placed between the second and third closing parenthesis, leading to malformed syntax: M1(x => M2("a", y => M3(z => {))});
  2. After pressing Return the ChangeSignatureCodeRefactoringProvider throws an exception, leading to a gold bar. The stack trace is posted below.

The second problem does not seem to occur when the namespace declaration is missing.

System.NullReferenceException : Object reference not set to an instance of an object.
   at Microsoft.CodeAnalysis.ChangeSignature.AbstractChangeSignatureService.GetParameterIndexFromInvocationArgument(SyntaxNode argument,Document document,SemanticModel semanticModel,CancellationToken cancellationToken)
   at async Microsoft.CodeAnalysis.CSharp.ChangeSignature.CSharpChangeSignatureService.GetInvocationSymbolAsync()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at async Microsoft.CodeAnalysis.ChangeSignature.AbstractChangeSignatureService.GetChangeSignatureContextAsync()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at async Microsoft.CodeAnalysis.ChangeSignature.AbstractChangeSignatureService.GetChangeSignatureCodeActionAsync()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at async Microsoft.CodeAnalysis.ChangeSignature.ChangeSignatureCodeRefactoringProvider.ComputeRefactoringsAsync()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at async Microsoft.CodeAnalysis.CodeRefactorings.CodeRefactoringService.GetRefactoringFromProviderAsync()

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area-IDEuntriagedIssues and PRs which have not yet been triaged by a lead

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions