diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/RazorTemplateEngine.cs b/src/Microsoft.AspNetCore.Razor.Evolution/RazorTemplateEngine.cs index 6d109ec14a..e4e8bdd136 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/RazorTemplateEngine.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/RazorTemplateEngine.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; namespace Microsoft.AspNetCore.Razor.Evolution { @@ -189,17 +190,14 @@ namespace Microsoft.AspNetCore.Razor.Evolution var result = new List(); - var importsFileName = Options.ImportsFileName; - if (!string.IsNullOrEmpty(importsFileName)) + + var importProjectItems = GetImportItems(projectItem); + foreach (var importItem in importProjectItems) { - var importProjectItems = Project.FindHierarchicalItems(projectItem.Path, importsFileName); - foreach (var importItem in importProjectItems) + if (importItem.Exists) { - if (importItem.Exists) - { - // We want items in descending order. FindHierarchicalItems returns items in ascending order. - result.Insert(0, RazorSourceDocument.ReadFrom(importItem)); - } + // We want items in descending order. FindHierarchicalItems returns items in ascending order. + result.Insert(0, RazorSourceDocument.ReadFrom(importItem)); } } @@ -210,5 +208,41 @@ namespace Microsoft.AspNetCore.Razor.Evolution return result; } + + /// + /// Gets the sequence of imports with the name specified by + /// that apply to . + /// + /// The path to look up import items for. + /// A sequence of instances that apply to the + /// . + public IEnumerable GetImportItems(string path) + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(path)); + } + + var projectItem = Project.GetItem(path); + return GetImportItems(projectItem); + } + + /// + /// Gets the sequence of imports with the name specified by + /// that apply to . + /// + /// The to look up import items for. + /// A sequence of instances that apply to the + /// . + public virtual IEnumerable GetImportItems(RazorProjectItem projectItem) + { + var importsFileName = Options.ImportsFileName; + if (!string.IsNullOrEmpty(importsFileName)) + { + return Project.FindHierarchicalItems(projectItem.Path, importsFileName); + } + + return Enumerable.Empty(); + } } } diff --git a/test/Microsoft.AspNetCore.Razor.Evolution.Test/RazorTemplateEngineTest.cs b/test/Microsoft.AspNetCore.Razor.Evolution.Test/RazorTemplateEngineTest.cs index 1076e3ea9f..64db7a5df6 100644 --- a/test/Microsoft.AspNetCore.Razor.Evolution.Test/RazorTemplateEngineTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Evolution.Test/RazorTemplateEngineTest.cs @@ -3,6 +3,7 @@ using System; using System.IO; +using System.Linq; using Microsoft.AspNetCore.Testing; using Xunit; @@ -215,5 +216,52 @@ namespace Microsoft.AspNetCore.Razor.Evolution Assert.Collection(codeDocument.Imports, import => Assert.Same(defaultImport, import)); } + + [Fact] + public void GetImportItems_WithPath_ReturnsAllImportsForFile() + { + // Arrange + var expected = new[] { "/Views/Home/MyImport.cshtml", "/Views/MyImport.cshtml", "/MyImport.cshtml" }; + var project = new TestRazorProject(); + var razorEngine = RazorEngine.Create(); + var templateEngine = new RazorTemplateEngine(razorEngine, project) + { + Options = + { + ImportsFileName = "MyImport.cshtml" + } + }; + + // Act + var imports = templateEngine.GetImportItems("/Views/Home/Index.cshtml"); + + // Assert + var paths = imports.Select(i => i.Path); + Assert.Equal(expected, paths); + } + + [Fact] + public void GetImportItems_WithItem_ReturnsAllImportsForFile() + { + // Arrange + var expected = new[] { "/Views/Home/MyImport.cshtml", "/Views/MyImport.cshtml", "/MyImport.cshtml" }; + var projectItem = new TestRazorProjectItem("/Views/Home/Index.cshtml"); + var project = new TestRazorProject(new[] { projectItem }); + var razorEngine = RazorEngine.Create(); + var templateEngine = new RazorTemplateEngine(razorEngine, project) + { + Options = + { + ImportsFileName = "MyImport.cshtml" + } + }; + + // Act + var imports = templateEngine.GetImportItems(projectItem); + + // Assert + var paths = imports.Select(i => i.Path); + Assert.Equal(expected, paths); + } } }