diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/Common/WriteInterfaceEventArgsWithParamArray.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/Common/WriteInterfaceEventArgsWithParamArray.txt new file mode 100644 index 000000000..c937a0439 --- /dev/null +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/Common/WriteInterfaceEventArgsWithParamArray.txt @@ -0,0 +1,14 @@ +// event args for com.xamarin.android.MyListener.onDoSomething +public partial class MyEventArgs : global::System.EventArgs { + + public MyEventArgs (params Java.Lang.Object[] args) + { + this.args = args; + } + + Java.Lang.Object[] args; + public Java.Lang.Object[] Args { + get { return args; } + } +} + diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteInterfaceEventArgsWithParamArray.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteInterfaceEventArgsWithParamArray.txt new file mode 100644 index 000000000..66e970b19 --- /dev/null +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteInterfaceEventArgsWithParamArray.txt @@ -0,0 +1,14 @@ +// event args for com.xamarin.android.MyListener.onDoSomething +public partial class MyEventArgs : global::System.EventArgs { + + public MyEventArgs (params Java.Lang.Object[]? args) + { + this.args = args; + } + + Java.Lang.Object[]? args; + public Java.Lang.Object[]? Args { + get { return args; } + } +} + diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs index 783d3c038..496b57400 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs @@ -1040,6 +1040,32 @@ public void WriteInterfaceEventArgs () Assert.AreEqual (GetExpected (nameof (WriteInterfaceEventArgs)), writer.ToString ().NormalizeLineEndings ()); } + [Test] + public void WriteInterfaceEventArgsWithParamArray () + { + var xml = @" + + + + + + + + + + + "; + + var gens = ParseApiDefinition (xml); + var iface = gens.Single (g => g.Name == "IMyListener"); + + generator.Context.ContextTypes.Push (iface); + generator.WriteInterfaceEventArgs (iface as InterfaceGen, iface.Methods [0], string.Empty); + generator.Context.ContextTypes.Pop (); + + Assert.AreEqual (GetExpected (nameof (WriteInterfaceEventArgsWithParamArray)), writer.ToString ().NormalizeLineEndings ()); + } + [Test] public void WriteInterfaceEventHandler () { diff --git a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs index f7cbfa234..5ada96814 100644 --- a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs +++ b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs @@ -598,10 +598,14 @@ public void WriteInterfaceEventArgs (InterfaceGen @interface, Method m, string i if (p.IsSender) continue; writer.WriteLine (); - //var safeTypeName = p.Type.StartsWith ("params ", StringComparison.Ordinal) ? p.Type.Substring ("params ".Length) : p.Type; - writer.WriteLine ("{0}\t{1} {2};", indent, opt.GetTypeReferenceName (p), opt.GetSafeIdentifier (p.Name)); + + // Remove "params" from things like "global::Java.Lang.Object[]" + var type_reference_name = opt.GetTypeReferenceName (p); + type_reference_name = type_reference_name.StartsWith ("params ", StringComparison.Ordinal) ? type_reference_name.Substring ("params ".Length) : type_reference_name; + + writer.WriteLine ("{0}\t{1} {2};", indent, type_reference_name, opt.GetSafeIdentifier (p.Name)); // AbsListView.IMultiChoiceModeListener.onItemCheckedStateChanged() hit this strict name check, at parameter "@checked". - writer.WriteLine ("{0}\tpublic {1} {2} {{", indent, opt.GetTypeReferenceName (p), p.PropertyName); + writer.WriteLine ("{0}\tpublic {1} {2} {{", indent, type_reference_name, p.PropertyName); writer.WriteLine ("{0}\t\tget {{ return {1}; }}", indent, opt.GetSafeIdentifier (p.Name)); writer.WriteLine ("{0}\t}}", indent); }