diff --git a/tools/generator/Parameter.cs b/tools/generator/Parameter.cs
index 1dbbc0ddc..8d89f5606 100644
--- a/tools/generator/Parameter.cs
+++ b/tools/generator/Parameter.cs
@@ -46,7 +46,8 @@ public string GetCall (CodeGenerationOptions opt)
public string ToNative (CodeGenerationOptions opt)
{
- return NeedsPrep ? sym.Call (opt, Name) : sym.ToNative (opt, Name, null);
+ var safeName = opt.GetSafeIdentifier (Name);
+ return NeedsPrep ? sym.Call (opt, safeName) : sym.ToNative (opt, safeName, null);
}
public string GenericType {
diff --git a/tools/generator/Tests/CSharpKeywords.cs b/tools/generator/Tests/CSharpKeywords.cs
new file mode 100644
index 000000000..023509bc6
--- /dev/null
+++ b/tools/generator/Tests/CSharpKeywords.cs
@@ -0,0 +1,19 @@
+using System;
+using NUnit.Framework;
+
+namespace generatortests
+{
+ [TestFixture]
+ public class CSharpKeywords : BaseGeneratorTest
+ {
+ [Test]
+ public void GeneratedOK ()
+ {
+ RunAllTargets (
+ outputRelativePath: "CSharpKeywords",
+ apiDescriptionFile: "expected/CSharpKeywords/CSharpKeywords.xml",
+ expectedRelativePath: "CSharpKeywords");
+ }
+ }
+}
+
diff --git a/tools/generator/Tests/expected.ji/CSharpKeywords/CSharpKeywords.xml b/tools/generator/Tests/expected.ji/CSharpKeywords/CSharpKeywords.xml
new file mode 100644
index 000000000..52d6f43cd
--- /dev/null
+++ b/tools/generator/Tests/expected.ji/CSharpKeywords/CSharpKeywords.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/generator/Tests/expected.ji/CSharpKeywords/Mono.Android.projitems b/tools/generator/Tests/expected.ji/CSharpKeywords/Mono.Android.projitems
new file mode 100644
index 000000000..59990d084
--- /dev/null
+++ b/tools/generator/Tests/expected.ji/CSharpKeywords/Mono.Android.projitems
@@ -0,0 +1,16 @@
+
+
+
+ $(DefineConstants);ANDROID_1;ANDROID_2;ANDROID_3;ANDROID_4
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tools/generator/Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs b/tools/generator/Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs
new file mode 100644
index 000000000..9a6c3aaa9
--- /dev/null
+++ b/tools/generator/Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using Android.Runtime;
+using Java.Interop;
+
+namespace Xamarin.Test {
+
+ // Metadata.xml XPath class reference: path="/api/package[@name='xamarin.test']/class[@name='CSharpKeywords']"
+ [global::Android.Runtime.Register ("xamarin/test/CSharpKeywords", DoNotGenerateAcw=true)]
+ public partial class CSharpKeywords : global::Java.Lang.Object {
+
+ internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/CSharpKeywords", typeof (CSharpKeywords));
+ internal static IntPtr class_ref {
+ get {
+ return _members.JniPeerType.PeerReference.Handle;
+ }
+ }
+
+ public override global::Java.Interop.JniPeerMembers JniPeerMembers {
+ get { return _members; }
+ }
+
+ protected override IntPtr ThresholdClass {
+ get { return _members.JniPeerType.PeerReference.Handle; }
+ }
+
+ protected override global::System.Type ThresholdType {
+ get { return _members.ManagedPeerType; }
+ }
+
+ protected CSharpKeywords (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}
+
+ static Delegate cb_usePartial_I;
+#pragma warning disable 0169
+ static Delegate GetUsePartial_IHandler ()
+ {
+ if (cb_usePartial_I == null)
+ cb_usePartial_I = JNINativeWrapper.CreateDelegate ((Func) n_UsePartial_I);
+ return cb_usePartial_I;
+ }
+
+ static IntPtr n_UsePartial_I (IntPtr jnienv, IntPtr native__this, int partial_)
+ {
+ global::Xamarin.Test.CSharpKeywords __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
+ return JNIEnv.NewString (__this.UsePartial (partial_));
+ }
+#pragma warning restore 0169
+
+ // Metadata.xml XPath method reference: path="/api/package[@name='xamarin.test']/class[@name='CSharpKeywords']/method[@name='usePartial' and count(parameter)=1 and parameter[1][@type='int']]"
+ [Register ("usePartial", "(I)Ljava/lang/String;", "GetUsePartial_IHandler")]
+ public virtual unsafe string UsePartial (int partial_)
+ {
+ const string __id = "usePartial.(I)Ljava/lang/String;";
+ try {
+ JniArgumentValue* __args = stackalloc JniArgumentValue [1];
+ __args [0] = new JniArgumentValue (partial_);
+ var __rm = _members.InstanceMethods.InvokeVirtualObjectMethod (__id, this, __args);
+ return JNIEnv.GetString (__rm.Handle, JniHandleOwnership.TransferLocalRef);
+ } finally {
+ }
+ }
+
+ }
+}
diff --git a/tools/generator/Tests/expected.targets b/tools/generator/Tests/expected.targets
index a0c7b21b3..24c070543 100644
--- a/tools/generator/Tests/expected.targets
+++ b/tools/generator/Tests/expected.targets
@@ -1,438 +1,486 @@
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
PreserveNewest
@@ -495,10 +543,10 @@
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
@@ -522,58 +570,25 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
+
PreserveNewest
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
diff --git a/tools/generator/Tests/expected/CSharpKeywords/CSharpKeywords.xml b/tools/generator/Tests/expected/CSharpKeywords/CSharpKeywords.xml
new file mode 100644
index 000000000..3f1f58f17
--- /dev/null
+++ b/tools/generator/Tests/expected/CSharpKeywords/CSharpKeywords.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/generator/Tests/expected/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs b/tools/generator/Tests/expected/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs
new file mode 100644
index 000000000..b7c270c30
--- /dev/null
+++ b/tools/generator/Tests/expected/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using Android.Runtime;
+
+namespace Xamarin.Test {
+
+ // Metadata.xml XPath class reference: path="/api/package[@name='xamarin.test']/class[@name='CSharpKeywords']"
+ [global::Android.Runtime.Register ("xamarin/test/CSharpKeywords", DoNotGenerateAcw=true)]
+ public partial class CSharpKeywords : global::Java.Lang.Object {
+
+ internal static IntPtr java_class_handle;
+ internal static IntPtr class_ref {
+ get {
+ return JNIEnv.FindClass ("xamarin/test/CSharpKeywords", ref java_class_handle);
+ }
+ }
+
+ protected override IntPtr ThresholdClass {
+ get { return class_ref; }
+ }
+
+ protected override global::System.Type ThresholdType {
+ get { return typeof (CSharpKeywords); }
+ }
+
+ protected CSharpKeywords (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}
+
+ static Delegate cb_usePartial_I;
+#pragma warning disable 0169
+ static Delegate GetUsePartial_IHandler ()
+ {
+ if (cb_usePartial_I == null)
+ cb_usePartial_I = JNINativeWrapper.CreateDelegate ((Func) n_UsePartial_I);
+ return cb_usePartial_I;
+ }
+
+ static IntPtr n_UsePartial_I (IntPtr jnienv, IntPtr native__this, int partial_)
+ {
+ global::Xamarin.Test.CSharpKeywords __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
+ return JNIEnv.NewString (__this.UsePartial (partial_));
+ }
+#pragma warning restore 0169
+
+ static IntPtr id_usePartial_I;
+ // Metadata.xml XPath method reference: path="/api/package[@name='xamarin.test']/class[@name='CSharpKeywords']/method[@name='usePartial' and count(parameter)=1 and parameter[1][@type='int']]"
+ [Register ("usePartial", "(I)Ljava/lang/String;", "GetUsePartial_IHandler")]
+ public virtual unsafe string UsePartial (int partial_)
+ {
+ if (id_usePartial_I == IntPtr.Zero)
+ id_usePartial_I = JNIEnv.GetMethodID (class_ref, "usePartial", "(I)Ljava/lang/String;");
+ try {
+ JValue* __args = stackalloc JValue [1];
+ __args [0] = new JValue (partial_);
+
+ if (((object) this).GetType () == ThresholdType)
+ return JNIEnv.GetString (JNIEnv.CallObjectMethod (((global::Java.Lang.Object) this).Handle, id_usePartial_I, __args), JniHandleOwnership.TransferLocalRef);
+ else
+ return JNIEnv.GetString (JNIEnv.CallNonvirtualObjectMethod (((global::Java.Lang.Object) this).Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "usePartial", "(I)Ljava/lang/String;"), __args), JniHandleOwnership.TransferLocalRef);
+ } finally {
+ }
+ }
+
+ }
+}
diff --git a/tools/generator/Tests/generator-Tests.csproj b/tools/generator/Tests/generator-Tests.csproj
index abfff42be..bf14760b1 100644
--- a/tools/generator/Tests/generator-Tests.csproj
+++ b/tools/generator/Tests/generator-Tests.csproj
@@ -36,6 +36,7 @@
..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll
+ nunit
@@ -59,6 +60,7 @@
+