-
Notifications
You must be signed in to change notification settings - Fork 119
Expand file tree
/
Copy pathGenerateFeatureFileCodeBehindTaskExecutor.cs
More file actions
86 lines (76 loc) · 3.79 KB
/
Copy pathGenerateFeatureFileCodeBehindTaskExecutor.cs
File metadata and controls
86 lines (76 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#nullable enable
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Reqnroll.BoDi;
using Reqnroll.CommonModels;
using Reqnroll.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Task = System.Threading.Tasks.Task;
namespace Reqnroll.Tools.MsBuild.Generation;
public class GenerateFeatureFileCodeBehindTaskExecutor(
IProcessInfoDumper processInfoDumper,
IReqnrollTaskLoggingHelper log,
IReqnrollProjectProvider reqnrollProjectProvider,
ReqnrollProjectInfo reqnrollProjectInfo,
WrappedGeneratorContainerBuilder wrappedGeneratorContainerBuilder,
IObjectContainer rootObjectContainer,
IMSBuildTaskAnalyticsTransmitter msbuildTaskAnalyticsTransmitter,
IExceptionTaskLogger exceptionTaskLogger)
: IGenerateFeatureFileCodeBehindTaskExecutor
{
public async Task<IResult<IReadOnlyCollection<ITaskItem>>> ExecuteAsync()
{
processInfoDumper.DumpProcessInfo();
log.LogTaskMessage("Starting GenerateFeatureFileCodeBehind task");
log.LogTaskDiagnosticMessage($"Project folder: {reqnrollProjectInfo.ProjectFolder}");
try
{
var reqnrollProject = reqnrollProjectProvider.GetReqnrollProject();
await using var generatorContainer = wrappedGeneratorContainerBuilder.BuildGeneratorContainer(
reqnrollProject.ProjectSettings.ConfigurationHolder,
reqnrollProject.ProjectSettings,
reqnrollProjectInfo.GeneratorPlugins,
rootObjectContainer);
var featureFileCodeBehindGenerator = generatorContainer.Resolve<IFeatureFileCodeBehindGenerator>();
_ = Task.Run(msbuildTaskAnalyticsTransmitter.TryTransmitProjectCompilingEventAsync);
var returnValue = GenerateCodeBehindFilesForProject(featureFileCodeBehindGenerator);
if (log.HasLoggedErrors)
{
return Result<IReadOnlyCollection<ITaskItem>>.Failure("Feature file code-behind generation has failed with errors.");
}
return Result.Success(returnValue);
}
catch (Exception e)
{
exceptionTaskLogger.LogException(e);
processInfoDumper.DumpLoadedAssemblies();
return Result<IReadOnlyCollection<ITaskItem>>.Failure(e);
}
finally
{
processInfoDumper.DumpLoadedAssemblies();
}
}
private IReadOnlyCollection<ITaskItem> GenerateCodeBehindFilesForProject(IFeatureFileCodeBehindGenerator featureFileCodeBehindGenerator)
{
var generatedFiles = featureFileCodeBehindGenerator
.GenerateFilesForProject()
.ToArray();
var result = new List<ITaskItem>();
foreach (var generatorResult in generatedFiles)
{
var taskItem = new TaskItem { ItemSpec = FileSystemHelper.GetRelativePath(generatorResult.CodeBehindFileFullPath, reqnrollProjectInfo.ProjectFolder) };
var messagesFileRelativePath = generatorResult.MessagesFileFullPath == null ? null : FileSystemHelper.GetRelativePath(generatorResult.MessagesFileFullPath, reqnrollProjectInfo.ProjectFolder);
taskItem.SetMetadata(GenerateFeatureFileCodeBehindTask.MessagesFileMetadata, messagesFileRelativePath);
taskItem.SetMetadata(GenerateFeatureFileCodeBehindTask.MessagesResourceNameMetadata, generatorResult.MessagesResourceName);
result.Add(taskItem);
log.LogTaskDiagnosticMessage($"Output {taskItem.ItemSpec} ({generatorResult.CodeBehindFileFullPath})");
log.LogTaskDiagnosticMessage($" Messages: {messagesFileRelativePath} ({generatorResult.MessagesFileFullPath})");
log.LogTaskDiagnosticMessage($" MessagesResourceName: {generatorResult.MessagesResourceName}");
}
return result;
}
}