Browse Source

Fixed an issue where the "CopilotQueriedScopeMention" type in "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\Microsoft.VisualStudio.Copilot.Contracts\Microsoft.VisualStudio.Copilot.dll" could not be decompiled correctly after expanding the judgment logic of IsPrimaryConstructor.

pull/3598/head
sonyps5201314 2 months ago
parent
commit
9a4e49a7d4
  1. 4
      ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs
  2. 22
      ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

4
ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs

@ -293,8 +293,8 @@ namespace ICSharpCode.Decompiler.CSharp @@ -293,8 +293,8 @@ namespace ICSharpCode.Decompiler.CSharp
for (int i = 0; i < method.Parameters.Count; i++)
{
var param = unspecializedMethod.Parameters[i];
//var backingMember = backingMembers.Find(x => x.Name == param.Name);
var backingMember = backingMembers.Count > i ? backingMembers[i] : null;
var backingMember = backingMembers.Find(x => x.Name == param.Name);
//var backingMember = backingMembers.Count > i ? backingMembers[i] : null;
if (backingMember != null)
{
primaryCtorParameterToAutoPropertyOrBackingField.Add(param, backingMember);

22
ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

@ -227,10 +227,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -227,10 +227,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
var v = initializer.Annotation<ILVariableResolveResult>()?.Variable;
if (v?.Kind == IL.VariableKind.Parameter)
{
// remove record ctor parameter assignments
if (!IsPropertyDeclaredByPrimaryCtor(fieldOrPropertyOrEvent, record))
break;
isStructPrimaryCtor = true;
isStructPrimaryCtor = record?.PrimaryConstructor != null;
if (fieldOrPropertyOrEvent is IField f)
fieldToVariableMap.Add(f, v);
}
@ -282,23 +279,6 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -282,23 +279,6 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
}
}
bool IsPropertyDeclaredByPrimaryCtor(IMember m, RecordDecompiler record)
{
if (record == null)
return false;
switch (m)
{
case IProperty p:
return record.IsPropertyDeclaredByPrimaryConstructor(p);
case IField f:
return record.PrimaryConstructor != null;
case IEvent e:
return record.PrimaryConstructor != null;
default:
return false;
}
}
void RemoveSingleEmptyConstructor(IEnumerable<AstNode> members, ITypeDefinition contextTypeDefinition)
{
// if we're outside of a type definition skip this altogether

Loading…
Cancel
Save