public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) { SyntaxNode root = await context.Document.GetSyntaxRootAsync(context.CancellationToken); AssignmentExpressionSyntax assignmentExpression = root .FindNode(context.Span, getInnermostNodeForTie: true)? .FirstAncestorOrSelf <AssignmentExpressionSyntax>(); if (assignmentExpression == null) { return; } if (AssignmentExpressionRefactoring.CanExpand(assignmentExpression) && assignmentExpression.OperatorToken.Span.Contains(context.Span)) { context.RegisterRefactoring( "Expand assignment expression", cancellationToken => { return(AssignmentExpressionRefactoring.ExpandAsync( context.Document, assignmentExpression, cancellationToken)); }); } if (assignmentExpression.IsKind(SyntaxKind.SimpleAssignmentExpression) && assignmentExpression.Left?.IsMissing == false && assignmentExpression.Right?.IsMissing == false && assignmentExpression.Right.Span.Contains(context.Span) && context.Document.SupportsSemanticModel) { SemanticModel semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken); ITypeSymbol leftSymbol = semanticModel.GetTypeInfo(assignmentExpression.Left).Type; if (leftSymbol != null) { ITypeSymbol rightSymbol = semanticModel.GetTypeInfo(assignmentExpression.Right).Type; if (!leftSymbol.Equals(rightSymbol)) { context.RegisterRefactoring( $"Add cast to '{leftSymbol.ToDisplayString(TypeSyntaxRefactoring.SymbolDisplayFormat)}'", cancellationToken => { return(AddCastRefactoring.RefactorAsync( context.Document, assignmentExpression.Right, leftSymbol, cancellationToken)); }); } } } }
private static void AddCastAccordingToParameterType( CodeRefactoringContext context, ArgumentSyntax argument, SemanticModel semanticModel) { ITypeSymbol typeSymbol = semanticModel.GetTypeInfo(argument.Expression).ConvertedType; if (typeSymbol == null) { return; } IParameterSymbol parameterSymbol = argument.DetermineParameter( semanticModel, allowParams: false, allowCandidate: true, cancellationToken: context.CancellationToken); if (parameterSymbol == null) { return; } if (typeSymbol.Equals(parameterSymbol.Type)) { return; } context.RegisterRefactoring( $"Add cast to '{parameterSymbol.Type.ToDisplayString(TypeSyntaxRefactoring.SymbolDisplayFormat)}'", cancellationToken => { return(AddCastRefactoring.RefactorAsync( context.Document, argument.Expression, parameterSymbol.Type, cancellationToken)); }); }