提交 2ada552b 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #16300 from CyrusNajmabadi/moveTypeTrivia1

Remove leading trivia from a type when moving to a new file.

Fixes #16283
......@@ -43,7 +43,7 @@ public async Task TestForSpans1()
{
var code =
@"[|clas|]s Class1 { }
class Class2 { }";
class Class2 { }";
var codeAfterMove = @"class Class2 { }";
var expectedDocumentName = "Class1.cs";
......@@ -784,5 +784,43 @@ class Inner {
await TestMoveTypeToNewFileAsync(code, codeAfterMove, expectedDocumentName, destinationDocumentText);
}
[WorkItem(16283, "https://github.com/dotnet/roslyn/issues/16283")]
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task TestLeadingTrivia1()
{
var code =
@"
class Outer
{
class Inner1
{
}
[|class|] Inner2
{
}
}";
var codeAfterMove = @"
partial class Outer
{
class Inner1
{
}
}";
var expectedDocumentName = "Inner2.cs";
var destinationDocumentText = @"
partial class Outer
{
class Inner2
{
}
}";
await TestMoveTypeToNewFileAsync(
code, codeAfterMove, expectedDocumentName, destinationDocumentText,
compareTokens: false);
}
}
}
\ No newline at end of file
......@@ -76,7 +76,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.EndConstructGeneration
' Add the new whitespace on the start of the statement
If statement.Kind <> SyntaxKind.EmptyStatement OrElse statement.HasTrailingTrivia Then
Dim leadingTrivia = indentedWhitespaceTrivia.Concat(triviaLeftForNextStatement.Concat(statement.GetLeadingTrivia()).WithoutLeadingWhitespace())
Dim leadingTrivia = indentedWhitespaceTrivia.Concat(triviaLeftForNextStatement.Concat(statement.GetLeadingTrivia()).WithoutLeadingWhitespaceOrEndOfLine())
statement = statement.WithLeadingTrivia(leadingTrivia)
End If
......
......@@ -10,6 +10,7 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.RemoveUnnecessaryImports;
using Microsoft.CodeAnalysis.Shared.Extensions;
......@@ -227,6 +228,30 @@ private static bool FilterToTopLevelMembers(SyntaxNode node, SyntaxNode typeNode
documentEditor.RemoveAllComments(node);
}
}
documentEditor.ReplaceNode(State.TypeNode,
(currentNode, generator) =>
{
var currentTypeNode = (TTypeDeclarationSyntax)currentNode;
// Trim leading whitespace from the type so we don't have excessive
// leading blank lines.
return RemoveLeadingWhitespace(currentTypeNode);
});
}
private TTypeDeclarationSyntax RemoveLeadingWhitespace(
TTypeDeclarationSyntax currentTypeNode)
{
var syntaxFacts = State.SemanticDocument.Document.GetLanguageService<ISyntaxFactsService>();
var leadingTrivia = currentTypeNode.GetLeadingTrivia();
var afterWhitespace = leadingTrivia.SkipWhile(
t => syntaxFacts.IsWhitespaceTrivia(t) || syntaxFacts.IsEndOfLineTrivia(t));
var withoutLeadingWhitespace = currentTypeNode.WithLeadingTrivia(afterWhitespace);
return withoutLeadingWhitespace.ReplaceToken(
withoutLeadingWhitespace.GetFirstToken(),
withoutLeadingWhitespace.GetFirstToken().WithAdditionalAnnotations(Formatter.Annotation));
}
}
}
......
......@@ -43,7 +43,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports
oldImports(i) = Nothing
Dim leadingTrivia = oldImport.GetLeadingTrivia()
If leadingTrivia.Any(Function(t) Not t.IsWhitespace()) Then
If leadingTrivia.Any(Function(t) Not t.IsWhitespaceOrEndOfLine()) Then
' This import had trivia we want to preserve. If we're the last import,
' then copy this trivia out so that our caller can place it on the next token.
' If there is any import following us, then place it on that.
......
......@@ -2187,7 +2187,7 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.CodeModel
If trivia.Kind = SyntaxKind.CommentTrivia Then
firstCommentFound = True
commentList.Add(trivia)
ElseIf Not firstCommentFound AndAlso trivia.IsWhitespace() Then
ElseIf Not firstCommentFound AndAlso trivia.IsWhitespaceOrEndOfLine() Then
Continue For
ElseIf firstCommentFound AndAlso trivia.Kind = SyntaxKind.EndOfLineTrivia AndAlso nextTrivia.Kind = SyntaxKind.CommentTrivia Then
Continue For
......
......@@ -171,9 +171,10 @@ public static SyntaxTriviaList AsTrivia(this string s)
}
public static bool IsWhitespaceOrEndOfLine(this SyntaxTrivia trivia)
{
return IsWhitespace(trivia) || trivia.Kind() == SyntaxKind.EndOfLineTrivia;
}
=> IsWhitespace(trivia) || IsEndOfLine(trivia);
public static bool IsEndOfLine(this SyntaxTrivia trivia)
=> trivia.Kind() == SyntaxKind.EndOfLineTrivia;
public static bool IsWhitespace(this SyntaxTrivia trivia)
=> trivia.Kind() == SyntaxKind.WhitespaceTrivia;
......
......@@ -1808,6 +1808,12 @@ public bool IsLogicalNotExpression(SyntaxNode node)
public SyntaxNode GetOperandOfPrefixUnaryExpression(SyntaxNode node)
=> ((PrefixUnaryExpressionSyntax)node).Operand;
public bool IsWhitespaceTrivia(SyntaxTrivia trivia)
=> trivia.IsWhitespace();
public bool IsEndOfLineTrivia(SyntaxTrivia trivia)
=> trivia.IsEndOfLine();
private class AddFirstMissingCloseBaceRewriter: CSharpSyntaxRewriter
{
private readonly SyntaxNode _contextNode;
......
......@@ -118,6 +118,9 @@ internal interface ISyntaxFactsService : ILanguageService
bool IsSkippedTokensTrivia(SyntaxNode node);
bool IsWhitespaceTrivia(SyntaxTrivia trivia);
bool IsEndOfLineTrivia(SyntaxTrivia trivia);
SyntaxNode GetExpressionOfConditionalAccessExpression(SyntaxNode node);
SyntaxNode GetExpressionOfElementAccessExpression(SyntaxNode node);
......
......@@ -234,7 +234,7 @@ Namespace Microsoft.CodeAnalysis.CodeCleanup.Providers
' If previousToken has trailing WhitespaceTrivia, strip off the trailing WhitespaceTrivia from the lastToken.
Dim lastTrailingTrivia = lastToken.TrailingTrivia
If prevTrailingTrivia.Any(SyntaxKind.WhitespaceTrivia) Then
lastTrailingTrivia = lastTrailingTrivia.WithoutLeadingWhitespace()
lastTrailingTrivia = lastTrailingTrivia.WithoutLeadingWhitespaceOrEndOfLine()
End If
' get the trivia and attach it to the last token
......
......@@ -17,10 +17,19 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
trivia.Kind = kind3
End Function
<Extension()>
<Extension>
Public Function IsWhitespaceOrEndOfLine(trivia As SyntaxTrivia) As Boolean
Return trivia.IsWhitespace() OrElse trivia.IsEndOfLine()
End Function
<Extension>
Public Function IsWhitespace(trivia As SyntaxTrivia) As Boolean
Return trivia.Kind = SyntaxKind.WhitespaceTrivia OrElse
trivia.Kind = SyntaxKind.EndOfLineTrivia
Return trivia.Kind = SyntaxKind.WhitespaceTrivia
End Function
<Extension>
Public Function IsEndOfLine(trivia As SyntaxTrivia) As Boolean
Return trivia.Kind = SyntaxKind.EndOfLineTrivia
End Function
<Extension>
......
......@@ -17,8 +17,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
End Function
<Extension()>
Public Function WithoutLeadingWhitespace(list As IEnumerable(Of SyntaxTrivia)) As SyntaxTriviaList
Return list.SkipWhile(Function(t) t.IsWhitespace()).ToSyntaxTriviaList()
Public Function WithoutLeadingWhitespaceOrEndOfLine(list As IEnumerable(Of SyntaxTrivia)) As SyntaxTriviaList
Return list.SkipWhile(Function(t) t.IsWhitespaceOrEndOfLine()).ToSyntaxTriviaList()
End Function
End Module
End Namespace
......@@ -343,7 +343,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
' see whether first non whitespace trivia after previous member is comment or not
Dim list = token1.TrailingTrivia.Concat(token2.LeadingTrivia)
Dim firstNonWhitespaceTrivia = list.FirstOrDefault(Function(t) Not t.IsWhitespace())
Dim firstNonWhitespaceTrivia = list.FirstOrDefault(Function(t) Not t.IsWhitespaceOrEndOfLine())
If firstNonWhitespaceTrivia.IsKind(SyntaxKind.CommentTrivia, SyntaxKind.DocumentationCommentTrivia) Then
Dim totalLines = GetNumberOfLines(list)
Dim blankLines = GetNumberOfLines(list.TakeWhile(Function(t) t <> firstNonWhitespaceTrivia))
......
......@@ -1621,5 +1621,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
expression = memberAccess.Expression
name = memberAccess.Name
End Sub
Public Function IsWhitespaceTrivia(trivia As SyntaxTrivia) As Boolean Implements ISyntaxFactsService.IsWhitespaceTrivia
Return trivia.IsWhitespace()
End Function
Public Function IsEndOfLineTrivia(trivia As SyntaxTrivia) As Boolean Implements ISyntaxFactsService.IsEndOfLineTrivia
Return trivia.IsEndOfLine()
End Function
End Class
End Namespace
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册