Skip to content

Commit bbbc6e3

Browse files
authored
Reduce allocations in InlayHintHandler.GetInlayHintsAsync (#80284)
1) Move syntaxVersion.ToString call outside the loop 2) Avoid ArrayBuilder usage, ArrayBuilder.ToImmutable call and JoinText call in the common single item scenario
1 parent 28c5775 commit bbbc6e3

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

src/LanguageServer/Protocol/Handler/InlayHint/InlayHintHandler.cs

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,19 @@ public TextDocumentIdentifier GetTextDocumentIdentifier(InlayHintParams request)
4949

5050
internal static async Task<LSP.InlayHint[]?> GetInlayHintsAsync(Document document, TextDocumentIdentifier textDocumentIdentifier, LSP.Range range, InlineHintsOptions options, bool displayAllOverride, InlayHintCache inlayHintCache, CancellationToken cancellationToken)
5151
{
52-
var text = await document.GetValueTextAsync(cancellationToken).ConfigureAwait(false);
5352
var hints = await CalculateInlayHintsAsync(document, range, options, displayAllOverride, cancellationToken).ConfigureAwait(false);
54-
var syntaxVersion = await document.GetSyntaxVersionAsync(cancellationToken).ConfigureAwait(false);
5553

5654
// Store the members in the resolve cache so that when we get a resolve request for a particular
5755
// member we can re-use the inline hint.
5856
var resultId = inlayHintCache.UpdateCache(new InlayHintCache.InlayHintCacheEntry(hints));
5957

58+
if (hints.Length == 0)
59+
return Array.Empty<LSP.InlayHint>();
60+
61+
var text = await document.GetValueTextAsync(cancellationToken).ConfigureAwait(false);
62+
var syntaxVersion = await document.GetSyntaxVersionAsync(cancellationToken).ConfigureAwait(false);
63+
var syntaxVersionString = syntaxVersion.ToString();
64+
6065
var inlayHints = new LSP.InlayHint[hints.Length];
6166
for (var i = 0; i < hints.Length; i++)
6267
{
@@ -85,7 +90,7 @@ public TextDocumentIdentifier GetTextDocumentIdentifier(InlayHintParams request)
8590
ToolTip = null,
8691
PaddingLeft = leftPadding,
8792
PaddingRight = rightPadding,
88-
Data = new InlayHintResolveData(resultId, i, textDocumentIdentifier, syntaxVersion.ToString(), range, displayAllOverride)
93+
Data = new InlayHintResolveData(resultId, i, textDocumentIdentifier, syntaxVersionString, range, displayAllOverride)
8994
};
9095

9196
inlayHints[i] = inlayHint;
@@ -110,35 +115,34 @@ internal static async Task<ImmutableArray<InlineHint>> CalculateInlayHintsAsync(
110115
/// </summary>
111116
private static (string label, bool leftPadding, bool rightPadding) Trim(ImmutableArray<TaggedText> taggedTexts)
112117
{
113-
using var _ = ArrayBuilder<TaggedText>.GetInstance(out var result);
114118
var leftPadding = false;
115119
var rightPadding = false;
116120

121+
if (taggedTexts.Length == 0)
122+
return (string.Empty, leftPadding, rightPadding);
123+
124+
var first = taggedTexts.First();
125+
var trimStart = first.Text.TrimStart();
126+
leftPadding = first.Text.Length - trimStart.Length != 0;
127+
117128
if (taggedTexts.Length == 1)
118129
{
119-
var first = taggedTexts.First();
120-
121-
var trimStart = first.Text.TrimStart();
122130
var trimBoth = trimStart.TrimEnd();
123-
result.Add(new TaggedText(first.Tag, trimBoth));
124-
leftPadding = first.Text.Length - trimStart.Length != 0;
125131
rightPadding = trimStart.Length - trimBoth.Length != 0;
132+
133+
return (trimBoth, leftPadding, rightPadding);
126134
}
127-
else if (taggedTexts.Length >= 2)
128-
{
129-
var first = taggedTexts.First();
130-
var trimStart = first.Text.TrimStart();
131-
result.Add(new TaggedText(first.Tag, trimStart));
132-
leftPadding = first.Text.Length - trimStart.Length != 0;
133-
134-
for (var i = 1; i < taggedTexts.Length - 1; i++)
135-
result.Add(taggedTexts[i]);
136-
137-
var last = taggedTexts.Last();
138-
var trimEnd = last.Text.TrimEnd();
139-
result.Add(new TaggedText(last.Tag, trimEnd));
140-
rightPadding = last.Text.Length - trimEnd.Length != 0;
141-
}
135+
136+
using var _ = ArrayBuilder<TaggedText>.GetInstance(out var result);
137+
result.Add(new TaggedText(first.Tag, trimStart));
138+
139+
for (var i = 1; i < taggedTexts.Length - 1; i++)
140+
result.Add(taggedTexts[i]);
141+
142+
var last = taggedTexts.Last();
143+
var trimEnd = last.Text.TrimEnd();
144+
result.Add(new TaggedText(last.Tag, trimEnd));
145+
rightPadding = last.Text.Length - trimEnd.Length != 0;
142146

143147
return (result.ToImmutable().JoinText(), leftPadding, rightPadding);
144148
}

0 commit comments

Comments
 (0)