Browse Source

Fix #3616: local variable naming conflict with primary constructor parameters.

pull/3013/head
Siegfried Pammer 3 weeks ago
parent
commit
c0a9afc4ad
  1. 26
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/ConstructorInitializers.cs
  2. 10
      ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs

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

@ -264,6 +264,32 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{ {
} }
#endif #endif
#if OPT && EXPECTED_OUTPUT
public class C8(object obj)
{
public int Test()
{
object obj2 = obj;
if (obj2 is int)
{
return (int)obj2;
}
return 0;
}
}
#else
public class C8(object obj)
{
public int Test()
{
if (obj is int result)
{
return result;
}
return 0;
}
}
#endif
#endif #endif
} }
} }

10
ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs

@ -28,6 +28,7 @@ using Humanizer.Inflections;
using ICSharpCode.Decompiler.CSharp; using ICSharpCode.Decompiler.CSharp;
using ICSharpCode.Decompiler.CSharp.OutputVisitor; using ICSharpCode.Decompiler.CSharp.OutputVisitor;
using ICSharpCode.Decompiler.CSharp.Transforms;
using ICSharpCode.Decompiler.CSharp.TypeSystem; using ICSharpCode.Decompiler.CSharp.TypeSystem;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.Decompiler.TypeSystem.Implementation; using ICSharpCode.Decompiler.TypeSystem.Implementation;
@ -106,6 +107,15 @@ namespace ICSharpCode.Decompiler.IL.Transforms
var currentLowerCaseTypeOrMemberNames = new HashSet<string>(StringComparer.Ordinal); var currentLowerCaseTypeOrMemberNames = new HashSet<string>(StringComparer.Ordinal);
foreach (var name in CollectAllLowerCaseMemberNames(function.Method.DeclaringTypeDefinition)) foreach (var name in CollectAllLowerCaseMemberNames(function.Method.DeclaringTypeDefinition))
currentLowerCaseTypeOrMemberNames.Add(name); currentLowerCaseTypeOrMemberNames.Add(name);
foreach (IField item in function.Method.DeclaringTypeDefinition.Fields)
{
if (TransformFieldAndConstructorInitializers.IsGeneratedPrimaryConstructorBackingField(item))
{
string name = item.Name.Substring(1, item.Name.Length - 3);
currentLowerCaseTypeOrMemberNames.Add(name);
AddExistingName(reservedVariableNames, name);
}
}
foreach (var name in CollectAllLowerCaseTypeNames(function.Method.DeclaringTypeDefinition)) foreach (var name in CollectAllLowerCaseTypeNames(function.Method.DeclaringTypeDefinition))
{ {
currentLowerCaseTypeOrMemberNames.Add(name); currentLowerCaseTypeOrMemberNames.Add(name);

Loading…
Cancel
Save