diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs index 40e7f04cc0ebf..3d7f8bb62991e 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs @@ -2734,7 +2734,7 @@ private void CheckSequentialOnPartialType(BindingDiagnosticBag diagnostics) foreach (var m in syntax.Members) { - if (HasInstanceData(m)) + if (hasInstanceData(m)) { if (whereFoundField != null && whereFoundField != syntaxRef) { @@ -2754,35 +2754,36 @@ private void CheckSequentialOnPartialType(BindingDiagnosticBag diagnostics) diagnostics.Add(ErrorCode.WRN_SequentialOnPartialClass, GetFirstLocation(), this); return; } - } - private static bool HasInstanceData(MemberDeclarationSyntax m) - { - switch (m.Kind()) - { - case SyntaxKind.FieldDeclaration: - var fieldDecl = (FieldDeclarationSyntax)m; - return - !ContainsModifier(fieldDecl.Modifiers, SyntaxKind.StaticKeyword) && - !ContainsModifier(fieldDecl.Modifiers, SyntaxKind.ConstKeyword); - case SyntaxKind.PropertyDeclaration: - // auto-property - var propertyDecl = (PropertyDeclarationSyntax)m; - return - !ContainsModifier(propertyDecl.Modifiers, SyntaxKind.StaticKeyword) && - !ContainsModifier(propertyDecl.Modifiers, SyntaxKind.AbstractKeyword) && - !ContainsModifier(propertyDecl.Modifiers, SyntaxKind.ExternKeyword) && - propertyDecl.AccessorList != null && - All(propertyDecl.AccessorList.Accessors, a => a.Body == null && a.ExpressionBody == null); - case SyntaxKind.EventFieldDeclaration: - // field-like event declaration - var eventFieldDecl = (EventFieldDeclarationSyntax)m; - return - !ContainsModifier(eventFieldDecl.Modifiers, SyntaxKind.StaticKeyword) && - !ContainsModifier(eventFieldDecl.Modifiers, SyntaxKind.AbstractKeyword) && - !ContainsModifier(eventFieldDecl.Modifiers, SyntaxKind.ExternKeyword); - default: - return false; + static bool hasInstanceData(MemberDeclarationSyntax m) + { + switch (m.Kind()) + { + case SyntaxKind.FieldDeclaration: + var fieldDecl = (FieldDeclarationSyntax)m; + return + !ContainsModifier(fieldDecl.Modifiers, SyntaxKind.StaticKeyword) && + !ContainsModifier(fieldDecl.Modifiers, SyntaxKind.ConstKeyword); + case SyntaxKind.PropertyDeclaration: + // auto-property + var propertyDecl = (PropertyDeclarationSyntax)m; + return + !ContainsModifier(propertyDecl.Modifiers, SyntaxKind.StaticKeyword) && + !ContainsModifier(propertyDecl.Modifiers, SyntaxKind.AbstractKeyword) && + !ContainsModifier(propertyDecl.Modifiers, SyntaxKind.ExternKeyword) && + !ContainsModifier(propertyDecl.Modifiers, SyntaxKind.PartialKeyword) && + propertyDecl.AccessorList != null && + All(propertyDecl.AccessorList.Accessors, a => a.Body == null && a.ExpressionBody == null); + case SyntaxKind.EventFieldDeclaration: + // field-like event declaration + var eventFieldDecl = (EventFieldDeclarationSyntax)m; + return + !ContainsModifier(eventFieldDecl.Modifiers, SyntaxKind.StaticKeyword) && + !ContainsModifier(eventFieldDecl.Modifiers, SyntaxKind.AbstractKeyword) && + !ContainsModifier(eventFieldDecl.Modifiers, SyntaxKind.ExternKeyword); + default: + return false; + } } } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/PartialPropertiesTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/PartialPropertiesTests.cs index d1a8b34d21ea1..36758dd62d35b 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/PartialPropertiesTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/PartialPropertiesTests.cs @@ -4985,7 +4985,7 @@ partial class C { public partial int Prop1 { get; set; } public partial int Prop1 { get => 1; set; } - + public partial int Prop2 { get; set; } public partial int Prop2 { get; set { } } } @@ -5000,5 +5000,51 @@ partial class C // public partial int Prop2 { get; set { } } Diagnostic(ErrorCode.ERR_ConcreteMissingBody, "get").WithArguments("C.Prop2.get").WithLocation(7, 32)); } + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/74679")] + public void WRN_SequentialOnPartialClass_NotReportedForPartialProperty_01() + { + var source = """ + partial struct S + { + partial int I { get; } + } + + partial struct S + { + public S() => i = 42; + private readonly int i; + partial int I => i; + } + """; + + var comp = CreateCompilation(source); + comp.VerifyEmitDiagnostics(); + } + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/74679")] + public void WRN_SequentialOnPartialClass_NotReportedForPartialProperty_02() + { + var source = """ + partial struct S + { + partial int I { get; } + } + + partial struct S + { + partial int I => i; + } + + partial struct S + { + public S() => i = 42; + private readonly int i; + } + """; + + var comp = CreateCompilation(source); + comp.VerifyEmitDiagnostics(); + } } }