From 3efbc94409ff1bc3c849767a347f16b9888cfcc4 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Fri, 20 Apr 2018 16:51:16 -0700 Subject: [PATCH] Add tests. --- ...ateEqualsAndGetHashCodeFromMembersTests.cs | 45 +++++++++++++++++++ ...ionFactoryExtensions_CreateEqualsMethod.cs | 25 ++++++----- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs index 71c274b6a22..601fb93f2e8 100644 --- a/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs +++ b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs @@ -1575,5 +1575,50 @@ public override bool Equals(object obj) } }"); } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] + public async Task TestEqualsBaseWithOverriddenEquals_Patterns() + { + await TestInRegularAndScript1Async( +@"using System.Collections.Generic; + +class Base +{ + public override bool Equals(object o) + { + } +} + +class Program : Base +{ + [|int i; + + string S { get; }|] +}", +@"using System.Collections.Generic; + +class Base +{ + public override bool Equals(object o) + { + } +} + +class Program : Base +{ + int i; + + string S { get; } + + public override bool Equals(object obj) + { + return obj is Program program && + base.Equals(obj) && + i == program.i && + S == program.S; + } +}", +index: 0); + } } } diff --git a/src/Workspaces/Core/Portable/Shared/Extensions/ICodeDefinitionFactoryExtensions_CreateEqualsMethod.cs b/src/Workspaces/Core/Portable/Shared/Extensions/ICodeDefinitionFactoryExtensions_CreateEqualsMethod.cs index eb4543f71fb..745b3c11c3f 100644 --- a/src/Workspaces/Core/Portable/Shared/Extensions/ICodeDefinitionFactoryExtensions_CreateEqualsMethod.cs +++ b/src/Workspaces/Core/Portable/Shared/Extensions/ICodeDefinitionFactoryExtensions_CreateEqualsMethod.cs @@ -157,18 +157,19 @@ public static IMethodSymbol CreateEqualsMethod(this Compilation compilation, Imm // // myType != null expressions.Add(factory.ReferenceNotEqualsExpression(localNameExpression, factory.NullLiteralExpression())); - if (HasExistingBaseEqualsMethod(containingType, cancellationToken)) - { - // If we're overriding something that also provided an overridden 'Equals', - // then ensure the base type thinks it is equals as well. - // - // base.Equals(obj) - expressions.Add(factory.InvocationExpression( - factory.MemberAccessExpression( - factory.BaseExpression(), - factory.IdentifierName(EqualsName)), - objNameExpression)); - } + } + + if (!containingType.IsValueType && HasExistingBaseEqualsMethod(containingType, cancellationToken)) + { + // If we're overriding something that also provided an overridden 'Equals', + // then ensure the base type thinks it is equals as well. + // + // base.Equals(obj) + expressions.Add(factory.InvocationExpression( + factory.MemberAccessExpression( + factory.BaseExpression(), + factory.IdentifierName(EqualsName)), + objNameExpression)); } AddMemberChecks(factory, compilation, members, localNameExpression, expressions); -- GitLab