From dedffbf5df0f82569c877eb74c269213cfc18ee3 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Tue, 5 Oct 2021 13:34:12 -0500 Subject: [PATCH 1/3] [build] Enable globalization analyzer errors and fix issues. --- Configuration.props | 18 ++++++++++++++++++ .../CheckApiCompatibility.cs | 10 +++++----- .../CodeGenDiff.cs | 2 +- .../GenerateWixFile.cs | 5 +++-- .../RenameTestCases.cs | 2 +- build-tools/api-merge/ApiDescription.cs | 2 +- build-tools/api-merge/Mono.Options-PCL.cs | 4 ++-- build-tools/check-boot-times/Program.cs | 4 ++-- build-tools/jnienv-gen/Generator.cs | 18 +++++++++--------- build-tools/jnienv-gen/Mono.Options-PCL.cs | 4 ++-- build-tools/scripts/RoslynAnalyzers.projitems | 4 ++-- .../xaprepare/Application/BuildInfo.cs | 2 +- .../PackagingUtils.cs | 2 +- .../Java.Interop/JavaObjectExtensions.cs | 2 +- .../GenerateProguardConfiguration.cs | 2 +- .../Linker/MonoDroid.Tuner/MarkJavaObjects.cs | 6 +++--- .../Tasks/AndroidComputeResPaths.cs | 4 ++-- .../Tasks/AndroidSignPackage.cs | 2 +- .../Tasks/BuildApk.cs | 2 +- .../Tasks/CalculateLayoutCodeBehind.cs | 2 +- .../Tasks/CheckDuplicateJavaLibraries.cs | 2 +- .../Tasks/CollectNonEmptyDirectories.cs | 4 ++-- .../Tasks/ConvertCustomView.cs | 2 +- .../Tasks/CreateLibraryResourceArchive.cs | 4 ++-- .../Tasks/GenerateManagedAidlProxies.cs | 2 +- .../Tasks/GeneratePackageManagerJava.cs | 2 +- .../Tasks/GetAotArguments.cs | 2 +- .../Tasks/JavaToolTask.cs | 4 ++-- .../Tasks/LinkAssemblies.cs | 2 +- src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs | 4 ++-- .../Tasks/ProcessAssemblies.cs | 4 ++-- .../Tasks/ResolveAssemblies.cs | 2 +- .../AndroidDependenciesTests.cs | 6 +++--- .../Xamarin.Android.Build.Tests/AotTests.cs | 2 +- .../BindingBuildTest.cs | 2 +- .../BuildAssetsTest.cs | 4 ++-- .../Xamarin.Android.Build.Tests/BuildTest.cs | 8 ++++---- .../Xamarin.Android.Build.Tests/BuildTest2.cs | 4 ++-- .../EnvironmentContentTests.cs | 4 ++-- .../ManifestTest.cs | 4 ++-- .../PackagingTest.cs | 10 +++++----- .../Tasks/Aapt2Tests.cs | 4 ++-- .../Tasks/ValidateJavaVersionTests.cs | 2 +- .../Utilities/BaseTest.cs | 2 +- .../Utilities/EnvironmentHelper.cs | 2 +- .../Android/MSBuildSdkExtrasProject.cs | 2 +- .../Utilities/JavaResourceParser.cs | 2 +- .../Utilities/ManifestDocument.cs | 6 +++--- .../Utilities/MonoAndroidHelper.Linker.cs | 2 +- .../Utilities/MonoAndroidHelper.cs | 2 +- .../Utilities/NdkTools/NdkTools.cs | 2 +- .../DocumentElement.cs | 6 +++--- .../HtmlLoader.cs | 2 +- .../MdocHelper.cs | 6 +++--- .../samples.cs | 2 +- .../Tests/InstallAndRunTests.cs | 4 ++-- .../Tests/PerformanceTest.cs | 2 +- 57 files changed, 121 insertions(+), 102 deletions(-) diff --git a/Configuration.props b/Configuration.props index 8b353191848..be06031431e 100644 --- a/Configuration.props +++ b/Configuration.props @@ -226,6 +226,24 @@ + + + + True + + + + + True + + + + AllEnabledByDefault + $(WarningsAsErrors);CA1309;CA1310 + + + $(NoWarn);CA1309;CA1310 + diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs index a6faea8f3de..1e1d13fb757 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs @@ -78,7 +78,7 @@ public override bool Execute () } TargetImplementationPath = implementationPath.FullName; - if (TargetImplementationPath.EndsWith ("\\") || TargetImplementationPath.EndsWith ("/")) { + if (TargetImplementationPath.EndsWith ("\\", StringComparison.Ordinal) || TargetImplementationPath.EndsWith ("/", StringComparison.Ordinal)) { TargetImplementationPath = TargetImplementationPath.Substring (0, TargetImplementationPath.Length - 1); } @@ -189,7 +189,7 @@ void dataReceived (object sender, DataReceivedEventArgs args) if (!string.IsNullOrWhiteSpace (args.Data)) { lines.Add (args.Data.Trim ()); - if (args.Data.IndexOf ("Native Crash Reporting") != -1) { + if (args.Data.IndexOf ("Native Crash Reporting", StringComparison.Ordinal) != -1) { processHasCrashed = true; } } @@ -245,13 +245,13 @@ void dataReceived (object sender, DataReceivedEventArgs args) Log.LogMessage (MessageImportance.High, $"{Environment.NewLine}*** CodeGen missing items***{Environment.NewLine}"); var indent = 0; foreach (var item in missingItems) { - if (item.StartsWith ("}")) { + if (item.StartsWith ("}", StringComparison.Ordinal)) { indent--; } - Log.LogMessage (MessageImportance.High, $"{(item.StartsWith ("namespace ") ? Environment.NewLine : string.Empty)}{new string (' ', indent * 2)}{item}"); + Log.LogMessage (MessageImportance.High, $"{(item.StartsWith ("namespace ", StringComparison.Ordinal) ? Environment.NewLine : string.Empty)}{new string (' ', indent * 2)}{item}"); - if (item.StartsWith ("{")) { + if (item.StartsWith ("{", StringComparison.Ordinal)) { indent++; } } diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CodeGenDiff.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CodeGenDiff.cs index 3ad4f2f3d82..b37c1908560 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CodeGenDiff.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CodeGenDiff.cs @@ -114,7 +114,7 @@ void dataReceived (object sender, DataReceivedEventArgs args) return; } - if (content.StartsWith ("namespace ") || content.IndexOf (" interface ") != -1 || content.IndexOf (" class ") != -1 || content.IndexOf (" partial struct ") != -1 || content.IndexOf (" enum ") != -1) { + if (content.StartsWith ("namespace ", StringComparison.Ordinal) || content.IndexOf (" interface ", StringComparison.Ordinal) != -1 || content.IndexOf (" class ", StringComparison.Ordinal) != -1 || content.IndexOf (" partial struct ", StringComparison.Ordinal) != -1 || content.IndexOf (" enum ", StringComparison.Ordinal) != -1) { if (string.IsNullOrWhiteSpace (currentObject.Item)) { currentObject.Item = content; } else { diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateWixFile.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateWixFile.cs index 6c8f6f118da..b251b393107 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateWixFile.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateWixFile.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Linq; using System.Security.Cryptography; @@ -121,13 +122,13 @@ static void RecurseDirectory (string top_dir, XmlWriter packWriter, XmlWriter co packWriter.WriteAttributeString ("FileSource", directory); foreach (var child in Directory.EnumerateDirectories (directory)) { var directoryName = Path.GetFileName (child); - if (directoryName.StartsWith (".") || directoryName.StartsWith ("_")) + if (directoryName.StartsWith (".", StringComparison.Ordinal) || directoryName.StartsWith ("_", StringComparison.Ordinal)) continue; RecurseDirectory (top_dir, packWriter, componentWriter, child); } foreach (var file in Directory.EnumerateFiles (directory)) { var fileName = Path.GetFileName (file); - if (fileName.StartsWith (".") || fileName.StartsWith ("_")) + if (fileName.StartsWith (".", StringComparison.Ordinal) || fileName.StartsWith ("_", StringComparison.Ordinal)) continue; AddFile (top_dir, packWriter, componentWriter, file); } diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/RenameTestCases.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/RenameTestCases.cs index b6cc673db12..592de31731a 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/RenameTestCases.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/RenameTestCases.cs @@ -166,7 +166,7 @@ static void CreateErrorResultsFile (string sourceFile, string destFile, string c static void GetTestCaseInfo (string sourceFile, string destinationFolder, string config, string flavor, Action logDebugMessage, out string testSuiteName, out string testCaseName, out string logcatPath) { var name = Path.GetFileNameWithoutExtension (sourceFile); - if (name.StartsWith ("TestResult-")) + if (name.StartsWith ("TestResult-", StringComparison.Ordinal)) name = name.Substring ("TestResult-".Length); testSuiteName = name; testCaseName = $"Possible Crash / {config}"; diff --git a/build-tools/api-merge/ApiDescription.cs b/build-tools/api-merge/ApiDescription.cs index 5fd2298d0a0..e2ca874a693 100644 --- a/build-tools/api-merge/ApiDescription.cs +++ b/build-tools/api-merge/ApiDescription.cs @@ -397,7 +397,7 @@ static string GetParameterType (string type, Dictionary mappings return "*"; // varargs should be normalized. - if (type.EndsWith ("...")) + if (type.EndsWith ("...", StringComparison.Ordinal)) return GetParameterType (type.Substring (0, type.Length - 3) + "[]", mappings); int first = type.IndexOfAny (type_sep); diff --git a/build-tools/api-merge/Mono.Options-PCL.cs b/build-tools/api-merge/Mono.Options-PCL.cs index 3fc9a7ab338..c0cce93f9cd 100644 --- a/build-tools/api-merge/Mono.Options-PCL.cs +++ b/build-tools/api-merge/Mono.Options-PCL.cs @@ -1353,11 +1353,11 @@ private static string GetArgumentName (int index, int maxIndex, string descripti for (int i = 0; i < nameStart.Length; ++i) { int start, j = 0; do { - start = description.IndexOf (nameStart [i], j); + start = description.IndexOf (nameStart [i], j, StringComparison.Ordinal); } while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false); if (start == -1) continue; - int end = description.IndexOf ("}", start); + int end = description.IndexOf ("}", start, StringComparison.Ordinal); if (end == -1) continue; return description.Substring (start + nameStart [i].Length, end - start - nameStart [i].Length); diff --git a/build-tools/check-boot-times/Program.cs b/build-tools/check-boot-times/Program.cs index 8d83063f45b..f274c87c2f3 100644 --- a/build-tools/check-boot-times/Program.cs +++ b/build-tools/check-boot-times/Program.cs @@ -177,7 +177,7 @@ bool validation (string data, ManualResetEvent mre) var activity = i % 2 == 0 ? "com.google.android.apps.photos/.home.HomeActivity" : "com.android.settings/.wifi.WifiStatusTest"; await RunProcess (adbPath, $"-e shell am start -n '{activity}'", 5000, (data, mre) => { - if (!string.IsNullOrWhiteSpace (data) && data.IndexOf ("com.android") != -1) { + if (!string.IsNullOrWhiteSpace (data) && data.IndexOf ("com.android", StringComparison.Ordinal) != -1) { mre.Set (); } return true; @@ -375,7 +375,7 @@ static async Task InstallSdk () { bool validation (string data, ManualResetEvent mre) { - if (!string.IsNullOrWhiteSpace (data) && data.IndexOf ("100%") != -1) { + if (!string.IsNullOrWhiteSpace (data) && data.IndexOf ("100%", StringComparison.Ordinal) != -1) { mre.Set (); } diff --git a/build-tools/jnienv-gen/Generator.cs b/build-tools/jnienv-gen/Generator.cs index 5ed4318b084..14a290c98e4 100644 --- a/build-tools/jnienv-gen/Generator.cs +++ b/build-tools/jnienv-gen/Generator.cs @@ -209,7 +209,7 @@ static void GenerateJniEnv (TextWriter o) switch (entry.ApiName) { case "NewArray": - var copyArray = JNIEnvEntries.Single (e => e.Name.StartsWith ("Get") && e.Name.EndsWith ("ArrayRegion") && + var copyArray = JNIEnvEntries.Single (e => e.Name.StartsWith ("Get", StringComparison.Ordinal) && e.Name.EndsWith ("ArrayRegion", StringComparison.Ordinal) && e.Parameters [0].Type.Type == entry.ReturnType.Type); o.Write ("\t\t{2} static {0} {1} (", entry.ReturnType.ManagedType, entry.ApiName, entry.Visibility); o.WriteLine ("{0} array)", copyArray.Parameters [3].Type.ManagedType); @@ -233,7 +233,7 @@ static void GenerateJniEnv (TextWriter o) break; case "CopyArray": o.Write ("\t\t{2} static unsafe {0} {1} (", entry.ReturnType.ManagedType, entry.ApiName, entry.Visibility); - if (entry.Name.StartsWith ("G")) { + if (entry.Name.StartsWith ("G", StringComparison.Ordinal)) { o.WriteLine ("IntPtr src, {0} dest)", entry.Parameters [3].Type.ManagedType); o.WriteLine ("\t\t{"); o.WriteLine ("\t\t\tif (src == IntPtr.Zero)"); @@ -319,7 +319,7 @@ entry.Parameters [entry.Parameters.Length-1].IsParamArray && o.Write ("Env.{0} (Handle", entry.Name); for (int i = 0; i < entry.Parameters.Length; i++) { o.Write (", "); - if (entry.Parameters [i].Type.ManagedType.StartsWith ("out ")) + if (entry.Parameters [i].Type.ManagedType.StartsWith ("out ", StringComparison.Ordinal)) o.Write ("out "); o.Write (Escape (entry.Parameters [i].Name)); } @@ -327,7 +327,7 @@ entry.Parameters [entry.Parameters.Length-1].IsParamArray && RaiseException (o, entry); if (is_void) { } - else if (entry.ReturnType.ManagedType == "IntPtr" && entry.ReturnType.Type.StartsWith ("j") && !entry.ReturnType.Type.EndsWith ("ID")) { + else if (entry.ReturnType.ManagedType == "IntPtr" && entry.ReturnType.Type.StartsWith ("j", StringComparison.Ordinal) && !entry.ReturnType.Type.EndsWith ("ID", StringComparison.Ordinal)) { o.WriteLine ("\t\t\treturn LogCreateLocalRef (tmp);"); } else { o.WriteLine ("\t\t\treturn tmp;"); @@ -381,13 +381,13 @@ static bool GenerateDefaultJavaInteropForwarder (TextWriter o, JniFunction entry if (!is_void) o.Write ("return "); var n = entry.Name; - if (n.StartsWith ("Call")) + if (n.StartsWith ("Call", StringComparison.Ordinal)) n = n.TrimEnd (new[]{'A'}); o.Write ("JniEnvironment.{0}.{1} (", entry.DeclaringType, n); for (int i = 0; i < entry.Parameters.Length; i++) { if (i > 0) o.Write (", "); - if (entry.Parameters [i].Type.ManagedType.StartsWith ("out ")) + if (entry.Parameters [i].Type.ManagedType.StartsWith ("out ", StringComparison.Ordinal)) o.Write ("out "); if (entry.Parameters [i].Type.ManagedType == "JValue*") o.Write ("(JniArgumentValue*) " + Escape (entry.Parameters [i].Name)); @@ -445,7 +445,7 @@ static bool IsObjectReferenceType (TypeInfo type) case "jweak": return true; } - if (type.Type.StartsWith ("j") && type.Type.EndsWith("Array")) + if (type.Type.StartsWith ("j", StringComparison.Ordinal) && type.Type.EndsWith("Array", StringComparison.Ordinal)) return true; return false; } @@ -643,9 +643,9 @@ public string GetManagedType (string native_type) case "jobjectRefType": return "int"; default: - if (native_type.EndsWith ("Array")) + if (native_type.EndsWith ("Array", StringComparison.Ordinal)) return "IntPtr"; - if (native_type.EndsWith ("*")) + if (native_type.EndsWith ("*", StringComparison.Ordinal)) return "IntPtr"; return native_type; } diff --git a/build-tools/jnienv-gen/Mono.Options-PCL.cs b/build-tools/jnienv-gen/Mono.Options-PCL.cs index 3fc9a7ab338..c0cce93f9cd 100644 --- a/build-tools/jnienv-gen/Mono.Options-PCL.cs +++ b/build-tools/jnienv-gen/Mono.Options-PCL.cs @@ -1353,11 +1353,11 @@ private static string GetArgumentName (int index, int maxIndex, string descripti for (int i = 0; i < nameStart.Length; ++i) { int start, j = 0; do { - start = description.IndexOf (nameStart [i], j); + start = description.IndexOf (nameStart [i], j, StringComparison.Ordinal); } while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false); if (start == -1) continue; - int end = description.IndexOf ("}", start); + int end = description.IndexOf ("}", start, StringComparison.Ordinal); if (end == -1) continue; return description.Substring (start + nameStart [i].Length, end - start - nameStart [i].Length); diff --git a/build-tools/scripts/RoslynAnalyzers.projitems b/build-tools/scripts/RoslynAnalyzers.projitems index 687157caebf..79bdca78bb8 100644 --- a/build-tools/scripts/RoslynAnalyzers.projitems +++ b/build-tools/scripts/RoslynAnalyzers.projitems @@ -1,6 +1,6 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/build-tools/xaprepare/xaprepare/Application/BuildInfo.cs b/build-tools/xaprepare/xaprepare/Application/BuildInfo.cs index 67413577b9b..750c67641a7 100644 --- a/build-tools/xaprepare/xaprepare/Application/BuildInfo.cs +++ b/build-tools/xaprepare/xaprepare/Application/BuildInfo.cs @@ -141,7 +141,7 @@ async Task DetermineLastVersionChangeCommit (Context context) if (be == null || String.IsNullOrEmpty (be.Line)) continue; - if (be.Line.IndexOf ("") >= 0) { + if (be.Line.IndexOf ("", StringComparison.Ordinal) >= 0) { Log.DebugLine ($"Last version change on {GetCommitDate (be)} by {be.Author}"); CommitOfLastVersionChange = be.Commit; Log.StatusLine (" Commit: ", be.Commit, tailColor: ConsoleColor.Cyan); diff --git a/src-ThirdParty/android-platform-tools-base/PackagingUtils.cs b/src-ThirdParty/android-platform-tools-base/PackagingUtils.cs index 94d0837d782..ee48570cc02 100644 --- a/src-ThirdParty/android-platform-tools-base/PackagingUtils.cs +++ b/src-ThirdParty/android-platform-tools-base/PackagingUtils.cs @@ -62,7 +62,7 @@ static bool CheckFolderForPackaging (string folderName) return !EqualsIgnoreCase (folderName, "CVS") && !EqualsIgnoreCase (folderName, ".svn") && !EqualsIgnoreCase (folderName, "SCCS") && - !folderName.StartsWith ("_"); + !folderName.StartsWith ("_", StringComparison.Ordinal); } /// diff --git a/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs b/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs index 52bb990f249..fcc9c2c1378 100644 --- a/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs +++ b/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs @@ -132,7 +132,7 @@ static IJavaObject CastClass (IJavaObject instance, Type resultType) if (arguments.Length == 0) return type.Assembly.GetType (type + suffix); Type definition = type.GetGenericTypeDefinition (); - int bt = definition.FullName!.IndexOf ("`"); + int bt = definition.FullName!.IndexOf ("`", StringComparison.Ordinal); if (bt == -1) throw new NotSupportedException ("Generic type doesn't follow generic type naming convention! " + type.FullName); Type? suffixDefinition = definition.Assembly.GetType ( diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GenerateProguardConfiguration.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GenerateProguardConfiguration.cs index 1f7ca08c2f9..47e42abecf0 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GenerateProguardConfiguration.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GenerateProguardConfiguration.cs @@ -86,7 +86,7 @@ void ProcessMethod (MethodDefinition method) return; var jname = ra.ConstructorArguments.First ().Value.ToString (); var jargs = ra.ConstructorArguments [1].Value.ToString (); - var pargs = jargs.StartsWith ("()") ? string.Empty : "***"; + var pargs = jargs.StartsWith ("()", StringComparison.Ordinal) ? string.Empty : "***"; // FIXME: do not preserve all overroads. if (jname == ".ctor") writer.WriteLine (" (...);", pargs); diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MarkJavaObjects.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MarkJavaObjects.cs index c2999880d9d..b0a420bc8eb 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MarkJavaObjects.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MarkJavaObjects.cs @@ -152,7 +152,7 @@ void PreserveMethod (TypeDefinition type, MethodDefinition method) string TypeNameWithoutKey (string name) { - var idx = name.IndexOf (", PublicKeyToken="); + var idx = name.IndexOf (", PublicKeyToken=", StringComparison.Ordinal); if (idx > 0) name = name.Substring (0, idx); @@ -266,7 +266,7 @@ void PreserveConstructors (TypeDefinition type, TypeDefinition helper) static bool IsImplementor (TypeDefinition type) { - return type.Name.EndsWith ("Implementor") && type.Inherits ("Java.Lang.Object"); + return type.Name.EndsWith ("Implementor", StringComparison.Ordinal) && type.Inherits ("Java.Lang.Object"); } static bool IsUserType (TypeDefinition type) @@ -280,7 +280,7 @@ void PreserveImplementor (TypeDefinition type) return; foreach (MethodDefinition method in type.Methods) - if (method.Name.EndsWith ("Handler")) + if (method.Name.EndsWith ("Handler", StringComparison.Ordinal)) PreserveMethod (type, method); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs index 1c1cbf8273b..f77393f5c4b 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs @@ -95,7 +95,7 @@ public override bool RunTask () if (!string.IsNullOrEmpty (ProjectDir)) { var fullRelPath = Path.GetFullPath (rel).Normalize (NormalizationForm.FormC); var fullProjectPath = Path.GetFullPath (ProjectDir).Normalize (NormalizationForm.FormC); - if (fullRelPath.StartsWith (fullProjectPath)) { + if (fullRelPath.StartsWith (fullProjectPath, StringComparison.Ordinal)) { rel = fullRelPath.Replace (fullProjectPath, string.Empty); } } @@ -109,7 +109,7 @@ public override bool RunTask () if (prefixes != null) { foreach (var p in prefixes) { - if (rel.StartsWith (p)) + if (rel.StartsWith (p, StringComparison.Ordinal)) rel = rel.Substring (p.Length); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidSignPackage.cs b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidSignPackage.cs index 00680879c8f..a4a6b19ba03 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidSignPackage.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidSignPackage.cs @@ -116,7 +116,7 @@ protected override void LogEventsFromTextOutput (string singleLine, MessageImpor if (singleLine.Length == 0) return; - if (singleLine.StartsWith ("Warning:")) { + if (singleLine.StartsWith ("Warning:", StringComparison.Ordinal)) { hasWarnings = true; return; } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs index 5dc361e6688..e57b746c100 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs @@ -215,7 +215,7 @@ void ExecuteWithAbi (string [] supportedAbis, string apkInputPath, string apkOut } } - var jarFiles = (JavaSourceFiles != null) ? JavaSourceFiles.Where (f => f.ItemSpec.EndsWith (".jar")) : null; + var jarFiles = (JavaSourceFiles != null) ? JavaSourceFiles.Where (f => f.ItemSpec.EndsWith (".jar", StringComparison.Ordinal)) : null; if (jarFiles != null && JavaLibraries != null) jarFiles = jarFiles.Concat (JavaLibraries); else if (JavaLibraries != null) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CalculateLayoutCodeBehind.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CalculateLayoutCodeBehind.cs index 693360ef75f..69a32f69761 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CalculateLayoutCodeBehind.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CalculateLayoutCodeBehind.cs @@ -482,7 +482,7 @@ bool ParseID (string id, out string parsedId, out string name) bool capitalize = false; if (id.StartsWith ("@id/", StringComparison.Ordinal) || id.StartsWith ("@+id/", StringComparison.Ordinal)) ns = "Resource.Id"; - else if (id.StartsWith ("@android:id/")) { + else if (id.StartsWith ("@android:id/", StringComparison.Ordinal)) { ns = $"{GlobalIdPrefix}Android.Resource.Id"; capitalize = true; } else diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs index 1a0c1919177..b46ae0c002d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs @@ -22,7 +22,7 @@ public class CheckDuplicateJavaLibraries : AndroidTask public override bool RunTask () { - var jarFiles = (JavaSourceFiles != null) ? JavaSourceFiles.Where (f => f.ItemSpec.EndsWith (".jar")) : null; + var jarFiles = (JavaSourceFiles != null) ? JavaSourceFiles.Where (f => f.ItemSpec.EndsWith (".jar", StringComparison.Ordinal)) : null; if (jarFiles != null && JavaLibraries != null) jarFiles = jarFiles.Concat (JavaLibraries); else if (JavaLibraries != null) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CollectNonEmptyDirectories.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CollectNonEmptyDirectories.cs index ab665b9384e..b4822df3d30 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CollectNonEmptyDirectories.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CollectNonEmptyDirectories.cs @@ -42,7 +42,7 @@ public override bool RunTask () string stampFile = directory.GetMetadata ("StampFile"); string directoryHash = Files.HashString (directory.ItemSpec); if (string.IsNullOrEmpty (stampFile)) { - if (Path.GetFullPath (directory.ItemSpec).StartsWith (libraryProjectDir)) { + if (Path.GetFullPath (directory.ItemSpec).StartsWith (libraryProjectDir, StringComparison.Ordinal)) { // If inside the `lp` directory stampFile = Path.GetFullPath (Path.Combine (directory.ItemSpec, "..", "..")) + ".stamp"; } else { @@ -57,7 +57,7 @@ public override bool RunTask () IEnumerable files; string filesCache = directory.GetMetadata ("FilesCache"); if (string.IsNullOrEmpty (filesCache)) { - if (Path.GetFullPath (directory.ItemSpec).StartsWith (libraryProjectDir)) { + if (Path.GetFullPath (directory.ItemSpec).StartsWith (libraryProjectDir, StringComparison.Ordinal)) { filesCache = Path.Combine (directory.ItemSpec, "..", "files.cache"); } else { filesCache = Path.Combine (directory.ItemSpec, "..", $"{directoryHash}-files.cache"); diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs index 417b782cf01..29a2b5cb509 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs @@ -82,7 +82,7 @@ public override bool RunTask () } var output = new Dictionary (processed.Count); foreach (var file in processed) { - ITaskItem resdir = ResourceDirectories?.FirstOrDefault (x => file.StartsWith (x.ItemSpec)) ?? null; + ITaskItem resdir = ResourceDirectories?.FirstOrDefault (x => file.StartsWith (x.ItemSpec, StringComparison.Ordinal)) ?? null; var hash = resdir?.GetMetadata ("Hash") ?? null; var stamp = resdir?.GetMetadata ("StampFile") ?? null; var filename = !string.IsNullOrEmpty (hash) ? hash : "compiled"; diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CreateLibraryResourceArchive.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CreateLibraryResourceArchive.cs index 7ad71bb84d5..abd30c5e108 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CreateLibraryResourceArchive.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CreateLibraryResourceArchive.cs @@ -181,9 +181,9 @@ IEnumerable ResolveLibraryProjectReferences (string singleFile, List (); foreach (var line in File.ReadAllLines (singleFile)) { var s = line.Trim (); - if (s.StartsWith ("#")) + if (s.StartsWith ("#", StringComparison.Ordinal)) continue; - if (!s.StartsWith (librefspec)) + if (!s.StartsWith (librefspec, StringComparison.Ordinal)) continue; int eqpos = s.IndexOf ('='); if (eqpos < 0) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateManagedAidlProxies.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateManagedAidlProxies.cs index 58ba89e5182..261f0854422 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateManagedAidlProxies.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateManagedAidlProxies.cs @@ -63,7 +63,7 @@ public override bool RunTask () string outPath = Path.Combine (IntermediateOutputDirectory, "aidl"); var ret = tool.Run (opts, assemblyFile => AssemblyDefinition.ReadAssembly (assemblyFile), (dir, file) => { var dst = Path.GetFullPath (Path.Combine (outPath, Path.ChangeExtension (file, ".cs"))); - if (!dst.StartsWith (outPath)) + if (!dst.StartsWith (outPath, StringComparison.Ordinal)) dst = Path.Combine (outPath, Path.ChangeExtension (Path.GetFileName (file), ".cs")); string dstdir = Path.GetDirectoryName (dst); if (!Directory.Exists (dstdir)) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs index dba71a8b077..a90c105c1c0 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs @@ -219,7 +219,7 @@ void AddEnvironment () } continue; } - if (lineToWrite.StartsWith ("XA_BROKEN_EXCEPTION_TRANSITIONS=")) { + if (lineToWrite.StartsWith ("XA_BROKEN_EXCEPTION_TRANSITIONS=", StringComparison.Ordinal)) { brokenExceptionTransitions = true; continue; } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GetAotArguments.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GetAotArguments.cs index 01149da32da..cdb99087e1c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GetAotArguments.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GetAotArguments.cs @@ -276,7 +276,7 @@ protected List GetAotOptions (NdkTools ndk, AndroidTargetArch arch, int if (!string.IsNullOrEmpty (ldName)) { ldName = Path.GetFileName (ldName); if (ldName.IndexOf ('-') >= 0) { - ldName = ldName.Substring (ldName.LastIndexOf ("-") + 1); + ldName = ldName.Substring (ldName.LastIndexOf ("-", StringComparison.Ordinal) + 1); } } } else { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs index 3dddd10d575..e0b99429849 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs @@ -143,11 +143,11 @@ bool ProcessOutput (string singleLine) return false; } else if (foundError) { if (singleLine.Trim () == "^") { - column = singleLine.IndexOf ("^"); + column = singleLine.IndexOf ("^", StringComparison.Ordinal); return true; } - if (singleLine.StartsWith ("Note:") || singleLine.Trim ().EndsWith ("errors")) { + if (singleLine.StartsWith ("Note:", StringComparison.Ordinal) || singleLine.Trim ().EndsWith ("errors", StringComparison.Ordinal)) { // See if we have one last error to print out Log.LogError (ToolName, DefaultErrorCode, null, file, line - 1, column + 1, 0, 0, errorText.ToString ()); errorText.Clear (); diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/LinkAssemblies.cs b/src/Xamarin.Android.Build.Tasks/Tasks/LinkAssemblies.cs index ab1644adf72..55c7bf7d804 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/LinkAssemblies.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/LinkAssemblies.cs @@ -95,7 +95,7 @@ bool Execute (DirectoryAssemblyResolver res) var options = new LinkerOptions (); options.MainAssembly = res.GetAssembly (MainAssembly); options.OutputDirectory = Path.GetFullPath (OutputDirectory); - options.LinkSdkOnly = string.Compare (LinkMode, "SdkOnly", true) == 0; + options.LinkSdkOnly = string.Compare (LinkMode, "SdkOnly", StringComparison.OrdinalIgnoreCase) == 0; options.LinkNone = false; options.Resolver = resolver; options.LinkDescriptions = LinkDescriptions.Select (item => Path.GetFullPath (item.ItemSpec)).ToArray (); diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs index 7c55675ffe6..b1faff2c2ae 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs @@ -316,11 +316,11 @@ protected override void LogEventsFromTextOutput (string singleLine, MessageImpor } if (matched) { if (singleLine.Trim () == "^") { - column = singleLine.IndexOf ("^"); + column = singleLine.IndexOf ("^", StringComparison.Ordinal); GenerateErrorOrWarning (); } if (singleLine.Trim ().Contains ("~")) { - column = singleLine.IndexOf ("~"); + column = singleLine.IndexOf ("~", StringComparison.Ordinal); GenerateErrorOrWarning (); } } else diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ProcessAssemblies.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ProcessAssemblies.cs index 3424c73c10b..379fe318c2c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ProcessAssemblies.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ProcessAssemblies.cs @@ -144,8 +144,8 @@ void DeduplicateAssemblies (List output, Dictionary symbols, ITaskItem assembly) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs index b8b4da760dc..ce0c1d0eedb 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs @@ -187,7 +187,7 @@ string ResolveRuntimeAssemblyForReferenceAssembly (LockFile lockFile, string ass } foreach (var folder in lockFile.PackageFolders) { var path = assemblyPath.Replace (folder.Path, string.Empty); - if (path.StartsWith ($"{Path.DirectorySeparatorChar}")) + if (path.StartsWith ($"{Path.DirectorySeparatorChar}", StringComparison.Ordinal)) path = path.Substring (1); var libraryPath = lockFile.Libraries.FirstOrDefault (x => path.StartsWith (x.Path.Replace('/', Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase)); if (libraryPath == null) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidDependenciesTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidDependenciesTests.cs index 07c5e2832f2..90080bcaad5 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidDependenciesTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidDependenciesTests.cs @@ -60,9 +60,9 @@ public void GetDependencyNdkRequiredConditions (string property, bool ndkRequire Assert.IsTrue (builder.Build (proj), "Build should have succeeded."); IEnumerable taskOutput = builder.LastBuildOutput .Select (x => x.Trim ()) - .SkipWhile (x => !x.StartsWith ("Task \"CalculateProjectDependencies\"")) - .SkipWhile (x => !x.StartsWith ("Output Item(s):")) - .TakeWhile (x => !x.StartsWith ("Done executing task \"CalculateProjectDependencies\"")); + .SkipWhile (x => !x.StartsWith ("Task \"CalculateProjectDependencies\"", StringComparison.Ordinal)) + .SkipWhile (x => !x.StartsWith ("Output Item(s):", StringComparison.Ordinal)) + .TakeWhile (x => !x.StartsWith ("Done executing task \"CalculateProjectDependencies\"", StringComparison.Ordinal)); if (ndkRequired) StringAssertEx.Contains ("ndk-bundle", taskOutput, "ndk-bundle should be a dependency."); else diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs index e45814b8bb3..bdc9d6faa81 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs @@ -402,7 +402,7 @@ public static void Foo () { b.ThrowOnBuildFailure = false; Assert.IsFalse (b.Build (proj), "Build should have failed."); string error = b.LastBuildOutput - .SkipWhile (x => !x.StartsWith ("Build FAILED.")) + .SkipWhile (x => !x.StartsWith ("Build FAILED.", StringComparison.Ordinal)) .FirstOrDefault (x => x.Contains ("error XA1025:")); Assert.IsNotNull (error, "Build should have failed with XA1025."); return; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs index c55cd3ff618..833c7d7c0df 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs @@ -609,7 +609,7 @@ public void BugzillaBug11964 () builder.ThrowOnBuildFailure = false; Assert.IsFalse (builder.Build (proj), "Build should have failed."); string error = builder.LastBuildOutput - .SkipWhile (x => !x.StartsWith ("Build FAILED.")) + .SkipWhile (x => !x.StartsWith ("Build FAILED.", StringComparison.Ordinal)) .FirstOrDefault (x => x.Contains ("error XA1019:")); Assert.IsNotNull (error, "Build should have failed with XA1019."); } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildAssetsTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildAssetsTest.cs index c05a246edd6..81f397e8e80 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildAssetsTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildAssetsTest.cs @@ -116,7 +116,7 @@ public void CheckAssetsAreIncludedInAPK ([Values (true, false)] bool useAapt2) using (var apk = ZipHelper.OpenZip (Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.PackageName}-Signed.apk"))) { foreach (var a in libproj.OtherBuildItems.Where (x => x is AndroidItem.AndroidAsset)) { var item = a.Include ().ToLower ().Replace ("\\", "/"); - if (item.EndsWith ("/")) + if (item.EndsWith ("/", StringComparison.Ordinal)) continue; var data = ZipHelper.ReadFileFromZip (apk, item); Assert.IsNotNull (data, "{0} should be in the apk.", item); @@ -124,7 +124,7 @@ public void CheckAssetsAreIncludedInAPK ([Values (true, false)] bool useAapt2) } foreach (var a in proj.OtherBuildItems.Where (x => x is AndroidItem.AndroidAsset)) { var item = a.Include ().ToLower ().Replace ("\\", "/"); - if (item.EndsWith ("/")) + if (item.EndsWith ("/", StringComparison.Ordinal)) continue; var data = ZipHelper.ReadFileFromZip (apk, item); Assert.IsNotNull (data, "{0} should be in the apk.", item); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index ff37f75b59c..0095b267205 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -693,7 +693,7 @@ public void BuildApplicationWithSpacesInPath ([Values (true, false)] bool enable b.ThrowOnBuildFailure = false; Assert.IsFalse (b.Build (proj), "Build should have failed."); string error = b.LastBuildOutput - .SkipWhile (x => !x.StartsWith ("Build FAILED.")) + .SkipWhile (x => !x.StartsWith ("Build FAILED.", StringComparison.Ordinal)) .FirstOrDefault (x => x.Contains ("error XA1011:")); Assert.IsNotNull (error, "Build should have failed with XA1011."); return; @@ -2141,7 +2141,7 @@ public void XA1018 () builder.ThrowOnBuildFailure = false; Assert.IsFalse (builder.Build (proj), "Build should have failed."); string error = builder.LastBuildOutput - .SkipWhile (x => !x.StartsWith ("Build FAILED.")) + .SkipWhile (x => !x.StartsWith ("Build FAILED.", StringComparison.Ordinal)) .FirstOrDefault (x => x.Contains ("error XA1018:")); Assert.IsNotNull (error, "Build should have failed with XA1018."); StringAssert.Contains ("DoesNotExist", error, "Error should include the name of the nonexistent file"); @@ -2163,7 +2163,7 @@ public void XA4313 ([Values ("OpenTK-1.0", "Xamarin.Android.NUnitLite")] string builder.ThrowOnBuildFailure = false; Assert.AreEqual (shouldSucceed, builder.Build (proj), $"Build should have {expectedText}."); string error = builder.LastBuildOutput - .SkipWhile (x => !x.StartsWith ($"Build {expectedText}.")) + .SkipWhile (x => !x.StartsWith ($"Build {expectedText}.", StringComparison.Ordinal)) .FirstOrDefault (x => x.Contains ($"{warnOrError} XA4313")); Assert.IsNotNull (error, $"Build should have {expectedText} with XA4313 {warnOrError}."); } @@ -2247,7 +2247,7 @@ public void XA1027XA1028 (string linkTool, string enableProguard, string android builder.Build (proj); Assert.IsNotNull( builder.LastBuildOutput - .SkipWhile (x => !x.StartsWith (expectedBuildResult ? "Build succeeded." : "Build FAILED.")) + .SkipWhile (x => !x.StartsWith (expectedBuildResult ? "Build succeeded." : "Build FAILED.", StringComparison.Ordinal)) .FirstOrDefault (x => x.Contains (expectedWarning)), $"Build output should contain '{expectedWarning}'."); } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs index e738695d331..f098c481f7e 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs @@ -1067,7 +1067,7 @@ public void BuildProguardEnabledProject ([Values (true, false)] bool isRelease, b.ThrowOnBuildFailure = false; Assert.IsFalse (b.Build (proj), "Build should have failed."); string error = b.LastBuildOutput - .SkipWhile (x => !x.StartsWith ("Build FAILED.")) + .SkipWhile (x => !x.StartsWith ("Build FAILED.", StringComparison.Ordinal)) .FirstOrDefault (x => x.Contains ("error XA1011:")); Assert.IsNotNull (error, "Build should have failed with XA1011."); return; @@ -1353,7 +1353,7 @@ abstract class ExtendsClassValue extends ClassValue {} using (var builder = CreateApkBuilder ()) { Assert.True (builder.Build (proj), "Build should have succeeded."); string warning = builder.LastBuildOutput - .SkipWhile (x => !x.StartsWith ("Build succeeded.")) + .SkipWhile (x => !x.StartsWith ("Build succeeded.", StringComparison.Ordinal)) .FirstOrDefault (x => x.Contains ("R8 : warning : Missing class: java.lang.ClassValue")); if (useConfig) { Assert.IsNull (warning, "Build should have completed without an R8 warning for `java.lang.ClassValue`."); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/EnvironmentContentTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/EnvironmentContentTests.cs index aab5121ed82..65d2270225a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/EnvironmentContentTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/EnvironmentContentTests.cs @@ -58,10 +58,10 @@ public void BuildApplicationWithMonoEnvironment ([Values ("", "Normal", "Offline string monoDebugVar; Assert.IsTrue (envvars.TryGetValue ("MONO_DEBUG", out monoDebugVar), "Environment should contain MONO_DEBUG"); Assert.IsFalse (String.IsNullOrEmpty (monoDebugVar), "Environment must contain MONO_DEBUG with a value"); - Assert.IsTrue (monoDebugVar.IndexOf ("soft-breakpoints") >= 0, "Environment must contain MONO_DEBUG with 'soft-breakpoints' in its value"); + Assert.IsTrue (monoDebugVar.IndexOf ("soft-breakpoints", StringComparison.Ordinal) >= 0, "Environment must contain MONO_DEBUG with 'soft-breakpoints' in its value"); if (!String.IsNullOrEmpty (sequencePointsMode)) - Assert.IsTrue (monoDebugVar.IndexOf ("gen-compact-seq-points") >= 0, "The values from Mono.env should have been merged into environment"); + Assert.IsTrue (monoDebugVar.IndexOf ("gen-compact-seq-points", StringComparison.Ordinal) >= 0, "The values from Mono.env should have been merged into environment"); EnvironmentHelper.AssertValidEnvironmentSharedLibrary (intermediateOutputDir, AndroidSdkPath, AndroidNdkPath, supportedAbis); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs index 07863cf784d..35c4ed8b8c4 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs @@ -575,12 +575,12 @@ public void ManifestPlaceHoldersXA1010 ([Values ("legacy", "manifestmerger.jar") IEnumerable messages; if (string.CompareOrdinal (manifestMerger, "legacy") == 0) { Assert.IsTrue (builder.Build (proj), "Build should have succeeded."); - messages = builder.LastBuildOutput.SkipWhile (x => !x.StartsWith ("Build succeeded.")); + messages = builder.LastBuildOutput.SkipWhile (x => !x.StartsWith ("Build succeeded.", StringComparison.Ordinal)); } else { builder.ThrowOnBuildFailure = false; Assert.IsFalse (builder.Build (proj), "Build should have failed."); - messages = builder.LastBuildOutput.SkipWhile (x => !x.StartsWith ("Build FAILED.")); + messages = builder.LastBuildOutput.SkipWhile (x => !x.StartsWith ("Build FAILED.", StringComparison.Ordinal)); } string warning = messages.FirstOrDefault (x => x.Contains ("warning XA1010:")); Assert.IsNotNull (warning, "Warning should be XA1010"); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs index d9d3e4d88d2..1844149193c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs @@ -164,7 +164,7 @@ public void CheckIncludedNativeLibraries ([Values (true, false)] bool compressNa proj.OutputPath, $"{proj.PackageName}-Signed.apk"); CompressionMethod method = compressNativeLibraries ? CompressionMethod.Deflate : CompressionMethod.Store; using (var zip = ZipHelper.OpenZip (apk)) { - var libFiles = zip.Where (x => x.FullName.StartsWith("lib/") && !x.FullName.Equals("lib/", StringComparison.InvariantCultureIgnoreCase)); + var libFiles = zip.Where (x => x.FullName.StartsWith("lib/", StringComparison.Ordinal) && !x.FullName.Equals("lib/", StringComparison.InvariantCultureIgnoreCase)); var abiPaths = new string[] { "lib/x86/" }; foreach (var file in libFiles) { Assert.IsTrue (abiPaths.Any (x => file.FullName.Contains (x)), $"Apk contains an unnesscary lib file: {file.FullName}"); @@ -208,7 +208,7 @@ void AssertEmbeddedDSOs (string apk) using (var zip = ZipHelper.OpenZip (apk)) { foreach (var entry in zip) { - if (entry.FullName.EndsWith (".so")) { + if (entry.FullName.EndsWith (".so", StringComparison.Ordinal)) { AssertCompression (entry, compressed: false); } } @@ -245,7 +245,7 @@ public void IncrementalCompression () FileAssert.Exists (apk); using (var zip = ZipHelper.OpenZip (apk)) { foreach (var entry in zip) { - if (entry.FullName.EndsWith (".so") || entry.FullName.EndsWith (".bar")) { + if (entry.FullName.EndsWith (".so", StringComparison.Ordinal) || entry.FullName.EndsWith (".bar", StringComparison.Ordinal)) { AssertCompression (entry, compressed: true); } } @@ -262,7 +262,7 @@ public void IncrementalCompression () FileAssert.Exists (apk); using (var zip = ZipHelper.OpenZip (apk)) { foreach (var entry in zip) { - if (entry.FullName.EndsWith (".so") || entry.FullName.EndsWith (".bar")) { + if (entry.FullName.EndsWith (".so", StringComparison.Ordinal) || entry.FullName.EndsWith (".bar", StringComparison.Ordinal)) { AssertCompression (entry, compressed: false); } } @@ -950,7 +950,7 @@ public void ExtractNativeLibsTrue () proj.OutputPath, $"{proj.PackageName}-Signed.apk"); using (var zip = ZipHelper.OpenZip (apk)) { foreach (var entry in zip) { - if (entry.FullName.EndsWith (".so")) { + if (entry.FullName.EndsWith (".so", StringComparison.Ordinal)) { AssertCompression (entry, compressed: true); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/Aapt2Tests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/Aapt2Tests.cs index 8e942e9b9bb..8ee83fc9876 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/Aapt2Tests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/Aapt2Tests.cs @@ -51,7 +51,7 @@ void CallAapt2Compile (IBuildEngine engine, string dir, string outputPath, strin ITaskItem CreateTaskItemForResourceFile (string root, string dir, string file) { string ext = Path.GetExtension (file); - if (dir.StartsWith ("values")) + if (dir.StartsWith ("values", StringComparison.Ordinal)) ext = ".arsc"; return new TaskItem (Path.Combine (root, dir, file), new Dictionary { { "_FlatFile", $"{dir}_{Path.GetFileNameWithoutExtension (file)}{ext}.flat" } } ); } @@ -60,7 +60,7 @@ ITaskItem CreateTaskItemForResourceFile (string file) { string ext = Path.GetExtension (file); string dir = Path.GetFileName (Path.GetDirectoryName (file)); - if (dir.StartsWith ("values")) + if (dir.StartsWith ("values", StringComparison.Ordinal)) ext = ".arsc"; return new TaskItem (file, new Dictionary { { "_FlatFile", $"{dir}_{Path.GetFileNameWithoutExtension (file)}{ext}.flat" } } ); } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ValidateJavaVersionTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ValidateJavaVersionTests.cs index d0014157915..dcd65294a5d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ValidateJavaVersionTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ValidateJavaVersionTests.cs @@ -122,7 +122,7 @@ public void CacheInvalidates () validateJavaVersion.JavaSdkPath = javaPath; Assert.IsTrue (validateJavaVersion.Execute (), "second Execute should succeed!"); - Assert.IsFalse (messages.Any (m => m.Message.StartsWith ("Using cached value for")), "`java -version` should *not* be cached!"); + Assert.IsFalse (messages.Any (m => m.Message.StartsWith ("Using cached value for", StringComparison.Ordinal)), "`java -version` should *not* be cached!"); } } } 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 71ddfc05245..daecd898b6e 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 @@ -463,7 +463,7 @@ void CreateFauxJdk (string dir, string releaseVersion, string releaseBuildNumber // https://github.com/xamarin/xamarin-android-tools/blob/683f37508b56c76c24b3287a5687743438625341/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs#L108-L132 void CreateShellScript (string path, string contents) { - if (IsWindows && string.Compare (Path.GetExtension (path), ".dll", true) != 0) + if (IsWindows && string.Compare (Path.GetExtension (path), ".dll", StringComparison.OrdinalIgnoreCase) != 0) path += ".cmd"; using (var script = new StreamWriter (path)) { if (IsWindows) { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/EnvironmentHelper.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/EnvironmentHelper.cs index e539ecb9731..272951341b7 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/EnvironmentHelper.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/EnvironmentHelper.cs @@ -312,7 +312,7 @@ static void AssertFieldType (string file, string expectedType, string value, int static string AssertIsAssemblerString (string file, string value, int lineNumber) { string v = value.Trim (); - Assert.IsTrue (v.StartsWith ("\"") && v.EndsWith("\""), $"Field value is not a valid assembler string in '{file}:{lineNumber}': {v}"); + Assert.IsTrue (v.StartsWith ("\"", StringComparison.Ordinal) && v.EndsWith("\"", StringComparison.Ordinal), $"Field value is not a valid assembler string in '{file}:{lineNumber}': {v}"); return v.Trim ('"'); } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/MSBuildSdkExtrasProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/MSBuildSdkExtrasProject.cs index 6b611ae9d3b..2c8304041de 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/MSBuildSdkExtrasProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/MSBuildSdkExtrasProject.cs @@ -39,7 +39,7 @@ public bool IsBindingProject { public string TargetFrameworkDirectory { get { - int index = TargetFrameworks.IndexOf (";"); + int index = TargetFrameworks.IndexOf (";", StringComparison.Ordinal); if (index != -1) { return TargetFrameworks.Substring (0, TargetFrameworks.Length - index).ToLowerInvariant (); } diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/JavaResourceParser.cs b/src/Xamarin.Android.Build.Tasks/Utilities/JavaResourceParser.cs index 4228e27738a..bb705dfbcdd 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/JavaResourceParser.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/JavaResourceParser.cs @@ -86,7 +86,7 @@ public JavaResourceParser () var name = ((CodeTypeDeclaration) g.Members [g.Members.Count-1]).Name; var f = new CodeMemberField (typeof (int), GetResourceName (name, m.Groups[1].Value, map)) { Attributes = app ? MemberAttributes.Const | MemberAttributes.Public : MemberAttributes.Static | MemberAttributes.Public, - InitExpression = new CodePrimitiveExpression (ToInt32 (m.Groups [2].Value, m.Groups [2].Value.IndexOf ("0x") == 0 ? 16 : 10)), + InitExpression = new CodePrimitiveExpression (ToInt32 (m.Groups [2].Value, m.Groups [2].Value.IndexOf ("0x", StringComparison.Ordinal) == 0 ? 16 : 10)), Comments = { new CodeCommentStatement ("aapt resource value: " + m.Groups [2].Value), }, diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs index 16cd4a86773..d996a02aa22 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs @@ -160,7 +160,7 @@ public ManifestDocument (string templateFilename) : base () string ToFullyQualifiedName (string typeName) { - if (typeName.StartsWith (".")) + if (typeName.StartsWith (".", StringComparison.Ordinal)) return PackageName + typeName; if (typeName.Contains (".")) return typeName; @@ -662,7 +662,7 @@ IList AddMonoRuntimeProviders (XElement app) switch (el.Name.LocalName) { case "provider": var autho = el.Attribute (androidNs.GetName ("authorities")); - if (autho != null && autho.Value.EndsWith (".__mono_init__")) + if (autho != null && autho.Value.EndsWith (".__mono_init__", StringComparison.Ordinal)) continue; goto case "activity"; case "activity": @@ -720,7 +720,7 @@ public bool DirectBootAware () XElement ActivityFromTypeDefinition (TypeDefinition type, string name, int targetSdkVersion) { - if (name.StartsWith ("_")) + if (name.StartsWith ("_", StringComparison.Ordinal)) throw new InvalidActivityNameException (string.Format ("Activity name '{0}' is invalid, because activity namespaces may not begin with an underscore.", type.FullName)); return ToElement (type, name, diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.Linker.cs b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.Linker.cs index 8a7d64ea9d1..1cdea1e493f 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.Linker.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.Linker.cs @@ -58,7 +58,7 @@ public static bool ExistsInFrameworkPath (string assembly) // e.g. $prefix/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0. // Trim off the version. .Select (p => Path.GetDirectoryName (p.TrimEnd (Path.DirectorySeparatorChar))) - .Any (p => assembly.StartsWith (p)); + .Any (p => assembly.StartsWith (p, StringComparison.Ordinal)); } } } diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs index 5d1f75a8a4e..e0b9effda99 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs @@ -224,7 +224,7 @@ public static IEnumerable GetDuplicateFileNames (IEnumerable ful public static bool IsEmbeddedReferenceJar (string jar) { - return jar.StartsWith ("__reference__"); + return jar.StartsWith ("__reference__", StringComparison.Ordinal); } public static void LogWarning (object log, string msg, params object [] args) diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/NdkTools/NdkTools.cs b/src/Xamarin.Android.Build.Tasks/Utilities/NdkTools/NdkTools.cs index 01306ccf0d3..e97834226f9 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/NdkTools/NdkTools.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/NdkTools/NdkTools.cs @@ -140,7 +140,7 @@ public virtual IEnumerable GetSupportedPlatforms () public string GetNdkToolPrefixForAOT (AndroidTargetArch arch, int apiLevel) { string path = GetToolPath (NdkToolKind.Assembler, arch, apiLevel); - return path.Substring (0, path.LastIndexOf ("-") + 1);; + return path.Substring (0, path.LastIndexOf ("-", StringComparison.Ordinal) + 1);; } // Work around for a bug in NDK r19 before its 'c' release. See NdkToolsWithClangWithPlatforms.ctor diff --git a/src/Xamarin.Android.Tools.JavadocImporter/DocumentElement.cs b/src/Xamarin.Android.Tools.JavadocImporter/DocumentElement.cs index 8e18584eb58..08ceeca3ca5 100644 --- a/src/Xamarin.Android.Tools.JavadocImporter/DocumentElement.cs +++ b/src/Xamarin.Android.Tools.JavadocImporter/DocumentElement.cs @@ -309,7 +309,7 @@ public override DocumentSection CreateSection (XElement sectionAnchor, string an public override IEnumerable GetTypeSummaryNodes (XElement jd) { var classDataComment = jd.DescendantNodes () - .Where (n => n.NodeType == XmlNodeType.Comment && ((XComment)n).Value.IndexOf ("======== START OF CLASS DATA ========") > 0) + .Where (n => n.NodeType == XmlNodeType.Comment && ((XComment)n).Value.IndexOf ("======== START OF CLASS DATA ========", StringComparison.Ordinal) > 0) .FirstOrDefault (); if (classDataComment == null) yield break; @@ -323,7 +323,7 @@ public override IEnumerable GetTypeSummaryNodes (XElement jd) // The next comment node is the end of this CLASS SUMMARY. It could be different comments if (n.NodeType == XmlNodeType.Comment) { var c = (XComment)n; - if (c.Value.IndexOf (" SUMMARY ========") > 0) + if (c.Value.IndexOf (" SUMMARY ========", StringComparison.Ordinal) > 0) yield break; } else if (n is XText) { // FIXME: we don't use HAP for JavaDoc6 anymore, so we don't need such a mess. @@ -339,7 +339,7 @@ public override IEnumerable GetTypeSummaryNodes (XElement jd) // Sometimes this NESTED CLASS SUMMARY node could come *inside* a

tag. I think it is wrong, but // 1) I don't trust SgmlReader, and 2) I don't trust javadoc/doclet. var e = n as XElement; - if (e != null && e.Nodes ().Any (x => x.NodeType == XmlNodeType.Comment && ((XComment)x).Value.IndexOf (" SUMMARY ========") > 0)) + if (e != null && e.Nodes ().Any (x => x.NodeType == XmlNodeType.Comment && ((XComment)x).Value.IndexOf (" SUMMARY ========", StringComparison.Ordinal) > 0)) yield break; // skip empty

tag. if (e == null || e.Name.LocalName != "p" || e.Nodes ().Any ()) diff --git a/src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs b/src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs index 28a39fabfe5..845c8293ffc 100644 --- a/src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs +++ b/src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs @@ -231,7 +231,7 @@ string ReadHtmlFile (string path) public string GetJavaDocPath (string name) { - if (name.StartsWith ("mono/")) { + if (name.StartsWith ("mono/", StringComparison.Ordinal)) { // generator.exe-generated type; there are no docs return null; } diff --git a/src/Xamarin.Android.Tools.JavadocImporter/MdocHelper.cs b/src/Xamarin.Android.Tools.JavadocImporter/MdocHelper.cs index 17d815cc109..049a20cfe61 100644 --- a/src/Xamarin.Android.Tools.JavadocImporter/MdocHelper.cs +++ b/src/Xamarin.Android.Tools.JavadocImporter/MdocHelper.cs @@ -55,7 +55,7 @@ public string CrefFromHref (string href) if (!m.Success) return string.Format ("!:BadHref:{0}", href); string jniTypeName = m.Groups ["type"].Value.Replace ('.', '$'); - if (jniTypeName.EndsWith ("package-summary")) + if (jniTypeName.EndsWith ("package-summary", StringComparison.Ordinal)) return CreateNamespaceCref (jniTypeName); Type type = GetAvailableTypes () .FirstOrDefault (t => { @@ -201,10 +201,10 @@ object ConvertLink (XElement e, bool insideFormat) if (href == null) return ""; var cref = CrefFromHref (href.Value); - if (!cref.StartsWith ("!:BadHref")) + if (!cref.StartsWith ("!:BadHref", StringComparison.Ordinal)) return new XElement ("see", new XAttribute ("cref", cref)); - int packageStart = href.Value.LastIndexOf ("../"); + int packageStart = href.Value.LastIndexOf ("../", StringComparison.Ordinal); if (packageStart < 0) return ""; var url = href.Value.Substring (packageStart + "../".Length); diff --git a/src/Xamarin.Android.Tools.JavadocImporter/samples.cs b/src/Xamarin.Android.Tools.JavadocImporter/samples.cs index 6fd5209c001..001ac8f0e57 100644 --- a/src/Xamarin.Android.Tools.JavadocImporter/samples.cs +++ b/src/Xamarin.Android.Tools.JavadocImporter/samples.cs @@ -28,7 +28,7 @@ public class SampleRepository Dictionary index = new Dictionary (); Dictionary updates = new Dictionary (); - public SampleRepository (string name) : this (ZipArchive.Open (name.EndsWith (".zip") ? name : name + ".zip", FileMode.Open)) + public SampleRepository (string name) : this (ZipArchive.Open (name.EndsWith (".zip", StringComparison.Ordinal) ? name : name + ".zip", FileMode.Open)) { } diff --git a/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs b/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs index 12868a91178..5a592d3415c 100644 --- a/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs +++ b/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs @@ -102,14 +102,14 @@ public static Func CreateLineChecker (string expectedLogcatOutput) // Try to see if *successive* lines match expected output var remaining = expectedLogcatOutput; return line => { - if (line.IndexOf (remaining) >= 0) { + if (line.IndexOf (remaining, StringComparison.Ordinal) >= 0) { Reset (); return true; } int count = Math.Min (line.Length, remaining.Length); for ( ; count > 0; count--) { var startMatch = remaining.Substring (0, count); - if (line.IndexOf (startMatch) >= 0) { + if (line.IndexOf (startMatch, StringComparison.Ordinal) >= 0) { remaining = remaining.Substring (count); return false; } diff --git a/tests/MSBuildDeviceIntegration/Tests/PerformanceTest.cs b/tests/MSBuildDeviceIntegration/Tests/PerformanceTest.cs index 6838021f81b..69dbd3b7ee0 100644 --- a/tests/MSBuildDeviceIntegration/Tests/PerformanceTest.cs +++ b/tests/MSBuildDeviceIntegration/Tests/PerformanceTest.cs @@ -25,7 +25,7 @@ public static void Setup () bool foundHeader = false; while (!reader.EndOfStream) { var line = reader.ReadLine (); - if (line.StartsWith ("#") || string.IsNullOrWhiteSpace (line)) { + if (line.StartsWith ("#", StringComparison.Ordinal) || string.IsNullOrWhiteSpace (line)) { continue; } var split = line.Split (','); From 853b39c1d76ceb1de9cfad2bda375c3731753b3e Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Tue, 5 Oct 2021 14:19:03 -0500 Subject: [PATCH 2/3] Build fixes. --- Configuration.props | 4 ---- .../Xamarin.Android.Build.Tasks.csproj | 2 ++ .../Xamarin.Android.Tools.JavadocImporter.csproj | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Configuration.props b/Configuration.props index be06031431e..e14db29a215 100644 --- a/Configuration.props +++ b/Configuration.props @@ -238,12 +238,8 @@ - AllEnabledByDefault $(WarningsAsErrors);CA1309;CA1310 - - $(NoWarn);CA1309;CA1310 - diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj index 3b7fc3bf58c..f2b18955722 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj @@ -20,6 +20,8 @@ true false ..\..\product.snk + + $(NoWarn);CA1310 diff --git a/src/Xamarin.Android.Tools.JavadocImporter/Xamarin.Android.Tools.JavadocImporter.csproj b/src/Xamarin.Android.Tools.JavadocImporter/Xamarin.Android.Tools.JavadocImporter.csproj index a632617d991..39e69bc6f3e 100644 --- a/src/Xamarin.Android.Tools.JavadocImporter/Xamarin.Android.Tools.JavadocImporter.csproj +++ b/src/Xamarin.Android.Tools.JavadocImporter/Xamarin.Android.Tools.JavadocImporter.csproj @@ -16,9 +16,6 @@ - - Options.cs - StringRocks.cs @@ -53,6 +50,7 @@ + From 0815c8babef5f635f2e2e68cb73236b43dfcb5c2 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Wed, 6 Oct 2021 13:58:57 -0500 Subject: [PATCH 3/3] Change non-test file/path comparisons to OrdinalIgnoreCase. --- .../Tasks/AndroidComputeResPaths.cs | 4 ++-- src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs | 2 +- .../Tasks/CheckDuplicateJavaLibraries.cs | 2 +- .../Tasks/CollectNonEmptyDirectories.cs | 4 ++-- src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs | 2 +- .../Tasks/GenerateManagedAidlProxies.cs | 2 +- .../Utilities/MonoAndroidHelper.Linker.cs | 2 +- src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs | 2 +- src/Xamarin.Android.Tools.JavadocImporter/samples.cs | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs index f77393f5c4b..e272340accf 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs @@ -95,7 +95,7 @@ public override bool RunTask () if (!string.IsNullOrEmpty (ProjectDir)) { var fullRelPath = Path.GetFullPath (rel).Normalize (NormalizationForm.FormC); var fullProjectPath = Path.GetFullPath (ProjectDir).Normalize (NormalizationForm.FormC); - if (fullRelPath.StartsWith (fullProjectPath, StringComparison.Ordinal)) { + if (fullRelPath.StartsWith (fullProjectPath, StringComparison.OrdinalIgnoreCase)) { rel = fullRelPath.Replace (fullProjectPath, string.Empty); } } @@ -109,7 +109,7 @@ public override bool RunTask () if (prefixes != null) { foreach (var p in prefixes) { - if (rel.StartsWith (p, StringComparison.Ordinal)) + if (rel.StartsWith (p, StringComparison.OrdinalIgnoreCase)) rel = rel.Substring (p.Length); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs index e57b746c100..f37a98b0a15 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs @@ -215,7 +215,7 @@ void ExecuteWithAbi (string [] supportedAbis, string apkInputPath, string apkOut } } - var jarFiles = (JavaSourceFiles != null) ? JavaSourceFiles.Where (f => f.ItemSpec.EndsWith (".jar", StringComparison.Ordinal)) : null; + var jarFiles = (JavaSourceFiles != null) ? JavaSourceFiles.Where (f => f.ItemSpec.EndsWith (".jar", StringComparison.OrdinalIgnoreCase)) : null; if (jarFiles != null && JavaLibraries != null) jarFiles = jarFiles.Concat (JavaLibraries); else if (JavaLibraries != null) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs index b46ae0c002d..2f7f199111c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs @@ -22,7 +22,7 @@ public class CheckDuplicateJavaLibraries : AndroidTask public override bool RunTask () { - var jarFiles = (JavaSourceFiles != null) ? JavaSourceFiles.Where (f => f.ItemSpec.EndsWith (".jar", StringComparison.Ordinal)) : null; + var jarFiles = (JavaSourceFiles != null) ? JavaSourceFiles.Where (f => f.ItemSpec.EndsWith (".jar", StringComparison.OrdinalIgnoreCase)) : null; if (jarFiles != null && JavaLibraries != null) jarFiles = jarFiles.Concat (JavaLibraries); else if (JavaLibraries != null) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CollectNonEmptyDirectories.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CollectNonEmptyDirectories.cs index b4822df3d30..723261f0f76 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CollectNonEmptyDirectories.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CollectNonEmptyDirectories.cs @@ -42,7 +42,7 @@ public override bool RunTask () string stampFile = directory.GetMetadata ("StampFile"); string directoryHash = Files.HashString (directory.ItemSpec); if (string.IsNullOrEmpty (stampFile)) { - if (Path.GetFullPath (directory.ItemSpec).StartsWith (libraryProjectDir, StringComparison.Ordinal)) { + if (Path.GetFullPath (directory.ItemSpec).StartsWith (libraryProjectDir, StringComparison.OrdinalIgnoreCase)) { // If inside the `lp` directory stampFile = Path.GetFullPath (Path.Combine (directory.ItemSpec, "..", "..")) + ".stamp"; } else { @@ -57,7 +57,7 @@ public override bool RunTask () IEnumerable files; string filesCache = directory.GetMetadata ("FilesCache"); if (string.IsNullOrEmpty (filesCache)) { - if (Path.GetFullPath (directory.ItemSpec).StartsWith (libraryProjectDir, StringComparison.Ordinal)) { + if (Path.GetFullPath (directory.ItemSpec).StartsWith (libraryProjectDir, StringComparison.OrdinalIgnoreCase)) { filesCache = Path.Combine (directory.ItemSpec, "..", "files.cache"); } else { filesCache = Path.Combine (directory.ItemSpec, "..", $"{directoryHash}-files.cache"); diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs index 29a2b5cb509..ea7a65b7a57 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs @@ -82,7 +82,7 @@ public override bool RunTask () } var output = new Dictionary (processed.Count); foreach (var file in processed) { - ITaskItem resdir = ResourceDirectories?.FirstOrDefault (x => file.StartsWith (x.ItemSpec, StringComparison.Ordinal)) ?? null; + ITaskItem resdir = ResourceDirectories?.FirstOrDefault (x => file.StartsWith (x.ItemSpec, StringComparison.OrdinalIgnoreCase)) ?? null; var hash = resdir?.GetMetadata ("Hash") ?? null; var stamp = resdir?.GetMetadata ("StampFile") ?? null; var filename = !string.IsNullOrEmpty (hash) ? hash : "compiled"; diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateManagedAidlProxies.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateManagedAidlProxies.cs index 261f0854422..5368fb84084 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateManagedAidlProxies.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateManagedAidlProxies.cs @@ -63,7 +63,7 @@ public override bool RunTask () string outPath = Path.Combine (IntermediateOutputDirectory, "aidl"); var ret = tool.Run (opts, assemblyFile => AssemblyDefinition.ReadAssembly (assemblyFile), (dir, file) => { var dst = Path.GetFullPath (Path.Combine (outPath, Path.ChangeExtension (file, ".cs"))); - if (!dst.StartsWith (outPath, StringComparison.Ordinal)) + if (!dst.StartsWith (outPath, StringComparison.OrdinalIgnoreCase)) dst = Path.Combine (outPath, Path.ChangeExtension (Path.GetFileName (file), ".cs")); string dstdir = Path.GetDirectoryName (dst); if (!Directory.Exists (dstdir)) diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.Linker.cs b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.Linker.cs index 1cdea1e493f..480f0d1c09b 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.Linker.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.Linker.cs @@ -58,7 +58,7 @@ public static bool ExistsInFrameworkPath (string assembly) // e.g. $prefix/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0. // Trim off the version. .Select (p => Path.GetDirectoryName (p.TrimEnd (Path.DirectorySeparatorChar))) - .Any (p => assembly.StartsWith (p, StringComparison.Ordinal)); + .Any (p => assembly.StartsWith (p, StringComparison.OrdinalIgnoreCase)); } } } diff --git a/src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs b/src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs index 845c8293ffc..9751811a2ce 100644 --- a/src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs +++ b/src/Xamarin.Android.Tools.JavadocImporter/HtmlLoader.cs @@ -231,7 +231,7 @@ string ReadHtmlFile (string path) public string GetJavaDocPath (string name) { - if (name.StartsWith ("mono/", StringComparison.Ordinal)) { + if (name.StartsWith ("mono/", StringComparison.OrdinalIgnoreCase)) { // generator.exe-generated type; there are no docs return null; } diff --git a/src/Xamarin.Android.Tools.JavadocImporter/samples.cs b/src/Xamarin.Android.Tools.JavadocImporter/samples.cs index 001ac8f0e57..40907040e44 100644 --- a/src/Xamarin.Android.Tools.JavadocImporter/samples.cs +++ b/src/Xamarin.Android.Tools.JavadocImporter/samples.cs @@ -28,7 +28,7 @@ public class SampleRepository Dictionary index = new Dictionary (); Dictionary updates = new Dictionary (); - public SampleRepository (string name) : this (ZipArchive.Open (name.EndsWith (".zip", StringComparison.Ordinal) ? name : name + ".zip", FileMode.Open)) + public SampleRepository (string name) : this (ZipArchive.Open (name.EndsWith (".zip", StringComparison.OrdinalIgnoreCase) ? name : name + ".zip", FileMode.Open)) { }