diff --git a/src/Features/Core/Portable/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs b/src/Features/Core/Portable/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs index d4111bdc916e5c0fe5850c77551b8cf171635389..a8852142ec885ba6b2ae4ae40f3a6edf0c5cf0c6 100644 --- a/src/Features/Core/Portable/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs +++ b/src/Features/Core/Portable/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs @@ -18,6 +18,7 @@ namespace Microsoft.CodeAnalysis.GenerateConstructorFromMembers [ExportCodeRefactoringProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, Name = PredefinedCodeRefactoringProviderNames.GenerateConstructorFromMembers), Shared] [ExtensionOrder(Before = PredefinedCodeRefactoringProviderNames.AddConstructorParametersFromMembers)] + [ExtensionOrder(Before = PredefinedCodeRefactoringProviderNames.GenerateEqualsAndGetHashCodeFromMembers)] internal partial class GenerateConstructorFromMembersCodeRefactoringProvider : AbstractGenerateFromMembersCodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) diff --git a/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs b/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs index df818653a868a67be6b8b8ff97fc683feec34443..0cfda8410012050dda8c1a344fba62f3b8d6473d 100644 --- a/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs +++ b/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs @@ -37,13 +37,18 @@ public FormatLargeBinaryExpressionRule(ISyntaxFactsService syntaxFacts) { if (_syntaxFacts.IsReturnStatement(node)) { - list.Add(FormattingOperations.CreateRelativeIndentBlockOperation( - node.GetFirstToken(), - node.GetFirstToken().GetNextToken(), - node.GetLastToken(), - indentationDelta: 1, - option: IndentBlockOption.RelativePosition)); - return; + var expr = _syntaxFacts.GetExpressionOfReturnStatement(node); + if (expr != null) + { + list.Add(FormattingOperations.CreateRelativeIndentBlockOperation( + expr.GetFirstToken(), + expr.GetFirstToken(), + node.GetLastToken(), + indentationDelta: 0, + option: IndentBlockOption.RelativePosition)); + + return; + } } nextOperation.Invoke(list); diff --git a/src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs b/src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs index ce80672788b5ed0e41c4547a21f9ce44ee1e8aad..7885baff186547147468a5777f9887c1e370272f 100644 --- a/src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs +++ b/src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs @@ -236,6 +236,9 @@ public bool IsUsingStatement(SyntaxNode node) public bool IsReturnStatement(SyntaxNode node) => node.Kind() == SyntaxKind.ReturnStatement; + public SyntaxNode GetExpressionOfReturnStatement(SyntaxNode node) + => (node as ReturnStatementSyntax)?.Expression; + public bool IsThisConstructorInitializer(SyntaxToken token) { return token.Parent.IsKind(SyntaxKind.ThisConstructorInitializer) && diff --git a/src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/ISyntaxFactsService.cs b/src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/ISyntaxFactsService.cs index 621e3158eb2fdcd150a9a120e3b591c5ec79f845..33551ce1d7e74af78ac33239b904177477d0655f 100644 --- a/src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/ISyntaxFactsService.cs +++ b/src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/ISyntaxFactsService.cs @@ -165,7 +165,9 @@ internal interface ISyntaxFactsService : ILanguageService bool IsForEachStatement(SyntaxNode node); bool IsLockStatement(SyntaxNode node); bool IsUsingStatement(SyntaxNode node); + bool IsReturnStatement(SyntaxNode node); + SyntaxNode GetExpressionOfReturnStatement(SyntaxNode node); bool IsLocalDeclarationStatement(SyntaxNode node); bool IsDeclaratorOfLocalDeclarationStatement(SyntaxNode declator, SyntaxNode localDeclarationStatement); diff --git a/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb b/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb index 5f87fe3e5b415f6c989c217e55f29fd876414fc9..100fd8c754927e6518129b08cf1aa7650b1e60c8 100644 --- a/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb +++ b/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb @@ -212,6 +212,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Return node.Kind() = SyntaxKind.ReturnStatement End Function + Public Function GetExpressionOfReturnStatement(node As SyntaxNode) As SyntaxNode Implements ISyntaxFactsService.GetExpressionOfReturnStatement + Return TryCast(node, ReturnStatementSyntax)?.Expression + End Function + Public Function IsThisConstructorInitializer(token As SyntaxToken) As Boolean Implements ISyntaxFactsService.IsThisConstructorInitializer If TypeOf token.Parent Is IdentifierNameSyntax AndAlso token.HasMatchingText(SyntaxKind.NewKeyword) Then Dim memberAccess = TryCast(token.Parent.Parent, MemberAccessExpressionSyntax)