提交 690c9ab4 编写于 作者: P Paul Chen

Special casing for single line ternary expressions that without singleline comments in C#

上级 b7fee1dc
...@@ -90,7 +90,7 @@ async Task<int> Test2() ...@@ -90,7 +90,7 @@ async Task<int> Test2()
} }
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)] [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)]
public void BadAsyncReturnOperand_WithTrailingTrivia1() public void BadAsyncReturnOperand_ConditionalExpressionWithTrailingTrivia_SingleLine()
{ {
var initial = var initial =
@"using System.Threading.Tasks; @"using System.Threading.Tasks;
...@@ -114,14 +114,14 @@ class Program ...@@ -114,14 +114,14 @@ class Program
async Task<int> Test2() async Task<int> Test2()
{ {
return await (true ? Test() /* true */ : Test()) /* false */; return await (true ? Test() /* true */ : Test() /* false */);
} }
}"; }";
Test(initial, expected, compareTokens: false); Test(initial, expected, compareTokens: false);
} }
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)] [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)]
public void BadAsyncReturnOperand_WithTrailingTrivia2() public void BadAsyncReturnOperand_ConditionalExpressionWithTrailingTrivia_Multiline()
{ {
var initial = var initial =
@"using System.Threading.Tasks; @"using System.Threading.Tasks;
...@@ -155,6 +155,136 @@ async Task<int> Test2() ...@@ -155,6 +155,136 @@ async Task<int> Test2()
Test(initial, expected, compareTokens: false); Test(initial, expected, compareTokens: false);
} }
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)]
public void BadAsyncReturnOperand_NullCoalescingExpressionWithTrailingTrivia_SingleLine()
{
var initial =
@"using System.Threading.Tasks;
class Program
{
async Task<int> Test() => 3;
async Task<int> Test2()
{[|
return null /* 0 */ ?? Test() /* 1 */;
|]}
}";
var expected =
@"using System.Threading.Tasks;
class Program
{
async Task<int> Test() => 3;
async Task<int> Test2()
{
return await (null /* 0 */ ?? Test() /* 1 */);
}
}";
Test(initial, expected, compareTokens: false);
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)]
public void BadAsyncReturnOperand_NullCoalescingExpressionWithTrailingTrivia_Multiline()
{
var initial =
@"using System.Threading.Tasks;
class Program
{
async Task<int> Test() => 3;
async Task<int> Test2()
{[|
return null // aaa
?? Test() // bbb
;
|]}
}";
var expected =
@"using System.Threading.Tasks;
class Program
{
async Task<int> Test() => 3;
async Task<int> Test2()
{
return await (null // aaa
?? Test()) // bbb
;
}
}";
Test(initial, expected, compareTokens: false);
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)]
public void BadAsyncReturnOperand_AsExpressionWithTrailingTrivia_SingleLine()
{
var initial =
@"using System.Threading.Tasks;
class Program
{
async Task<int> Test2()
{[|
return null /* 0 */ as Task<int> /* 1 */;
|]}
}";
var expected =
@"using System.Threading.Tasks;
class Program
{
async Task<int> Test() => 3;
async Task<int> Test2()
{
return await (null /* 0 */ as Task<int> /* 1 */);
}
}";
Test(initial, expected, compareTokens: false);
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)]
public void BadAsyncReturnOperand_AsExpressionWithTrailingTrivia_Multiline()
{
var initial =
@"using System.Threading.Tasks;
class Program
{
async Task<int> Test() => 3;
async Task<int> Test2()
{[|
return null // aaa
as Task<int> // bbb
;
|]}
}";
var expected =
@"using System.Threading.Tasks;
class Program
{
async Task<int> Test() => 3;
async Task<int> Test2()
{
return await (null // aaa
as Task<int>) // bbb
;
}
}";
Test(initial, expected, compareTokens: false);
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)] [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddAwait)]
public void TaskNotAwaited() public void TaskNotAwaited()
{ {
......
...@@ -148,6 +148,17 @@ private static bool IsInAsyncFunction(ExpressionSyntax expression) ...@@ -148,6 +148,17 @@ private static bool IsInAsyncFunction(ExpressionSyntax expression)
private static SyntaxNode ConvertToAwaitExpression(ExpressionSyntax expression) private static SyntaxNode ConvertToAwaitExpression(ExpressionSyntax expression)
{ {
if ((expression is BinaryExpressionSyntax || expression is ConditionalExpressionSyntax) && expression.HasTrailingTrivia)
{
var expWithTrailing = expression.WithoutLeadingTrivia();
var span = expWithTrailing.GetLocation().GetLineSpan().Span;
if (span.Start.Line == span.End.Line && !expWithTrailing.DescendantTrivia().Any(trivia => trivia.IsKind(SyntaxKind.SingleLineCommentTrivia)))
{
return SyntaxFactory.AwaitExpression(SyntaxFactory.ParenthesizedExpression(expWithTrailing))
.WithLeadingTrivia(expression.GetLeadingTrivia())
.WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation);
}
}
return SyntaxFactory.AwaitExpression(expression.WithoutTrivia().Parenthesize()) return SyntaxFactory.AwaitExpression(expression.WithoutTrivia().Parenthesize())
.WithTriviaFrom(expression) .WithTriviaFrom(expression)
.WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation); .WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册