Skip to content

Commit 6e7d254

Browse files
authored
Collect and log/report generic binding errors and type load errors from connectors (#157)
* Collect and log/report generic binding errors and type load errors from connectors * update CHANGELOG
1 parent a3572a1 commit 6e7d254

7 files changed

Lines changed: 69 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* Support file scoped namespace declarations when generating code (#140)
66
* Improved handling of scope tag expressions, hook and scope errors (#150)
77
* Improved logging for binding discovery (#154)
8+
* Report generic binding errors and log type load errors of binding discovery (#157)
89

910
## Bug fixes:
1011

Connectors/Reqnroll.VisualStudio.ReqnrollConnector.Generic/Discovery/DiscoveryExecutor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ public static DiscoveryResult Execute(DiscoveryOptions options,
7373
Hooks = discoveryResult.Hooks,
7474
SourceFiles = new Dictionary<string, string>(discoveryResult.SourceFiles),
7575
TypeNames = new Dictionary<string, string>(discoveryResult.TypeNames),
76+
GenericBindingErrors = discoveryResult.GenericBindingErrors,
77+
LogMessages = discoveryResult.TypeLoadErrors.Select(e => $"Type or method has been skipped: {e}").ToArray(),
7678
AnalyticsProperties = analytics.ToDictionary()
7779
};
7880
}

Connectors/Reqnroll.VisualStudio.ReqnrollConnector.Generic/Discovery/DiscoveryResultTransformer.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ public InternalDiscoveryResult Transform(BindingData bindingData, ISourceLocatio
3636
.OrderBy(sd => sd.SourceLocation)
3737
.ToArray();
3838

39+
string[] GetErrorsWithPrefix(string prefix) =>
40+
bindingData.Errors?
41+
.Where(e => e.StartsWith(prefix))
42+
.Select(e => e.Substring(prefix.Length).Trim())
43+
.ToArray() ?? Array.Empty<string>();
44+
45+
var typeLoadErrors = GetErrorsWithPrefix("TypeLoadError:");
46+
var genericBindingErrors = GetErrorsWithPrefix("BindingError:");
3947

4048
analytics.AddAnalyticsProperty("TypeNames", typeNamesToKey.Count.ToString());
4149
analytics.AddAnalyticsProperty("SourcePaths", sourceFilesToKey.Count.ToString());
@@ -46,7 +54,9 @@ public InternalDiscoveryResult Transform(BindingData bindingData, ISourceLocatio
4654
stepDefinitions,
4755
hooks,
4856
ReverseDictionary(sourceFilesToKey),
49-
ReverseDictionary(typeNamesToKey)
57+
ReverseDictionary(typeNamesToKey),
58+
genericBindingErrors,
59+
typeLoadErrors
5060
);
5161
}
5262

Connectors/Reqnroll.VisualStudio.ReqnrollConnector.Generic/Discovery/InternalDiscoveryResult.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ public record InternalDiscoveryResult(
44
Reqnroll.VisualStudio.ReqnrollConnector.Models.StepDefinition[] StepDefinitions,
55
Reqnroll.VisualStudio.ReqnrollConnector.Models.Hook[] Hooks,
66
IDictionary<string, string> SourceFiles,
7-
IDictionary<string, string> TypeNames
7+
IDictionary<string, string> TypeNames,
8+
string[] GenericBindingErrors,
9+
string[] TypeLoadErrors
810
);

Connectors/Reqnroll.VisualStudio.ReqnrollConnector.Models/ConnectorResult.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public abstract class ConnectorResult
77
public string ReqnrollVersion { get; set; }
88
public string ErrorMessage { get; set; }
99
public bool IsFailed => !string.IsNullOrWhiteSpace(ErrorMessage);
10+
public string[] LogMessages { get; set; }
1011
public string[] Warnings { get; set; }
1112
public Dictionary<string, object> AnalyticsProperties { get; set; }
1213
}

Connectors/Reqnroll.VisualStudio.ReqnrollConnector.Models/DiscoveryResult.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public class DiscoveryResult : ConnectorResult
77
public Hook[] Hooks { get; set; } = Array.Empty<Hook>();
88
public Dictionary<string, string> SourceFiles { get; set; }
99
public Dictionary<string, string> TypeNames { get; set; }
10+
public string[] GenericBindingErrors { get; set; }
1011
}

Reqnroll.VisualStudio/Discovery/DiscoveryInvoker.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,36 @@ public IDiscovery AndDiscoveryProviderSucceed(IDiscoveryResultProvider discovery
102102
_discoveryResult = discoveryResultProvider.RunDiscovery(_testAssemblySource.FilePath,
103103
_projectSettings.ReqnrollConfigFilePath, _projectSettings);
104104

105+
if (_discoveryResult.LogMessages is { Length: > 0 })
106+
{
107+
foreach (var logMessage in _discoveryResult.LogMessages)
108+
{
109+
var lines = logMessage.Trim().Split(new[] {'\n', '\r'}, StringSplitOptions.RemoveEmptyEntries);
110+
_logger.LogInfo(lines[0]);
111+
if (lines.Length > 1)
112+
{
113+
_logger.LogVerbose($"Additional details:{Environment.NewLine}{string.Join(Environment.NewLine, lines.Skip(1))}");
114+
}
115+
}
116+
}
117+
118+
if (_discoveryResult.Warnings is { Length: > 0 })
119+
{
120+
foreach (string warning in _discoveryResult.Warnings)
121+
{
122+
_logger.LogWarning(warning);
123+
_errorListServices.AddErrors(new[]
124+
{
125+
new DeveroomUserError
126+
{
127+
Category = DeveroomUserErrorCategory.Discovery,
128+
Message = warning,
129+
Type = TaskErrorCategory.Warning
130+
}
131+
});
132+
}
133+
}
134+
105135
if (!_discoveryResult.IsFailed)
106136
return this;
107137

@@ -142,12 +172,32 @@ public IDiscovery ThenImportBindings(string projectName)
142172
_logger.LogInfo(
143173
$"{_stepDefinitions.Length} step definitions and {_hooks.Length} hooks discovered for project {projectName}");
144174

175+
ReportGenericBindingErrors();
145176
ReportInvalidStepDefinitions();
146177
ReportInvalidHooks();
147178

148179
return this;
149180
}
150181

182+
private void ReportGenericBindingErrors()
183+
{
184+
if (_discoveryResult.GenericBindingErrors == null || !_discoveryResult.GenericBindingErrors.Any())
185+
return;
186+
187+
_logger.LogWarning($"Generic binding errors found: {Environment.NewLine}" +
188+
string.Join(Environment.NewLine, _discoveryResult.GenericBindingErrors));
189+
190+
_errorListServices.AddErrors(
191+
_discoveryResult.GenericBindingErrors
192+
.Select(errorMessage => new DeveroomUserError
193+
{
194+
Category = DeveroomUserErrorCategory.Discovery,
195+
Message = errorMessage,
196+
Type = TaskErrorCategory.Error
197+
})
198+
);
199+
}
200+
151201
public ProjectBindingRegistry AndCreateBindingRegistry(IMonitoringService monitoringService)
152202
{
153203
monitoringService.MonitorReqnrollDiscovery(_discoveryResult.IsFailed, _discoveryResult.ErrorMessage,

0 commit comments

Comments
 (0)