From 7ff8d1050c0cc1d537446d70d1e8e230541615df Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Wed, 10 Jan 2018 19:34:53 +0900 Subject: [PATCH 1/3] method parameter type may contain "params " and cannot be used by fields. This fixes https://github.com/xamarin/xamarin-android/issues/1138 It is quite corner case, where ... arguments are used in interfaces that can be converted to events. Parameter types cannot be simply used for fields and parameters because they cannot take "params" as their modifiers. The real code fix should be in Parameter.cs, but that would require a lot of changes unlike this tiny fix. --- tools/generator/CodeGenerator.cs | 2 +- tools/generator/InterfaceGen.cs | 6 ++++-- .../Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs | 1 + .../Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/generator/CodeGenerator.cs b/tools/generator/CodeGenerator.cs index 875eb70e9..579c92f66 100644 --- a/tools/generator/CodeGenerator.cs +++ b/tools/generator/CodeGenerator.cs @@ -626,7 +626,7 @@ public string GetOutputName (string s) if (s == "System.Void") return "void"; if (s.StartsWith ("params ")) - return "params " + GetOutputName (s.Substring (6)); + return "params " + GetOutputName (s.Substring (7)); if (s.StartsWith ("global::")) Report.Error (Report.ErrorCodeGenerator + 0, null, "Unexpected \"global::\" specification. This error happens if it is specified in the Metadata API fixup for example."); if (!UseGlobal) diff --git a/tools/generator/InterfaceGen.cs b/tools/generator/InterfaceGen.cs index cc08830bc..62e643166 100644 --- a/tools/generator/InterfaceGen.cs +++ b/tools/generator/InterfaceGen.cs @@ -349,6 +349,7 @@ void GenerateEventArgs (Method m, StreamWriter sw, string indent, CodeGeneration string args_name = GetArgsName (m); if (m.RetVal.IsVoid || m.IsEventHandlerWithHandledProperty) { if (!m.IsSimpleEventHandler || m.IsEventHandlerWithHandledProperty) { + sw.WriteLine ("{0}// event args for {1}.{2}", indent, this.JavaName, m.JavaName); sw.WriteLine ("{0}public partial class {1} : global::System.EventArgs {{", indent, args_name); sw.WriteLine (); var signature = m.Parameters.GetSignatureDropSender (opt); @@ -375,9 +376,10 @@ void GenerateEventArgs (Method m, StreamWriter sw, string indent, CodeGeneration if (p.IsSender) continue; sw.WriteLine (); - sw.WriteLine ("{0}\t{1} {2};", indent, opt.GetOutputName (p.Type), opt.GetSafeIdentifier (p.Name)); + var safeTypeName = p.Type.StartsWith ("params ", StringComparison.Ordinal) ? p.Type.Substring (7) : p.Type; + sw.WriteLine ("{0}\t{1} {2};", indent, opt.GetOutputName (safeTypeName), opt.GetSafeIdentifier (p.Name)); // AbsListView.IMultiChoiceModeListener.onItemCheckedStateChanged() hit this strict name check, at parameter "@checked". - sw.WriteLine ("{0}\tpublic {1} {2} {{", indent, opt.GetOutputName (p.Type), p.PropertyName); + sw.WriteLine ("{0}\tpublic {1} {2} {{", indent, opt.GetOutputName (safeTypeName), p.PropertyName); sw.WriteLine ("{0}\t\tget {{ return {1}; }}", indent, opt.GetSafeIdentifier (p.Name)); sw.WriteLine ("{0}\t}}", indent); } diff --git a/tools/generator/Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs b/tools/generator/Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs index e20848e86..9b87ca92d 100644 --- a/tools/generator/Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs +++ b/tools/generator/Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs @@ -116,6 +116,7 @@ public unsafe void OnEvent (global::Com.Google.Android.Exoplayer.Drm.IExoMediaDr } + // event args for com.google.android.exoplayer.drm.ExoMediaDrm.OnEventListener.onEvent public partial class ExoMediaDrmOnEventEventArgs : global::System.EventArgs { public ExoMediaDrmOnEventEventArgs (global::Com.Google.Android.Exoplayer.Drm.IExoMediaDrm p0, byte[] p1, int p2, int p3, byte[] p4) diff --git a/tools/generator/Tests/expected/GenericArguments/Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs b/tools/generator/Tests/expected/GenericArguments/Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs index 640be49c6..2c2ec0994 100644 --- a/tools/generator/Tests/expected/GenericArguments/Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs +++ b/tools/generator/Tests/expected/GenericArguments/Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.cs @@ -107,6 +107,7 @@ public unsafe void OnEvent (global::Com.Google.Android.Exoplayer.Drm.IExoMediaDr } + // event args for com.google.android.exoplayer.drm.ExoMediaDrm.OnEventListener.onEvent public partial class ExoMediaDrmOnEventEventArgs : global::System.EventArgs { public ExoMediaDrmOnEventEventArgs (global::Com.Google.Android.Exoplayer.Drm.IExoMediaDrm p0, byte[] p1, int p2, int p3, byte[] p4) From f7af24649c294b7eca395345b70f32837e9300a7 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Tue, 6 Feb 2018 20:00:36 -0500 Subject: [PATCH 2/3] Code hygiene --- tools/generator/CodeGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/generator/CodeGenerator.cs b/tools/generator/CodeGenerator.cs index 579c92f66..2f0805e0d 100644 --- a/tools/generator/CodeGenerator.cs +++ b/tools/generator/CodeGenerator.cs @@ -626,7 +626,7 @@ public string GetOutputName (string s) if (s == "System.Void") return "void"; if (s.StartsWith ("params ")) - return "params " + GetOutputName (s.Substring (7)); + return "params " + GetOutputName (s.Substring ("params ".Length)); if (s.StartsWith ("global::")) Report.Error (Report.ErrorCodeGenerator + 0, null, "Unexpected \"global::\" specification. This error happens if it is specified in the Metadata API fixup for example."); if (!UseGlobal) From 64c05fef7c4cc7adf548ca6452fd6982c44edd2d Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Tue, 6 Feb 2018 20:01:27 -0500 Subject: [PATCH 3/3] Code hygiene --- tools/generator/InterfaceGen.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/generator/InterfaceGen.cs b/tools/generator/InterfaceGen.cs index 62e643166..23227bd9d 100644 --- a/tools/generator/InterfaceGen.cs +++ b/tools/generator/InterfaceGen.cs @@ -376,7 +376,7 @@ void GenerateEventArgs (Method m, StreamWriter sw, string indent, CodeGeneration if (p.IsSender) continue; sw.WriteLine (); - var safeTypeName = p.Type.StartsWith ("params ", StringComparison.Ordinal) ? p.Type.Substring (7) : p.Type; + var safeTypeName = p.Type.StartsWith ("params ", StringComparison.Ordinal) ? p.Type.Substring ("params ".Length) : p.Type; sw.WriteLine ("{0}\t{1} {2};", indent, opt.GetOutputName (safeTypeName), opt.GetSafeIdentifier (p.Name)); // AbsListView.IMultiChoiceModeListener.onItemCheckedStateChanged() hit this strict name check, at parameter "@checked". sw.WriteLine ("{0}\tpublic {1} {2} {{", indent, opt.GetOutputName (safeTypeName), p.PropertyName);