Browse Source

Extend definition of ComputeIsRecord to avoid false-positives.

pull/2696/head
Siegfried Pammer 3 years ago
parent
commit
e905160537
  1. 23
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs

23
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs

@ -760,19 +760,38 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
{ {
if (Kind != TypeKind.Class && Kind != TypeKind.Struct) if (Kind != TypeKind.Class && Kind != TypeKind.Struct)
return false; return false;
bool isStruct = Kind == TypeKind.Struct;
var metadata = module.metadata; var metadata = module.metadata;
var typeDef = metadata.GetTypeDefinition(handle); var typeDef = metadata.GetTypeDefinition(handle);
bool getEqualityContract = isStruct;
bool toString = false;
bool printMembers = false;
bool getHashCode = false;
bool equals = false;
bool opEquality = false; bool opEquality = false;
bool opInequality = false; bool opInequality = false;
bool clone = Kind == TypeKind.Struct; bool clone = isStruct;
foreach (var methodHandle in typeDef.GetMethods()) foreach (var methodHandle in typeDef.GetMethods())
{ {
var method = metadata.GetMethodDefinition(methodHandle); var method = metadata.GetMethodDefinition(methodHandle);
if (metadata.StringComparer.Equals(method.Name, "Clone"))
{
// error CS8859: Members named 'Clone' are disallowed in records.
return false;
}
getEqualityContract |= metadata.StringComparer.Equals(method.Name, "get_EqualityContract");
toString |= metadata.StringComparer.Equals(method.Name, "ToString");
printMembers |= metadata.StringComparer.Equals(method.Name, "PrintMembers");
getHashCode |= metadata.StringComparer.Equals(method.Name, "GetHashCode");
equals |= metadata.StringComparer.Equals(method.Name, "Equals");
opEquality |= metadata.StringComparer.Equals(method.Name, "op_Equality"); opEquality |= metadata.StringComparer.Equals(method.Name, "op_Equality");
opInequality |= metadata.StringComparer.Equals(method.Name, "op_Inequality"); opInequality |= metadata.StringComparer.Equals(method.Name, "op_Inequality");
clone |= metadata.StringComparer.Equals(method.Name, "<Clone>$"); clone |= metadata.StringComparer.Equals(method.Name, "<Clone>$");
} }
return opEquality & opInequality & clone; return getEqualityContract & toString & printMembers & getHashCode & equals & opEquality & opInequality & clone;
} }
#endregion #endregion
} }

Loading…
Cancel
Save