Skip to content

Commit 7d087f4

Browse files
committed
feat: align project analysis between project and solution modes + imp. logging of analysis results
1 parent 8fe7cfb commit 7d087f4

File tree

3 files changed

+37
-26
lines changed

3 files changed

+37
-26
lines changed

src/Stryker.Core/Stryker.Core/Initialisation/Buildalyzer/IAnalyzerResultExtensions.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,12 @@ internal static NuGetFramework GetNuGetFramework(this IAnalyzerResult analyzerRe
125125
throw new InputException(message);
126126
}
127127

128-
internal static bool TargetsFullFramework(this IAnalyzerResult analyzerResult) => GetNuGetFramework(analyzerResult).IsDesktop();
128+
internal static bool TargetsFullFramework(this IAnalyzerResult analyzerResult)
129+
{
130+
var nuGetFramework = GetNuGetFramework(analyzerResult);
131+
132+
return nuGetFramework.IsDesktop() && (nuGetFramework.Version.Major<4 || nuGetFramework.Version is { Major: 4, Minor: < 8 });
133+
}
129134

130135
public static Language GetLanguage(this IAnalyzerResult analyzerResult) => analyzerResult.GetPropertyOrDefault("Language") switch
131136
{

src/Stryker.Core/Stryker.Core/Initialisation/InputFileResolver.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ public IReadOnlyCollection<SourceProjectInfo> ResolveSourceProjectInfos(StrykerO
6060
testProjectFileNames = new List<string> { FindTestProject(options.ProjectPath) };
6161
}
6262

63-
var testProjects = testProjectFileNames.Select(testProjectFile => _projectFileReader.AnalyzeProject(testProjectFile, options.SolutionPath, options.TargetFramework)).ToList();
63+
var testProjects = testProjectFileNames.Select(testProjectFile =>
64+
_projectFileReader.AnalyzeProject(testProjectFile, options.SolutionPath, options.TargetFramework)).ToList();
6465

6566
var analyzerResult = _projectFileReader.AnalyzeProject(FindSourceProject(testProjects, options),
6667
options.SolutionPath, options.TargetFramework);
@@ -147,12 +148,13 @@ private List<IAnalyzerResult> AnalyzeSolution(StrykerOptions options)
147148
_logger.LogDebug("Analyzing {count} projects.", manager.Projects.Count);
148149
try
149150
{
150-
Parallel.ForEach(manager.Projects.Values, project =>
151+
Parallel.ForEach(manager.Projects.Values, new ParallelOptions{MaxDegreeOfParallelism = options.DevMode ? 1 : Math.Max(options.Concurrency,1)}, project =>
151152
{
152153
var projectLogName = Path.GetRelativePath(options.WorkingDirectory, project.ProjectFile.Path);
153154
_logger.LogDebug("Analyzing {projectFilePath}", projectLogName);
154155
var buildResult = project.Build();
155-
var projectAnalyzerResult = buildResult.Results.FirstOrDefault(a => a.TargetFramework is not null);
156+
157+
var projectAnalyzerResult = _projectFileReader.GetAnalyzerResult(buildResult, options.TargetFramework);
156158
if (projectAnalyzerResult is not null)
157159
{
158160
projectsAnalyzerResults.Add(projectAnalyzerResult);

src/Stryker.Core/Stryker.Core/Initialisation/ProjectFileReader.cs

+26-22
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.IO;
34
using System.Linq;
@@ -17,6 +18,8 @@ IAnalyzerResult AnalyzeProject(string projectFilePath,
1718
string targetFramework,
1819
string msBuildPath = null);
1920
IAnalyzerManager GetAnalyzerManager(string solutionFilePath = null);
21+
22+
IAnalyzerResult GetAnalyzerResult(IAnalyzerResults results, string targetFramework);
2023
}
2124

2225
/// <summary>
@@ -51,8 +54,7 @@ public IAnalyzerResult AnalyzeProject(string projectFilePath,
5154
string msBuildPath = null)
5255
{
5356
_logger.LogDebug("Analyzing project file {0}", projectFilePath);
54-
var analyzerResult = GetProjectInfo(projectFilePath, solutionFilePath, targetFramework);
55-
LogAnalyzerResult(analyzerResult);
57+
var analyzerResult = GetAnalyzerResult(GetAnalyzerManager(solutionFilePath).GetProject(projectFilePath).Build(), targetFramework);
5658

5759
if (analyzerResult.Succeeded)
5860
{
@@ -63,28 +65,21 @@ public IAnalyzerResult AnalyzeProject(string projectFilePath,
6365
// buildalyzer failed to find restored packages, retry after nuget restore
6466
_logger.LogDebug("Project analyzer result not successful, restoring packages");
6567
_nugetRestoreProcess.RestorePackages(solutionFilePath, msBuildPath);
66-
analyzerResult = GetProjectInfo(projectFilePath, solutionFilePath, targetFramework);
67-
}
68-
else
69-
{
70-
// buildalyzer failed, but seems to work anyway.
71-
_logger.LogDebug("Project analyzer result not successful");
68+
analyzerResult = GetAnalyzerResult(GetAnalyzerManager(solutionFilePath).GetProject(projectFilePath).Build(), targetFramework);
7269
}
7370

7471
return analyzerResult;
7572
}
7673

77-
/// <summary>
78-
/// Checks if project info is already present in solution projects. If not, analyze here.
79-
/// </summary>
80-
/// <returns></returns>
81-
private IAnalyzerResult GetProjectInfo(
82-
string projectFilePath,
83-
string solutionFilePath,
84-
string targetFramework)
74+
public IAnalyzerResult GetAnalyzerResult(IAnalyzerResults results, string targetFramework)
8575
{
86-
var analyzerResults = GetAnalyzerManager(solutionFilePath).GetProject(projectFilePath).Build();
87-
return SelectAnalyzerResult(analyzerResults, targetFramework);
76+
var result = SelectAnalyzerResult(results, targetFramework);
77+
if (!result.Succeeded)
78+
{
79+
_logger.LogDebug("Project analyzer result not successful");
80+
}
81+
LogAnalyzerResult(result);
82+
return result;
8883
}
8984

9085
private IAnalyzerResult SelectAnalyzerResult(IAnalyzerResults analyzerResults, string targetFramework)
@@ -119,27 +114,36 @@ private IAnalyzerResult SelectAnalyzerResult(IAnalyzerResults analyzerResults, s
119114
return firstAnalyzerResult;
120115
}
121116

117+
private static readonly HashSet<string> ImportantProperties = new() {"Configuration", "Platform", "AssemblyName", "Configurations"};
118+
122119
private void LogAnalyzerResult(IAnalyzerResult analyzerResult)
123120
{
124121
// dump all properties as it can help diagnosing build issues for user project.
125122
_logger.LogTrace("**** Buildalyzer result ****");
126123

127124
_logger.LogTrace("Project: {0}", analyzerResult.ProjectFilePath);
128125
_logger.LogTrace("TargetFramework: {0}", analyzerResult.TargetFramework);
126+
_logger.LogTrace("Succeeded: {0}", analyzerResult.Succeeded);
129127

130-
foreach (var property in analyzerResult?.Properties ?? new Dictionary<string, string>())
128+
var properties = analyzerResult?.Properties ?? new Dictionary<string, string>();
129+
foreach (var property in ImportantProperties)
131130
{
132-
_logger.LogTrace("Property {0}={1}", property.Key, property.Value);
131+
_logger.LogTrace("Property {0}={1}", property, properties.GetValueOrDefault(property)??"'undefined'");
133132
}
134133
foreach (var sourceFile in analyzerResult?.SourceFiles ?? Enumerable.Empty<string>())
135134
{
136135
_logger.LogTrace("SourceFile {0}", sourceFile);
137136
}
138137
foreach (var reference in analyzerResult?.References ?? Enumerable.Empty<string>())
139138
{
140-
_logger.LogTrace("References: {0}", reference);
139+
_logger.LogTrace("References: {0} (in {1})", Path.GetFileName(reference), Path.GetDirectoryName(reference));
140+
}
141+
142+
foreach (var property in properties)
143+
{
144+
if (ImportantProperties.Contains(property.Key)) continue; // already logged
145+
_logger.LogTrace("Property {0}={1}", property.Key, property.Value.Replace(Environment.NewLine, "\\n"));
141146
}
142-
_logger.LogTrace("Succeeded: {0}", analyzerResult.Succeeded);
143147

144148
_logger.LogTrace("**** Buildalyzer result ****");
145149
}

0 commit comments

Comments
 (0)