private async Task<Document> ApplyReplacement(Document document, IdentifierNameSyntax node, CancellationToken cancellationToken, string replaceWithName, string namespaceUsed) { IdentifierNameSyntax newNode = SyntaxFactory.IdentifierName(replaceWithName) .WithLeadingTrivia(node.GetLeadingTrivia()) .WithTrailingTrivia(node.GetTrailingTrivia()); var oldNode = node.Parent.Kind() == SyntaxKind.SimpleMemberAccessExpression ? node.Parent : node; document = await this.ReplaceNodeInDocumentAsync(document, cancellationToken, oldNode, newNode); return await this.CheckNamespaceUsageAsync(document, cancellationToken, namespaceUsed); }
private async Task<Solution> UseTypeExplicit(Document document, IdentifierNameSyntax identifierName, TypeInfo typeInfo, CancellationToken cancellationToken) { var root = await document.GetSyntaxRootAsync(); var newIdentifierName = SyntaxFactory.ParseTypeName(typeInfo.ConvertedType.ToString()) .WithAdditionalAnnotations(Simplifier.Annotation) .WithLeadingTrivia(identifierName.GetLeadingTrivia()) .WithTrailingTrivia(identifierName.GetTrailingTrivia()); var newDocument = document.WithSyntaxRoot(root.ReplaceNode(identifierName, newIdentifierName)); return newDocument.Project.Solution; }
private static IdentifierNameSyntax PadMemberAccess( SimpleLambdaExpressionSyntax node, IdentifierNameSyntax memberAccess) { // We want to make the new span var originalSpan = node.GetLocation().GetMappedLineSpan(); // Start by collecting all the trivia 'inside' the expression - we need to tack that on the end, but // if it ends with a newline, don't include that. var innerTrivia = SyntaxFactory.TriviaList(node.DescendantTrivia(descendIntoChildren: n => true)); if (innerTrivia.Count > 0 && innerTrivia[innerTrivia.Count - 1].IsKind(SyntaxKind.EndOfLineTrivia)) { innerTrivia = innerTrivia.RemoveAt(innerTrivia.Count - 1); } memberAccess = memberAccess.WithTrailingTrivia(innerTrivia); // If everything is all on one line, then make sure the spans are the same, to compensate // for the expression potentially being longer than the variable name. var lineSpan = originalSpan.EndLinePosition.Line - originalSpan.StartLinePosition.Line; if (lineSpan == 0) { var padding = node.Span.Length - memberAccess.FullSpan.Length; var trailingTrivia = SyntaxFactory.TriviaList(memberAccess.GetTrailingTrivia()) .Add(SyntaxFactory.Whitespace(new string(' ', padding))) .AddRange(node.GetTrailingTrivia()); return memberAccess .WithLeadingTrivia(node.GetLeadingTrivia()) .WithTrailingTrivia(trailingTrivia); } else { // If everything isn't on the same line, we need to pad out the last line. var padding = originalSpan.EndLinePosition.Character - originalSpan.StartLinePosition.Character; var trailingTrivia = SyntaxFactory.TriviaList(memberAccess.GetTrailingTrivia()) .Add(SyntaxFactory.Whitespace(new string(' ', padding))) .AddRange(node.GetTrailingTrivia()); return memberAccess .WithLeadingTrivia(node.GetLeadingTrivia()) .WithTrailingTrivia(trailingTrivia); } }