From ce0e35ff759f5bcddcee5ae738c99810a0d1ee00 Mon Sep 17 00:00:00 2001 From: damianedwards Date: Mon, 21 Dec 2015 16:15:13 -0800 Subject: [PATCH] Make ViewLocalizer base name generation more efficient: - Because @pranavkm made me do it - And it is actually faster and less allocating than the old code (~25% faster) - Added some more test cases --- .../ViewLocalizer.cs | 28 +++++++++++-------- .../ViewLocalizerTest.cs | 2 ++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Localization/ViewLocalizer.cs b/src/Microsoft.AspNet.Mvc.Localization/ViewLocalizer.cs index 657a98623d..b51ba3fda9 100644 --- a/src/Microsoft.AspNet.Mvc.Localization/ViewLocalizer.cs +++ b/src/Microsoft.AspNet.Mvc.Localization/ViewLocalizer.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; +using System.Text; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.ViewFeatures.Internal; using Microsoft.Extensions.Localization; @@ -97,7 +98,6 @@ namespace Microsoft.AspNet.Mvc.Localization } // Given a view path "/Views/Home/Index.cshtml" we want a baseName like "MyApplication.Views.Home.Index" - var path = viewContext.ExecutingFilePath; if (string.IsNullOrEmpty(path)) @@ -105,22 +105,26 @@ namespace Microsoft.AspNet.Mvc.Localization path = viewContext.View.Path; } - // Trim the file extension from the end of the path - if (!string.IsNullOrEmpty(path) && Path.HasExtension(path)) - { - var extension = Path.GetExtension(path); - path = path.Substring(0, path.Length - extension.Length); - } - Debug.Assert(!string.IsNullOrEmpty(path), "Couldn't determine a path for the view"); - var baseName = path.Replace('/', '.').Replace('\\', '.'); - baseName = baseName.TrimStart('.'); + _localizer = _localizerFactory.Create(BuildBaseName(path), _applicationName); + } + + private string BuildBaseName(string path) + { + var extension = Path.GetExtension(path); + var startIndex = path[0] == '/' || path[0] == '\\' ? 1 : 0; + var length = path.Length - startIndex - extension.Length; + var capacity = length + _applicationName.Length + 1; + var builder = new StringBuilder(path, startIndex, length, capacity); + + builder.Replace('/', '.').Replace('\\', '.'); // Prepend the application name - baseName = _applicationName + "." + baseName; + builder.Insert(0, '.'); + builder.Insert(0, _applicationName); - _localizer = _localizerFactory.Create(baseName, _applicationName); + return builder.ToString(); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.Localization.Test/ViewLocalizerTest.cs b/test/Microsoft.AspNet.Mvc.Localization.Test/ViewLocalizerTest.cs index d695cd0b06..8e60cb3111 100644 --- a/test/Microsoft.AspNet.Mvc.Localization.Test/ViewLocalizerTest.cs +++ b/test/Microsoft.AspNet.Mvc.Localization.Test/ViewLocalizerTest.cs @@ -18,6 +18,8 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { [Theory] [InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Home/Index.cshtml", "TestApplication.Views.Home.Index")] + [InlineData("TestApplication", "/Views/Home/Index.cshtml", "/Views/Home/Index.cshtml", "TestApplication.Views.Home.Index")] + [InlineData("TestApplication", "\\Views\\Home\\Index.cshtml", "\\Views\\Home\\Index.cshtml", "TestApplication.Views.Home.Index")] [InlineData("TestApplication.Web", "Views/Home/Index.cshtml", "Views/Home/Index.cshtml", "TestApplication.Web.Views.Home.Index")] [InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Shared/_Layout.cshtml", "TestApplication.Views.Shared._Layout")] [InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Shared/_MyPartial.cshtml", "TestApplication.Views.Shared._MyPartial")]