Skip to content

Commit a0750b5

Browse files
author
Julien Couvreur
committed
MemberNameSameAsType
1 parent 08147a8 commit a0750b5

19 files changed

+485
-7
lines changed

src/Compilers/CSharp/Portable/CSharpResources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8218,4 +8218,7 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
82188218
<data name="ERR_InterpolatedStringHandlerArgumentDisallowed" xml:space="preserve">
82198219
<value>Interpolated string handler arguments are not allowed in this context.</value>
82208220
</data>
8221+
<data name="ERR_MemberNameSameAsExtendedType" xml:space="preserve">
8222+
<value>'{0}': extension member names cannot be the same as their extended type</value>
8223+
</data>
82218224
</root>

src/Compilers/CSharp/Portable/Errors/ErrorCode.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2420,6 +2420,7 @@ internal enum ErrorCode
24202420
ERR_InstanceOperatorExtensionWrongReceiverType = 9323,
24212421
ERR_ExpressionTreeContainsExtensionBasedConditionalLogicalOperator = 9324,
24222422
ERR_InterpolatedStringHandlerArgumentDisallowed = 9325,
2423+
ERR_MemberNameSameAsExtendedType = 9326,
24232424

24242425
// Note: you will need to do the following after adding errors:
24252426
// 1) Update ErrorFacts.IsBuildOnlyDiagnostic (src/Compilers/CSharp/Portable/Errors/ErrorFacts.cs)

src/Compilers/CSharp/Portable/Errors/ErrorFacts.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2532,6 +2532,7 @@ or ErrorCode.ERR_InstanceOperatorStructExtensionWrongReceiverRefKind
25322532
or ErrorCode.ERR_InstanceOperatorExtensionWrongReceiverType
25332533
or ErrorCode.ERR_ExpressionTreeContainsExtensionBasedConditionalLogicalOperator
25342534
or ErrorCode.ERR_InterpolatedStringHandlerArgumentDisallowed
2535+
or ErrorCode.ERR_MemberNameSameAsExtendedType
25352536
=> false,
25362537
};
25372538
#pragma warning restore CS8524 // The switch expression does not handle some values of its input type (it is not exhaustive) involving an unnamed enum value.

src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,18 +1391,45 @@ private void CheckMemberNameDistinctFromType(Symbol member, BindingDiagnosticBag
13911391
{
13921392
case TypeKind.Class:
13931393
case TypeKind.Struct:
1394-
if (member.Name == this.Name)
1395-
{
1396-
diagnostics.Add(ErrorCode.ERR_MemberNameSameAsType, member.GetFirstLocation(), this.Name);
1397-
}
1394+
checkContainingTypeName(member, this.Name, diagnostics);
13981395
break;
13991396
case TypeKind.Interface:
14001397
if (member.IsStatic)
14011398
{
1402-
goto case TypeKind.Class;
1399+
checkContainingTypeName(member, this.Name, diagnostics);
14031400
}
1401+
1402+
break;
1403+
case TypeKind.Extension:
1404+
// Since implementation methods have the same name as the extension method, we don't need to report the problem twice
1405+
if (member.Kind != SymbolKind.Method && this.ContainingType is { } containingType)
1406+
{
1407+
checkContainingTypeName(member, containingType.Name, diagnostics);
1408+
}
1409+
1410+
if (this.ExtensionParameter is { Type: NamedTypeSymbol { Name: var extendedTypeName } })
1411+
{
1412+
checkExtendedTypeName(member, extendedTypeName, diagnostics);
1413+
}
1414+
14041415
break;
14051416
}
1417+
1418+
static void checkContainingTypeName(Symbol member, string typeName, BindingDiagnosticBag diagnostics)
1419+
{
1420+
if (member.Name == typeName)
1421+
{
1422+
diagnostics.Add(ErrorCode.ERR_MemberNameSameAsType, member.GetFirstLocation(), typeName);
1423+
}
1424+
}
1425+
1426+
static void checkExtendedTypeName(Symbol member, string typeName, BindingDiagnosticBag diagnostics)
1427+
{
1428+
if (member.Name == typeName)
1429+
{
1430+
diagnostics.Add(ErrorCode.ERR_MemberNameSameAsExtendedType, member.GetFirstLocation(), typeName);
1431+
}
1432+
}
14061433
}
14071434

14081435
internal override bool HasDeclaredRequiredMembers
@@ -1812,7 +1839,7 @@ protected void AfterMembersChecks(BindingDiagnosticBag diagnostics)
18121839
CheckExtensionMembers(this.GetMembers(), diagnostics);
18131840
}
18141841

1815-
CheckMemberNamesDistinctFromType(diagnostics); // Tracked by https://github.com/dotnet/roslyn/issues/76130 : Should this check "see through" extensions?
1842+
CheckMemberNamesDistinctFromType(diagnostics);
18161843
CheckMemberNameConflictsAndUnmatchedOperators(diagnostics);
18171844
CheckRecordMemberNames(diagnostics);
18181845
CheckSpecialMemberErrors(diagnostics);

src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)