, IProjectMetadataParent, IItemTypeDefinition
{
///
/// Project that this item definition lives in.
diff --git a/src/Build/Evaluation/Expander.cs b/src/Build/Evaluation/Expander.cs
index c76c6a47780..5ad7c2b13d0 100644
--- a/src/Build/Evaluation/Expander.cs
+++ b/src/Build/Evaluation/Expander.cs
@@ -88,6 +88,13 @@ internal enum ExpanderOptions
///
Truncate = 0x40,
+ ///
+ /// Issues build message if item references unqualified or qualified metadata odf self - as this can lead to unintended expansion and
+ /// cross-combination of other items.
+ /// More info: https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-batching#item-batching-on-self-referencing-metadata
+ ///
+ LogOnItemMetadataSelfReference = 0x80,
+
///
/// Expand only properties and then item lists
///
@@ -441,7 +448,7 @@ internal string ExpandIntoStringLeaveEscaped(string expression, ExpanderOptions
ErrorUtilities.VerifyThrowInternalNull(elementLocation, nameof(elementLocation));
- string result = MetadataExpander.ExpandMetadataLeaveEscaped(expression, _metadata, options, elementLocation);
+ string result = MetadataExpander.ExpandMetadataLeaveEscaped(expression, _metadata, options, elementLocation, loggingContext);
result = PropertyExpander.ExpandPropertiesLeaveEscaped(result, _properties, options, elementLocation, _usedUninitializedProperties, _fileSystem, loggingContext);
result = ItemExpander.ExpandItemVectorsIntoString(this, result, _items, options, elementLocation);
result = FileUtilities.MaybeAdjustFilePath(result);
@@ -871,8 +878,9 @@ private static class MetadataExpander
/// The metadata to be expanded.
/// Used to specify what to expand.
/// The location information for error reporting purposes.
+ /// The logging context for this operation.
/// The string with item metadata expanded in-place, escaped.
- internal static string ExpandMetadataLeaveEscaped(string expression, IMetadataTable metadata, ExpanderOptions options, IElementLocation elementLocation)
+ internal static string ExpandMetadataLeaveEscaped(string expression, IMetadataTable metadata, ExpanderOptions options, IElementLocation elementLocation, LoggingContext loggingContext = null)
{
try
{
@@ -896,7 +904,7 @@ internal static string ExpandMetadataLeaveEscaped(string expression, IMetadataTa
{
// if there are no item vectors in the string
// run a simpler Regex to find item metadata references
- MetadataMatchEvaluator matchEvaluator = new MetadataMatchEvaluator(metadata, options);
+ MetadataMatchEvaluator matchEvaluator = new MetadataMatchEvaluator(metadata, options, elementLocation, loggingContext);
result = RegularExpressions.ItemMetadataPattern.Value.Replace(expression, new MatchEvaluator(matchEvaluator.ExpandSingleMetadata));
}
else
@@ -915,7 +923,7 @@ internal static string ExpandMetadataLeaveEscaped(string expression, IMetadataTa
using SpanBasedStringBuilder finalResultBuilder = Strings.GetSpanBasedStringBuilder();
int start = 0;
- MetadataMatchEvaluator matchEvaluator = new MetadataMatchEvaluator(metadata, options);
+ MetadataMatchEvaluator matchEvaluator = new MetadataMatchEvaluator(metadata, options, elementLocation, loggingContext);
if (itemVectorExpressions != null)
{
@@ -993,13 +1001,23 @@ private class MetadataMatchEvaluator
///