Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ public override bool RunTask ()
}

// if the path ends up "outside" of our target intermediate directory, just use the filename
if (String.Compare (intermediateDirFullPath, 0, dest, 0, intermediateDirFullPath.Length, StringComparison.OrdinalIgnoreCase) != 0) {
if (!dest.StartsWith (intermediateDirFullPath, StringComparison.OrdinalIgnoreCase)) {
dest = Path.GetFullPath (Path.Combine (IntermediateDir, Path.GetFileName (baseFileName)));
}
if (!File.Exists (item.ItemSpec)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,10 +218,10 @@ bool LoadLayout (string filePath, Dictionary <string, LayoutGroup> groupIndex, r

// <merge> anywhere is ignored - Android always returns 'null' if you try to find such
// an element. Prevents https://github.com/xamarin/xamarin-android/issues/1929
if (String.Compare ("merge", current.LocalName, StringComparison.Ordinal) == 0)
if (MonoAndroidHelper.StringEquals ("merge", current.LocalName))
continue;

bool isInclude = String.Compare ("include", current.LocalName, StringComparison.Ordinal) == 0;
bool isInclude = MonoAndroidHelper.StringEquals ("include", current.LocalName);

if (!GetAndParseId (current, filePath, androidNS, isInclude, out id, out parsedId, out name) && !isInclude) {
errors = true;
Expand Down Expand Up @@ -258,7 +258,7 @@ bool LoadLayout (string filePath, Dictionary <string, LayoutGroup> groupIndex, r

void CreateWidget (XPathNavigator current, string filePath, string androidNS, string xamarinNS, string id, string parsedId, string name, string partialClasses, ref IDictionary <string, LayoutWidget> widgets)
{
bool isFragment = String.Compare ("fragment", current.LocalName, StringComparison.Ordinal) == 0;
bool isFragment = MonoAndroidHelper.StringEquals ("fragment", current.LocalName);
string managedType = current.GetAttribute (XamarinManagedTypeAttribute, xamarinNS);
string oldType = null;

Expand Down Expand Up @@ -327,7 +327,7 @@ void CreateWidget (XPathNavigator current, string filePath, string androidNS, st
if (fresh)
return;

if (widget.Type != null && String.Compare (widget.Type, managedType, StringComparison.Ordinal) == 0)
if (widget.Type != null && MonoAndroidHelper.StringEquals (widget.Type, managedType))
return;

widget.Type = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,15 +111,15 @@ void ReadXml (XmlReader reader, List<JniRemappingTypeReplacement> typeReplacemen
}

haveAllAttributes = true;
if (String.Compare ("replace-type", reader.LocalName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("replace-type", reader.LocalName)) {
haveAllAttributes &= GetRequiredAttribute ("from", out string from);
haveAllAttributes &= GetRequiredAttribute ("to", out string to);
if (!haveAllAttributes) {
continue;
}

typeReplacements.Add (new JniRemappingTypeReplacement (from, to));
} else if (String.Compare ("replace-method", reader.LocalName, StringComparison.Ordinal) == 0) {
} else if (MonoAndroidHelper.StringEquals ("replace-method", reader.LocalName)) {
haveAllAttributes &= GetRequiredAttribute ("source-type", out string sourceType);
haveAllAttributes &= GetRequiredAttribute ("source-method-name", out string sourceMethodName);
haveAllAttributes &= GetRequiredAttribute ("target-type", out string targetType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ protected virtual string GetValidPropertyName (State state, LayoutWidget widget)
// there may still be a widget with the same ID). It is better to append a suffix to the
// property name since we're guaranteed that each property is unique.
StringComparison comparison = CaseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase;
if (String.Compare (state.ClassName, widget.Name, comparison) != 0 && !NameMatchesBindingClass (state, widget, comparison))
if (!MonoAndroidHelper.StringEquals (state.ClassName, widget.Name, comparison) && !NameMatchesBindingClass (state, widget, comparison))
return widget.Name;

string suffix = null;
Expand Down Expand Up @@ -273,7 +273,7 @@ bool NameMatchesBindingClass (State state, LayoutWidget widget, StringComparison
if (dot < 0)
return false;

return String.Compare (state.BindingClassName.Substring (dot + 1), widget.Name, comparison) == 0;
return MonoAndroidHelper.StringEquals (state.BindingClassName.Substring (dot + 1), widget.Name, comparison);
}

protected void WriteBindingPropertyBackingField (State state, LayoutWidget widget)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,9 @@ public override bool RunTask ()
}

global::Android.Runtime.BoundExceptionType boundExceptionType;
if (String.IsNullOrEmpty (BoundExceptionType) || String.Compare (BoundExceptionType, "System", StringComparison.OrdinalIgnoreCase) == 0) {
if (String.IsNullOrEmpty (BoundExceptionType) || MonoAndroidHelper.StringEquals (BoundExceptionType, "System", StringComparison.OrdinalIgnoreCase)) {
boundExceptionType = global::Android.Runtime.BoundExceptionType.System;
} else if (String.Compare (BoundExceptionType, "Java", StringComparison.OrdinalIgnoreCase) == 0) {
} else if (MonoAndroidHelper.StringEquals (BoundExceptionType, "Java", StringComparison.OrdinalIgnoreCase)) {
boundExceptionType = global::Android.Runtime.BoundExceptionType.Java;
} else {
throw new InvalidOperationException ($"Unsupported BoundExceptionType value '{BoundExceptionType}'");
Expand Down Expand Up @@ -223,11 +223,11 @@ public override bool RunTask ()
MonoComponent monoComponents = MonoComponent.None;
if (MonoComponents != null && MonoComponents.Length > 0) {
foreach (ITaskItem item in MonoComponents) {
if (String.Compare ("diagnostics_tracing", item.ItemSpec, StringComparison.OrdinalIgnoreCase) == 0) {
if (MonoAndroidHelper.StringEquals ("diagnostics_tracing", item.ItemSpec, StringComparison.OrdinalIgnoreCase)) {
monoComponents |= MonoComponent.Tracing;
} else if (String.Compare ("hot_reload", item.ItemSpec, StringComparison.OrdinalIgnoreCase) == 0) {
} else if (MonoAndroidHelper.StringEquals ("hot_reload", item.ItemSpec, StringComparison.OrdinalIgnoreCase)) {
monoComponents |= MonoComponent.HotReload;
} else if (String.Compare ("debugger", item.ItemSpec, StringComparison.OrdinalIgnoreCase) == 0) {
} else if (MonoAndroidHelper.StringEquals ("debugger", item.ItemSpec, StringComparison.OrdinalIgnoreCase)) {
monoComponents |= MonoComponent.Debugger;
}
}
Expand Down Expand Up @@ -391,9 +391,9 @@ void GetRequiredTokens (MetadataReader reader, out int android_runtime_jnienv_cl
MethodDefinition md = reader.GetMethodDefinition (methodHandle);
string name = reader.GetString (md.Name);

if (jnienv_initialize_method_token == -1 && String.Compare (name, "Initialize", StringComparison.Ordinal) == 0) {
if (jnienv_initialize_method_token == -1 && MonoAndroidHelper.StringEquals (name, "Initialize")) {
jnienv_initialize_method_token = MetadataTokens.GetToken (reader, methodHandle);
} else if (jnienv_registerjninatives_method_token == -1 && String.Compare (name, "RegisterJniNatives", StringComparison.Ordinal) == 0) {
} else if (jnienv_registerjninatives_method_token == -1 && MonoAndroidHelper.StringEquals (name, "RegisterJniNatives")) {
jnienv_registerjninatives_method_token = MetadataTokens.GetToken (reader, methodHandle);
}

Expand All @@ -406,12 +406,12 @@ void GetRequiredTokens (MetadataReader reader, out int android_runtime_jnienv_cl
bool TypeMatches (TypeDefinition td)
{
string ns = reader.GetString (td.Namespace);
if (String.Compare (ns, "Android.Runtime", StringComparison.Ordinal) != 0) {
if (!MonoAndroidHelper.StringEquals (ns, "Android.Runtime")) {
return false;
}

string name = reader.GetString (td.Name);
if (String.Compare (name, "JNIEnvInit", StringComparison.Ordinal) != 0) {
if (!MonoAndroidHelper.StringEquals (name, "JNIEnvInit")) {
return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ List<ITaskItem> GetItemsForABI (string abi, ITaskItem[] items)
{
var ret = new List <ITaskItem> ();
foreach (ITaskItem item in items) {
if (String.Compare (abi, item.GetMetadata (KnownMetadata.Abi), StringComparison.Ordinal) != 0) {
if (!MonoAndroidHelper.StringEquals (abi, item.GetMetadata (KnownMetadata.Abi))) {
continue;
}
ret.Add (item);
Expand Down
10 changes: 5 additions & 5 deletions src/Xamarin.Android.Build.Tasks/Tasks/PrepareAbiItems.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,15 @@ public override bool RunTask ()
var includes = new List<ITaskItem> ();
string baseName;

if (String.Compare ("typemap", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
if (MonoAndroidHelper.StringEquals ("typemap", Mode, StringComparison.OrdinalIgnoreCase)) {
baseName = TypeMapBase;
} else if (String.Compare ("environment", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
} else if (MonoAndroidHelper.StringEquals ("environment", Mode, StringComparison.OrdinalIgnoreCase)) {
baseName = EnvBase;
} else if (String.Compare ("compressed", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
} else if (MonoAndroidHelper.StringEquals ("compressed", Mode, StringComparison.OrdinalIgnoreCase)) {
baseName = CompressedAssembliesBase;
} else if (String.Compare ("jniremap", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
} else if (MonoAndroidHelper.StringEquals ("jniremap", Mode, StringComparison.OrdinalIgnoreCase)) {
baseName = JniRemappingBase;
} else if (String.Compare ("marshal_methods", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
} else if (MonoAndroidHelper.StringEquals ("marshal_methods", Mode, StringComparison.OrdinalIgnoreCase)) {
baseName = MarshalMethodsBase;
} else {
Log.LogError ($"Unknown mode: {Mode}");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using NUnit.Framework;
using System;
using Xamarin.Android.Tasks;

namespace Xamarin.Android.Build.Tests.Tasks
{
[TestFixture]
public class MonoAndroidHelperTests : BaseTest
{
[Test]
public void TestStringEquals_DefaultComparison ()
{
// Test default Ordinal comparison
Assert.IsTrue (MonoAndroidHelper.StringEquals ("Hello", "Hello"));
Assert.IsFalse (MonoAndroidHelper.StringEquals ("Hello", "hello"));
Assert.IsFalse (MonoAndroidHelper.StringEquals ("WORLD", "world"));
Assert.IsTrue (MonoAndroidHelper.StringEquals ("", ""));
}

[Test]
public void TestStringEquals_OrdinalIgnoreCaseComparison ()
{
// Test explicit OrdinalIgnoreCase comparison
Assert.IsTrue (MonoAndroidHelper.StringEquals ("Hello", "hello", StringComparison.OrdinalIgnoreCase));
Assert.IsTrue (MonoAndroidHelper.StringEquals ("WORLD", "world", StringComparison.OrdinalIgnoreCase));
Assert.IsFalse (MonoAndroidHelper.StringEquals ("Hello", "World", StringComparison.OrdinalIgnoreCase));
Assert.IsTrue (MonoAndroidHelper.StringEquals ("", "", StringComparison.OrdinalIgnoreCase));
}

[Test]
public void TestStringEquals_NullHandling ()
{
// Test null handling
Assert.IsTrue (MonoAndroidHelper.StringEquals (null, null));
Assert.IsFalse (MonoAndroidHelper.StringEquals ("test", null));
Assert.IsFalse (MonoAndroidHelper.StringEquals (null, "test"));
Assert.IsFalse (MonoAndroidHelper.StringEquals ("", null));
Assert.IsFalse (MonoAndroidHelper.StringEquals (null, ""));
}

[Test]
public void TestStringEquals_ReplaceStringCompareUseCases ()
{
// Test cases that replicate the original String.Compare use cases

// Replaces: String.Compare("typemap", Mode, StringComparison.OrdinalIgnoreCase) == 0
string mode = "TYPEMAP";
Assert.IsTrue (MonoAndroidHelper.StringEquals ("typemap", mode, StringComparison.OrdinalIgnoreCase));

// Replaces: String.Compare("environment", Mode, StringComparison.OrdinalIgnoreCase) == 0
mode = "Environment";
Assert.IsTrue (MonoAndroidHelper.StringEquals ("environment", mode, StringComparison.OrdinalIgnoreCase));

// Replaces: String.Compare(abi, item.GetMetadata(), StringComparison.Ordinal) != 0
string abi = "arm64-v8a";
string metadata = "x86_64";
Assert.IsFalse (MonoAndroidHelper.StringEquals (abi, metadata));

// Replaces: String.Compare("merge", current.LocalName, StringComparison.Ordinal) == 0
string localName = "merge";
Assert.IsTrue (MonoAndroidHelper.StringEquals ("merge", localName));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ sealed class DSOCacheEntryContextDataProvider : NativeAssemblerStructContextData
public override string GetComment (object data, string fieldName)
{
var dso_entry = EnsureType<DSOCacheEntry> (data);
if (String.Compare ("hash", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("hash", fieldName)) {
return $" from name: {dso_entry.HashedName}";
}

if (String.Compare ("name", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("name", fieldName)) {
return $" name: {dso_entry.name}";
}

Expand Down Expand Up @@ -123,11 +123,11 @@ sealed class XamarinAndroidBundledAssemblyContextDataProvider : NativeAssemblerS
public override ulong GetBufferSize (object data, string fieldName)
{
var xaba = EnsureType<XamarinAndroidBundledAssembly> (data);
if (String.Compare ("name", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("name", fieldName)) {
return xaba.name_length;
}

if (String.Compare ("file_name", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("file_name", fieldName)) {
return xaba.name_length + MonoAndroidHelper.GetMangledAssemblyNameSizeOverhead ();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ sealed class DSOCacheEntryContextDataProvider : NativeAssemblerStructContextData
public override string GetComment (object data, string fieldName)
{
var dso_entry = EnsureType<DSOCacheEntry> (data);
if (String.Compare ("hash", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("hash", fieldName)) {
return $" from name: {dso_entry.HashedName}";
}

if (String.Compare ("name_index", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("name_index", fieldName)) {
return $" name: {dso_entry.RealName}";
}

Expand Down Expand Up @@ -121,11 +121,11 @@ sealed class RuntimePropertyContextDataProvider : NativeAssemblerStructContextDa
public override string GetComment (object data, string fieldName)
{
var runtimeProp = EnsureType<RuntimeProperty> (data);
if (String.Compare ("key_index", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("key_index", fieldName)) {
return $" '{runtimeProp.Key}'";
}

if (String.Compare ("value_index", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("value_index", fieldName)) {
return $" '{runtimeProp.Value}'";
}

Expand Down Expand Up @@ -170,11 +170,11 @@ public override string GetComment (object data, string fieldName)
{
var envVar = EnsureType<AppEnvironmentVariable> (data);

if (String.Compare ("name_index", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("name_index", fieldName)) {
return $" '{envVar.Name}'";
}

if (String.Compare ("value_index", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("value_index", fieldName)) {
return $" '{envVar.Value}'";
}

Expand Down Expand Up @@ -205,11 +205,11 @@ sealed class XamarinAndroidBundledAssemblyContextDataProvider : NativeAssemblerS
public override ulong GetBufferSize (object data, string fieldName)
{
var xaba = EnsureType<XamarinAndroidBundledAssembly> (data);
if (String.Compare ("name", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("name", fieldName)) {
return xaba.name_length;
}

if (String.Compare ("file_name", fieldName, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals ("file_name", fieldName)) {
return xaba.name_length + MonoAndroidHelper.GetMangledAssemblyNameSizeOverhead ();
}

Expand Down Expand Up @@ -424,7 +424,7 @@ protected override void Construct (LlvmIrModule module)
};

foreach (var kvp in runtimeProperties) {
if (String.Compare (kvp.Key, HOST_PROPERTY_RUNTIME_CONTRACT, StringComparison.Ordinal) == 0) {
if (MonoAndroidHelper.StringEquals (kvp.Key, HOST_PROPERTY_RUNTIME_CONTRACT)) {
continue;
}
runtime_property_names.Add (kvp.Key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ static void CheckSplitDimensionProperty (Utf8JsonReader reader, Strings strings,
if (reader.ValueTextEquals (strings.ValuePropertyName)) {
reader.Read ();
string? v = reader.GetString ();
valueIsAbi = String.CompareOrdinal ("ABI", v) == 0;
valueIsAbi = Xamarin.Android.Tasks.MonoAndroidHelper.StringEquals ("ABI", v);
return;
}
}
Expand Down Expand Up @@ -181,7 +181,7 @@ static void TransitionState (Strings strings, Utf8JsonReader reader, Stack<Bundl
_ => throw new InvalidOperationException ($"Internal error: unsupported state transition to '{need}'")
};

if (!String.IsNullOrEmpty (objectName) && String.CompareOrdinal (needName, objectName) == 0) {
if (!String.IsNullOrEmpty (objectName) && Xamarin.Android.Tasks.MonoAndroidHelper.StringEquals (needName, objectName)) {
state.Push (need);
} else {
state.Push (BundleConfigObject.Other);
Expand Down
4 changes: 2 additions & 2 deletions src/Xamarin.Android.Build.Tasks/Utilities/ELFHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ static bool IsLibraryReference (IStringTable stringTable, IDynamicEntry dynEntry
return false;
}

return String.Compare (referencedLibraryName, stringTable[(long)index], StringComparison.Ordinal) == 0;
return MonoAndroidHelper.StringEquals (referencedLibraryName, stringTable[(long)index]);
}

static bool IsEmptyAOTLibrary (TaskLoggingHelper log, string path, IELF elf)
Expand All @@ -170,7 +170,7 @@ static bool IsEmptyAOTLibrary (TaskLoggingHelper log, string path, IELF elf)

bool mono_aot_file_info_found = false;
foreach (var entry in symtab.Entries) {
if (String.Compare ("mono_aot_file_info", entry.Name, StringComparison.Ordinal) == 0 && entry.Type == ELFSymbolType.Object) {
if (MonoAndroidHelper.StringEquals ("mono_aot_file_info", entry.Name) && entry.Type == ELFSymbolType.Object) {
mono_aot_file_info_found = true;
break;
}
Expand Down
Loading