Skip to content

Commit

Permalink
Merge pull request #69072 from CyrusNajmabadi/primaryConstructorWork
Browse files Browse the repository at this point in the history
Update 'initialize member from parameter' to work with primary constructors.
  • Loading branch information
CyrusNajmabadi authored Jul 18, 2023
2 parents ff4ba9c + 445db56 commit 70a05cd
Show file tree
Hide file tree
Showing 15 changed files with 2,748 additions and 125 deletions.
1 change: 1 addition & 0 deletions SpellingExclusions.dic
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
awaitable
Refactorings
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,10 @@ private static bool IsValidLocation(SyntaxNode location)
var parameterList = container.GetParameterList();
Contract.ThrowIfNull(parameterList);

var outParameters =
parameterList.Parameters.Select(p => (IParameterSymbol)semanticModel.GetRequiredDeclaredSymbol(p, cancellationToken))
.Where(p => p.RefKind == RefKind.Out)
.ToImmutableArray();
var outParameters = parameterList.Parameters
.Select(p => semanticModel.GetRequiredDeclaredSymbol(p, cancellationToken))
.Where(p => p.RefKind == RefKind.Out)
.ToImmutableArray();

var distinctExprsOrStatements = group.Select(t => t.exprOrStatement).Distinct();
foreach (var exprOrStatement in distinctExprsOrStatements)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ public static ImmutableArray<PositionalParameterInfo> GetPropertiesForPositional
using var _ = ArrayBuilder<PositionalParameterInfo>.GetInstance(out var resultBuilder);

// get all declared property symbols, put inherited property symbols first
var symbols = properties
.SelectAsArray(p => (IPropertySymbol)semanticModel.GetRequiredDeclaredSymbol(p, cancellationToken));
var symbols = properties.SelectAsArray(p => semanticModel.GetRequiredDeclaredSymbol(p, cancellationToken));

// add inherited properties from a potential base record first
var inheritedProperties = GetInheritedPositionalParams(type, cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@
using System.Collections.Generic;
using System.Composition;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.InitializeParameter;
using Microsoft.CodeAnalysis.Operations;

namespace Microsoft.CodeAnalysis.CSharp.InitializeParameter
{
using static InitializeParameterHelpersCore;

[ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = PredefinedCodeRefactoringProviderNames.InitializeMemberFromParameter), Shared]
[ExtensionOrder(Before = nameof(CSharpAddParameterCheckCodeRefactoringProvider))]
[ExtensionOrder(Before = PredefinedCodeRefactoringProviderNames.Wrapping)]
internal class CSharpInitializeMemberFromParameterCodeRefactoringProvider :
internal sealed class CSharpInitializeMemberFromParameterCodeRefactoringProvider :
AbstractInitializeMemberFromParameterCodeRefactoringProvider<
BaseTypeDeclarationSyntax,
ParameterSyntax,
Expand Down Expand Up @@ -56,55 +56,10 @@ protected override SyntaxNode GetBody(SyntaxNode functionDeclaration)
=> InitializeParameterHelpers.GetBody(functionDeclaration);

protected override SyntaxNode? GetAccessorBody(IMethodSymbol accessor, CancellationToken cancellationToken)
{
var node = accessor.DeclaringSyntaxReferences[0].GetSyntax(cancellationToken);
if (node is AccessorDeclarationSyntax accessorDeclaration)
return accessorDeclaration.ExpressionBody ?? (SyntaxNode?)accessorDeclaration.Body;

// `int Age => ...;`
if (node is ArrowExpressionClauseSyntax arrowExpression)
return arrowExpression;

return null;
}
=> InitializeParameterHelpers.GetAccessorBody(accessor, cancellationToken);

protected override SyntaxNode RemoveThrowNotImplemented(SyntaxNode node)
{
if (node is PropertyDeclarationSyntax propertyDeclaration)
{
if (propertyDeclaration.ExpressionBody != null)
{
var result = propertyDeclaration
.WithExpressionBody(null)
.WithSemicolonToken(default)
.AddAccessorListAccessors(SyntaxFactory
.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)))
.WithTrailingTrivia(propertyDeclaration.SemicolonToken.TrailingTrivia)
.WithAdditionalAnnotations(Formatter.Annotation);
return result;
}

if (propertyDeclaration.AccessorList != null)
{
var accessors = propertyDeclaration.AccessorList.Accessors.Select(RemoveThrowNotImplemented);
return propertyDeclaration.WithAccessorList(
propertyDeclaration.AccessorList.WithAccessors(SyntaxFactory.List(accessors)));
}
}

return node;
}

private static AccessorDeclarationSyntax RemoveThrowNotImplemented(AccessorDeclarationSyntax accessorDeclaration)
{
var result = accessorDeclaration
.WithExpressionBody(null)
.WithBody(null)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));

return result.WithTrailingTrivia(accessorDeclaration.Body?.GetTrailingTrivia() ?? accessorDeclaration.SemicolonToken.TrailingTrivia);
}
=> InitializeParameterHelpers.RemoveThrowNotImplemented(node);

protected override bool TryUpdateTupleAssignment(
IBlockOperation? blockStatement,
Expand Down
Loading

0 comments on commit 70a05cd

Please sign in to comment.