提交 1efb97af 编写于 作者: D Dustin Campbell

Properly support indentation within text of XML doc comment on ENTER

上级 47e6da37
......@@ -1114,6 +1114,156 @@ void M()
VerifyPressingEnter(code, expected);
}
[WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")]
[Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)]
public void PressingEnter_Indentation1()
{
const string code =
@"class C
{
/// <summary>
/// hello world$$
/// </summary>
void M()
{
}
}";
const string expected =
@"class C
{
/// <summary>
/// hello world
/// $$
/// </summary>
void M()
{
}
}";
VerifyPressingEnter(code, expected);
}
[WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")]
[Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)]
public void PressingEnter_Indentation2()
{
const string code =
@"class C
{
/// <summary>
/// hello $$world
/// </summary>
void M()
{
}
}";
const string expected =
@"class C
{
/// <summary>
/// hello
/// $$world
/// </summary>
void M()
{
}
}";
VerifyPressingEnter(code, expected);
}
[WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")]
[Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)]
public void PressingEnter_Indentation3()
{
const string code =
@"class C
{
/// <summary>
/// hello$$ world
/// </summary>
void M()
{
}
}";
const string expected =
@"class C
{
/// <summary>
/// hello
/// $$world
/// </summary>
void M()
{
}
}";
VerifyPressingEnter(code, expected);
}
[WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")]
[Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)]
public void PressingEnter_Indentation4()
{
const string code =
@"class C
{
/// <summary>
/// $$hello world
/// </summary>
void M()
{
}
}";
const string expected =
@"class C
{
/// <summary>
///
/// $$hello world
/// </summary>
void M()
{
}
}";
VerifyPressingEnter(code, expected);
}
[WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")]
[Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)]
public void PressingEnter_Indentation5_UseTabs()
{
const string code =
@"class C
{
/// <summary>
/// hello world$$
/// </summary>
void M()
{
}
}";
const string expected =
@"class C
{
/// <summary>
/// hello world
/// $$
/// </summary>
void M()
{
}
}";
VerifyPressingEnter(code, expected, useTabs: true);
}
[Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)]
public void Command_Class()
{
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using Microsoft.CodeAnalysis.Editor.Commands;
using Microsoft.CodeAnalysis.Editor.Host;
......@@ -657,20 +658,39 @@ private void InsertExteriorTriviaIfNeeded(ITextView view, ITextBuffer subjectBuf
private void InsertExteriorTrivia(ITextView view, ITextBuffer subjectBuffer, TextLine currentLine, TextLine previousLine)
{
var useTabs = subjectBuffer.GetOption(FormattingOptions.UseTabs);
var tabSize = subjectBuffer.GetOption(FormattingOptions.TabSize);
var firstNonWhitespaceColumn = previousLine.GetColumnOfFirstNonWhitespaceCharacterOrEndOfLine(tabSize);
var indentText = firstNonWhitespaceColumn.CreateIndentationString(useTabs, tabSize) + ExteriorTriviaText + " ";
var insertionText = CreateInsertionTextFromPreviousLine(previousLine, subjectBuffer);
var firstNonWhitespaceOffset = currentLine.GetFirstNonWhitespaceOffset();
var replaceSpan = firstNonWhitespaceOffset != null
? TextSpan.FromBounds(currentLine.Start, currentLine.Start + firstNonWhitespaceOffset.Value)
: currentLine.Span;
subjectBuffer.Replace(replaceSpan.ToSpan(), indentText);
subjectBuffer.Replace(replaceSpan.ToSpan(), insertionText);
view.TryMoveCaretToAndEnsureVisible(subjectBuffer.CurrentSnapshot.GetPoint(replaceSpan.Start + insertionText.Length));
}
private string CreateInsertionTextFromPreviousLine(TextLine previousLine, ITextBuffer subjectBuffer)
{
var useTabs = subjectBuffer.GetOption(FormattingOptions.UseTabs);
var tabSize = subjectBuffer.GetOption(FormattingOptions.TabSize);
var previousLineText = previousLine.ToString();
var firstNonWhitespaceColumn = previousLineText.GetColumnOfFirstNonWhitespaceCharacterOrEndOfLine(tabSize);
var trimmedPreviousLine = previousLineText.Trim();
Debug.Assert(trimmedPreviousLine.StartsWith(ExteriorTriviaText), "Unexpected: previous line does not begin with doc comment exterior trivia.");
// skip exterior trivia.
trimmedPreviousLine = trimmedPreviousLine.Substring(3);
var firstNonWhitespaceOffsetInPreviousXmlText = trimmedPreviousLine.GetFirstNonWhitespaceOffset();
var extraIndent = firstNonWhitespaceOffsetInPreviousXmlText != null
? trimmedPreviousLine.Substring(0, firstNonWhitespaceOffsetInPreviousXmlText.Value)
: " ";
view.TryMoveCaretToAndEnsureVisible(subjectBuffer.CurrentSnapshot.GetPoint(replaceSpan.Start + indentText.Length));
return firstNonWhitespaceColumn.CreateIndentationString(useTabs, tabSize) + ExteriorTriviaText + extraIndent;
}
private bool CurrentLineStartsWithExteriorTrivia(ITextBuffer subjectBuffer, int position)
......
......@@ -611,6 +611,131 @@ End Class
VerifyPressingEnter(code, expected)
End Sub
<WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")>
<Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)>
Public Sub PressingEnter_Indentation1()
Const code = "
Class C
''' <summary>
''' hello world$$
''' </summary>
Sub M()
End Sub
End Class
"
Const expected = "
Class C
''' <summary>
''' hello world
''' $$
''' </summary>
Sub M()
End Sub
End Class
"
VerifyPressingEnter(code, expected)
End Sub
<WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")>
<Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)>
Public Sub PressingEnter_Indentation2()
Const code = "
Class C
''' <summary>
''' hello $$world
''' </summary>
Sub M()
End Sub
End Class
"
Const expected = "
Class C
''' <summary>
''' hello
''' $$world
''' </summary>
Sub M()
End Sub
End Class
"
VerifyPressingEnter(code, expected)
End Sub
<WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")>
<Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)>
Public Sub PressingEnter_Indentation3()
Const code = "
Class C
''' <summary>
''' hello$$ world
''' </summary>
Sub M()
End Sub
End Class
"
Const expected = "
Class C
''' <summary>
''' hello
''' $$world
''' </summary>
Sub M()
End Sub
End Class
"
VerifyPressingEnter(code, expected)
End Sub
<WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")>
<Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)>
Public Sub PressingEnter_Indentation4()
Const code = "
Class C
''' <summary>
''' $$hello world
''' </summary>
Sub M()
End Sub
End Class
"
Const expected = "
Class C
''' <summary>
'''
''' $$hello world
''' </summary>
Sub M()
End Sub
End Class
"
VerifyPressingEnter(code, expected)
End Sub
<WorkItem(2108, "https://github.com/dotnet/roslyn/issues/2108")>
<Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)>
Public Sub PressingEnter_Indentation5_UseTabs()
Const code = "
Class C
''' <summary>
''' hello world$$
''' </summary>
Sub M()
End Sub
End Class
"
Const expected = "
Class C
''' <summary>
''' hello world
''' $$
''' </summary>
Sub M()
End Sub
End Class
"
VerifyPressingEnter(code, expected, useTabs:=True)
End Sub
<Fact, Trait(Traits.Feature, Traits.Features.DocumentationComments)>
Public Sub Command_Class()
Const code = "
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册