Skip to content

Commit eec6ac7

Browse files
authored
Add EvaluatedItemCheckData (dotnet#10932)
* Add EvaluatedItemCheckData * Fix build
1 parent 1c41c5d commit eec6ac7

7 files changed

+86
-3
lines changed

src/Build/BuildCheck/API/IBuildCheckRegistrationContext.cs

+3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ public interface IBuildCheckRegistrationContext
99
{
1010
void RegisterEvaluatedPropertiesAction(Action<BuildCheckDataContext<EvaluatedPropertiesCheckData>> evaluatedPropertiesAction);
1111

12+
[Obsolete("Use RegisterEvaluatedItemsAction to obtain evaluated items of a project.", false)]
1213
void RegisterParsedItemsAction(Action<BuildCheckDataContext<ParsedItemsCheckData>> parsedItemsAction);
1314

15+
void RegisterEvaluatedItemsAction(Action<BuildCheckDataContext<EvaluatedItemsCheckData>> evaluatedItemsAction);
16+
1417
void RegisterTaskInvocationAction(Action<BuildCheckDataContext<TaskInvocationCheckData>> taskInvocationAction);
1518

1619
void RegisterEnvironmentVariableReadAction(Action<BuildCheckDataContext<EnvironmentVariableCheckData>> environmentVariableAction);

src/Build/BuildCheck/Infrastructure/BuildCheckCentralContext.cs

+20-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ public BuildCheckCentralContext(
2626

2727
private record CallbackRegistry(
2828
List<(CheckWrapper, Action<BuildCheckDataContext<EvaluatedPropertiesCheckData>>)> EvaluatedPropertiesActions,
29+
#pragma warning disable CS0618 // Type or member is obsolete
2930
List<(CheckWrapper, Action<BuildCheckDataContext<ParsedItemsCheckData>>)> ParsedItemsActions,
31+
#pragma warning restore CS0618 // Type or member is obsolete
32+
List<(CheckWrapper, Action<BuildCheckDataContext<EvaluatedItemsCheckData>>)> EvaluatedItemsActions,
3033
List<(CheckWrapper, Action<BuildCheckDataContext<TaskInvocationCheckData>>)> TaskInvocationActions,
3134
List<(CheckWrapper, Action<BuildCheckDataContext<PropertyReadData>>)> PropertyReadActions,
3235
List<(CheckWrapper, Action<BuildCheckDataContext<PropertyWriteData>>)> PropertyWriteActions,
@@ -36,14 +39,15 @@ private record CallbackRegistry(
3639
List<(CheckWrapper, Action<BuildCheckDataContext<ProjectImportedCheckData>>)> ProjectImportedCheckDataActions)
3740
{
3841
public CallbackRegistry()
39-
: this([], [], [], [], [], [], [], [], [])
42+
: this([], [], [], [], [], [], [], [], [], [])
4043
{
4144
}
4245

4346
internal void DeregisterCheck(CheckWrapper check)
4447
{
4548
EvaluatedPropertiesActions.RemoveAll(a => a.Item1 == check);
4649
ParsedItemsActions.RemoveAll(a => a.Item1 == check);
50+
EvaluatedItemsActions.RemoveAll(a => a.Item1 == check);
4751
PropertyReadActions.RemoveAll(a => a.Item1 == check);
4852
PropertyWriteActions.RemoveAll(a => a.Item1 == check);
4953
ProjectRequestProcessingDoneActions.RemoveAll(a => a.Item1 == check);
@@ -78,9 +82,14 @@ internal void RegisterEvaluatedPropertiesAction(CheckWrapper check, Action<Build
7882
// (it was being communicated via MSBUILDLOGPROPERTIESANDITEMSAFTEREVALUATION)
7983
=> RegisterAction(check, evaluatedPropertiesAction, _globalCallbacks.EvaluatedPropertiesActions);
8084

85+
#pragma warning disable CS0618 // Type or member is obsolete
8186
internal void RegisterParsedItemsAction(CheckWrapper check, Action<BuildCheckDataContext<ParsedItemsCheckData>> parsedItemsAction)
87+
#pragma warning restore CS0618 // Type or member is obsolete
8288
=> RegisterAction(check, parsedItemsAction, _globalCallbacks.ParsedItemsActions);
8389

90+
internal void RegisterEvaluatedItemsAction(CheckWrapper check, Action<BuildCheckDataContext<EvaluatedItemsCheckData>> parsedItemsAction)
91+
=> RegisterAction(check, parsedItemsAction, _globalCallbacks.EvaluatedItemsActions);
92+
8493
internal void RegisterTaskInvocationAction(CheckWrapper check, Action<BuildCheckDataContext<TaskInvocationCheckData>> taskInvocationAction)
8594
=> RegisterAction(check, taskInvocationAction, _globalCallbacks.TaskInvocationActions);
8695

@@ -134,13 +143,23 @@ internal void RunEvaluatedPropertiesActions(
134143
=> RunRegisteredActions(_globalCallbacks.EvaluatedPropertiesActions, evaluatedPropertiesCheckData, checkContext, resultHandler);
135144

136145
internal void RunParsedItemsActions(
146+
#pragma warning disable CS0618 // Type or member is obsolete
137147
ParsedItemsCheckData parsedItemsCheckData,
148+
#pragma warning restore CS0618 // Type or member is obsolete
138149
ICheckContext checkContext,
139150
Action<CheckWrapper, ICheckContext, CheckConfigurationEffective[], BuildCheckResult>
140151
resultHandler)
141152
=> RunRegisteredActions(_globalCallbacks.ParsedItemsActions, parsedItemsCheckData,
142153
checkContext, resultHandler);
143154

155+
internal void RunEvaluatedItemsActions(
156+
EvaluatedItemsCheckData evaluatedItemsCheckData,
157+
ICheckContext checkContext,
158+
Action<CheckWrapper, ICheckContext, CheckConfigurationEffective[], BuildCheckResult>
159+
resultHandler)
160+
=> RunRegisteredActions(_globalCallbacks.EvaluatedItemsActions, evaluatedItemsCheckData,
161+
checkContext, resultHandler);
162+
144163
internal void RunTaskInvocationActions(
145164
TaskInvocationCheckData taskInvocationCheckData,
146165
ICheckContext checkContext,

src/Build/BuildCheck/Infrastructure/BuildEventsProcessor.cs

+4
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,17 @@ internal void ProcessEvaluationFinishedEventArgs(
7777
evaluationFinishedEventArgs.ProjectFile!, /*unused*/
7878
null, /*unused*/null, _cache, false /*Not explicitly loaded - unused*/);
7979

80+
#pragma warning disable CS0618 // Type or member is obsolete
8081
ParsedItemsCheckData itemsCheckData = new(
82+
#pragma warning restore CS0618 // Type or member is obsolete
8183
evaluationFinishedEventArgs.ProjectFile!,
8284
evaluationFinishedEventArgs.BuildEventContext?.ProjectInstanceId,
8385
new ItemsHolder(xml.Items, xml.ItemGroups));
8486

8587
_buildCheckCentralContext.RunParsedItemsActions(itemsCheckData, checkContext, ReportResult);
8688
}
89+
90+
_buildCheckCentralContext.RunEvaluatedItemsActions(new EvaluatedItemsCheckData(evaluationFinishedEventArgs), checkContext, ReportResult);
8791
}
8892

8993
/// <summary>

src/Build/BuildCheck/Infrastructure/CheckRegistrationContext.cs

+5
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ public void RegisterEnvironmentVariableReadAction(Action<BuildCheckDataContext<E
1515
public void RegisterEvaluatedPropertiesAction(Action<BuildCheckDataContext<EvaluatedPropertiesCheckData>> evaluatedPropertiesAction) =>
1616
buildCheckCentralContext.RegisterEvaluatedPropertiesAction(checkWrapper, evaluatedPropertiesAction);
1717

18+
#pragma warning disable CS0618 // Type or member is obsolete
1819
public void RegisterParsedItemsAction(Action<BuildCheckDataContext<ParsedItemsCheckData>> parsedItemsAction) =>
20+
#pragma warning restore CS0618 // Type or member is obsolete
1921
buildCheckCentralContext.RegisterParsedItemsAction(checkWrapper, parsedItemsAction);
2022

23+
public void RegisterEvaluatedItemsAction(Action<BuildCheckDataContext<EvaluatedItemsCheckData>> evaluatedItemsAction) =>
24+
buildCheckCentralContext.RegisterEvaluatedItemsAction(checkWrapper, evaluatedItemsAction);
25+
2126
public void RegisterTaskInvocationAction(Action<BuildCheckDataContext<TaskInvocationCheckData>> taskInvocationAction) =>
2227
buildCheckCentralContext.RegisterTaskInvocationAction(checkWrapper, taskInvocationAction);
2328

src/Build/BuildCheck/OM/ParsedItemsCheckData.cs

+30-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Microsoft.Build.Collections;
88
using Microsoft.Build.Construction;
99
using Microsoft.Build.Framework;
10+
using Microsoft.Build.Logging;
1011

1112
namespace Microsoft.Build.Experimental.BuildCheck;
1213

@@ -40,9 +41,11 @@ public IEnumerable<ProjectItemElement> GetItemsOfType(string itemType)
4041
}
4142

4243
/// <summary>
43-
/// BuildCheck OM data representing the evaluated items of a project.
44+
/// BuildCheck OM data representing the evaluated items of a project - but only those defined within the project!.
45+
/// No explicit nor implicit imports are regarded. If you are looking the get all evaluated items - use <see cref="EvaluatedItemsCheckData"/>
4446
/// </summary>
45-
public class ParsedItemsCheckData : CheckData
47+
[Obsolete("Use EvaluatedItemsData for access to evaluated items.", false)]
48+
public sealed class ParsedItemsCheckData : CheckData
4649
{
4750
internal ParsedItemsCheckData(
4851
string projectFilePath,
@@ -53,6 +56,31 @@ internal ParsedItemsCheckData(
5356
public ItemsHolder ItemsHolder { get; }
5457
}
5558

59+
/// <summary>
60+
/// BuildCheck OM data representing the evaluated items of a project.
61+
/// </summary>
62+
public sealed class EvaluatedItemsCheckData : CheckData
63+
{
64+
internal EvaluatedItemsCheckData(
65+
ProjectEvaluationFinishedEventArgs evaluationFinishedEventArgs)
66+
: base(evaluationFinishedEventArgs.ProjectFile!, evaluationFinishedEventArgs.BuildEventContext?.ProjectInstanceId)
67+
{
68+
_evaluationFinishedEventArgs = evaluationFinishedEventArgs;
69+
}
70+
71+
private readonly ProjectEvaluationFinishedEventArgs _evaluationFinishedEventArgs;
72+
73+
/// <summary>
74+
/// Lazy enumerates evaluated items for a current project.
75+
/// </summary>
76+
public IEnumerable<ItemData> EvaluatedItems => _evaluationFinishedEventArgs.EnumerateItems();
77+
78+
/// <summary>
79+
/// Lazy enumerates evaluated items for a current project. Only items with matching type will be returned (case-insensitive, MSBuild valid names only).
80+
/// </summary>
81+
public IEnumerable<ItemData> EnumerateItemsOfType(string typeName) => _evaluationFinishedEventArgs.EnumerateItemsOfType(typeName);
82+
}
83+
5684
/// <summary>
5785
/// BuildCheck OM data representing a task executed by a project.
5886
/// </summary>

src/Build/CompatibilitySuppressions.xml

+21
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,41 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<!-- https://learn.microsoft.com/dotnet/fundamentals/package-validation/diagnostic-ids -->
33
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
4+
<Suppression>
5+
<DiagnosticId>CP0006</DiagnosticId>
6+
<Target>M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterEvaluatedItemsAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.EvaluatedItemsCheckData}})</Target>
7+
<Left>lib/net472/Microsoft.Build.dll</Left>
8+
<Right>lib/net472/Microsoft.Build.dll</Right>
9+
<IsBaselineSuppression>true</IsBaselineSuppression>
10+
</Suppression>
411
<Suppression>
512
<DiagnosticId>CP0006</DiagnosticId>
613
<Target>M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterProjectImportedAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.ProjectImportedCheckData}})</Target>
714
<Left>lib/net472/Microsoft.Build.dll</Left>
815
<Right>lib/net472/Microsoft.Build.dll</Right>
916
<IsBaselineSuppression>true</IsBaselineSuppression>
1017
</Suppression>
18+
<Suppression>
19+
<DiagnosticId>CP0006</DiagnosticId>
20+
<Target>M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterEvaluatedItemsAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.EvaluatedItemsCheckData}})</Target>
21+
<Left>lib/net9.0/Microsoft.Build.dll</Left>
22+
<Right>lib/net9.0/Microsoft.Build.dll</Right>
23+
<IsBaselineSuppression>true</IsBaselineSuppression>
24+
</Suppression>
1125
<Suppression>
1226
<DiagnosticId>CP0006</DiagnosticId>
1327
<Target>M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterProjectImportedAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.ProjectImportedCheckData}})</Target>
1428
<Left>lib/net9.0/Microsoft.Build.dll</Left>
1529
<Right>lib/net9.0/Microsoft.Build.dll</Right>
1630
<IsBaselineSuppression>true</IsBaselineSuppression>
1731
</Suppression>
32+
<Suppression>
33+
<DiagnosticId>CP0006</DiagnosticId>
34+
<Target>M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterEvaluatedItemsAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.EvaluatedItemsCheckData}})</Target>
35+
<Left>ref/net9.0/Microsoft.Build.dll</Left>
36+
<Right>ref/net9.0/Microsoft.Build.dll</Right>
37+
<IsBaselineSuppression>true</IsBaselineSuppression>
38+
</Suppression>
1839
<Suppression>
1940
<DiagnosticId>CP0006</DiagnosticId>
2041
<Target>M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterProjectImportedAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.ProjectImportedCheckData}})</Target>

src/BuildCheck.UnitTests/MockBuildCheckRegistrationContext.cs

+3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ internal sealed class MockBuildCheckRegistrationContext : IBuildCheckRegistratio
1717

1818
public void RegisterEvaluatedPropertiesAction(Action<BuildCheckDataContext<EvaluatedPropertiesCheckData>> evaluatedPropertiesAction)
1919
=> _evaluatedPropertiesAction += evaluatedPropertiesAction;
20+
#pragma warning disable CS0618 // Type or member is obsolete
2021
public void RegisterParsedItemsAction(Action<BuildCheckDataContext<ParsedItemsCheckData>> parsedItemsAction) => throw new NotImplementedException();
22+
#pragma warning restore CS0618 // Type or member is obsolete
23+
public void RegisterEvaluatedItemsAction(Action<BuildCheckDataContext<EvaluatedItemsCheckData>> evaluatedItemsAction) => throw new NotImplementedException();
2124

2225
public void RegisterTaskInvocationAction(Action<BuildCheckDataContext<TaskInvocationCheckData>> taskInvocationAction)
2326
=> _taskInvocationAction += taskInvocationAction;

0 commit comments

Comments
 (0)