diff --git a/build-tools/automation/guardian/source.gdnsuppress b/build-tools/automation/guardian/source.gdnsuppress index 98123d3e81c..7d42cdcacc6 100644 --- a/build-tools/automation/guardian/source.gdnsuppress +++ b/build-tools/automation/guardian/source.gdnsuppress @@ -4,7 +4,7 @@ "default": { "name": "default", "createdDate": "2023-02-22 23:55:29Z", - "lastUpdatedDate": "2023-02-22 23:55:29Z" + "lastUpdatedDate": "2023-05-04 13:54:18Z" } }, "results": { @@ -78,8 +78,8 @@ "expirationDate": null, "type": null }, - "58fab4dfef38677720e955e546a6af108332c65daafb0d043ad9d93442300a30": { - "signature": "58fab4dfef38677720e955e546a6af108332c65daafb0d043ad9d93442300a30", + "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab": { + "signature": "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab", "alternativeSignatures": [], "target": "src/Mono.Android/Android.Util/Log.cs", "memberOf": [ @@ -134,8 +134,8 @@ "expirationDate": null, "type": null }, - "06af52be6b6f87455b1db2eb6e631e783f1dacaf607c9b5f34cdee669992c8b5": { - "signature": "06af52be6b6f87455b1db2eb6e631e783f1dacaf607c9b5f34cdee669992c8b5", + "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97": { + "signature": "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97", "alternativeSignatures": [], "target": "src/Mono.Android/Android.Util/Log.cs", "memberOf": [ diff --git a/src/.editorconfig b/src/.editorconfig new file mode 100644 index 00000000000..29acc8a16f6 --- /dev/null +++ b/src/.editorconfig @@ -0,0 +1,2 @@ +[*.{cs,vb}] +dotnet_diagnostic.CA1305.severity = error # Specify IFormatProvider \ No newline at end of file diff --git a/src/Mono.Android.Export/Mono.CodeGeneration/CodeCustomAttribute.cs b/src/Mono.Android.Export/Mono.CodeGeneration/CodeCustomAttribute.cs index 41d574cdbf7..05178369826 100644 --- a/src/Mono.Android.Export/Mono.CodeGeneration/CodeCustomAttribute.cs +++ b/src/Mono.Android.Export/Mono.CodeGeneration/CodeCustomAttribute.cs @@ -42,7 +42,7 @@ public static CodeCustomAttribute Create (Type attributeType, Type [] ctorArgTyp if (members [i] == null) members [i] = attributeType.GetProperty (namedArgNames [i]); if (members [i] == null) - throw new ArgumentException (String.Format ("Named argument {0} was not found in attribute type {1}", namedArgNames [i], attributeType)); + throw new ArgumentException (FormattableString.Invariant ($"Named argument {namedArgNames [i]} was not found in attribute type {attributeType}")); } CodeLiteral [] args = new CodeLiteral [ctorArgs.Length]; @@ -64,7 +64,7 @@ public static CodeCustomAttribute Create (Type attributeType, Type [] ctorArgTyp ArrayList fvalues = new ArrayList (); for (int i = 0; i < members.Length; i++) { if (members [i] == null) - throw new ArgumentException (String.Format ("MemberInfo at {0} was null for type {1}.", i, attributeType)); + throw new ArgumentException (FormattableString.Invariant ($"MemberInfo at {i} was null for type {attributeType}.")); if (members [i] is PropertyInfo) { props.Add ((PropertyInfo) members [i]); pvalues.Add (values [i].Value); diff --git a/src/Mono.Android/Android.Graphics/Color.cs b/src/Mono.Android/Android.Graphics/Color.cs index 44cb881a97c..6b866cb4735 100644 --- a/src/Mono.Android/Android.Graphics/Color.cs +++ b/src/Mono.Android/Android.Graphics/Color.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Globalization; using System.Linq.Expressions; using System.Reflection; using System.Text; @@ -64,7 +65,7 @@ public int ToArgb () public override string ToString () { - return String.Format ("Color [A={0}, R={1}, G={2}, B={3}]", A, R, G, B); + return FormattableString.Invariant ($"Color [A={A}, R={R}, G={G}, B={B}]"); } public override bool Equals (object obj) @@ -217,9 +218,8 @@ private static void CheckRGBValues (int red, int green, int blue) private static ArgumentException CreateColorArgumentException (int value, string color) { - return new ArgumentException (string.Format ("'{0}' is not a valid" - + " value for '{1}'. '{1}' should be greater or equal to 0 and" - + " less than or equal to 255.", value, color)); + return new ArgumentException (FormattableString.Invariant ( + $"'{value}' is not a valid value for '{color}'. '{color}' should be greater or equal to 0 and less than or equal to 255.")); } public static Color ParseColor (string colorString) diff --git a/src/Mono.Android/Android.Runtime/AndroidEnvironment.cs b/src/Mono.Android/Android.Runtime/AndroidEnvironment.cs index dda2dea521e..c8dcb831e21 100644 --- a/src/Mono.Android/Android.Runtime/AndroidEnvironment.cs +++ b/src/Mono.Android/Android.Runtime/AndroidEnvironment.cs @@ -188,7 +188,8 @@ static bool TrustEvaluateSsl (List certsRawData) if (certStore == null) return null; - var alias = string.Format ("{0}:{1:x8}.0", userStore ? "user" : "system", hash); + var store = userStore ? "user" : "system"; + var alias = FormattableString.Invariant ($"{store}:{hash:x8}.0"); var certificate = certStore.GetCertificate (alias); if (certificate == null) return null; @@ -220,7 +221,7 @@ static void NotifyTimeZoneChanged () try { clearInfo.Method (); } catch (Exception e) { - Logger.Log (LogLevel.Warn, "MonoAndroid", string.Format ("Ignoring exception from {0}: {1}", clearInfo.Description, e)); + Logger.Log (LogLevel.Warn, "MonoAndroid", FormattableString.Invariant ($"Ignoring exception from {clearInfo.Description}: {e}")); } } } @@ -426,11 +427,7 @@ public Uri GetProxy (Uri destination) if (address == null) // FIXME return destination; -#if ANDROID_19 - return new Uri (string.Format ("http://{0}:{1}/", address.HostString, address.Port)); -#else - return new Uri (string.Format ("http://{0}:{1}/", address.HostName, address.Port)); -#endif + return new Uri (FormattableString.Invariant ($"http://{address.HostString}:{address.Port}/")); } public bool IsBypassed (Uri host) diff --git a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs index b2436fb01b6..da27a3b04f2 100644 --- a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs +++ b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; @@ -165,7 +166,7 @@ public override IntPtr ReleaseLocalReference (ref JniObjectReference value, ref public override void WriteGlobalReferenceLine (string format, params object?[] args) { - RuntimeNativeMethods._monodroid_gref_log (string.Format (format, args)); + RuntimeNativeMethods._monodroid_gref_log (string.Format (CultureInfo.InvariantCulture, format, args)); } public override JniObjectReference CreateGlobalReference (JniObjectReference value) @@ -530,7 +531,7 @@ public void RegisterNativeMembers (JniType nativeClass, Type type, ReadOnlySpan< } if (minfo == null) - throw new InvalidOperationException (String.Format ("Specified managed method '{0}' was not found. Signature: {1}", mname.ToString (), signature.ToString ())); + throw new InvalidOperationException (FormattableString.Invariant ($"Specified managed method '{mname.ToString ()}' was not found. Signature: {signature.ToString ()}")); callback = CreateDynamicCallback (minfo); needToRegisterNatives = true; } else { @@ -659,9 +660,8 @@ internal void AddPeer (IJavaPeerable value, JniObjectReference reference, IntPtr if (JniEnvironment.Types.IsSameObject (value.PeerReference, target!.PeerReference)) { found = true; if (Logger.LogGlobalRef) { - Logger.Log (LogLevel.Info, "monodroid-gref", - string.Format ("warning: not replacing previous registered handle {0} with handle {1} for key_handle 0x{2}", - target.PeerReference.ToString (), reference.ToString (), hash.ToString ("x"))); + Logger.Log (LogLevel.Info, "monodroid-gref", FormattableString.Invariant ( + $"warning: not replacing previous registered handle {target.PeerReference} with handle {reference} for key_handle 0x{hash:x}")); } } } @@ -704,10 +704,9 @@ internal void AddPeer (IJavaPeerable value, IntPtr handle, JniHandleOwnership tr } if (Logger.LogGlobalRef) { - RuntimeNativeMethods._monodroid_gref_log ("handle 0x" + handleField.ToString ("x") + - "; key_handle 0x" + hash.ToString ("x") + - ": Java Type: `" + JNIEnv.GetClassNameFromInstance (handleField) + "`; " + - "MCW type: `" + value.GetType ().FullName + "`\n"); + RuntimeNativeMethods._monodroid_gref_log ( + FormattableString.Invariant ( + $"handle 0x{handleField:x}; key_handle 0x{hash:x}: Java Type: `{JNIEnv.GetClassNameFromInstance (handleField)}`; MCW type: `{value.GetType ().FullName}`\n")); } } diff --git a/src/Mono.Android/Android.Runtime/JNIEnv.cs b/src/Mono.Android/Android.Runtime/JNIEnv.cs index 46c8d75313c..1b4c2430344 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnv.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnv.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; @@ -262,8 +263,8 @@ public static unsafe void InvokeConstructor (IntPtr instance, string jniCtorSign try { IntPtr ctor = JNIEnv.GetMethodID (lrefClass, "", jniCtorSignature); if (ctor == IntPtr.Zero) - throw new ArgumentException (string.Format ("Could not find constructor JNI signature '{0}' on type '{1}'.", - jniCtorSignature, Java.Interop.TypeManager.GetClassName (lrefClass))); + throw new ArgumentException (FormattableString.Invariant ( + $"Could not find constructor JNI signature '{jniCtorSignature}' on type '{Java.Interop.TypeManager.GetClassName (lrefClass)}'.")); CallNonvirtualVoidMethod (instance, lrefClass, ctor, constructorParameters); } finally { DeleteLocalRef (lrefClass); @@ -280,8 +281,8 @@ public static unsafe IntPtr CreateInstance (IntPtr jniClass, string signature, J { IntPtr ctor = JNIEnv.GetMethodID (jniClass, "", signature); if (ctor == IntPtr.Zero) - throw new ArgumentException (string.Format ("Could not find constructor JNI signature '{0}' on type '{1}'.", - signature, Java.Interop.TypeManager.GetClassName (jniClass))); + throw new ArgumentException (FormattableString.Invariant ( + $"Could not find constructor JNI signature '{signature}' on type '{Java.Interop.TypeManager.GetClassName (jniClass)}'.")); return JNIEnv.NewObject (jniClass, ctor, constructorParameters); } @@ -627,9 +628,8 @@ static void AssertCompatibleArrayTypes (Type sourceType, IntPtr destArray) IntPtr lrefDest = GetObjectClass (destArray); try { if (!IsAssignableFrom (grefSource, lrefDest)) { - throw new InvalidCastException (string.Format ("Unable to cast from '{0}' to '{1}'.", - Java.Interop.TypeManager.GetClassName (grefSource), - Java.Interop.TypeManager.GetClassName (lrefDest))); + throw new InvalidCastException (FormattableString.Invariant ( + $"Unable to cast from '{Java.Interop.TypeManager.GetClassName (grefSource)}' to '{Java.Interop.TypeManager.GetClassName (lrefDest)}'.")); } } finally { DeleteGlobalRef (grefSource); @@ -643,9 +643,8 @@ static void AssertCompatibleArrayTypes (IntPtr sourceArray, Type destType) IntPtr lrefSource = GetObjectClass (sourceArray); try { if (!IsAssignableFrom (lrefSource, grefDest)) { - throw new InvalidCastException (string.Format ("Unable to cast from '{0}' to '{1}'.", - Java.Interop.TypeManager.GetClassName (lrefSource), - Java.Interop.TypeManager.GetClassName (grefDest))); + throw new InvalidCastException (FormattableString.Invariant ( + $"Unable to cast from '{Java.Interop.TypeManager.GetClassName (lrefSource)}' to '{Java.Interop.TypeManager.GetClassName (grefDest)}'.")); } } finally { DeleteGlobalRef (grefDest); @@ -1145,7 +1144,7 @@ static int _GetArrayLength (IntPtr array_ptr) ret [i] = value; ret [i] = targetType == null || targetType.IsInstanceOfType (value) ? value - : Convert.ChangeType (value, targetType); + : Convert.ChangeType (value, targetType, CultureInfo.InvariantCulture); } return ret; diff --git a/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs b/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs index 8d723c813cd..ad19ae407da 100644 --- a/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs +++ b/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs @@ -461,8 +461,9 @@ public string PositionDescription { var xi = r as IXmlLineInfo; var loc = xi == null || !xi.HasLineInfo () ? "(location N/A)" : - String.Format ("({0}, {1})", xi.LineNumber, xi.LinePosition); - return String.Format ("Node {0} at {1} {2}", r.NodeType, String.IsNullOrEmpty (r.BaseURI) ? null : r.BaseURI, loc); + FormattableString.Invariant ($"({xi.LineNumber}, {xi.LinePosition})"); + var uri = string.IsNullOrEmpty (r.BaseURI) ? null : r.BaseURI; + return FormattableString.Invariant ($"Node {r.NodeType} at {uri} {loc}"); } } diff --git a/src/Mono.Android/Android.Util/Log.cs b/src/Mono.Android/Android.Util/Log.cs index f47670d3912..44e88364e53 100644 --- a/src/Mono.Android/Android.Util/Log.cs +++ b/src/Mono.Android/Android.Util/Log.cs @@ -1,13 +1,22 @@ using System; +using System.Globalization; using Android.Runtime; namespace Android.Util { public partial class Log { + /// + /// IFormatProvider passed to any underlying string.Format() calls. Defaults to System.Globalization.CultureInfo.CurrentCulture. + /// +#if ANDROID_34 + public +#endif // ANDROID_34 + static IFormatProvider FormatProvider { get; set; } = CultureInfo.CurrentCulture; + public static int Debug (string tag, string format, params object[] args) { - return Debug (tag, string.Format (format, args)); + return Debug (tag, string.Format (FormatProvider, format, args)); } public static int Debug (string tag, Java.Lang.Throwable tr, string msg) @@ -17,12 +26,12 @@ public static int Debug (string tag, Java.Lang.Throwable tr, string msg) public static int Debug (string tag, Java.Lang.Throwable tr, string format, params object[] args) { - return Debug (tag, string.Format (format, args), tr); + return Debug (tag, string.Format (FormatProvider, format, args), tr); } public static int Error (string tag, string format, params object[] args) { - return Error (tag, string.Format (format, args)); + return Error (tag, string.Format (FormatProvider, format, args)); } public static int Error (string tag, Java.Lang.Throwable tr, string msg) @@ -32,12 +41,12 @@ public static int Error (string tag, Java.Lang.Throwable tr, string msg) public static int Error (string tag, Java.Lang.Throwable tr, string format, params object[] args) { - return Error (tag, string.Format (format, args), tr); + return Error (tag, string.Format (FormatProvider, format, args), tr); } public static int Info (string tag, string format, params object[] args) { - return Info (tag, string.Format (format, args)); + return Info (tag, string.Format (FormatProvider, format, args)); } public static int Info (string tag, Java.Lang.Throwable tr, string msg) @@ -47,17 +56,17 @@ public static int Info (string tag, Java.Lang.Throwable tr, string msg) public static int Info (string tag, Java.Lang.Throwable tr, string format, params object[] args) { - return Info (tag, string.Format (format, args), tr); + return Info (tag, string.Format (FormatProvider, format, args), tr); } public static int WriteLine (LogPriority priority, string tag, string format, params object[] args) { - return WriteLine (priority, tag, string.Format (format, args)); + return WriteLine (priority, tag, string.Format (FormatProvider, format, args)); } public static int Verbose (string tag, string format, params object[] args) { - return Verbose (tag, string.Format (format, args)); + return Verbose (tag, string.Format (FormatProvider, format, args)); } public static int Verbose (string tag, Java.Lang.Throwable tr, string msg) @@ -67,12 +76,12 @@ public static int Verbose (string tag, Java.Lang.Throwable tr, string msg) public static int Verbose (string tag, Java.Lang.Throwable tr, string format, params object[] args) { - return Verbose (tag, string.Format (format, args), tr); + return Verbose (tag, string.Format (FormatProvider, format, args), tr); } public static int Warn (string tag, string format, params object[] args) { - return Warn (tag, string.Format (format, args)); + return Warn (tag, string.Format (FormatProvider, format, args)); } public static int Warn (string tag, Java.Lang.Throwable tr, string msg) @@ -82,12 +91,12 @@ public static int Warn (string tag, Java.Lang.Throwable tr, string msg) public static int Warn (string tag, Java.Lang.Throwable tr, string format, params object[] args) { - return Warn (tag, string.Format (format, args), tr); + return Warn (tag, string.Format (FormatProvider, format, args), tr); } public static int Wtf (string tag, string format, params object[] args) { - return Wtf (tag, string.Format (format, args)); + return Wtf (tag, string.Format (FormatProvider, format, args)); } public static int Wtf (string tag, Java.Lang.Throwable tr, string msg) @@ -97,7 +106,7 @@ public static int Wtf (string tag, Java.Lang.Throwable tr, string msg) public static int Wtf (string tag, Java.Lang.Throwable tr, string format, params object[] args) { - return Wtf (tag, string.Format (format, args), tr); + return Wtf (tag, string.Format (FormatProvider, format, args), tr); } } } diff --git a/src/Mono.Android/Java.Interop/JavaConvert.cs b/src/Mono.Android/Java.Interop/JavaConvert.cs index ea40a0abaf6..6f132b95bf3 100644 --- a/src/Mono.Android/Java.Interop/JavaConvert.cs +++ b/src/Mono.Android/Java.Interop/JavaConvert.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Globalization; using System.Reflection; using Android.Runtime; @@ -131,7 +132,7 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out // hail mary pass; perhaps there's a MCW which participates in normal // .NET type conversion? - return (T) Convert.ChangeType (v, typeof (T)); + return (T) Convert.ChangeType (v, typeof (T), CultureInfo.InvariantCulture); } public static object? FromJniHandle (IntPtr handle, JniHandleOwnership transfer, Type? targetType = null) @@ -164,7 +165,7 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out // hail mary pass; perhaps there's a MCW which participates in normal // .NET type conversion? - return Convert.ChangeType (v, targetType!); + return Convert.ChangeType (v, targetType!, CultureInfo.InvariantCulture); } static Dictionary TypeMappings = new Dictionary (9, StringComparer.Ordinal) { @@ -229,7 +230,7 @@ public static T FromJavaObject(IJavaObject? value, out bool set) set = true; if (o.Instance is T) return (T) o.Instance; - return (T) Convert.ChangeType (o.Instance, typeof (T)); + return (T) Convert.ChangeType (o.Instance, typeof (T), CultureInfo.InvariantCulture); } if (value is T) { set = true; @@ -245,7 +246,7 @@ public static T FromJavaObject(IJavaObject? value, out bool set) if (converter != null) return (T) converter (lrefValue, JniHandleOwnership.TransferLocalRef); JNIEnv.DeleteLocalRef (lrefValue); - return (T) Convert.ChangeType (value, typeof (T)); + return (T) Convert.ChangeType (value, typeof (T), CultureInfo.InvariantCulture); } public static object? FromJavaObject (IJavaObject value, Type? targetType = null) @@ -260,7 +261,7 @@ public static T FromJavaObject(IJavaObject? value, out bool set) if (value is Android.Runtime.JavaObject o) { if (targetType == null) return o.Instance; - return Convert.ChangeType (o.Instance, targetType); + return Convert.ChangeType (o.Instance, targetType, CultureInfo.InvariantCulture); } if (targetType == null || targetType.IsAssignableFrom (value.GetType ())) @@ -274,7 +275,7 @@ public static T FromJavaObject(IJavaObject? value, out bool set) if (converter != null) return converter (lrefValue, JniHandleOwnership.TransferLocalRef); JNIEnv.DeleteLocalRef (lrefValue); - return Convert.ChangeType (value, targetType); + return Convert.ChangeType (value, targetType, CultureInfo.InvariantCulture); } static Dictionary> JavaObjectConverters = new Dictionary>() { diff --git a/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs b/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs index fcc9c2c1378..0110165e1be 100644 --- a/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs +++ b/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs @@ -72,8 +72,7 @@ internal static TResult _JavaCast (this IJavaObject? instance) return (TResult) Java.Lang.Object.GetObject (instance.Handle, JniHandleOwnership.DoNotTransfer, resultType); } else - throw new NotSupportedException (string.Format ("Unable to convert type '{0}' to '{1}'.", - instance.GetType ().FullName, resultType.FullName)); + throw new NotSupportedException (FormattableString.Invariant ($"Unable to convert type '{instance.GetType ().FullName}' to '{resultType.FullName}'.")); } static IJavaObject CastClass (IJavaObject instance, Type resultType) @@ -84,8 +83,7 @@ static IJavaObject CastClass (IJavaObject instance, Type resultType) throw new ArgumentException ("Unable to determine JNI class for '" + resultType.FullName + "'.", "TResult"); if (!JNIEnv.IsInstanceOf (instance.Handle, klass)) throw new InvalidCastException ( - string.Format ("Unable to convert instance of type '{0}' to type '{1}'.", - instance.GetType ().FullName, resultType.FullName)); + FormattableString.Invariant ($"Unable to convert instance of type '{instance.GetType ().FullName}' to type '{resultType.FullName}'.")); } finally { JNIEnv.DeleteGlobalRef (klass); } @@ -118,8 +116,7 @@ static IJavaObject CastClass (IJavaObject instance, Type resultType) return (IJavaObject?) Java.Lang.Object.GetObject (instance.Handle, JniHandleOwnership.DoNotTransfer, resultType); } else - throw new NotSupportedException (string.Format ("Unable to convert type '{0}' to '{1}'.", - instance.GetType ().FullName, resultType.FullName)); + throw new NotSupportedException (FormattableString.Invariant ($"Unable to convert type '{instance.GetType ().FullName}' to '{resultType.FullName}'.")); } // typeof(Foo) -> FooInvoker diff --git a/src/Mono.Android/Java.Interop/TypeManager.cs b/src/Mono.Android/Java.Interop/TypeManager.cs index e70d00bc424..6d4556bf7a4 100644 --- a/src/Mono.Android/Java.Interop/TypeManager.cs +++ b/src/Mono.Android/Java.Interop/TypeManager.cs @@ -138,10 +138,7 @@ static void n_Activate (IntPtr jnienv, IntPtr jclass, IntPtr typename_ptr, IntPt if (!ActivationEnabled) { if (Logger.LogGlobalRef) { Logger.Log (LogLevel.Info, "monodroid-gref", - string.Format ("warning: Skipping managed constructor invocation for handle 0x{0} (key_handle 0x{1}). " + - "Please use JNIEnv.StartCreateInstance() + JNIEnv.FinishCreateInstance() instead of " + - "JNIEnv.NewObject() and/or JNIEnv.CreateInstance().", - jobject.ToString ("x"), JNIEnv.IdentityHash (jobject).ToString ("x"))); + FormattableString.Invariant ($"warning: Skipping managed constructor invocation for handle 0x{jobject:x} (key_handle 0x{JNIEnv.IdentityHash (jobject):x}). Please use JNIEnv.StartCreateInstance() + JNIEnv.FinishCreateInstance() instead of JNIEnv.NewObject() and/or JNIEnv.CreateInstance().")); } return; } @@ -179,8 +176,8 @@ internal static void Activate (IntPtr jobject, ConstructorInfo cinfo, object? [] } cinfo.Invoke (newobj, parms); } catch (Exception e) { - var m = string.Format ("Could not activate JNI Handle 0x{0} (key_handle 0x{1}) of Java type '{2}' as managed type '{3}'.", - jobject.ToString ("x"), JNIEnv.IdentityHash (jobject).ToString ("x"), JNIEnv.GetClassNameFromInstance (jobject), cinfo.DeclaringType.FullName); + var m = FormattableString.Invariant ( + $"Could not activate JNI Handle 0x{jobject:x} (key_handle 0x{JNIEnv.IdentityHash (jobject):x}) of Java type '{JNIEnv.GetClassNameFromInstance (jobject)}' as managed type '{cinfo.DeclaringType.FullName}'."); Logger.Log (LogLevel.Warn, "monodroid", m); Logger.Log (LogLevel.Warn, "monodroid", CreateJavaLocationException ().ToString ()); @@ -286,8 +283,7 @@ internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership if (type == null) { JNIEnv.DeleteRef (handle, transfer); throw new NotSupportedException ( - string.Format ("Internal error finding wrapper class for '{0}'. (Where is the Java.Lang.Object wrapper?!)", - JNIEnv.GetClassNameFromInstance (handle)), + FormattableString.Invariant ($"Internal error finding wrapper class for '{JNIEnv.GetClassNameFromInstance (handle)}'. (Where is the Java.Lang.Object wrapper?!)"), CreateJavaLocationException ()); } @@ -313,10 +309,8 @@ internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership } catch (MissingMethodException e) { var key_handle = JNIEnv.IdentityHash (handle); JNIEnv.DeleteRef (handle, transfer); - throw new NotSupportedException ( - string.Format ("Unable to activate instance of type {0} from native handle 0x{1} (key_handle 0x{2}).", - type, handle.ToString ("x"), key_handle.ToString ("x")), - e); + throw new NotSupportedException (FormattableString.Invariant ( + $"Unable to activate instance of type {type} from native handle 0x{handle:x} (key_handle 0x{key_handle:x})."), e); } return result; } @@ -358,7 +352,7 @@ public static void RegisterType (string java_class, Type t) } } else if (!JNIEnvInit.IsRunningOnDesktop || t != typeof (Java.Interop.TypeManager)) { // skip the registration and output a warning - Logger.Log (LogLevel.Warn, "monodroid", string.Format ("Type Registration Skipped for {0} to {1} ", java_class, t.ToString())); + Logger.Log (LogLevel.Warn, "monodroid", FormattableString.Invariant ($"Type Registration Skipped for {java_class} to {t} ")); } } diff --git a/src/Mono.Android/Java.Lang/Boolean.cs b/src/Mono.Android/Java.Lang/Boolean.cs index 7103f796d7c..45d8e4c7f57 100644 --- a/src/Mono.Android/Java.Lang/Boolean.cs +++ b/src/Mono.Android/Java.Lang/Boolean.cs @@ -75,7 +75,7 @@ float IConvertible.ToSingle (IFormatProvider? provider) string IConvertible.ToString (IFormatProvider? provider) { - return Convert.ToString (BooleanValue ()); + return Convert.ToString (BooleanValue (), provider); } object IConvertible.ToType (Type conversionType, IFormatProvider? provider) diff --git a/src/Mono.Android/Java.Lang/Byte.cs b/src/Mono.Android/Java.Lang/Byte.cs index 2c3035d4862..ec4df9b6861 100644 --- a/src/Mono.Android/Java.Lang/Byte.cs +++ b/src/Mono.Android/Java.Lang/Byte.cs @@ -75,7 +75,7 @@ float IConvertible.ToSingle (IFormatProvider? provider) string IConvertible.ToString (IFormatProvider? provider) { - return Convert.ToString (IntValue ()); + return Convert.ToString (IntValue (), provider); } object IConvertible.ToType (Type conversionType, IFormatProvider? provider) diff --git a/src/Mono.Android/Java.Lang/Character.cs b/src/Mono.Android/Java.Lang/Character.cs index 70dc42a6b2e..2e78ac1b846 100644 --- a/src/Mono.Android/Java.Lang/Character.cs +++ b/src/Mono.Android/Java.Lang/Character.cs @@ -75,7 +75,7 @@ float IConvertible.ToSingle (IFormatProvider? provider) string IConvertible.ToString (IFormatProvider? provider) { - return Convert.ToString (CharValue ()); + return Convert.ToString (CharValue (), provider); } object IConvertible.ToType (Type conversionType, IFormatProvider? provider) diff --git a/src/Mono.Android/Java.Lang/Double.cs b/src/Mono.Android/Java.Lang/Double.cs index 7ec9ef7833f..f0c2bcf4d94 100644 --- a/src/Mono.Android/Java.Lang/Double.cs +++ b/src/Mono.Android/Java.Lang/Double.cs @@ -75,7 +75,7 @@ float IConvertible.ToSingle (IFormatProvider? provider) string IConvertible.ToString (IFormatProvider? provider) { - return Convert.ToString (DoubleValue ()); + return Convert.ToString (DoubleValue (), provider); } object IConvertible.ToType (Type conversionType, IFormatProvider? provider) diff --git a/src/Mono.Android/Java.Lang/Float.cs b/src/Mono.Android/Java.Lang/Float.cs index 01703df017a..070f30575be 100644 --- a/src/Mono.Android/Java.Lang/Float.cs +++ b/src/Mono.Android/Java.Lang/Float.cs @@ -75,7 +75,7 @@ float IConvertible.ToSingle (IFormatProvider? provider) string IConvertible.ToString (IFormatProvider? provider) { - return Convert.ToString (FloatValue ()); + return Convert.ToString (FloatValue (), provider); } object IConvertible.ToType (Type conversionType, IFormatProvider? provider) diff --git a/src/Mono.Android/Java.Lang/Integer.cs b/src/Mono.Android/Java.Lang/Integer.cs index 659a0d6feaa..0c77ec4cb17 100644 --- a/src/Mono.Android/Java.Lang/Integer.cs +++ b/src/Mono.Android/Java.Lang/Integer.cs @@ -75,7 +75,7 @@ float IConvertible.ToSingle (IFormatProvider? provider) string IConvertible.ToString (IFormatProvider? provider) { - return Convert.ToString (IntValue ()); + return Convert.ToString (IntValue (), provider); } object IConvertible.ToType (Type conversionType, IFormatProvider? provider) diff --git a/src/Mono.Android/Java.Lang/Long.cs b/src/Mono.Android/Java.Lang/Long.cs index aa355948570..41b2b557b3f 100644 --- a/src/Mono.Android/Java.Lang/Long.cs +++ b/src/Mono.Android/Java.Lang/Long.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using Android.Runtime; namespace Java.Lang { @@ -75,7 +76,7 @@ float IConvertible.ToSingle (IFormatProvider? provider) string IConvertible.ToString (IFormatProvider? provider) { - return Convert.ToString (LongValue ()); + return Convert.ToString (LongValue (), CultureInfo.InvariantCulture); } object IConvertible.ToType (Type conversionType, IFormatProvider? provider) diff --git a/src/Mono.Android/Java.Lang/Object.cs b/src/Mono.Android/Java.Lang/Object.cs index e968f0369ff..01dde260fc5 100644 --- a/src/Mono.Android/Java.Lang/Object.cs +++ b/src/Mono.Android/Java.Lang/Object.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Runtime.Serialization; using System.Text; @@ -221,7 +222,7 @@ internal static void Dispose (IJavaPeerable instance, ref IntPtr handle, IntPtr if (Logger.LogGlobalRef) { RuntimeNativeMethods._monodroid_gref_log ( - string.Format ("Disposing handle 0x{0}\n", handle.ToString ("x"))); + FormattableString.Invariant ($"Disposing handle 0x{handle:x}\n")); } JNIEnvInit.AndroidValueManager?.RemovePeer (instance, key_handle); @@ -380,7 +381,7 @@ public static implicit operator Java.Lang.Object (double value) public static explicit operator bool (Java.Lang.Object value) { - return Convert.ToBoolean (value); + return Convert.ToBoolean (value, CultureInfo.InvariantCulture); } [Obsolete ("Use `(byte)(sbyte) value`", error: true)] @@ -391,12 +392,12 @@ public static explicit operator byte (Java.Lang.Object value) public static explicit operator sbyte (Java.Lang.Object value) { - return Convert.ToSByte (value); + return Convert.ToSByte (value, CultureInfo.InvariantCulture); } public static explicit operator char (Java.Lang.Object value) { - return Convert.ToChar (value); + return Convert.ToChar (value, CultureInfo.InvariantCulture); } [Obsolete ("Use `(uint)(int) value`", error: true)] @@ -407,7 +408,7 @@ public static explicit operator uint (Java.Lang.Object value) public static explicit operator int (Java.Lang.Object value) { - return Convert.ToInt32 (value); + return Convert.ToInt32 (value, CultureInfo.InvariantCulture); } [Obsolete ("Use `(ulong)(long) value`", error: true)] @@ -418,24 +419,24 @@ public static explicit operator ulong (Java.Lang.Object value) public static explicit operator long (Java.Lang.Object value) { - return Convert.ToInt64 (value); + return Convert.ToInt64 (value, CultureInfo.InvariantCulture); } public static explicit operator float (Java.Lang.Object value) { - return Convert.ToSingle (value); + return Convert.ToSingle (value, CultureInfo.InvariantCulture); } public static explicit operator double (Java.Lang.Object value) { - return Convert.ToDouble (value); + return Convert.ToDouble (value, CultureInfo.InvariantCulture); } public static explicit operator string? (Java.Lang.Object? value) { if (value == null) return null; - return Convert.ToString (value); + return Convert.ToString (value, CultureInfo.InvariantCulture); } [return: NotNullIfNotNull ("value")] diff --git a/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs b/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs index 967a94b2bcb..4fb5f1ff3cc 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs @@ -16,6 +16,7 @@ // http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html // using System; +using System.Globalization; using System.Net; using System.Security.Cryptography; using System.Text; @@ -96,7 +97,7 @@ public bool Parse (string challenge) var sb = new StringBuilder (); foreach (byte b in result) - sb.Append (b.ToString ("x2")); + sb.Append (b.ToString ("x2", CultureInfo.InvariantCulture)); return sb.ToString (); } @@ -121,9 +122,9 @@ public bool Parse (string challenge) string? Response (string username, string password, HttpURLConnection webRequest) { - string response = $"{HA1 (username, password)}:{Nonce}:"; + string response = FormattableString.Invariant ($"{HA1 (username, password)}:{Nonce}:"); if (QOP != null) - response += $"{_nc.ToString ("X8")}:{CNonce}:{QOP}:"; + response += FormattableString.Invariant ($"{_nc:X8}:{CNonce}:{QOP}:"); response += HA2 (webRequest); return HashToHexString (response); } @@ -147,36 +148,36 @@ public bool Parse (string challenge) string password = cred.Password; var auth = new StringBuilder (); - auth.Append ($"Digest username=\"{userName}\", "); - auth.Append ($"realm=\"{Realm}\", "); - auth.Append ($"nonce=\"{Nonce}\", "); - auth.Append ($"uri=\"{uri.PathAndQuery}\", "); + auth.Append (FormattableString.Invariant ($"Digest username=\"{userName}\", ")); + auth.Append (FormattableString.Invariant ($"realm=\"{Realm}\", ")); + auth.Append (FormattableString.Invariant ($"nonce=\"{Nonce}\", ")); + auth.Append (FormattableString.Invariant ($"uri=\"{uri.PathAndQuery}\", ")); if (Algorithm != null) { // hash algorithm (only MD5 in RFC2617) - auth.Append ($"algorithm=\"{Algorithm}\", "); + auth.Append (FormattableString.Invariant ($"algorithm=\"{Algorithm}\", ")); } - auth.Append ($"response=\"{Response (userName, password, request)}\", "); + auth.Append (FormattableString.Invariant ($"response=\"{Response (userName, password, request)}\", ")); if (QOP != null) { // quality of protection (server decision) - auth.Append ($"qop=\"{QOP}\", "); + auth.Append (FormattableString.Invariant ($"qop=\"{QOP}\", ")); } lock (this) { // _nc MUST NOT change from here... // number of request using this nonce if (QOP != null) { - auth.Append ($"nc={_nc.ToString ("X8")}, "); + auth.Append (FormattableString.Invariant ($"nc={_nc:X8}, ")); _nc++; } // until here, now _nc can change } if (CNonce != null) // opaque value from the client - auth.Append ($"cnonce=\"{CNonce}\", "); + auth.Append (FormattableString.Invariant ($"cnonce=\"{CNonce}\", ")); if (Opaque != null) // exact same opaque value as received from server - auth.Append ($"opaque=\"{Opaque}\", "); + auth.Append (FormattableString.Invariant ($"opaque=\"{Opaque}\", ")); auth.Length -= 2; // remove ", " return new Authorization (auth.ToString ()); diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixAbstractMethodsStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixAbstractMethodsStep.cs index 1143bc1bef1..6d910437066 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixAbstractMethodsStep.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixAbstractMethodsStep.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Mono.Cecil; @@ -123,7 +124,7 @@ internal void CheckAppDomainUsage (AssemblyDefinition assembly, Action w foreach (var mr in assembly.MainModule.GetMemberReferences ()) { if (mr.ToString ().Contains ("System.AppDomain System.AppDomain::CreateDomain")) { - warn (string.Format (Resources.XA2000, assembly)); + warn (string.Format (CultureInfo.CurrentCulture, Resources.XA2000, assembly)); break; } } diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs index f03fa12d0fc..2c30e4ba228 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs @@ -5,6 +5,7 @@ using System.Linq; using Xamarin.Android.Tasks; using System.Collections.Generic; +using System.Globalization; using Mono.Cecil.Cil; using System.Text.RegularExpressions; using Mono.Collections.Generic; @@ -100,7 +101,7 @@ protected Dictionary BuildResourceDesignerFieldLookup (TypeDefiniti { string key = $"{definition.Name}::{field.Name}"; if (!output.ContainsKey (key)) - output.Add(key, int.Parse (field.Constant?.ToString () ?? "0")); + output.Add(key, int.Parse (field.Constant?.ToString () ?? "0", CultureInfo.InvariantCulture)); } } return output; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs index 4048d6d3d18..ee3ad36fa0a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs @@ -3,6 +3,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.Globalization; using System.IO; using System.Linq; using System.Text; @@ -274,7 +275,7 @@ protected string CreateFauxAndroidSdkDirectory (string path, string buildToolsVe List defaults = new List (); for (int i = 10; i < 26; i++) { defaults.Add (new ApiInfo () { - Id = i.ToString (), + Id = i.ToString (CultureInfo.InvariantCulture), }); } foreach (var level in apiLevels ?? defaults.ToArray ()) { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/DeviceTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/DeviceTest.cs index 38f38962ea0..0e5d0ed3909 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/DeviceTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/DeviceTest.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using NUnit.Framework.Interfaces; using System; +using System.Globalization; using System.Linq; using System.Diagnostics; using System.IO; @@ -305,7 +306,9 @@ protected static bool WaitForActivityToStart (string activityNamespace, string a }, logcatFilePath, timeout); var match = regex.Match (capturedLine); if (match.Success) { - startupTime = new TimeSpan (0, 0, 0, int.Parse (match.Groups ["seconds"].Value), int.Parse (match.Groups ["milliseconds"].Value)); + startupTime = new TimeSpan (0, 0, 0, + int.Parse (match.Groups ["seconds"].Value, CultureInfo.InvariantCulture), + int.Parse (match.Groups ["milliseconds"].Value, CultureInfo.InvariantCulture)); } return result; } @@ -414,7 +417,7 @@ protected static int GetUserId (string username) Console.WriteLine (output); var match = regex.Match (output); if (match.Success) { - return int.Parse (match.Groups ["userId"].Value); + return int.Parse (match.Groups ["userId"].Value, CultureInfo.InvariantCulture); } return -1; } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/InlineData.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/InlineData.cs index 8085e9b1131..b9b49d4d5a4 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/InlineData.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/InlineData.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -90,7 +91,7 @@ public static string DesignerWithContents (string projectName, string className, { var content = new StringBuilder (); foreach (string data in dataNames) { - content.AppendFormat (@"internal static string {0} {{ + content.AppendFormat (CultureInfo.InvariantCulture, @"internal static string {0} {{ get {{ return ResourceManager.GetString(""{0}"", resourceCulture); }} diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj index d6ebaf54736..ad22a1aeaed 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj @@ -8,6 +8,7 @@ ..\..\..\..\product.snk True portable + $(NoWarn);CA1305 diff --git a/src/Xamarin.Android.NUnitLite/Xamarin.Android.NUnitLite.NET.csproj b/src/Xamarin.Android.NUnitLite/Xamarin.Android.NUnitLite.NET.csproj index 5f0f31194da..83e909c59ac 100644 --- a/src/Xamarin.Android.NUnitLite/Xamarin.Android.NUnitLite.NET.csproj +++ b/src/Xamarin.Android.NUnitLite/Xamarin.Android.NUnitLite.NET.csproj @@ -13,7 +13,7 @@ CS1572: XML comment has a param tag for 'Bar', but there is no parameter by that name CS1591: Missing XML comment for publicly visible type or member 'Foo' --> - 1570;1572;1591 + 1570;1572;1591;CA1305 false