Skip to content

Commit 79b0cbb

Browse files
Fix #3703: Do not transform to a primary constructor if it's not public (or protected in abstract classes)
1 parent b100ddc commit 79b0cbb

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

ICSharpCode.Decompiler.Tests/TestCases/Pretty/ConstructorInitializers.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public class MethodCallInCtorInit
134134
{
135135
public MethodCallInCtorInit(ConsoleKey key)
136136
#if MCS5
137-
: this(((int)key/*cast due to .constrained prefix*/).ToString())
137+
: this(((int)key/*cast due to constrained. prefix*/).ToString())
138138
#else
139139
: this(((int)key).ToString())
140140
#endif
@@ -286,6 +286,16 @@ public int Test()
286286
}
287287
}
288288
#endif
289+
290+
public struct My
291+
{
292+
private ClassWithConstantAndStaticCtor test;
293+
294+
internal My(ClassWithConstantAndStaticCtor a)
295+
{
296+
test = a;
297+
}
298+
}
289299
#endif
290300
}
291301
}

ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,12 +179,15 @@ bool IsAutoSetter(IMethod method, [NotNullWhen(true)] out IField? field)
179179
}
180180

181181
IMethod? guessedPrimaryCtor = null;
182+
Accessibility expectedCtorAccessibility = recordTypeDef.IsAbstract ? Accessibility.Protected : Accessibility.Public;
182183

183184
foreach (var method in recordTypeDef.Methods)
184185
{
185186
cancellationToken.ThrowIfCancellationRequested();
186187
if (method.IsStatic || !method.IsConstructor)
187188
continue;
189+
if (method.Accessibility != expectedCtorAccessibility)
190+
continue;
188191
if (IsCopyConstructor(method))
189192
{
190193
continue;

ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,8 @@ public bool Analyze(IEnumerable<AstNode> members)
340340
}
341341
}
342342

343+
Accessibility expectedCtorAccessibility = TypeDefinition.IsAbstract ? Accessibility.Protected : Accessibility.Public;
344+
343345
if (context.Settings.UsePrimaryConstructorSyntaxForNonRecordTypes
344346
&& RecordDecompiler == null && constructorsNotChainedWithThis.Count == 1)
345347
{
@@ -351,7 +353,8 @@ public bool Analyze(IEnumerable<AstNode> members)
351353

352354
var initializer = InitializerSequence.Analyze(this, ctor, ctorMethod);
353355

354-
if (initializer is { CoversFullBody: true, HasDuplicateAssignments: false, Statements.Count: > 0 })
356+
if (initializer is { CoversFullBody: true, HasDuplicateAssignments: false, Statements.Count: > 0 }
357+
&& ctorMethod.Accessibility == expectedCtorAccessibility)
355358
{
356359
bool transformToPrimaryConstructor = MetadataTokens.GetRowNumber(ctorMethod.MetadataToken) == firstMethodRowNumber;
357360

0 commit comments

Comments
 (0)