diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/CSharp/TypeAccessibilityCodeActionProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/CSharp/TypeAccessibilityCodeActionProvider.cs index 63849b7f8cb..3957d9afcb8 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/CSharp/TypeAccessibilityCodeActionProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/CSharp/TypeAccessibilityCodeActionProvider.cs @@ -111,7 +111,7 @@ private static ImmutableArray ProcessCodeActionsVSCod continue; } - var associatedValue = context.SourceText.GetSubTextString(diagnosticSpan); + var associatedValue = context.SourceText.ToString(diagnosticSpan); var fqn = string.Empty; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToCodeBehindCodeActionResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToCodeBehindCodeActionResolver.cs index c1b23206077..9b212895d1d 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToCodeBehindCodeActionResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToCodeBehindCodeActionResolver.cs @@ -46,7 +46,7 @@ internal class ExtractToCodeBehindCodeActionResolver( var text = await documentContext.GetSourceTextAsync(cancellationToken).ConfigureAwait(false); var className = Path.GetFileNameWithoutExtension(path); - var codeBlockContent = text.GetSubTextString(new TextSpan(actionParams.ExtractStart, actionParams.ExtractEnd - actionParams.ExtractStart)).Trim(); + var codeBlockContent = text.ToString(new TextSpan(actionParams.ExtractStart, actionParams.ExtractEnd - actionParams.ExtractStart)).Trim(); var codeBehindContent = GenerateCodeBehindClass(className, actionParams.Namespace, codeBlockContent, codeDocument); codeBehindContent = await _roslynCodeActionHelpers.GetFormattedNewFileContentsAsync(documentContext.Project, codeBehindUri, codeBehindContent, cancellationToken).ConfigureAwait(false); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToCssCodeActionResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToCssCodeActionResolver.cs index 856e7b46727..4ae3a8c983a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToCssCodeActionResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/ExtractToCssCodeActionResolver.cs @@ -42,7 +42,7 @@ internal class ExtractToCssCodeActionResolver( var text = await documentContext.GetSourceTextAsync(cancellationToken).ConfigureAwait(false); - var cssContent = text.GetSubTextString(new TextSpan(actionParams.ExtractStart, actionParams.ExtractEnd - actionParams.ExtractStart)).Trim(); + var cssContent = text.ToString(new TextSpan(actionParams.ExtractStart, actionParams.ExtractEnd - actionParams.ExtractStart)).Trim(); var removeRange = codeDocument.Source.Text.GetRange(actionParams.RemoveStart, actionParams.RemoveEnd); var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier { DocumentUri = new(documentContext.Uri) }; diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/PromoteUsingCodeActionResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/PromoteUsingCodeActionResolver.cs index d875e8c2fe7..7d9878748ff 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/PromoteUsingCodeActionResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/Razor/PromoteUsingCodeActionResolver.cs @@ -43,7 +43,7 @@ internal class PromoteUsingCodeActionResolver(IFileSystem fileSystem) : IRazorCo using var edits = new PooledArrayBuilder>(); - var textToInsert = sourceText.GetSubTextString(TextSpan.FromBounds(actionParams.UsingStart, actionParams.UsingEnd)); + var textToInsert = sourceText.ToString(TextSpan.FromBounds(actionParams.UsingStart, actionParams.UsingEnd)); var insertLocation = new LinePosition(0, 0); if (!_fileSystem.FileExists(importsFile)) { diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/SourceTextExtensions.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/SourceTextExtensions.cs index 77dd6cdc81f..3ee61c68809 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/SourceTextExtensions.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/SourceTextExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Buffers; using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.AspNetCore.Razor; @@ -52,14 +51,6 @@ public static int GetPosition(this SourceText text, LinePosition position) public static int GetPosition(this SourceText text, int line, int character) => text.GetPosition(new LinePosition(line, character)); - public static string GetSubTextString(this SourceText text, TextSpan span) - { - using var _ = ArrayPool.Shared.GetPooledArray(span.Length, out var charBuffer); - - text.CopyTo(span.Start, charBuffer, 0, span.Length); - return new string(charBuffer, 0, span.Length); - } - public static bool NonWhitespaceContentEquals(this SourceText text, ImmutableArray changes) { if (changes.IsEmpty) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/FindAllReferences/FindAllReferencesHelper.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/FindAllReferences/FindAllReferencesHelper.cs index b33457903d2..27b82ecc820 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/FindAllReferences/FindAllReferencesHelper.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/FindAllReferences/FindAllReferencesHelper.cs @@ -45,7 +45,7 @@ internal static class FindAllReferencesHelper !documentMappingService.TryMapToCSharpDocumentPosition(csharpDocument, line.End, out _, out _)) { var start = line.GetFirstNonWhitespacePosition() ?? line.Start; - return codeDoc.Source.Text.GetSubTextString(TextSpan.FromBounds(start, line.End)); + return codeDoc.Source.Text.ToString(TextSpan.FromBounds(start, line.End)); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/AddUsingsHelper.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/AddUsingsHelper.cs index 6d18b8acb70..14f62c36e7b 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/AddUsingsHelper.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/AddUsingsHelper.cs @@ -140,7 +140,7 @@ static string GetNamespaceFromDirective(UsingDirectiveSyntax usingDirectiveSynta // as trivia to the using keyword. var start = usingDirectiveSyntax.UsingKeyword.FullSpan.End; - return sourceText.GetSubTextString(TextSpan.FromBounds(start, end)); + return sourceText.ToString(TextSpan.FromBounds(start, end)); } } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingUtilities.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingUtilities.cs index 079e1a1b376..d498c775240 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingUtilities.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/FormattingUtilities.cs @@ -167,7 +167,7 @@ public static int GetIndentationLevel(TextLine line, int firstNonWhitespaceChara else { Debug.Assert(text[i] == ' '); - additionalIndentation = text.GetSubTextString(TextSpan.FromBounds(i, firstNonWhitespaceCharacterPosition)); + additionalIndentation = text.ToString(TextSpan.FromBounds(i, firstNonWhitespaceCharacterPosition)); return tabCount; } } @@ -222,7 +222,7 @@ public static string GetIndentationString(int indentation, bool insertSpaces, in /// public static void NaivelyUnindentSubstring(SourceText text, TextSpan extractionSpan, System.Text.StringBuilder builder) { - var extractedText = text.GetSubTextString(extractionSpan); + var extractedText = text.ToString(extractionSpan); var range = text.GetRange(extractionSpan); if (range.Start.Line == range.End.Line) { diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.CSharpDocumentGenerator.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.CSharpDocumentGenerator.cs index bd587cc945e..02a5ed4fea5 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.CSharpDocumentGenerator.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpFormattingPass.CSharpDocumentGenerator.cs @@ -279,13 +279,13 @@ private void AddAdditionalLineFormattingContent(StringBuilder additionalLinesBui { additionalLinesBuilder.AppendLine("F<"); additionalLinesBuilder.AppendLine(GetAdditionalLineComment(originalSpan)); - additionalLinesBuilder.AppendLine(_sourceText.GetSubTextString(originalSpan.ToTextSpan())); + additionalLinesBuilder.AppendLine(_sourceText.ToString(originalSpan.ToTextSpan())); additionalLinesBuilder.AppendLine("> x;"); return; } additionalLinesBuilder.AppendLine(GetAdditionalLineComment(originalSpan)); - additionalLinesBuilder.AppendLine(_sourceText.GetSubTextString(originalSpan.ToTextSpan())); + additionalLinesBuilder.AppendLine(_sourceText.ToString(originalSpan.ToTextSpan())); additionalLinesBuilder.AppendLine(";"); } @@ -337,7 +337,7 @@ _sourceText.Lines[nodeStartLine] is { } previousLine && // This is a multi-line literal, and we're emiting the 2nd line, and the literal didn't start at the start of // the previous line, so it wouldn't have been handled by that lines formatting. We need to include it here, // but skip it to not confuse things. - _builder.AppendLine(_sourceText.GetSubTextString(TextSpan.FromBounds(node.SpanStart, previousLine.End))); + _builder.AppendLine(_sourceText.ToString(TextSpan.FromBounds(node.SpanStart, previousLine.End))); skipPreviousLine = true; } @@ -907,8 +907,8 @@ private LineInfo VisitCSharpCodeBlock(RazorSyntaxNode node, CSharpCodeBlockSynta // Multi-line expressions are often not formatted by Roslyn much at all, but it will often move subsequent lines // relative to the first, so make sure we include the users indentation so everything moves together, and is stable. - _builder.Append(_sourceText.GetSubTextString(TextSpan.FromBounds(_currentLine.Start, _currentFirstNonWhitespacePosition))); - _builder.AppendLine(_sourceText.GetSubTextString(TextSpan.FromBounds(_currentToken.Position + 1, _currentLine.End))); + _builder.Append(_sourceText.ToString(TextSpan.FromBounds(_currentLine.Start, _currentFirstNonWhitespacePosition))); + _builder.AppendLine(_sourceText.ToString(TextSpan.FromBounds(_currentToken.Position + 1, _currentLine.End))); return CreateLineInfo( processFormatting: true, checkForNewLines: true, @@ -919,7 +919,7 @@ private LineInfo VisitCSharpCodeBlock(RazorSyntaxNode node, CSharpCodeBlockSynta public override LineInfo VisitCSharpCodeBlock(CSharpCodeBlockSyntax node) { // Matches things like @if, so skip the first character, but output as C# otherwise - _builder.AppendLine(_sourceText.GetSubTextString(TextSpan.FromBounds(_currentToken.Position + 1, _currentLine.End))); + _builder.AppendLine(_sourceText.ToString(TextSpan.FromBounds(_currentToken.Position + 1, _currentLine.End))); return CreateLineInfo( processFormatting: true, @@ -1008,7 +1008,7 @@ private LineInfo VisitUsingDirective() // For @using we just skip over the @ and format as a C# using directive // "@using System" to "using System" // Roslyn's parser is smart enough to not care about missing semicolons. - _builder.AppendLine(_sourceText.GetSubTextString(TextSpan.FromBounds(_currentToken.Position + 1, _currentLine.End))); + _builder.AppendLine(_sourceText.ToString(TextSpan.FromBounds(_currentToken.Position + 1, _currentLine.End))); return CreateLineInfo( processFormatting: true, originOffset: 1, diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpOnTypeFormattingPass.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpOnTypeFormattingPass.cs index 2601364110c..8bedd40a01b 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpOnTypeFormattingPass.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/Passes/CSharpOnTypeFormattingPass.cs @@ -587,7 +587,7 @@ private async Task> AdjustIndentationAsync(Formatting { var mappingSpan = new TextSpan(mapping.OriginalSpan.AbsoluteIndex, mapping.OriginalSpan.Length); #if DEBUG - var spanText = context.SourceText.GetSubTextString(mappingSpan); + var spanText = context.SourceText.ToString(mappingSpan); #endif var options = new ShouldFormatOptions( diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingService.cs index da3b0c2dd46..fbd6d090e70 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingService.cs @@ -342,7 +342,7 @@ internal static TextChange MergeChanges(ImmutableArray changes, Sour var affectedRange = changedText.GetEncompassingTextChangeRange(sourceText); var spanBeforeChange = affectedRange.Span; var spanAfterChange = new TextSpan(spanBeforeChange.Start, affectedRange.NewLength); - var newText = changedText.GetSubTextString(spanAfterChange); + var newText = changedText.ToString(spanAfterChange); return new TextChange(spanBeforeChange, newText); } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionProviderTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionProviderTest.cs index 305184d260e..4dd74416050 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionProviderTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionProviderTest.cs @@ -698,8 +698,8 @@ private async Task TestAsync(string contents) if (resultSpan.Start != actionParams.Start || resultSpan.End != actionParams.End) { - var resultText = context.SourceText.GetSubTextString(resultSpan); - var actualText = context.SourceText.GetSubTextString(TextSpan.FromBounds(actionParams.Start, actionParams.End)); + var resultText = context.SourceText.ToString(resultSpan); + var actualText = context.SourceText.ToString(TextSpan.FromBounds(actionParams.Start, actionParams.End)); AssertEx.EqualOrDiff(resultText, actualText, "Code action span does not match expected"); } } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/RazorDiagnosticHelperTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/RazorDiagnosticHelperTest.cs index eaf527a5df9..033fb987baa 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/RazorDiagnosticHelperTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Diagnostics/RazorDiagnosticHelperTest.cs @@ -70,7 +70,7 @@ public void ConvertSpanToRange_ReturnsConvertedRange() var range = RazorDiagnosticHelper.ConvertSpanToRange(sourceSpan, sourceText); // Assert - Assert.Equal("lo W", sourceText.GetSubTextString(sourceText.GetTextSpan(range))); + Assert.Equal("lo W", sourceText.ToString(sourceText.GetTextSpan(range))); Assert.Equal(expectedRange, range); } @@ -86,7 +86,7 @@ public void ConvertSpanToRange_StartsOutsideOfDocument_EmptyDocument_NormalizesT var range = RazorDiagnosticHelper.ConvertSpanToRange(sourceSpan, sourceText); // Assert - Assert.Equal("", sourceText.GetSubTextString(sourceText.GetTextSpan(range))); + Assert.Equal("", sourceText.ToString(sourceText.GetTextSpan(range))); Assert.Equal(expectedRange, range); } @@ -102,7 +102,7 @@ public void ConvertSpanToRange_StartsOutsideOfDocument_NormalizesToEnd() var range = RazorDiagnosticHelper.ConvertSpanToRange(sourceSpan, sourceText); // Assert - Assert.Equal("", sourceText.GetSubTextString(sourceText.GetTextSpan(range))); + Assert.Equal("", sourceText.ToString(sourceText.GetTextSpan(range))); Assert.Equal(expectedRange, range); } @@ -118,7 +118,7 @@ public void ConvertSpanToRange_EndsOutsideOfDocument_NormalizesToEnd() var range = RazorDiagnosticHelper.ConvertSpanToRange(sourceSpan, sourceText); // Assert - Assert.Equal("World", sourceText.GetSubTextString(sourceText.GetTextSpan(range))); + Assert.Equal("World", sourceText.ToString(sourceText.GetTextSpan(range))); Assert.Equal(expectedRange, range); } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Semantic/SemanticTokensTest.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Semantic/SemanticTokensTest.cs index ed8ed02e44c..c00c302d1cd 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Semantic/SemanticTokensTest.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Semantic/SemanticTokensTest.cs @@ -1132,7 +1132,7 @@ private static string GetFileRepresentationOfTokens(SourceText sourceText, int[] builder.Append(length).Append(' '); builder.Append(typeString).Append(' '); builder.Append(data[i + 4]).Append(' '); - builder.Append('[').Append(sourceText.GetSubTextString(new TextSpan(sourceText.Lines[lineIndex].Start + lineOffset, length))).Append(']'); + builder.Append('[').Append(sourceText.ToString(new TextSpan(sourceText.Lines[lineIndex].Start + lineOffset, length))).Append(']'); builder.AppendLine(); prevLength = length; diff --git a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Cohost/RemoteDebugInfoServiceTest.cs b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Cohost/RemoteDebugInfoServiceTest.cs index dd26b38ed2d..a0bf738536f 100644 --- a/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Cohost/RemoteDebugInfoServiceTest.cs +++ b/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Cohost/RemoteDebugInfoServiceTest.cs @@ -381,7 +381,7 @@ private async Task VerifyProximityExpressionsAsync(TestCode input, string[] extr Assert.NotNull(result); - var expected = input.Spans.Select(inputText.GetSubTextString).Concat(extraExpressions).OrderAsArray(); + var expected = input.Spans.Select(inputText.ToString).Concat(extraExpressions).OrderAsArray(); AssertEx.SequenceEqual(expected, result.OrderAsArray()); } diff --git a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostSemanticTokensRangeEndpointTest.cs b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostSemanticTokensRangeEndpointTest.cs index b17fe22f4db..a62fa94629e 100644 --- a/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostSemanticTokensRangeEndpointTest.cs +++ b/src/Razor/test/Microsoft.VisualStudioCode.RazorExtension.Test/Endpoints/Shared/CohostSemanticTokensRangeEndpointTest.cs @@ -475,7 +475,7 @@ private static string GetTestOutput(SourceText sourceText, int[]? data, ISemanti var type = tokenTypes[data[i + 3]]; var modifier = GetTokenModifierString(data[i + 4], legend); - var text = sourceText.GetSubTextString(new TextSpan(sourceText.Lines[lineIndex].Start + lineOffset, length)); + var text = sourceText.ToString(new TextSpan(sourceText.Lines[lineIndex].Start + lineOffset, length)); builder.AppendLine($"{lineDelta} {charDelta} {length} {type} {modifier} [{text}]"); prevLength = length;