diff --git a/Avalonia.sln b/Avalonia.sln
index 2777f1b923..2f2acb4bde 100644
--- a/Avalonia.sln
+++ b/Avalonia.sln
@@ -42,7 +42,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{A689DE
src\Shared\ModuleInitializer.cs = src\Shared\ModuleInitializer.cs
src\Shared\NullableAttributes.cs = src\Shared\NullableAttributes.cs
src\Shared\SourceGeneratorAttributes.cs = src\Shared\SourceGeneratorAttributes.cs
- src\Avalonia.Base\Compatibility\StringCompatibilityExtensions.cs = src\Avalonia.Base\Compatibility\StringCompatibilityExtensions.cs
+ src\Shared\StringCompatibilityExtensions.cs = src\Shared\StringCompatibilityExtensions.cs
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.ReactiveUI", "src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj", "{6417B24E-49C2-4985-8DB2-3AB9D898EC91}"
diff --git a/src/Avalonia.Base/Animation/Cue.cs b/src/Avalonia.Base/Animation/Cue.cs
index c48f2ab6b0..793bd16f6f 100644
--- a/src/Avalonia.Base/Animation/Cue.cs
+++ b/src/Avalonia.Base/Animation/Cue.cs
@@ -34,7 +34,7 @@ namespace Avalonia.Animation
{
string v = value;
- if (value.EndsWith("%"))
+ if (value.EndsWith('%'))
{
v = v.TrimEnd('%');
}
diff --git a/src/Avalonia.Base/Media/Color.cs b/src/Avalonia.Base/Media/Color.cs
index 17ee14e533..d100fa2822 100644
--- a/src/Avalonia.Base/Media/Color.cs
+++ b/src/Avalonia.Base/Media/Color.cs
@@ -346,7 +346,7 @@ namespace Avalonia.Media
if (workingString.Length >= 11 &&
workingString.StartsWith("rgba(", StringComparison.OrdinalIgnoreCase) &&
- workingString.EndsWith(")", StringComparison.Ordinal))
+ workingString.EndsWith(')'))
{
workingString = workingString.Substring(5, workingString.Length - 6);
prefixMatched = true;
@@ -355,7 +355,7 @@ namespace Avalonia.Media
if (prefixMatched == false &&
workingString.Length >= 10 &&
workingString.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase) &&
- workingString.EndsWith(")", StringComparison.Ordinal))
+ workingString.EndsWith(')'))
{
workingString = workingString.Substring(4, workingString.Length - 5);
prefixMatched = true;
diff --git a/src/Avalonia.Base/Media/Fonts/FontFamilyLoader.cs b/src/Avalonia.Base/Media/Fonts/FontFamilyLoader.cs
index 37992c895e..2c61ffd419 100644
--- a/src/Avalonia.Base/Media/Fonts/FontFamilyLoader.cs
+++ b/src/Avalonia.Base/Media/Fonts/FontFamilyLoader.cs
@@ -94,14 +94,14 @@ namespace Avalonia.Media.Fonts
{
var path = x.GetUnescapeAbsolutePath();
return path.IndexOf(filePattern, StringComparison.Ordinal) >= 0
- && path.EndsWith(fileExtension, StringComparison.Ordinal);
+ && path.EndsWith(fileExtension, StringComparison.OrdinalIgnoreCase);
}
private static bool IsFontTtfOrOtf(Uri uri)
{
var sourceWithoutArguments = GetSubString(uri.OriginalString, '?');
- return sourceWithoutArguments.EndsWith(".ttf", StringComparison.Ordinal)
- || sourceWithoutArguments.EndsWith(".otf", StringComparison.Ordinal);
+ return sourceWithoutArguments.EndsWith(".ttf", StringComparison.OrdinalIgnoreCase)
+ || sourceWithoutArguments.EndsWith(".otf", StringComparison.OrdinalIgnoreCase);
}
private static (string fileNameWithoutExtension, string extension) GetFileNameAndExtension(
diff --git a/src/Avalonia.Base/Media/HslColor.cs b/src/Avalonia.Base/Media/HslColor.cs
index 84f2149367..02176d65d7 100644
--- a/src/Avalonia.Base/Media/HslColor.cs
+++ b/src/Avalonia.Base/Media/HslColor.cs
@@ -256,7 +256,7 @@ namespace Avalonia.Media
if (workingString.Length >= 11 &&
workingString.StartsWith("hsla(", StringComparison.OrdinalIgnoreCase) &&
- workingString.EndsWith(")", StringComparison.Ordinal))
+ workingString.EndsWith(')'))
{
workingString = workingString.Substring(5, workingString.Length - 6);
prefixMatched = true;
@@ -265,7 +265,7 @@ namespace Avalonia.Media
if (prefixMatched == false &&
workingString.Length >= 10 &&
workingString.StartsWith("hsl(", StringComparison.OrdinalIgnoreCase) &&
- workingString.EndsWith(")", StringComparison.Ordinal))
+ workingString.EndsWith(')'))
{
workingString = workingString.Substring(4, workingString.Length - 5);
prefixMatched = true;
diff --git a/src/Avalonia.Base/RelativePoint.cs b/src/Avalonia.Base/RelativePoint.cs
index 5f04f4d57f..c20c279c00 100644
--- a/src/Avalonia.Base/RelativePoint.cs
+++ b/src/Avalonia.Base/RelativePoint.cs
@@ -164,9 +164,9 @@ namespace Avalonia
var unit = RelativeUnit.Absolute;
var scale = 1.0;
- if (x.EndsWith("%"))
+ if (x.EndsWith('%'))
{
- if (!y.EndsWith("%"))
+ if (!y.EndsWith('%'))
{
throw new FormatException("If one coordinate is relative, both must be.");
}
diff --git a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
index bc36c610c7..55a72c4af9 100644
--- a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
+++ b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
@@ -118,6 +118,7 @@
+
diff --git a/src/Avalonia.Build.Tasks/GenerateAvaloniaResourcesTask.cs b/src/Avalonia.Build.Tasks/GenerateAvaloniaResourcesTask.cs
index 620cd4723d..86c04132a0 100644
--- a/src/Avalonia.Build.Tasks/GenerateAvaloniaResourcesTask.cs
+++ b/src/Avalonia.Build.Tasks/GenerateAvaloniaResourcesTask.cs
@@ -88,7 +88,10 @@ namespace Avalonia.Build.Tasks
foreach (var s in sources.ToArray())
{
- if (s.Path.ToLowerInvariant().EndsWith(".xaml") || s.Path.ToLowerInvariant().EndsWith(".paml") || s.Path.ToLowerInvariant().EndsWith(".axaml"))
+ var path = s.Path;
+ if (path.EndsWith(".axaml", StringComparison.OrdinalIgnoreCase)
+ || path.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase)
+ || path.EndsWith(".paml", StringComparison.OrdinalIgnoreCase) )
{
XamlFileInfo info;
try
@@ -110,7 +113,7 @@ namespace Avalonia.Build.Tasks
$"Duplicate x:Class directive, {info.XClass} is already used in {typeToXamlIndex[info.XClass]}");
return false;
}
- typeToXamlIndex[info.XClass] = s.Path;
+ typeToXamlIndex[info.XClass] = path;
}
}
}
diff --git a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs
index 469a51f32a..b99c209ec4 100644
--- a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs
+++ b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs
@@ -23,11 +23,15 @@ namespace Avalonia.Build.Tasks
public static partial class XamlCompilerTaskExecutor
{
private const string CompiledAvaloniaXamlNamespace = "CompiledAvaloniaXaml";
-
- static bool CheckXamlName(IResource r) => r.Name.ToLowerInvariant().EndsWith(".xaml")
- || r.Name.ToLowerInvariant().EndsWith(".paml")
- || r.Name.ToLowerInvariant().EndsWith(".axaml");
-
+
+ static bool CheckXamlName(IResource r)
+ {
+ var name = r.Name;
+ return name.EndsWith(".axaml", StringComparison.OrdinalIgnoreCase)
+ || name.EndsWith(".xaml",StringComparison.OrdinalIgnoreCase)
+ || name.EndsWith(".paml", StringComparison.OrdinalIgnoreCase);
+ }
+
public class CompileResult
{
public bool Success { get; set; }
diff --git a/src/Shared/StringCompatibilityExtensions.cs b/src/Shared/StringCompatibilityExtensions.cs
index 7c894dba97..dc694e6af5 100644
--- a/src/Shared/StringCompatibilityExtensions.cs
+++ b/src/Shared/StringCompatibilityExtensions.cs
@@ -8,5 +8,9 @@ internal static class StringCompatibilityExtensions
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool Contains(this string str, char search) =>
str.Contains(search.ToString());
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static bool EndsWith(this string str, char search) =>
+ str.Length > 0 && str[str.Length - 1] == search;
}
#endif
diff --git a/src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameGenerator.cs b/src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameGenerator.cs
index fa20be721c..67389ef826 100644
--- a/src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameGenerator.cs
+++ b/src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameGenerator.cs
@@ -36,10 +36,11 @@ internal class AvaloniaNameGenerator : INameGenerator
{
var resolveViews =
from file in additionalFiles
- where (file.Path.EndsWith(".xaml") ||
- file.Path.EndsWith(".paml") ||
- file.Path.EndsWith(".axaml")) &&
- _pathPattern.Matches(file.Path)
+ let filePath = file.Path
+ where (filePath.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase) ||
+ filePath.EndsWith(".paml", StringComparison.OrdinalIgnoreCase) ||
+ filePath.EndsWith(".axaml", StringComparison.OrdinalIgnoreCase)) &&
+ _pathPattern.Matches(filePath)
let xaml = file.GetText(cancellationToken)?.ToString()
where xaml != null
let view = _classes.ResolveView(xaml)
diff --git a/src/tools/DevGenerators/CompositionGenerator/CompositionRoslynGenerator.cs b/src/tools/DevGenerators/CompositionGenerator/CompositionRoslynGenerator.cs
index 26bd4796df..9b610f9812 100644
--- a/src/tools/DevGenerators/CompositionGenerator/CompositionRoslynGenerator.cs
+++ b/src/tools/DevGenerators/CompositionGenerator/CompositionRoslynGenerator.cs
@@ -10,7 +10,7 @@ namespace Avalonia.SourceGenerator.CompositionGenerator
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var schema =
- context.AdditionalTextsProvider.Where(static file => file.Path.EndsWith("composition-schema.xml"));
+ context.AdditionalTextsProvider.Where(static file => file.Path.EndsWith("composition-schema.xml", System.StringComparison.OrdinalIgnoreCase));
var configs = schema.Select((t, _) => t.GetText())
.Where(source => source is not null)
.Select((source, _) => (GConfig)new XmlSerializer(typeof(GConfig)).Deserialize(new StringReader(source!.ToString())));