From 5036705c8d1c35e3e4b13b0d8633a3d228683581 Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Thu, 8 Sep 2022 10:02:08 +0100 Subject: [PATCH] Apply Obsolete attribute to deprecated enums and enum values in C# generated code Fixes #10513 --- csharp/protos/unittest_issues.proto | 4 +- .../UnittestIssues.cs | 78 +++++++++--------- .../DeprecatedMemberTest.cs | 21 ++++- csharp/src/Google.Protobuf.Test/testprotos.pb | Bin 346547 -> 346639 bytes .../protobuf/compiler/csharp/csharp_enum.cc | 6 ++ 5 files changed, 67 insertions(+), 42 deletions(-) diff --git a/csharp/protos/unittest_issues.proto b/csharp/protos/unittest_issues.proto index 45df7a19a0..d5907bb642 100644 --- a/csharp/protos/unittest_issues.proto +++ b/csharp/protos/unittest_issues.proto @@ -59,10 +59,12 @@ message NegativeEnumMessage { // Decorate fields with [deprecated=true] as [System.Obsolete] message DeprecatedChild { + option deprecated = true; } enum DeprecatedEnum { - DEPRECATED_ZERO = 0; + option deprecated = true; + DEPRECATED_ZERO = 0 [deprecated = true]; one = 1; } diff --git a/csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs b/csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs index d65a65662f..3278517d33 100644 --- a/csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs +++ b/csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs @@ -30,43 +30,44 @@ namespace UnitTest.Issues.TestProtos { "EiwKBXZhbHVlGAEgASgOMh0udW5pdHRlc3RfaXNzdWVzLk5lZ2F0aXZlRW51", "bRIxCgZ2YWx1ZXMYAiADKA4yHS51bml0dGVzdF9pc3N1ZXMuTmVnYXRpdmVF", "bnVtQgIQABI4Cg1wYWNrZWRfdmFsdWVzGAMgAygOMh0udW5pdHRlc3RfaXNz", - "dWVzLk5lZ2F0aXZlRW51bUICEAEiEQoPRGVwcmVjYXRlZENoaWxkIrkCChdE", - "ZXByZWNhdGVkRmllbGRzTWVzc2FnZRIaCg5QcmltaXRpdmVWYWx1ZRgBIAEo", - "BUICGAESGgoOUHJpbWl0aXZlQXJyYXkYAiADKAVCAhgBEjoKDE1lc3NhZ2VW", - "YWx1ZRgDIAEoCzIgLnVuaXR0ZXN0X2lzc3Vlcy5EZXByZWNhdGVkQ2hpbGRC", - "AhgBEjoKDE1lc3NhZ2VBcnJheRgEIAMoCzIgLnVuaXR0ZXN0X2lzc3Vlcy5E", - "ZXByZWNhdGVkQ2hpbGRCAhgBEjYKCUVudW1WYWx1ZRgFIAEoDjIfLnVuaXR0", - "ZXN0X2lzc3Vlcy5EZXByZWNhdGVkRW51bUICGAESNgoJRW51bUFycmF5GAYg", - "AygOMh8udW5pdHRlc3RfaXNzdWVzLkRlcHJlY2F0ZWRFbnVtQgIYASIZCglJ", - "dGVtRmllbGQSDAoEaXRlbRgBIAEoBSJECg1SZXNlcnZlZE5hbWVzEg0KBXR5", - "cGVzGAEgASgFEhIKCmRlc2NyaXB0b3IYAiABKAUaEAoOU29tZU5lc3RlZFR5", - "cGUioAEKFVRlc3RKc29uRmllbGRPcmRlcmluZxITCgtwbGFpbl9pbnQzMhgE", - "IAEoBRITCglvMV9zdHJpbmcYAiABKAlIABISCghvMV9pbnQzMhgFIAEoBUgA", - "EhQKDHBsYWluX3N0cmluZxgBIAEoCRISCghvMl9pbnQzMhgGIAEoBUgBEhMK", - "CW8yX3N0cmluZxgDIAEoCUgBQgQKAm8xQgQKAm8yIksKDFRlc3RKc29uTmFt", - "ZRIMCgRuYW1lGAEgASgJEhkKC2Rlc2NyaXB0aW9uGAIgASgJUgRkZXNjEhIK", - "BGd1aWQYAyABKAlSBGV4aWQifwoMT25lb2ZNZXJnaW5nEg4KBHRleHQYASAB", - "KAlIABI2CgZuZXN0ZWQYAiABKAsyJC51bml0dGVzdF9pc3N1ZXMuT25lb2ZN", - "ZXJnaW5nLk5lc3RlZEgAGh4KBk5lc3RlZBIJCgF4GAEgASgFEgkKAXkYAiAB", - "KAVCBwoFdmFsdWUiawoWTnVsbFZhbHVlT3V0c2lkZVN0cnVjdBIWCgxzdHJp", - "bmdfdmFsdWUYASABKAlIABIwCgpudWxsX3ZhbHVlGAIgASgOMhouZ29vZ2xl", - "LnByb3RvYnVmLk51bGxWYWx1ZUgAQgcKBXZhbHVlIkUKE051bGxWYWx1ZU5v", - "dEluT25lb2YSLgoKbnVsbF92YWx1ZRgCIAEoDjIaLmdvb2dsZS5wcm90b2J1", - "Zi5OdWxsVmFsdWUiYAoXTWl4ZWRSZWd1bGFyQW5kT3B0aW9uYWwSFQoNcmVn", - "dWxhcl9maWVsZBgBIAEoCRIbCg5vcHRpb25hbF9maWVsZBgCIAEoCUgAiAEB", - "QhEKD19vcHRpb25hbF9maWVsZCI5ChJPbmVvZldpdGhOb25lRmllbGQSCwoB", - "eBgBIAEoCUgAEg4KBG5vbmUYAiABKAlIAEIGCgR0ZXN0IjUKEU9uZW9mV2l0", - "aE5vbmVOYW1lEgsKAXgYASABKAlIABILCgF5GAIgASgJSABCBgoEbm9uZSKT", - "AgoZRGlzYW1iaWd1YXRlQ29tbW9uTWVtYmVycxIjChtkaXNhbWJpZ3VhdGVf", - "Y29tbW9uX21lbWJlcnMYASABKAUSDQoFdHlwZXMYAiABKAUSEgoKZGVzY3Jp", - "cHRvchgDIAEoBRIOCgZlcXVhbHMYBCABKAUSEQoJdG9fc3RyaW5nGAUgASgF", - "EhUKDWdldF9oYXNoX2NvZGUYBiABKAUSEAoId3JpdGVfdG8YByABKAUSDQoF", - "Y2xvbmUYCCABKAUSFgoOY2FsY3VsYXRlX3NpemUYCSABKAUSEgoKbWVyZ2Vf", - "ZnJvbRgKIAEoBRIXCg9vbl9jb25zdHJ1Y3Rpb24YCyABKAUSDgoGcGFyc2Vy", - "GAwgASgFKlUKDE5lZ2F0aXZlRW51bRIWChJORUdBVElWRV9FTlVNX1pFUk8Q", - "ABIWCglGaXZlQmVsb3cQ+///////////ARIVCghNaW51c09uZRD/////////", - "//8BKi4KDkRlcHJlY2F0ZWRFbnVtEhMKD0RFUFJFQ0FURURfWkVSTxAAEgcK", - "A29uZRABQh2qAhpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvc2IGcHJvdG8z")); + "dWVzLk5lZ2F0aXZlRW51bUICEAEiFQoPRGVwcmVjYXRlZENoaWxkOgIYASK5", + "AgoXRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2USGgoOUHJpbWl0aXZlVmFsdWUY", + "ASABKAVCAhgBEhoKDlByaW1pdGl2ZUFycmF5GAIgAygFQgIYARI6CgxNZXNz", + "YWdlVmFsdWUYAyABKAsyIC51bml0dGVzdF9pc3N1ZXMuRGVwcmVjYXRlZENo", + "aWxkQgIYARI6CgxNZXNzYWdlQXJyYXkYBCADKAsyIC51bml0dGVzdF9pc3N1", + "ZXMuRGVwcmVjYXRlZENoaWxkQgIYARI2CglFbnVtVmFsdWUYBSABKA4yHy51", + "bml0dGVzdF9pc3N1ZXMuRGVwcmVjYXRlZEVudW1CAhgBEjYKCUVudW1BcnJh", + "eRgGIAMoDjIfLnVuaXR0ZXN0X2lzc3Vlcy5EZXByZWNhdGVkRW51bUICGAEi", + "GQoJSXRlbUZpZWxkEgwKBGl0ZW0YASABKAUiRAoNUmVzZXJ2ZWROYW1lcxIN", + "CgV0eXBlcxgBIAEoBRISCgpkZXNjcmlwdG9yGAIgASgFGhAKDlNvbWVOZXN0", + "ZWRUeXBlIqABChVUZXN0SnNvbkZpZWxkT3JkZXJpbmcSEwoLcGxhaW5faW50", + "MzIYBCABKAUSEwoJbzFfc3RyaW5nGAIgASgJSAASEgoIbzFfaW50MzIYBSAB", + "KAVIABIUCgxwbGFpbl9zdHJpbmcYASABKAkSEgoIbzJfaW50MzIYBiABKAVI", + "ARITCglvMl9zdHJpbmcYAyABKAlIAUIECgJvMUIECgJvMiJLCgxUZXN0SnNv", + "bk5hbWUSDAoEbmFtZRgBIAEoCRIZCgtkZXNjcmlwdGlvbhgCIAEoCVIEZGVz", + "YxISCgRndWlkGAMgASgJUgRleGlkIn8KDE9uZW9mTWVyZ2luZxIOCgR0ZXh0", + "GAEgASgJSAASNgoGbmVzdGVkGAIgASgLMiQudW5pdHRlc3RfaXNzdWVzLk9u", + "ZW9mTWVyZ2luZy5OZXN0ZWRIABoeCgZOZXN0ZWQSCQoBeBgBIAEoBRIJCgF5", + "GAIgASgFQgcKBXZhbHVlImsKFk51bGxWYWx1ZU91dHNpZGVTdHJ1Y3QSFgoM", + "c3RyaW5nX3ZhbHVlGAEgASgJSAASMAoKbnVsbF92YWx1ZRgCIAEoDjIaLmdv", + "b2dsZS5wcm90b2J1Zi5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJFChNOdWxsVmFs", + "dWVOb3RJbk9uZW9mEi4KCm51bGxfdmFsdWUYAiABKA4yGi5nb29nbGUucHJv", + "dG9idWYuTnVsbFZhbHVlImAKF01peGVkUmVndWxhckFuZE9wdGlvbmFsEhUK", + "DXJlZ3VsYXJfZmllbGQYASABKAkSGwoOb3B0aW9uYWxfZmllbGQYAiABKAlI", + "AIgBAUIRCg9fb3B0aW9uYWxfZmllbGQiOQoST25lb2ZXaXRoTm9uZUZpZWxk", + "EgsKAXgYASABKAlIABIOCgRub25lGAIgASgJSABCBgoEdGVzdCI1ChFPbmVv", + "ZldpdGhOb25lTmFtZRILCgF4GAEgASgJSAASCwoBeRgCIAEoCUgAQgYKBG5v", + "bmUikwIKGURpc2FtYmlndWF0ZUNvbW1vbk1lbWJlcnMSIwobZGlzYW1iaWd1", + "YXRlX2NvbW1vbl9tZW1iZXJzGAEgASgFEg0KBXR5cGVzGAIgASgFEhIKCmRl", + "c2NyaXB0b3IYAyABKAUSDgoGZXF1YWxzGAQgASgFEhEKCXRvX3N0cmluZxgF", + "IAEoBRIVCg1nZXRfaGFzaF9jb2RlGAYgASgFEhAKCHdyaXRlX3RvGAcgASgF", + "Eg0KBWNsb25lGAggASgFEhYKDmNhbGN1bGF0ZV9zaXplGAkgASgFEhIKCm1l", + "cmdlX2Zyb20YCiABKAUSFwoPb25fY29uc3RydWN0aW9uGAsgASgFEg4KBnBh", + "cnNlchgMIAEoBSpVCgxOZWdhdGl2ZUVudW0SFgoSTkVHQVRJVkVfRU5VTV9a", + "RVJPEAASFgoJRml2ZUJlbG93EPv//////////wESFQoITWludXNPbmUQ////", + "////////ASo2Cg5EZXByZWNhdGVkRW51bRIXCg9ERVBSRUNBVEVEX1pFUk8Q", + "ABoCCAESBwoDb25lEAEaAhgBQh2qAhpVbml0VGVzdC5Jc3N1ZXMuVGVzdFBy", + "b3Rvc2IGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::UnitTest.Issues.TestProtos.NegativeEnum), typeof(global::UnitTest.Issues.TestProtos.DeprecatedEnum), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -97,7 +98,9 @@ namespace UnitTest.Issues.TestProtos { [pbr::OriginalName("MinusOne")] MinusOne = -1, } + [global::System.ObsoleteAttribute] public enum DeprecatedEnum { + [global::System.ObsoleteAttribute] [pbr::OriginalName("DEPRECATED_ZERO")] DeprecatedZero = 0, [pbr::OriginalName("one")] One = 1, } @@ -826,6 +829,7 @@ namespace UnitTest.Issues.TestProtos { } + [global::System.ObsoleteAttribute] public sealed partial class DeprecatedChild : pb::IMessage #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE , pb::IBufferMessage diff --git a/csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs b/csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs index f291b1eeee..6d31441e04 100644 --- a/csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs +++ b/csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs @@ -34,7 +34,9 @@ using System; using System.Reflection; using Google.Protobuf.TestProtos; using NUnit.Framework; +using UnitTest.Issues.TestProtos; +#pragma warning disable CS0612 // Type or member is obsolete namespace Google.Protobuf { public class DeprecatedMemberTest @@ -46,9 +48,20 @@ namespace Google.Protobuf } [Test] - public void TestDepreatedPrimitiveValue() - { - AssertIsDeprecated(typeof(TestDeprecatedFields).GetProperty("DeprecatedInt32")); - } + public void TestDepreatedPrimitiveValue() => + AssertIsDeprecated(typeof(TestDeprecatedFields).GetProperty(nameof(TestDeprecatedFields.DeprecatedInt32))); + + [Test] + public void TestDeprecatedMessage() => + AssertIsDeprecated(typeof(DeprecatedChild)); + + [Test] + public void TestDeprecatedEnum() => + AssertIsDeprecated(typeof(DeprecatedEnum)); + + [Test] + public void TestDeprecatedEnumValue() => + AssertIsDeprecated(typeof(DeprecatedEnum).GetField(nameof(DeprecatedEnum.DeprecatedZero))); } } +#pragma warning restore CS0612 // Type or member is obsolete diff --git a/csharp/src/Google.Protobuf.Test/testprotos.pb b/csharp/src/Google.Protobuf.Test/testprotos.pb index bdfe1cce5a5d996252548abe5d1b636be71a6c25..ae89679da6e66985e6955eb8d3fe26b7cb71d2f5 100644 GIT binary patch delta 3678 zcmYk9+iz4=6vofmXPq-=_H?H0>4kQ<6_Bd5V!aCyLR$*8wbf8#Kx&B5CK{wQm12z2 zV`88vpwU5Njm2=$AfN#%AQvwW`eH(2{1^1WN2C9M-`bZc4Zq(*Dt}*Ik^gV4&ZSWh{4k$h`8}eI zl|OIHWg)9v8gAgFx}X{V4=re|B1(Bvu$i>hVMLUMo1zB$f8=yqK}6y0pn^2);Z9wn zqli=hO%FGCQlREVo*?UK>CjnG$C4UKZtEH`0R;4NjZ2l*y`1xeGQCKHK@L;i5f`NO0M`t|)~4yxwIJ z3mK2dB(&%+ramT_4J$mMNdFzHJ)uK?`#RTwGHKC&=cBF#1~1E+Ov*rG zn~y;@u<8y^C_1qEQCCz+&4KnuTus0r_qfauwg;=W!#D#L{pe*52bbRMQ$^T$k0-Pk zT-)thgwkU0-c7CriVpEZE|XzLXqLS{2(IO9$vG-b%>*tIRGH(gnF&WNfvl>zWDqRiIA*^vD_lGr5&q0~rio!N*{%FhJP*^P)}6F!qP z=`I|nC=62Gu69)Z`l&11j!h?LERr5Om7O2}dhB#PKv3^Yil#pZJ$BYvYmsb#QDqJg zYRHZot;*z#j3&M$K{nddtp5!$%sAy;!5g%4zVh=wla(DCr?$a$WETBT0!Ez>c}HQe&n(r_7xhfl};twbDtTxV%)}W z25*zyH#y|JnKbGFj4datv%k{u%M;mtHzxdqg#CHDH9)Ad-))VY%+j=4YkC0Cf4VA@ z@lEG#f5af0Mtiv#K{y@Lt@en6G^lKDZ;1)DXPsuUbFxO6y3^@ojk0P7>7G@M$+BcH zW;-Z!$kKLCsF^j`lZui;%UA1J!ZuCP_y7eT5S8Dfw#Q$4ZECFTf&06R{UUUz$Feze3;bx-lZH9K1}9VBP`UVUdrbYlX^kJ2U6S@G;_h zTu=-HmwGhOWp{am^cZ!>7F4X$_)`i#Bg%|pjnq#mv1PS5nkCg?gdmg!F7}ArSz6NW z5oKrT?lq=tA&oz$;0reo1!R6s_-+uh1*tmc%YZOWV3wFVU?k5`-cCLcW#_0>ZXnSj zc%0N~my7QMK|4nXqSSG}GC-4@w)tdKI!@*}S6q|ECn)&J8LT0!{|QRUW~FLmrB0Ii z(ybI2l}?g*m6&T}0H=uU1^}Te(3$`u_Y@UsOjjVfo+3P9;=e}xpZ2>F1SwFYStL;t zcH0sN?Psjx(D2~r9XvHzmYsK(6KUm~KdQPNeY^_onU!dTJ%Fu7E*#%1EOO3fCUM`Zd zn-PS1z?_*aAnIMDWR*wMyGZSFBZ?HkON2LFZY2<;Kra<5m*h0LD5RIjT#?LK30Eu6 z6CQRO#oa3CwNiN=_q2~fJ5P9bY+KNGq#9fhZ=j%;;&Tp|lzh}A*UMWfj*f5-scB$x0E@il+2L68DP zip>p%_8KMjU<0AO<_~sB+_*Amv$wLeDZRH}pzOX)dNUu|qe9VYro$?J*_O=5- z3iMLB(QXV-;#XcndxOgItt{F?$~Q^bR{{hr&}-%1y1B5n1xRnc({XF2;}+qc!oTop J$1Ohe*8hRZL52VT delta 3578 zcmYk9*>6=<6vofmXP=>^{w^oebzqv^whbE z+3AXzpYDnOI%Z$o>!7$ym24XrIXLji$72I~-}!WKXzy(0{X3~btI99@zJ33p;kYpU z$6O&Dr<8wS|3E37|8s}mn7-MnQgPsU&u8l&{~pk$>A#;}Nkl-g-0W>7rIa5K#s21? zpfXAZB)r(~kc(7S1q=vv$busQs;sh!2yKyB8{!&UWXcf|w;)X^A^lix^WM{)q>rp^ zQA5HNq|dFk%k`{b2$<52khxuH8yxdNi)&ph0@bytoC-M>aj<@!tqEPHe9LB%WYQjy zN$Aj-i&Zw!4cT&MVTnscmCof&j?kjBd4p|1+@f}qO9&4hgmF51=nrY#ESmRoJA58vHI-#%J&=iKUf54-DDxlGorS?dTb zx?8tc+dg;bUe{qepk|MJgEJGfmnhmJu^DtmH+EcbYy(bCz!Ui?GJo~TZn2-(D-FsA^3YJ;{K z2-OB7Gk73W8^qDf!h0BDLHophU%LPyb6=!vNx+b-HX(f^hNN=Du}pd55H*LY%zlId zQ$H-t!T_)`Y!534x?yD&27+uD3*&7J8Ae2nt>{BGA|gkSjif6aapod6mhckrf;uP; zxh3${9V{*ZV>Vi}B2ja+XoUxPv}lC~d9-K+iDSi;2b$coZnxm zSRVF1H)E4R+To~Ny^E!#_~DFCPyO1PjN2vQCnSug&18Vke%ww*iZ^LOwCWZBw4W%- zczF|P(;hL%CeWRaCJ1L^qS~BrkOI}LaWSUm18ekNr}z;~iWN4-k7%;kfxAx@jqy{N zgfY`Wpu=R`>>+-5r3SVUKj<28i8B!%C-IeY$)`ddCw+<$W{)RGmYXH;QDamNk$ZwNB@X>K0mpp! zSc~XMl9e_}ILtt&WnU*LQ|6*@b&|??>V-_l;VJUY5!?1<8kwgks@L0^X2YjROk2ZX zgikxeNtzv>Az7>Ig5Vfvx&o1WhB8$yimqpS+B+hmfA7 z79KevRUCdp-UTAQ!hNZb`VB>jV>9LE|b2!h0Mm`Rr0>G2D60cf0d#d{iL$|q^^;;X`d7rm9CM#grv;! z0_5x?Z@8%hK?-DP5^z+9?N|b#yarcvz|1xK&R!m>yw4&lZNyORhTcPJgzzUl!SQ& zf*=JtDZl2PQe>VyqL6NUN;Uks%&X1B@)-$pb%3A+IxWAb N`19wdUdk^g{s$QFH|GEV diff --git a/src/google/protobuf/compiler/csharp/csharp_enum.cc b/src/google/protobuf/compiler/csharp/csharp_enum.cc index 23f44a4c93..8ee38bcd1e 100644 --- a/src/google/protobuf/compiler/csharp/csharp_enum.cc +++ b/src/google/protobuf/compiler/csharp/csharp_enum.cc @@ -61,6 +61,9 @@ EnumGenerator::~EnumGenerator() { void EnumGenerator::Generate(io::Printer* printer) { WriteEnumDocComment(printer, descriptor_); + if (descriptor_->options().deprecated()) { + printer->Print("[global::System.ObsoleteAttribute]\n"); + } printer->Print("$access_level$ enum $name$ {\n", "access_level", class_access_level(), "name", descriptor_->name()); @@ -69,6 +72,9 @@ void EnumGenerator::Generate(io::Printer* printer) { std::set used_number; for (int i = 0; i < descriptor_->value_count(); i++) { WriteEnumValueDocComment(printer, descriptor_->value(i)); + if (descriptor_->value(i)->options().deprecated()) { + printer->Print("[global::System.ObsoleteAttribute]\n"); + } std::string original_name = descriptor_->value(i)->name(); std::string name = GetEnumValueName(descriptor_->name(), descriptor_->value(i)->name());