From b5ef713add6fda258cbfb48bc8be9013ad23e7dd Mon Sep 17 00:00:00 2001 From: John Gathogo Date: Fri, 12 Feb 2021 10:40:07 +0300 Subject: [PATCH] Fix warnings as a result of an empty metadata file generated when user opts to include T4 file (#197) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Inhibit generation of empty metadata file when user opts to include T4 file * Prepopulate metadata file with root element to suppress warning when T4 file is included * Code comment improvement Co-authored-by: Clément Habinshuti * Make improvement suggested in pull request review Co-authored-by: John Gathogo Co-authored-by: Clément Habinshuti --- src/CodeGeneration/V4CodeGenDescriptor.cs | 25 ++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/CodeGeneration/V4CodeGenDescriptor.cs b/src/CodeGeneration/V4CodeGenDescriptor.cs index 46ad079f..460dc2ca 100644 --- a/src/CodeGeneration/V4CodeGenDescriptor.cs +++ b/src/CodeGeneration/V4CodeGenDescriptor.cs @@ -63,13 +63,13 @@ private async Task AddT4FileAsync() { await Context.Logger.WriteMessageAsync(LoggerMessageCategory.Information, "Adding T4 files for OData V4...").ConfigureAwait(true); - var tempFile = Path.GetTempFileName(); + var t4IncludeTempFile = Path.GetTempFileName(); var t4Folder = Path.Combine(this.CurrentAssemblyPath, "Templates"); var referenceFolder = this.GetReferenceFileFolder(); // generate .ttinclude - using (StreamWriter writer = File.CreateText(tempFile)) + using (StreamWriter writer = File.CreateText(t4IncludeTempFile)) { var ttIncludeText = File.ReadAllText(Path.Combine(t4Folder, "ODataT4CodeGenerator.ttinclude")); if (this.TargetProjectLanguage == LanguageOption.GenerateVBCode) @@ -78,16 +78,25 @@ private async Task AddT4FileAsync() await writer.FlushAsync().ConfigureAwait(true); } - await Context.HandlerHelper.AddFileAsync(tempFile, Path.Combine(referenceFolder, GeneratedFileNamePrefix + ".ttinclude")).ConfigureAwait(true); + await Context.HandlerHelper.AddFileAsync(t4IncludeTempFile, Path.Combine(referenceFolder, GeneratedFileNamePrefix + ".ttinclude")).ConfigureAwait(true); await Context.HandlerHelper.AddFileAsync(Path.Combine(t4Folder, "ODataT4CodeGenFilesManager.ttinclude"), Path.Combine(referenceFolder, "ODataT4CodeGenFilesManager.ttinclude")).ConfigureAwait(true); - tempFile = Path.GetTempFileName(); + var csdlTempFile = Path.GetTempFileName(); // Csdl file name is this format [ServiceName]Csdl.xml var csdlFileName = string.Concat(ServiceConfiguration.ServiceName, Common.Constants.CsdlFileNameSuffix); var metadataFile = Path.Combine(referenceFolder, csdlFileName); - await Context.HandlerHelper.AddFileAsync(tempFile, metadataFile, new AddFileOptions() { SuppressOverwritePrompt = true }).ConfigureAwait(true); + // When the T4 file is added to the target project, the proxy and metadata files + // are not automatically generated. To avoid ending up with an empty metadata file with + // warnings, we pre-populate it with the root element. The content will later be overwritten with the actual metadata when T4 template is run by the user. + using (StreamWriter writer = File.CreateText(csdlTempFile)) + { + await writer.WriteLineAsync("").ConfigureAwait(true); + await writer.WriteLineAsync("").ConfigureAwait(true); + } + + await Context.HandlerHelper.AddFileAsync(csdlTempFile, metadataFile, new AddFileOptions() { SuppressOverwritePrompt = true }).ConfigureAwait(true); // Hack! // Tests were failing since the test project cannot access ProjectItems @@ -99,7 +108,9 @@ private async Task AddT4FileAsync() projectItem.Properties.Item("BuildAction").Value = prjBuildAction.prjBuildActionEmbeddedResource; } - using (StreamWriter writer = File.CreateText(tempFile)) + var t4TempFile = Path.GetTempFileName(); + + using (StreamWriter writer = File.CreateText(t4TempFile)) { var text = File.ReadAllText(Path.Combine(t4Folder, "ODataT4CodeGenerator.tt")); @@ -141,7 +152,7 @@ private async Task AddT4FileAsync() await writer.FlushAsync().ConfigureAwait(true); } - await Context.HandlerHelper.AddFileAsync(tempFile, Path.Combine(referenceFolder, GeneratedFileNamePrefix + ".tt")).ConfigureAwait(true); + await Context.HandlerHelper.AddFileAsync(t4TempFile, Path.Combine(referenceFolder, GeneratedFileNamePrefix + ".tt")).ConfigureAwait(true); await Context.Logger.WriteMessageAsync(LoggerMessageCategory.Information, "T4 files for OData V4 were added.").ConfigureAwait(true); }