public static void ComputeRefactoring(RefactoringContext context, StringConcatenationExpressionInfo concatenationInfo) { StringConcatenationAnalysis analysis = concatenationInfo.Analyze(); if (analysis.ContainsNonStringLiteral) { if (analysis.ContainsStringLiteral || analysis.ContainsInterpolatedString) { context.RegisterRefactoring( "Join string expressions", cancellationToken => ToInterpolatedStringAsync(context.Document, concatenationInfo, cancellationToken), RefactoringIdentifiers.JoinStringExpressions); } } else if (analysis.ContainsStringLiteral) { context.RegisterRefactoring( "Join string literals", cancellationToken => ToStringLiteralAsync(context.Document, concatenationInfo, multiline: false, cancellationToken: cancellationToken), RefactoringIdentifiers.JoinStringExpressions); if (concatenationInfo.BinaryExpression .DescendantTrivia(concatenationInfo.Span ?? concatenationInfo.BinaryExpression.Span) .Any(f => f.IsEndOfLineTrivia())) { context.RegisterRefactoring( "Join string literals into multiline string literal", cancellationToken => ToStringLiteralAsync(context.Document, concatenationInfo, multiline: true, cancellationToken: cancellationToken), EquivalenceKey.Join(RefactoringIdentifiers.JoinStringExpressions, "Multiline")); } } }
public static async Task <Document> RefactorAsync( Document document, BinaryExpressionSyntax binaryExpression, CancellationToken cancellationToken) { SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); StringConcatenationExpressionInfo concatenationInfo = SyntaxInfo.StringConcatenationExpressionInfo(binaryExpression, semanticModel, cancellationToken); StringConcatenationAnalysis analysis = concatenationInfo.Analyze(); ExpressionSyntax newNode; if (analysis.ContainsStringLiteral) { if (analysis.ContainsVerbatimExpression && concatenationInfo.ContainsMultiLineExpression()) { newNode = concatenationInfo.ToMultiLineStringLiteralExpression(); } else { newNode = concatenationInfo.ToStringLiteralExpression(); } } else { newNode = concatenationInfo.ToInterpolatedStringExpression(); } newNode = newNode.WithTriviaFrom(binaryExpression); return(await document.ReplaceNodeAsync(binaryExpression, newNode, cancellationToken).ConfigureAwait(false)); }
public static void AnalyzeAddExpression(SyntaxNodeAnalysisContext context) { SyntaxNode node = context.Node; if (node.ContainsDiagnostics) { return; } if (node.SpanContainsDirectives()) { return; } var addExpression = (BinaryExpressionSyntax)node; StringConcatenationExpressionInfo concatenationInfo = SyntaxInfo.StringConcatenationExpressionInfo(addExpression, context.SemanticModel, context.CancellationToken); if (!concatenationInfo.Success) { return; } StringConcatenationAnalysis analysis = concatenationInfo.Analyze(); if (!analysis.ContainsUnspecifiedExpression && (analysis.ContainsStringLiteral ^ analysis.ContainsInterpolatedString) && (analysis.ContainsNonVerbatimExpression ^ analysis.ContainsVerbatimExpression) && (analysis.ContainsVerbatimExpression || addExpression.IsSingleLine(includeExteriorTrivia: false, cancellationToken: context.CancellationToken))) { context.ReportDiagnostic(DiagnosticDescriptors.JoinStringExpressions, addExpression); } }