Change final code documents to not contain non-existent imports.

- Existent imports are imports that have content that contribute to the processing of a Razor document. Prior to this we had a legacy expectation that code documents had empty markers in them for all of their import locations. This proved troublesome when cross-referencing files that had file paths and were supposed to be existent but weren't in metadata. Now that we have a project engine with a de-coupled import feature we can rely on the import feature for finding all locations of important files and then strip out any non-existent items.
This commit is contained in:
N. Taylor Mullen 2018-02-22 11:51:17 -08:00
parent 64c86634a8
commit b538ceba93
3 changed files with 21 additions and 28 deletions

View File

@ -65,7 +65,7 @@ namespace Microsoft.AspNetCore.Razor.Language
var importFeature = GetRequiredFeature<IImportProjectFeature>();
var importItems = importFeature.GetImports(projectItem);
var importSourceDocuments = importItems.Select(ConvertToSourceDocument);
var importSourceDocuments = GetImportSourceDocuments(importItems);
var parserOptions = GetRequiredFeature<IRazorParserOptionsFactoryProjectFeature>().Create(ConfigureParserOptions);
var codeGenerationOptions = GetRequiredFeature<IRazorCodeGenerationOptionsFactoryProjectFeature>().Create(ConfigureCodeGenerationOptions);
@ -84,12 +84,11 @@ namespace Microsoft.AspNetCore.Razor.Language
var importFeature = GetRequiredFeature<IImportProjectFeature>();
var importItems = importFeature.GetImports(projectItem);
var importSourceDocuments = importItems.Select(ConvertToSourceDocument);
var importSourceDocuments = GetImportSourceDocuments(importItems);
var parserOptions = GetRequiredFeature<IRazorParserOptionsFactoryProjectFeature>().Create(ConfigureDesignTimeParserOptions);
var codeGenerationOptions = GetRequiredFeature<IRazorCodeGenerationOptionsFactoryProjectFeature>().Create(ConfigureDesignTimeCodeGenerationOptions);
return RazorCodeDocument.Create(sourceDocument, importSourceDocuments, parserOptions, codeGenerationOptions);
}
@ -138,17 +137,21 @@ namespace Microsoft.AspNetCore.Razor.Language
}
// Internal for testing
internal static RazorSourceDocument ConvertToSourceDocument(RazorProjectItem importItem)
internal static IReadOnlyList<RazorSourceDocument> GetImportSourceDocuments(IReadOnlyList<RazorProjectItem> importItems)
{
if (importItem.Exists)
var imports = new List<RazorSourceDocument>();
for (var i = 0; i < importItems.Count; i++)
{
// Normal import, has file paths, content etc.
return RazorSourceDocument.ReadFrom(importItem);
var importItem = importItems[i];
if (importItem.Exists)
{
var sourceDocument = RazorSourceDocument.ReadFrom(importItem);
imports.Add(sourceDocument);
}
}
// Marker import, doesn't exist, used as an identifier for "there could be something here".
var sourceDocumentProperties = new RazorSourceDocumentProperties(importItem.FilePath, importItem.RelativePhysicalPath);
return RazorSourceDocument.Create(string.Empty, sourceDocumentProperties);
return imports;
}
}
}

View File

@ -57,7 +57,7 @@ namespace Microsoft.AspNetCore.Razor.Language
// Arrange
var projectItem = new TestRazorProjectItem("Index.cshtml");
var testImport = Mock.Of<RazorProjectItem>(i => i.Read() == new MemoryStream() && i.FilePath == "testvalue");
var testImport = Mock.Of<RazorProjectItem>(i => i.Read() == new MemoryStream() && i.FilePath == "testvalue" && i.Exists == true);
var importFeature = new Mock<IImportProjectFeature>();
importFeature
.Setup(feature => feature.GetImports(It.IsAny<RazorProjectItem>()))

View File

@ -9,29 +9,19 @@ namespace Microsoft.AspNetCore.Razor.Language
public class DefaultRazorProjectEngineTest
{
[Fact]
public void ConvertToSourceDocument_ConvertsNormalImports()
public void GetImportSourceDocuments_DoesNotIncludeNonExistentItems()
{
// Arrange
var projectItem = new TestRazorProjectItem("Index.cshtml");
var existingItem = new TestRazorProjectItem("Index.cshtml");
var nonExistentItem = Mock.Of<RazorProjectItem>(item => item.Exists == false);
var items = new[] { existingItem, nonExistentItem };
// Act
var sourceDocument = DefaultRazorProjectEngine.ConvertToSourceDocument(projectItem);
var sourceDocuments = DefaultRazorProjectEngine.GetImportSourceDocuments(items);
// Assert
Assert.NotNull(sourceDocument);
}
[Fact]
public void ConvertToSourceDocument_ConvertsMarkerImports()
{
// Arrange
var projectItem = Mock.Of<RazorProjectItem>(item => item.FilePath == "Index.cshtml" && item.Exists == false);
// Act
var sourceDocument = DefaultRazorProjectEngine.ConvertToSourceDocument(projectItem);
// Assert
Assert.NotNull(sourceDocument);
var sourceDocument = Assert.Single(sourceDocuments);
Assert.Equal(existingItem.FilePath, sourceDocument.FilePath);
}
}
}