From cf13b427eb0b7a9d0109d7aae9bb0ecb7c4d4bf2 Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Mon, 14 Jul 2025 15:39:12 -0700 Subject: [PATCH 1/9] fixed irregular spacing between list item --- .../DocCommentFormattingTests.cs | 2 +- ...ctDocumentationCommentFormattingService.cs | 53 ++++++++++++++++++- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/EditorFeatures/Test/DocCommentFormatting/DocCommentFormattingTests.cs b/src/EditorFeatures/Test/DocCommentFormatting/DocCommentFormattingTests.cs index 31795dc86e2d2..8d97f7fb2f86f 100644 --- a/src/EditorFeatures/Test/DocCommentFormatting/DocCommentFormattingTests.cs +++ b/src/EditorFeatures/Test/DocCommentFormatting/DocCommentFormattingTests.cs @@ -64,7 +64,7 @@ public void ListTag() Item 2. - """, "Here is an example of a bulleted list:\r\n\r\n• Item 1.\r\n• Item 2."); + """, "Here is an example of a bulleted list:\r\n\r\n• Item 1. • Item 2."); } [Fact] diff --git a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs index a8d81cb41ebcb..39a41148c5d36 100644 --- a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs +++ b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs @@ -15,6 +15,51 @@ namespace Microsoft.CodeAnalysis.DocumentationComments; +/// +/// Indicates whether a newline may validly follow the specified SyntaxToken without requiring an explicit line continuation sequence ' _' or terminating the containing statement. +/// +/// The token to test. This token must be parented by a SyntaxNode. +/// True if implicit line continuation is allowed after token. +/// +/// Refer to "Statements in Visual Basic", 2010 version, http://msdn.microsoft.com/en-us/library/865x40k4(v=vs.100).aspx +/// for examples. +/// Implicit line continuation may be used in Visual Basic: +/// +/// After a comma (,). +/// After a less-than sign (<) or before a greater-than sign (>) when you specify an attribute. +/// After an open parenthesis (() or before a closing parenthesis ()). +/// After an open curly brace ({) or before a closing curly brace (}). +/// After an open embedded expression (<%=) or before the close of an embedded expression (%>) within an XML literal. +/// +/// Before and after query operators (Aggregate, Distinct, From, Group By, Group Join, Join, Let, +/// Order By, Select, Skip, Skip While, Take, Take While, Where, In, Into, On, Ascending, and Descending). +/// You cannot break a line between the keywords of query operators that are made up of multiple keywords +/// (Order By, Group Join, Take While, and Skip While). +/// +/// After the concatenation operator (&). +/// After assignment operators (=, &=, :=, +=, -=, *=, /=, \=, ^=, <<=, >>=). +/// After binary operators (+, -, /, *, Mod, <>, <, >, <=, >=, ^, >>, <<, And, AndAlso, Or, OrElse, Like, Xor) within an expression. +/// After the Is and IsNot operators. +/// After a less-than sign (<) or before a greater-than sign (>) when you specify an attribute. +/// +/// Also after a greater-than sign (>) when you specify an attribute. +/// However, you must include a line-continuation character (_) when you specify assembly-level or module-level attributes. +/// +/// +/// After a member qualifier character (.) and before the member name. +/// However, you must include a line-continuation character (_) following a member qualifier character when you are using the With statement or +/// supplying values in the initialization list for a type. +/// +/// +/// After an XML axis property qualifier (. or ...). +/// However, you must include a line-continuation character (_) when you specify a member qualifier when you are using the With keyword. +/// +/// After the From keyword in a collection initializer. +/// After the With keyword in a member initializer. +/// After the In keyword in a For Each statement. +/// +/// + internal abstract class AbstractDocumentationCommentFormattingService : IDocumentationCommentFormattingService { private enum DocumentationCommentListType @@ -142,11 +187,14 @@ public void NextListItem() { // Mark the end of the previous list item Builder.Add(new TaggedText(TextTags.ContainerEnd, string.Empty)); + _pendingSingleSpace = false; // Clear pending whitespace After ListItem + } + else + { + MarkLineBreak(); } - // The next list item has an incremented index, and has not yet been rendered to Builder. _listStack[^1] = (type, index + 1, renderedItem: false); - MarkLineBreak(); } public void PopList() @@ -208,6 +256,7 @@ public void MarkLineBreak() else { _pendingLineBreak = true; + } // Reset flag. From f3b351d5717620e4bf08ce57ad858468a65f3a28 Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Mon, 14 Jul 2025 15:42:12 -0700 Subject: [PATCH 2/9] removed documentation comment --- ...ctDocumentationCommentFormattingService.cs | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs index 39a41148c5d36..60b8ef07cab3a 100644 --- a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs +++ b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs @@ -15,51 +15,6 @@ namespace Microsoft.CodeAnalysis.DocumentationComments; -/// -/// Indicates whether a newline may validly follow the specified SyntaxToken without requiring an explicit line continuation sequence ' _' or terminating the containing statement. -/// -/// The token to test. This token must be parented by a SyntaxNode. -/// True if implicit line continuation is allowed after token. -/// -/// Refer to "Statements in Visual Basic", 2010 version, http://msdn.microsoft.com/en-us/library/865x40k4(v=vs.100).aspx -/// for examples. -/// Implicit line continuation may be used in Visual Basic: -/// -/// After a comma (,). -/// After a less-than sign (<) or before a greater-than sign (>) when you specify an attribute. -/// After an open parenthesis (() or before a closing parenthesis ()). -/// After an open curly brace ({) or before a closing curly brace (}). -/// After an open embedded expression (<%=) or before the close of an embedded expression (%>) within an XML literal. -/// -/// Before and after query operators (Aggregate, Distinct, From, Group By, Group Join, Join, Let, -/// Order By, Select, Skip, Skip While, Take, Take While, Where, In, Into, On, Ascending, and Descending). -/// You cannot break a line between the keywords of query operators that are made up of multiple keywords -/// (Order By, Group Join, Take While, and Skip While). -/// -/// After the concatenation operator (&). -/// After assignment operators (=, &=, :=, +=, -=, *=, /=, \=, ^=, <<=, >>=). -/// After binary operators (+, -, /, *, Mod, <>, <, >, <=, >=, ^, >>, <<, And, AndAlso, Or, OrElse, Like, Xor) within an expression. -/// After the Is and IsNot operators. -/// After a less-than sign (<) or before a greater-than sign (>) when you specify an attribute. -/// -/// Also after a greater-than sign (>) when you specify an attribute. -/// However, you must include a line-continuation character (_) when you specify assembly-level or module-level attributes. -/// -/// -/// After a member qualifier character (.) and before the member name. -/// However, you must include a line-continuation character (_) following a member qualifier character when you are using the With statement or -/// supplying values in the initialization list for a type. -/// -/// -/// After an XML axis property qualifier (. or ...). -/// However, you must include a line-continuation character (_) when you specify a member qualifier when you are using the With keyword. -/// -/// After the From keyword in a collection initializer. -/// After the With keyword in a member initializer. -/// After the In keyword in a For Each statement. -/// -/// - internal abstract class AbstractDocumentationCommentFormattingService : IDocumentationCommentFormattingService { private enum DocumentationCommentListType From 4002e9ef0ff6c476565480734d3bbddeea08bcd6 Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Tue, 15 Jul 2025 16:18:03 -0700 Subject: [PATCH 3/9] fixed some tests --- ...IntellisenseQuickInfoBuilderTests_Lists.vb | 217 +++++++++--------- ...ctDocumentationCommentFormattingService.cs | 1 - 2 files changed, 111 insertions(+), 107 deletions(-) diff --git a/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb b/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb index ef3ea02d86701..7288b80ac38c7 100644 --- a/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb +++ b/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb @@ -42,36 +42,38 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Dim intellisenseQuickInfo = Await GetQuickInfoItemAsync(workspace, LanguageNames.CSharp) Dim expected = New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), + New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), New ContainerElement( ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), - New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1"))))), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), New ContainerElement( - ContainerElementStyle.Wrapped, + ContainerElementStyle.Stacked, New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))) + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) End Function @@ -105,36 +107,38 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Dim intellisenseQuickInfo = Await GetQuickInfoItemAsync(workspace, LanguageNames.CSharp) Dim expected = New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), + New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), New ContainerElement( ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), - New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1"))))), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), New ContainerElement( - ContainerElementStyle.Wrapped, + ContainerElementStyle.Stacked, New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))) + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) End Function @@ -179,28 +183,29 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), + ContainerElementStyle.Stacked, New ContainerElement( - ContainerElementStyle.Stacked, + ContainerElementStyle.Wrapped, New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "word1", ClassifiedTextRunStyle.Bold), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1"))))), - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "word2", ClassifiedTextRunStyle.Bold), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))) - + New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "word1", ClassifiedTextRunStyle.Bold), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "word2", ClassifiedTextRunStyle.Bold), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) End Function @@ -229,44 +234,44 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Dim intellisenseQuickInfo = Await GetQuickInfoItemAsync(workspace, LanguageNames.CSharp) Dim expected = New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), + New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), New ContainerElement( ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), - New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "word1", ClassifiedTextRunStyle.Bold), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1"))))), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "word1", ClassifiedTextRunStyle.Bold), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), New ContainerElement( - ContainerElementStyle.Wrapped, + ContainerElementStyle.Stacked, New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "word2", ClassifiedTextRunStyle.Bold), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))) - - ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) + New ClassifiedTextRun(ClassificationTypeNames.Text, "word2", ClassifiedTextRunStyle.Bold), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) End Function diff --git a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs index 60b8ef07cab3a..daa69f12ccd0a 100644 --- a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs +++ b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs @@ -211,7 +211,6 @@ public void MarkLineBreak() else { _pendingLineBreak = true; - } // Reset flag. From 3244cb2c17224dceb18ca4e8d1d00e539bdff2ee Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Wed, 16 Jul 2025 12:27:51 -0700 Subject: [PATCH 4/9] fixed text with new expected --- .../IntellisenseQuickInfoBuilderTests_Lists.vb | 2 ++ .../Completion/CompletionResolveTests.cs | 6 ++---- src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs | 8 +++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb b/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb index 7288b80ac38c7..71321d9ad9766 100644 --- a/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb +++ b/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb @@ -272,6 +272,8 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) + + ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) End Function diff --git a/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs b/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs index c60c51ae06e2c..ef1d9c5132f3a 100644 --- a/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs +++ b/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs @@ -274,8 +274,7 @@ void A.AMethod(int i) _italic text_ underline text - • Item 1\. - • Item 2\. + • Item 1\. • Item 2\. [link text](https://google.com) """, results.Documentation.Value.Second.Value); @@ -333,8 +332,7 @@ strong text italic text underline text - • Item 1. - • Item 2. + • Item 1. • Item 2. link text """, results.Documentation.Value.Second.Value); diff --git a/src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs b/src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs index 3875323771865..9626654a67a6c 100644 --- a/src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs +++ b/src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs @@ -112,7 +112,7 @@ public async Task TestGetHoverAsync_WithList(bool mutatingLspWorkspace) var expectedLocation = testLspServer.GetLocations("caret").Single(); var results = await RunGetHoverAsync(testLspServer, expectedLocation).ConfigureAwait(false); - VerifyVSContent(results, "string A.Method(int i)|A great method|• |Item 1.|• |Item 2."); + VerifyVSContent(results, "string A.Method(int i)|A great method|• |Item 1.| |• |Item 2."); } [Theory, CombinatorialData] @@ -248,8 +248,7 @@ void A.AMethod(int i) _italic text_ underline text -• Item 1\. -• Item 2\. +• Item 1\. • Item 2\. [link text](https://google.com) @@ -312,8 +311,7 @@ strong text italic text underline text -• Item 1. -• Item 2. +• Item 1. • Item 2. link text From 8c45e53d707beb2fc4f3e422f0d1fa286cd992d4 Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Wed, 23 Jul 2025 02:15:17 -0700 Subject: [PATCH 5/9] reverted hovertests back to main, added fix to spaces being added when rendering tags within items --- ...ractDocumentationCommentFormattingService.cs | 17 ++++++++++++++++- .../ProtocolUnitTests/Hover/HoverTests.cs | 8 +++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs index daa69f12ccd0a..ffcc998a7cd7e 100644 --- a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs +++ b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs @@ -96,6 +96,11 @@ public bool AtBeginning internal (string target, string hint) NavigationTarget => _navigationTargetStack.Peek(); internal TaggedTextStyle Style => _styleStack.Peek(); + /// + /// Gets a value indicating whether we are currently inside a list element. + /// + internal bool IsInsideList => _listStack.Count > 0; + public void AppendSingleSpace() => _pendingSingleSpace = true; @@ -142,7 +147,10 @@ public void NextListItem() { // Mark the end of the previous list item Builder.Add(new TaggedText(TextTags.ContainerEnd, string.Empty)); - _pendingSingleSpace = false; // Clear pending whitespace After ListItem + // Clear all pending whitespace when transitioning between list items + _pendingSingleSpace = false; + _pendingLineBreak = false; + _pendingParagraphBreak = false; } else { @@ -557,6 +565,13 @@ private static void AppendTextFromTextNode(FormatterState state, XText element) return; } + // When inside a list, suppress whitespace-only text nodes to prevent unwanted spaces + // between list items and within list item structures + if (state.IsInsideList && string.IsNullOrWhiteSpace(rawText)) + { + return; + } + var builder = new StringBuilder(rawText.Length); // Normalize the whitespace. diff --git a/src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs b/src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs index 9626654a67a6c..3875323771865 100644 --- a/src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs +++ b/src/LanguageServer/ProtocolUnitTests/Hover/HoverTests.cs @@ -112,7 +112,7 @@ public async Task TestGetHoverAsync_WithList(bool mutatingLspWorkspace) var expectedLocation = testLspServer.GetLocations("caret").Single(); var results = await RunGetHoverAsync(testLspServer, expectedLocation).ConfigureAwait(false); - VerifyVSContent(results, "string A.Method(int i)|A great method|• |Item 1.| |• |Item 2."); + VerifyVSContent(results, "string A.Method(int i)|A great method|• |Item 1.|• |Item 2."); } [Theory, CombinatorialData] @@ -248,7 +248,8 @@ void A.AMethod(int i) _italic text_ underline text -• Item 1\. • Item 2\. +• Item 1\. +• Item 2\. [link text](https://google.com) @@ -311,7 +312,8 @@ strong text italic text underline text -• Item 1. • Item 2. +• Item 1. +• Item 2. link text From 3dd0eb109f0433caeea3e25b89d4250380a666c1 Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Mon, 28 Jul 2025 12:06:38 -0700 Subject: [PATCH 6/9] modified tagged text instead to resolve LSP issues --- ...ctDocumentationCommentFormattingService.cs | 22 ++----------------- .../Presentation/TaggedTextExtensions.cs | 5 +++++ 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs index ffcc998a7cd7e..a8d81cb41ebcb 100644 --- a/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs +++ b/src/Features/Core/Portable/DocumentationComments/AbstractDocumentationCommentFormattingService.cs @@ -96,11 +96,6 @@ public bool AtBeginning internal (string target, string hint) NavigationTarget => _navigationTargetStack.Peek(); internal TaggedTextStyle Style => _styleStack.Peek(); - /// - /// Gets a value indicating whether we are currently inside a list element. - /// - internal bool IsInsideList => _listStack.Count > 0; - public void AppendSingleSpace() => _pendingSingleSpace = true; @@ -147,17 +142,11 @@ public void NextListItem() { // Mark the end of the previous list item Builder.Add(new TaggedText(TextTags.ContainerEnd, string.Empty)); - // Clear all pending whitespace when transitioning between list items - _pendingSingleSpace = false; - _pendingLineBreak = false; - _pendingParagraphBreak = false; - } - else - { - MarkLineBreak(); } + // The next list item has an incremented index, and has not yet been rendered to Builder. _listStack[^1] = (type, index + 1, renderedItem: false); + MarkLineBreak(); } public void PopList() @@ -565,13 +554,6 @@ private static void AppendTextFromTextNode(FormatterState state, XText element) return; } - // When inside a list, suppress whitespace-only text nodes to prevent unwanted spaces - // between list items and within list item structures - if (state.IsInsideList && string.IsNullOrWhiteSpace(rawText)) - { - return; - } - var builder = new StringBuilder(rawText.Length); // Normalize the whitespace. diff --git a/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs b/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs index 9082510445d41..c882183b99daa 100644 --- a/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs +++ b/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs @@ -59,6 +59,11 @@ ref TextElementBuilder.AsRef(in nestedBuilder), case TextTags.ContainerEnd: // We're finished processing inline elements. Break out and let the caller continue + + if (taggedTexts is [var head, .. var tail] && head.Tag == TextTags.LineBreak) + { + taggedTexts = tail; + } done = true; break; From 58989aa7589bd7a2925d1e396ef0219405dd4887 Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Mon, 28 Jul 2025 17:01:37 -0700 Subject: [PATCH 7/9] reverted tests back to main --- ...IntellisenseQuickInfoBuilderTests_Lists.vb | 108 +++++++++--------- .../Completion/CompletionResolveTests.cs | 6 +- 2 files changed, 58 insertions(+), 56 deletions(-) diff --git a/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb b/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb index 71321d9ad9766..6146ff9e08cea 100644 --- a/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb +++ b/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb @@ -315,76 +315,76 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Dim intellisenseQuickInfo = Await GetQuickInfoItemAsync(workspace, LanguageNames.CSharp) Dim expected = New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), + New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), + New ContainerElement( + ContainerElementStyle.Stacked, New ContainerElement( - ContainerElementStyle.Stacked, + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), New ContainerElement( - ContainerElementStyle.Wrapped, - New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), + ContainerElementStyle.Stacked, New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), - New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), + New ClassifiedTextRun(ClassificationTypeNames.Text, "Line1")), + New ContainerElement( + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Line2"))))), + New ContainerElement( + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, New ContainerElement( ContainerElementStyle.Wrapped, New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), + New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), New ContainerElement( ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Line1")), - New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Line2"))))), - New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1.2")))))))), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1.2")))))))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2.1")))), New ContainerElement( ContainerElementStyle.Wrapped, New ClassifiedTextElement( New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), New ContainerElement( ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2.1")))), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Line1")), New ContainerElement( ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Line1")), - New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Line2"))))))))) + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Line2"))))))))) ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) End Function diff --git a/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs b/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs index ef1d9c5132f3a..c60c51ae06e2c 100644 --- a/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs +++ b/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs @@ -274,7 +274,8 @@ void A.AMethod(int i) _italic text_ underline text - • Item 1\. • Item 2\. + • Item 1\. + • Item 2\. [link text](https://google.com) """, results.Documentation.Value.Second.Value); @@ -332,7 +333,8 @@ strong text italic text underline text - • Item 1. • Item 2. + • Item 1. + • Item 2. link text """, results.Documentation.Value.Second.Value); From 38ae6df1caecb051d110c28a4fa6f91b16548096 Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Mon, 28 Jul 2025 17:01:37 -0700 Subject: [PATCH 8/9] reverted tests back to main --- ...IntellisenseQuickInfoBuilderTests_Lists.vb | 206 +++++++++--------- .../Presentation/TaggedTextExtensions.cs | 3 + .../Completion/CompletionResolveTests.cs | 6 +- 3 files changed, 110 insertions(+), 105 deletions(-) diff --git a/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb b/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb index 71321d9ad9766..50c7662aac62e 100644 --- a/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb +++ b/src/EditorFeatures/Test2/IntelliSense/IntellisenseQuickInfoBuilderTests_Lists.vb @@ -42,38 +42,38 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Dim intellisenseQuickInfo = Await GetQuickInfoItemAsync(workspace, LanguageNames.CSharp) Dim expected = New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, - New ContainerElement( - ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), - New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), - New ContainerElement( - ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, New ContainerElement( ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) + New ContainerElement( + ContainerElementStyle.Wrapped, + New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), + New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "• ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) End Function @@ -107,38 +107,38 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Dim intellisenseQuickInfo = Await GetQuickInfoItemAsync(workspace, LanguageNames.CSharp) Dim expected = New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, - New ContainerElement( - ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), - New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), - New ContainerElement( - ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, New ContainerElement( ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) + New ContainerElement( + ContainerElementStyle.Wrapped, + New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), + New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) End Function @@ -234,44 +234,44 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Dim intellisenseQuickInfo = Await GetQuickInfoItemAsync(workspace, LanguageNames.CSharp) Dim expected = New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, - New ContainerElement( - ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), - New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), - New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), - New ContainerElement( - ContainerElementStyle.Stacked, - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), - New ContainerElement( - ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "word1", ClassifiedTextRunStyle.Bold), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), - New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), + ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, New ContainerElement( ContainerElementStyle.Stacked, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "word2", ClassifiedTextRunStyle.Bold), - New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), - New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) + New ContainerElement( + ContainerElementStyle.Wrapped, + New ImageElement(New ImageId(KnownImageIds.ImageCatalogGuid, KnownImageIds.MethodPrivate)), + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Keyword, "void"), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.ClassName, "MyClass", navigationAction:=Sub() Return, "MyClass"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "."), + New ClassifiedTextRun(ClassificationTypeNames.MethodName, "MyMethod", navigationAction:=Sub() Return, "void MyClass.MyMethod()"), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, "("), + New ClassifiedTextRun(ClassificationTypeNames.Punctuation, ")"))), + New ContainerElement( + ContainerElementStyle.Stacked, + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "word1", ClassifiedTextRunStyle.Bold), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 1")))), + New ContainerElement( + ContainerElementStyle.Wrapped, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "2. ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "word2", ClassifiedTextRunStyle.Bold), + New ClassifiedTextRun(ClassificationTypeNames.WhiteSpace, " "), + New ClassifiedTextRun(ClassificationTypeNames.Text, "–"), + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2"))))))) ToolTipAssert.EqualContent(expected, intellisenseQuickInfo.Item) End Function @@ -364,15 +364,15 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense New ContainerElement( ContainerElementStyle.Stacked, New ContainerElement( - ContainerElementStyle.Wrapped, - New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), + ContainerElementStyle.Stacked, New ContainerElement( - ContainerElementStyle.Stacked, + ContainerElementStyle.Wrapped, New ClassifiedTextElement( - New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2.1")))), - New ContainerElement( - ContainerElementStyle.Stacked Or ContainerElementStyle.VerticalPadding, + New ClassifiedTextRun(ClassificationTypeNames.Text, "1. ")), + New ContainerElement( + ContainerElementStyle.Stacked, + New ClassifiedTextElement( + New ClassifiedTextRun(ClassificationTypeNames.Text, "Item 2.1")))), New ContainerElement( ContainerElementStyle.Wrapped, New ClassifiedTextElement( diff --git a/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs b/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs index c882183b99daa..ad5c2ed5c6854 100644 --- a/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs +++ b/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs @@ -60,6 +60,9 @@ ref TextElementBuilder.AsRef(in nestedBuilder), case TextTags.ContainerEnd: // We're finished processing inline elements. Break out and let the caller continue + // Documentation formatting may add an extra LineBreak after ContainerEnd to separate + // elements in LSP scenarios. During rendering, we consume this extra LineBreak to + // prevent double spacing, since each line is already rendered on its own line. if (taggedTexts is [var head, .. var tail] && head.Tag == TextTags.LineBreak) { taggedTexts = tail; diff --git a/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs b/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs index ef1d9c5132f3a..c60c51ae06e2c 100644 --- a/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs +++ b/src/LanguageServer/ProtocolUnitTests/Completion/CompletionResolveTests.cs @@ -274,7 +274,8 @@ void A.AMethod(int i) _italic text_ underline text - • Item 1\. • Item 2\. + • Item 1\. + • Item 2\. [link text](https://google.com) """, results.Documentation.Value.Second.Value); @@ -332,7 +333,8 @@ strong text italic text underline text - • Item 1. • Item 2. + • Item 1. + • Item 2. link text """, results.Documentation.Value.Second.Value); From 6c405e8b043177481fb0e808cabef01dcdedd29e Mon Sep 17 00:00:00 2001 From: Gobind Singh Date: Thu, 31 Jul 2025 11:31:32 -0700 Subject: [PATCH 9/9] defer tail slicing for efficiency --- .../Portable/QuickInfo/Presentation/TaggedTextExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs b/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs index ad5c2ed5c6854..22a39b7a5a486 100644 --- a/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs +++ b/src/Features/Core/Portable/QuickInfo/Presentation/TaggedTextExtensions.cs @@ -63,9 +63,9 @@ ref TextElementBuilder.AsRef(in nestedBuilder), // Documentation formatting may add an extra LineBreak after ContainerEnd to separate // elements in LSP scenarios. During rendering, we consume this extra LineBreak to // prevent double spacing, since each line is already rendered on its own line. - if (taggedTexts is [var head, .. var tail] && head.Tag == TextTags.LineBreak) + if (taggedTexts is [var head, ..] && head.Tag == TextTags.LineBreak) { - taggedTexts = tail; + taggedTexts = taggedTexts[1..]; } done = true; break;