diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidator.cs index 8f0039889..ef5c09cb4 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidator.cs @@ -26,6 +26,8 @@ public static class IdentifierValidator private const string Identifier = IdentifierStartCharacter + "(" + IdentifierPartCharacter + ")"; + static Regex IsValidIdentifierRegex = new Regex ($"^[{IdentifierStartCharacter}][{IdentifierPartCharacter}]*$", RegexOptions.Compiled); + // We use [^ ...] to detect any character that is NOT a match. static Regex validIdentifier = new Regex ($"[^{Identifier}]", RegexOptions.Compiled); @@ -43,7 +45,7 @@ public static string CreateValidIdentifier (string identifier, bool useEncodedRe public static bool IsValidIdentifier (string identifier) { - return !validIdentifier.IsMatch (identifier); + return IsValidIdentifierRegex.IsMatch (identifier); } // Makes uglier but unique identifiers by encoding each invalid character with its character value diff --git a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidatorTests.cs b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidatorTests.cs index abb1593bb..772383627 100644 --- a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidatorTests.cs +++ b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidatorTests.cs @@ -24,5 +24,18 @@ public void CreateValidIdentifier_Encoded () Assert.AreEqual ("my_x45_identifier_x36_test", IdentifierValidator.CreateValidIdentifier ("my-identifier$test", true)); Assert.AreEqual ("myidentifier_x55357__x56842_test", IdentifierValidator.CreateValidIdentifier ("myidentifier😊test", true)); } + + [Test] + public void IsValidIdentifier () + { + Assert.IsTrue (IdentifierValidator.IsValidIdentifier ("name")); + Assert.IsTrue (IdentifierValidator.IsValidIdentifier ("Name_With_Underscores")); + + // Yes, this is "wrong" -- keywords aren't identifiers -- but the keyword check is done elsewhere. + Assert.IsTrue (IdentifierValidator.IsValidIdentifier ("true")); + + Assert.IsFalse (IdentifierValidator.IsValidIdentifier ("name-with-hyphens and spaces")); + Assert.IsFalse (IdentifierValidator.IsValidIdentifier ("123")); + } } } diff --git a/tests/generator-Tests/Tests-Core/api.xml b/tests/generator-Tests/Tests-Core/api.xml index b62bd74e3..b979cf7c7 100644 --- a/tests/generator-Tests/Tests-Core/api.xml +++ b/tests/generator-Tests/Tests-Core/api.xml @@ -6,6 +6,10 @@ + + + + diff --git a/tests/generator-Tests/Tests-Core/expected.ji/Android.Views.View.cs b/tests/generator-Tests/Tests-Core/expected.ji/Android.Views.View.cs index a51b106fa..7f8ce10c2 100644 --- a/tests/generator-Tests/Tests-Core/expected.ji/Android.Views.View.cs +++ b/tests/generator-Tests/Tests-Core/expected.ji/Android.Views.View.cs @@ -179,6 +179,36 @@ public virtual unsafe void SetOnClickListener (Android.Views.View.IOnClickListen } } + static Delegate cb_setOn123Listener_Landroid_view_View_OnClickListener_; +#pragma warning disable 0169 + static Delegate GetSetOn123Listener_Landroid_view_View_OnClickListener_Handler () + { + if (cb_setOn123Listener_Landroid_view_View_OnClickListener_ == null) + cb_setOn123Listener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((Action) n_SetOn123Listener_Landroid_view_View_OnClickListener_); + return cb_setOn123Listener_Landroid_view_View_OnClickListener_; + } + + static void n_SetOn123Listener_Landroid_view_View_OnClickListener_ (IntPtr jnienv, IntPtr native__this, IntPtr native_l) + { + Android.Views.View __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer); + Android.Views.View.IOnClickListener l = (Android.Views.View.IOnClickListener)global::Java.Lang.Object.GetObject (native_l, JniHandleOwnership.DoNotTransfer); + __this.SetOn123Listener (l); + } +#pragma warning restore 0169 + + // Metadata.xml XPath method reference: path="/api/package[@name='android.view']/class[@name='View']/method[@name='setOn123Listener' and count(parameter)=1 and parameter[1][@type='android.view.View.OnClickListener']]" + [Register ("setOn123Listener", "(Landroid/view/View$OnClickListener;)V", "GetSetOn123Listener_Landroid_view_View_OnClickListener_Handler")] + public virtual unsafe void SetOn123Listener (Android.Views.View.IOnClickListener l) + { + const string __id = "setOn123Listener.(Landroid/view/View$OnClickListener;)V"; + try { + JniArgumentValue* __args = stackalloc JniArgumentValue [1]; + __args [0] = new JniArgumentValue ((l == null) ? IntPtr.Zero : ((global::Java.Lang.Object) l).Handle); + _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); + } finally { + } + } + static Delegate cb_addTouchables_Ljava_util_ArrayList_; #pragma warning disable 0169 static Delegate GetAddTouchables_Ljava_util_ArrayList_Handler () diff --git a/tests/generator-Tests/Tests-Core/expected/Android.Views.View.cs b/tests/generator-Tests/Tests-Core/expected/Android.Views.View.cs index a7bfff021..4c3a00556 100644 --- a/tests/generator-Tests/Tests-Core/expected/Android.Views.View.cs +++ b/tests/generator-Tests/Tests-Core/expected/Android.Views.View.cs @@ -172,6 +172,42 @@ public virtual unsafe void SetOnClickListener (Android.Views.View.IOnClickListen } } + static Delegate cb_setOn123Listener_Landroid_view_View_OnClickListener_; +#pragma warning disable 0169 + static Delegate GetSetOn123Listener_Landroid_view_View_OnClickListener_Handler () + { + if (cb_setOn123Listener_Landroid_view_View_OnClickListener_ == null) + cb_setOn123Listener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((Action) n_SetOn123Listener_Landroid_view_View_OnClickListener_); + return cb_setOn123Listener_Landroid_view_View_OnClickListener_; + } + + static void n_SetOn123Listener_Landroid_view_View_OnClickListener_ (IntPtr jnienv, IntPtr native__this, IntPtr native_l) + { + Android.Views.View __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer); + Android.Views.View.IOnClickListener l = (Android.Views.View.IOnClickListener)global::Java.Lang.Object.GetObject (native_l, JniHandleOwnership.DoNotTransfer); + __this.SetOn123Listener (l); + } +#pragma warning restore 0169 + + static IntPtr id_setOn123Listener_Landroid_view_View_OnClickListener_; + // Metadata.xml XPath method reference: path="/api/package[@name='android.view']/class[@name='View']/method[@name='setOn123Listener' and count(parameter)=1 and parameter[1][@type='android.view.View.OnClickListener']]" + [Register ("setOn123Listener", "(Landroid/view/View$OnClickListener;)V", "GetSetOn123Listener_Landroid_view_View_OnClickListener_Handler")] + public virtual unsafe void SetOn123Listener (Android.Views.View.IOnClickListener l) + { + if (id_setOn123Listener_Landroid_view_View_OnClickListener_ == IntPtr.Zero) + id_setOn123Listener_Landroid_view_View_OnClickListener_ = JNIEnv.GetMethodID (class_ref, "setOn123Listener", "(Landroid/view/View$OnClickListener;)V"); + try { + JValue* __args = stackalloc JValue [1]; + __args [0] = new JValue (l); + + if (((object) this).GetType () == ThresholdType) + JNIEnv.CallVoidMethod (((global::Java.Lang.Object) this).Handle, id_setOn123Listener_Landroid_view_View_OnClickListener_, __args); + else + JNIEnv.CallNonvirtualVoidMethod (((global::Java.Lang.Object) this).Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "setOn123Listener", "(Landroid/view/View$OnClickListener;)V"), __args); + } finally { + } + } + static Delegate cb_addTouchables_Ljava_util_ArrayList_; #pragma warning disable 0169 static Delegate GetAddTouchables_Ljava_util_ArrayList_Handler ()