提交 5b2dea4e 编写于 作者: B Balaji Soundrarajan

Merge pull request #1982 from basoundr/fix1922MultiLineLambdaInXml

End Construct should look at the context to determine the generated statement
......@@ -21,6 +21,9 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.EndConstructGeneration
Dim newLineTrivia = originalNode.GetTrailingTrivia().SkipWhile(Function(t) Not t.IsKind(SyntaxKind.EndOfLineTrivia))
Dim node = originalNode.WithTrailingTrivia(originalNode.GetTrailingTrivia().TakeWhile(Function(t) Not t.IsKind(SyntaxKind.EndOfLineTrivia)))
Dim tokenNextToLambda = originalNode.GetLastToken().GetNextToken()
Dim isNextToXmlEmbeddedExpression = tokenNextToLambda.IsKind(SyntaxKind.PercentGreaterThanToken) AndAlso tokenNextToLambda.Parent.IsKind(SyntaxKind.XmlEmbeddedExpression)
Dim aligningWhitespace = _subjectBuffer.CurrentSnapshot.GetAligningWhitespace(originalNode.SpanStart)
Dim indentedWhitespace = aligningWhitespace & " "
......@@ -28,7 +31,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.EndConstructGeneration
Dim endStatementKind = If(originalNode.Kind = SyntaxKind.SingleLineSubLambdaExpression, SyntaxKind.EndSubStatement, SyntaxKind.EndFunctionStatement)
Dim endStatement = SyntaxFactory.EndBlockStatement(endStatementKind, SyntaxFactory.Token(originalNode.SubOrFunctionHeader.DeclarationKeyword.Kind).WithLeadingTrivia(SyntaxFactory.WhitespaceTrivia(" "))) _
.WithLeadingTrivia(SyntaxFactory.WhitespaceTrivia(aligningWhitespace)) _
.WithTrailingTrivia(newLineTrivia)
.WithTrailingTrivia(If(isNextToXmlEmbeddedExpression, SyntaxFactory.TriviaList(SyntaxFactory.WhitespaceTrivia(" ")), newLineTrivia))
' We are hitting enter after a single line. Let's transform it to a multi-line form
If node.Kind = SyntaxKind.SingleLineSubLambdaExpression Then
......@@ -73,7 +76,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.EndConstructGeneration
End If
' It's still missing entirely, so just spit normally
Return CreateSpitLinesForLambdaHeader(node.SubOrFunctionHeader)
Return CreateSpitLinesForLambdaHeader(node.SubOrFunctionHeader, isNextToXmlEmbeddedExpression, originalNode.SpanStart)
End If
Dim newHeader = node.SubOrFunctionHeader.WithTrailingTrivia(SyntaxFactory.EndOfLineTrivia(_state.NewLineCharacter))
......@@ -127,14 +130,15 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.EndConstructGeneration
End If
End Function
Private Function CreateSpitLinesForLambdaHeader(node As LambdaHeaderSyntax) As AbstractEndConstructResult
Dim endConstruct = _subjectBuffer.CurrentSnapshot.GetAligningWhitespace(node.SpanStart) & "End " & node.DeclarationKeyword.ToString()
Private Function CreateSpitLinesForLambdaHeader(node As LambdaHeaderSyntax, Optional isNextToXmlEmbeddedExpression As Boolean = False, Optional originalNodeSpanStart? As Integer = Nothing) As AbstractEndConstructResult
Dim spanStart As Integer = If(originalNodeSpanStart.HasValue, originalNodeSpanStart.Value, node.SpanStart)
Dim endConstruct = _subjectBuffer.CurrentSnapshot.GetAligningWhitespace(spanStart) & "End " & node.DeclarationKeyword.ToString()
' We may wish to spit () at the end of if we are missing our parenthesis
If node.ParameterList Is Nothing OrElse (node.ParameterList.OpenParenToken.IsMissing AndAlso node.ParameterList.CloseParenToken.IsMissing) Then
Return New SpitLinesResult({"()", "", endConstruct}, startOnCurrentLine:=True)
Else
Return New SpitLinesResult({"", endConstruct})
Return New SpitLinesResult({"", If(isNextToXmlEmbeddedExpression, endConstruct & " ", endConstruct)})
End If
End Function
End Class
......
......@@ -374,5 +374,45 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.EndConstructGenera
"End Class"},
afterCaret:={3, 27})
End Sub
<WorkItem(1922, "https://github.com/dotnet/roslyn/issues/1922")>
<Fact, Trait(Traits.Feature, Traits.Features.EndConstructGeneration), WorkItem(530683)>
Public Sub VerifySingleLineFunctionLambdaToMultiLineInsideXMLTag()
VerifyStatementEndConstructApplied(
before:={"Class C",
" Sub s()",
" Dim x = <xml><%= Function()%></xml>",
" End Sub",
"End Class"},
beforeCaret:={2, 35},
after:={"Class C",
" Sub s()",
" Dim x = <xml><%= Function()",
"",
" End Function %></xml>",
" End Sub",
"End Class"},
afterCaret:={3, -1})
End Sub
<WorkItem(1922, "https://github.com/dotnet/roslyn/issues/1922")>
<Fact, Trait(Traits.Feature, Traits.Features.EndConstructGeneration), WorkItem(530683)>
Public Sub VerifySingleLineSubLambdaToMultiLineInsideXMLTag()
VerifyStatementEndConstructApplied(
before:={"Class C",
" Sub s()",
" Dim x = <xml><%= Sub()%></xml>",
" End Sub",
"End Class"},
beforeCaret:={2, 30},
after:={"Class C",
" Sub s()",
" Dim x = <xml><%= Sub()",
"",
" End Sub %></xml>",
" End Sub",
"End Class"},
afterCaret:={3, -1})
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册