@@ -15,7 +15,9 @@ namespace StyleCop.Analyzers.ReadabilityRules
15
15
using Microsoft . CodeAnalysis . CodeFixes ;
16
16
using Microsoft . CodeAnalysis . CSharp ;
17
17
using Microsoft . CodeAnalysis . CSharp . Syntax ;
18
+ using Microsoft . CodeAnalysis . Editing ;
18
19
using StyleCop . Analyzers . Helpers ;
20
+ using StyleCop . Analyzers . Lightup ;
19
21
20
22
/// <summary>
21
23
/// Implements a code fix for <see cref="SA1129DoNotUseDefaultValueTypeConstructor"/>.
@@ -54,17 +56,19 @@ private static async Task<Document> GetTransformedDocumentAsync(Document documen
54
56
var semanticModel = await document . GetSemanticModelAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
55
57
56
58
var newExpression = syntaxRoot . FindNode ( diagnostic . Location . SourceSpan , getInnermostNodeForTie : true ) ;
57
- var newSyntaxRoot = syntaxRoot . ReplaceNode ( newExpression , GetReplacementNode ( newExpression , semanticModel , cancellationToken ) ) ;
59
+ var newSyntaxRoot = syntaxRoot . ReplaceNode ( newExpression , GetReplacementNode ( document . Project , newExpression , semanticModel , cancellationToken ) ) ;
58
60
59
61
return document . WithSyntaxRoot ( newSyntaxRoot ) ;
60
62
}
61
63
62
- private static SyntaxNode GetReplacementNode ( SyntaxNode node , SemanticModel semanticModel , CancellationToken cancellationToken )
64
+ private static SyntaxNode GetReplacementNode ( Project project , SyntaxNode node , SemanticModel semanticModel , CancellationToken cancellationToken )
63
65
{
64
- var newExpression = ( ObjectCreationExpressionSyntax ) node ;
66
+ var newExpression = ( BaseObjectCreationExpressionSyntaxWrapper ) node ;
65
67
66
- var symbolInfo = semanticModel . GetSymbolInfo ( newExpression . Type , cancellationToken ) ;
67
- var namedTypeSymbol = symbolInfo . Symbol as INamedTypeSymbol ;
68
+ var symbolInfo = semanticModel . GetSymbolInfo ( newExpression , cancellationToken ) ;
69
+ var namedTypeSymbol = ( symbolInfo . Symbol as IMethodSymbol ) ? . ContainingType ;
70
+
71
+ var type = GetOrCreateTypeSyntax ( project , newExpression , namedTypeSymbol ) ;
68
72
69
73
SyntaxNode replacement ;
70
74
@@ -75,7 +79,7 @@ private static SyntaxNode GetReplacementNode(SyntaxNode node, SemanticModel sema
75
79
{
76
80
if ( IsDefaultParameterValue ( newExpression ) )
77
81
{
78
- replacement = SyntaxFactory . DefaultExpression ( newExpression . Type ) ;
82
+ replacement = SyntaxFactory . DefaultExpression ( type ) ;
79
83
}
80
84
else
81
85
{
@@ -98,21 +102,34 @@ private static SyntaxNode GetReplacementNode(SyntaxNode node, SemanticModel sema
98
102
fieldName = nameof ( Guid . Empty ) ;
99
103
}
100
104
101
- replacement = ConstructMemberAccessSyntax ( newExpression . Type , fieldName ) ;
105
+ replacement = ConstructMemberAccessSyntax ( type , fieldName ) ;
102
106
}
103
107
}
104
108
else if ( IsEnumWithDefaultMember ( namedTypeSymbol , out string memberName ) )
105
109
{
106
- replacement = ConstructMemberAccessSyntax ( newExpression . Type , memberName ) ;
110
+ replacement = ConstructMemberAccessSyntax ( type , memberName ) ;
107
111
}
108
112
else
109
113
{
110
- replacement = SyntaxFactory . DefaultExpression ( newExpression . Type ) ;
114
+ replacement = SyntaxFactory . DefaultExpression ( type ) ;
111
115
}
112
116
113
117
return replacement
114
- . WithLeadingTrivia ( newExpression . GetLeadingTrivia ( ) )
115
- . WithTrailingTrivia ( newExpression . GetTrailingTrivia ( ) ) ;
118
+ . WithLeadingTrivia ( newExpression . SyntaxNode . GetLeadingTrivia ( ) )
119
+ . WithTrailingTrivia ( newExpression . SyntaxNode . GetTrailingTrivia ( ) ) ;
120
+ }
121
+
122
+ private static TypeSyntax GetOrCreateTypeSyntax ( Project project , BaseObjectCreationExpressionSyntaxWrapper baseObjectCreationExpression , INamedTypeSymbol constructedType )
123
+ {
124
+ if ( baseObjectCreationExpression . SyntaxNode is ObjectCreationExpressionSyntax objectCreationExpressionSyntax )
125
+ {
126
+ return objectCreationExpressionSyntax . Type ;
127
+ }
128
+ else
129
+ {
130
+ SyntaxGenerator generator = SyntaxGenerator . GetGenerator ( project ) ;
131
+ return ( TypeSyntax ) generator . TypeExpression ( constructedType ) ;
132
+ }
116
133
}
117
134
118
135
/// <summary>
@@ -146,9 +163,9 @@ private static bool IsType<T>(INamedTypeSymbol namedTypeSymbol)
146
163
return true ;
147
164
}
148
165
149
- private static bool IsDefaultParameterValue ( ObjectCreationExpressionSyntax expression )
166
+ private static bool IsDefaultParameterValue ( BaseObjectCreationExpressionSyntaxWrapper expression )
150
167
{
151
- if ( expression . Parent . Parent is ParameterSyntax parameterSyntax )
168
+ if ( expression . SyntaxNode . Parent . Parent is ParameterSyntax parameterSyntax )
152
169
{
153
170
return parameterSyntax . Parent . Parent is BaseMethodDeclarationSyntax ;
154
171
}
@@ -221,7 +238,7 @@ protected override async Task<SyntaxNode> FixAllInDocumentAsync(FixAllContext fi
221
238
222
239
var nodes = diagnostics . Select ( diagnostic => syntaxRoot . FindNode ( diagnostic . Location . SourceSpan , getInnermostNodeForTie : true ) ) ;
223
240
224
- return syntaxRoot . ReplaceNodes ( nodes , ( originalNode , rewrittenNode ) => GetReplacementNode ( rewrittenNode , semanticModel , fixAllContext . CancellationToken ) ) ;
241
+ return syntaxRoot . ReplaceNodes ( nodes , ( originalNode , rewrittenNode ) => GetReplacementNode ( document . Project , rewrittenNode , semanticModel , fixAllContext . CancellationToken ) ) ;
225
242
}
226
243
}
227
244
}
0 commit comments