Skip to content

Commit 4989625

Browse files
authored
Revert "ResolveAssemblyReference CPU optimizations (#8916)" (#9037)
This reverts commit 1ff019a. Fixes # VS Insertion, C++ Project System - PR: VC.ProjectSystem.VCProject.CachedProjectAutomation fails since these changes. https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_git/VS/pullRequest/483186#1689247828 So far I know the problem is in 1ff019a#diff-20c3f77300d596d35264f7f9351652e233cb3455c3f7a7262df4842d437fe8efR1407-R1414 but let's revert for now to unblock insertions. Thank you!
1 parent efc6bcf commit 4989625

File tree

8 files changed

+38
-154
lines changed

8 files changed

+38
-154
lines changed

src/Build.OM.UnitTests/Instance/ProjectItemInstance_Tests.cs

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -95,49 +95,6 @@ public void AccessorsWithMetadata()
9595
Assert.Equal("v2", item.GetMetadataValue("m2"));
9696
}
9797

98-
/// <summary>
99-
/// Basic ProjectItemInstance with metadata added using ImportMetadata
100-
/// </summary>
101-
[Fact]
102-
public void AccessorsWithImportedMetadata()
103-
{
104-
ProjectItemInstance item = GetItemInstance();
105-
106-
((IMetadataContainer)item).ImportMetadata(new Dictionary<string, string>
107-
{
108-
{ "m1", "v1" },
109-
{ "m2", "v2" },
110-
});
111-
112-
Assert.Equal("m1", item.GetMetadata("m1").Name);
113-
Assert.Equal("m2", item.GetMetadata("m2").Name);
114-
Assert.Equal("v1", item.GetMetadataValue("m1"));
115-
Assert.Equal("v2", item.GetMetadataValue("m2"));
116-
}
117-
118-
/// <summary>
119-
/// ImportMetadata adds and overwrites metadata, does not delete existing metadata
120-
/// </summary>
121-
[Fact]
122-
public void ImportMetadataAddsAndOverwrites()
123-
{
124-
ProjectItemInstance item = GetItemInstance();
125-
126-
item.SetMetadata("m1", "v1");
127-
item.SetMetadata("m2", "v0");
128-
129-
((IMetadataContainer) item).ImportMetadata(new Dictionary<string, string>
130-
{
131-
{ "m2", "v2" },
132-
{ "m3", "v3" },
133-
});
134-
135-
// m1 was not deleted, m2 was overwritten, m3 was added
136-
Assert.Equal("v1", item.GetMetadataValue("m1"));
137-
Assert.Equal("v2", item.GetMetadataValue("m2"));
138-
Assert.Equal("v3", item.GetMetadataValue("m3"));
139-
}
140-
14198
/// <summary>
14299
/// Get metadata not present
143100
/// </summary>

src/Build/Instance/ProjectItemInstance.cs

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -521,8 +521,6 @@ IDictionary ITaskItem2.CloneCustomMetadataEscaped()
521521

522522
IEnumerable<KeyValuePair<string, string>> IMetadataContainer.EnumerateMetadata() => _taskItem.EnumerateMetadata();
523523

524-
void IMetadataContainer.ImportMetadata(IEnumerable<KeyValuePair<string, string>> metadata) => _taskItem.ImportMetadata(metadata);
525-
526524
#region IMetadataTable Members
527525

528526
/// <summary>
@@ -1036,19 +1034,6 @@ public IEnumerable<KeyValuePair<string, string>> EnumerateMetadata()
10361034
}
10371035
}
10381036

1039-
/// <summary>
1040-
/// Sets the given metadata.
1041-
/// Equivalent to calling <see cref="SetMetadata(string,string)"/> for each item in <paramref name="metadata"/>.
1042-
/// </summary>
1043-
/// <param name="metadata">The metadata to set.</param>
1044-
public void ImportMetadata(IEnumerable<KeyValuePair<string, string>> metadata)
1045-
{
1046-
ProjectInstance.VerifyThrowNotImmutable(_isImmutable);
1047-
1048-
_directMetadata ??= new CopyOnWritePropertyDictionary<ProjectMetadataInstance>();
1049-
_directMetadata.ImportProperties(metadata.Select(kvp => new ProjectMetadataInstance(kvp.Key, kvp.Value, allowItemSpecModifiers: true)));
1050-
}
1051-
10521037
/// <summary>
10531038
/// Used to return metadata from another AppDomain. Can't use yield return because the
10541039
/// generated state machine is not marked as [Serializable], so we need to allocate.
@@ -1386,7 +1371,9 @@ public void CopyMetadataTo(ITaskItem destinationItem, bool addOriginalItemSpec)
13861371
originalItemSpec = destinationItem.GetMetadata("OriginalItemSpec");
13871372
}
13881373

1389-
if (destinationItem is TaskItem destinationAsTaskItem && destinationAsTaskItem._directMetadata == null)
1374+
TaskItem destinationAsTaskItem = destinationItem as TaskItem;
1375+
1376+
if (destinationAsTaskItem != null && destinationAsTaskItem._directMetadata == null)
13901377
{
13911378
ProjectInstance.VerifyThrowNotImmutable(destinationAsTaskItem._isImmutable);
13921379

@@ -1404,14 +1391,6 @@ public void CopyMetadataTo(ITaskItem destinationItem, bool addOriginalItemSpec)
14041391
destinationAsTaskItem._itemDefinitions.AddRange(_itemDefinitions);
14051392
}
14061393
}
1407-
else if (destinationItem is IMetadataContainer destinationItemAsMetadataContainer)
1408-
{
1409-
// The destination implements IMetadataContainer so we can use the ImportMetadata bulk-set operation.
1410-
IEnumerable<ProjectMetadataInstance> metadataEnumerable = MetadataCollection;
1411-
destinationItemAsMetadataContainer.ImportMetadata(metadataEnumerable
1412-
.Where(metadatum => string.IsNullOrEmpty(destinationItem.GetMetadata(metadatum.Name)))
1413-
.Select(metadatum => new KeyValuePair<string, string>(metadatum.Name, GetMetadataEscaped(metadatum.Name))));
1414-
}
14151394
else
14161395
{
14171396
// OK, most likely the destination item was a Microsoft.Build.Utilities.TaskItem.

src/Framework/IMetadataContainer.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,5 @@ internal interface IMetadataContainer
2020
/// in the binary logger.
2121
/// </summary>
2222
IEnumerable<KeyValuePair<string, string>> EnumerateMetadata();
23-
24-
/// <summary>
25-
/// Sets the given metadata. The operation is equivalent to calling
26-
/// <see cref="ITaskItem.SetMetadata"/> on all metadata, but takes
27-
/// advantage of a faster bulk-set operation where applicable. The
28-
/// implementation may not perform the same parameter validation
29-
/// as SetMetadata.
30-
/// </summary>
31-
/// <param name="metadata">The metadata to set. The keys are assumed
32-
/// to be unique and values are assumed to be escaped.
33-
/// </param>
34-
void ImportMetadata(IEnumerable<KeyValuePair<string, string>> metadata);
3523
}
3624
}

src/Framework/TaskItemData.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ public TaskItemData(ITaskItem original)
4949

5050
IEnumerable<KeyValuePair<string, string>> IMetadataContainer.EnumerateMetadata() => Metadata;
5151

52-
void IMetadataContainer.ImportMetadata(IEnumerable<KeyValuePair<string, string>> metadata)
53-
=> throw new InvalidOperationException($"{nameof(TaskItemData)} does not support write operations");
54-
5552
public int MetadataCount => Metadata.Count;
5653

5754
public ICollection MetadataNames => (ICollection)Metadata.Keys;

src/Shared/TaskParameter.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -856,14 +856,6 @@ private IEnumerable<KeyValuePair<string, string>> EnumerateMetadataLazy()
856856
yield return unescaped;
857857
}
858858
}
859-
860-
public void ImportMetadata(IEnumerable<KeyValuePair<string, string>> metadata)
861-
{
862-
foreach (KeyValuePair<string, string> kvp in metadata)
863-
{
864-
SetMetadata(kvp.Key, kvp.Value);
865-
}
866-
}
867859
}
868860
}
869861
}

src/Tasks/AssemblyDependency/ReferenceTable.cs

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,8 @@ private static AssemblyNameExtension GetAssemblyNameFromItemMetadata(ITaskItem i
852852
name = item.GetMetadata(FileUtilities.ItemSpecModifiers.Filename);
853853
}
854854

855-
return new AssemblyNameExtension($"{name}, Version={version}, Culture=neutral, PublicKeyToken={publicKeyToken}");
855+
AssemblyName assemblyName = new AssemblyName($"{name}, Version={version}, Culture=neutral, PublicKeyToken={publicKeyToken}");
856+
return new AssemblyNameExtension(assemblyName);
856857
}
857858

858859
/// <summary>
@@ -2676,9 +2677,36 @@ private ITaskItem SetItemMetadata(List<ITaskItem> relatedItems, List<ITaskItem>
26762677
// Set up the main item.
26772678
TaskItem referenceItem = new TaskItem();
26782679
referenceItem.ItemSpec = reference.FullPath;
2680+
referenceItem.SetMetadata(ItemMetadataNames.resolvedFrom, reference.ResolvedSearchPath);
26792681

2680-
IMetadataContainer referenceItemAsMetadataContainer = referenceItem;
2681-
referenceItemAsMetadataContainer.ImportMetadata(EnumerateCommonMetadata());
2682+
// Set the CopyLocal metadata.
2683+
referenceItem.SetMetadata(ItemMetadataNames.copyLocal, reference.IsCopyLocal ? "true" : "false");
2684+
2685+
// Set the Redist name metadata.
2686+
if (!String.IsNullOrEmpty(reference.RedistName))
2687+
{
2688+
referenceItem.SetMetadata(ItemMetadataNames.redist, reference.RedistName);
2689+
}
2690+
2691+
if (Reference.IsFrameworkFile(reference.FullPath, _frameworkPaths) || (_installedAssemblies?.FrameworkAssemblyEntryInRedist(assemblyName) == true))
2692+
{
2693+
if (!IsAssemblyRemovedFromDotNetFramework(assemblyName, reference.FullPath, _frameworkPaths, _installedAssemblies))
2694+
{
2695+
referenceItem.SetMetadata(ItemMetadataNames.frameworkFile, "true");
2696+
}
2697+
}
2698+
2699+
if (!String.IsNullOrEmpty(reference.ImageRuntime))
2700+
{
2701+
referenceItem.SetMetadata(ItemMetadataNames.imageRuntime, reference.ImageRuntime);
2702+
}
2703+
2704+
// The redist root is "null" when there was no IsRedistRoot flag in the Redist XML
2705+
// (or there was no redist XML at all for this item).
2706+
if (reference.IsRedistRoot != null)
2707+
{
2708+
referenceItem.SetMetadata(ItemMetadataNames.isRedistRoot, (bool)reference.IsRedistRoot ? "true" : "false");
2709+
}
26822710

26832711
// If there was a primary source item, then forward metadata from it.
26842712
// It's important that the metadata from the primary source item
@@ -2852,45 +2880,13 @@ private ITaskItem SetItemMetadata(List<ITaskItem> relatedItems, List<ITaskItem>
28522880
// nonForwardableMetadata should be null here if relatedFileExtensions, satellites, serializationAssemblyFiles, and scatterFiles were all empty.
28532881
if (nonForwardableMetadata != null)
28542882
{
2855-
referenceItemAsMetadataContainer.ImportMetadata(nonForwardableMetadata);
2856-
}
2857-
2858-
return referenceItem;
2859-
2860-
// Enumerate common metadata with an iterator to allow using a more efficient bulk-set operation.
2861-
IEnumerable<KeyValuePair<string, string>> EnumerateCommonMetadata()
2862-
{
2863-
yield return new KeyValuePair<string, string>(ItemMetadataNames.resolvedFrom, reference.ResolvedSearchPath);
2864-
2865-
// Set the CopyLocal metadata.
2866-
yield return new KeyValuePair<string, string>(ItemMetadataNames.copyLocal, reference.IsCopyLocal ? "true" : "false");
2867-
2868-
// Set the Redist name metadata.
2869-
if (!string.IsNullOrEmpty(reference.RedistName))
2883+
foreach (KeyValuePair<string, string> kvp in nonForwardableMetadata)
28702884
{
2871-
yield return new KeyValuePair<string, string>(ItemMetadataNames.redist, reference.RedistName);
2872-
}
2873-
2874-
if (Reference.IsFrameworkFile(reference.FullPath, _frameworkPaths) || (_installedAssemblies?.FrameworkAssemblyEntryInRedist(assemblyName) == true))
2875-
{
2876-
if (!IsAssemblyRemovedFromDotNetFramework(assemblyName, reference.FullPath, _frameworkPaths, _installedAssemblies))
2877-
{
2878-
yield return new KeyValuePair<string, string>(ItemMetadataNames.frameworkFile, "true");
2879-
}
2880-
}
2881-
2882-
if (!string.IsNullOrEmpty(reference.ImageRuntime))
2883-
{
2884-
yield return new KeyValuePair<string, string>(ItemMetadataNames.imageRuntime, reference.ImageRuntime);
2885-
}
2886-
2887-
// The redist root is "null" when there was no IsRedistRoot flag in the Redist XML
2888-
// (or there was no redist XML at all for this item).
2889-
if (reference.IsRedistRoot != null)
2890-
{
2891-
yield return new KeyValuePair<string, string>(ItemMetadataNames.isRedistRoot, (bool)reference.IsRedistRoot ? "true" : "false");
2885+
referenceItem.SetMetadata(kvp.Key, kvp.Value);
28922886
}
28932887
}
2888+
2889+
return referenceItem;
28942890
}
28952891

28962892
/// <summary>

src/Utilities.UnitTests/TaskItem_Tests.cs

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -324,25 +324,6 @@ public void SetNullMetadataValue()
324324
item.GetMetadata("m").ShouldBe(string.Empty);
325325
}
326326

327-
[Fact]
328-
public void ImplementsIMetadataContainer()
329-
{
330-
Dictionary<string, string> metadata = new()
331-
{
332-
{ "a", "a1" },
333-
{ "b", "b1" },
334-
};
335-
336-
TaskItem item = new TaskItem("foo");
337-
IMetadataContainer metadataContainer = (IMetadataContainer)item;
338-
339-
metadataContainer.ImportMetadata(metadata);
340-
341-
var actualMetadata = metadataContainer.EnumerateMetadata().OrderBy(metadata => metadata.Key).ToList();
342-
var expectedMetadata = metadata.OrderBy(metadata => metadata.Value).ToList();
343-
Assert.True(actualMetadata.SequenceEqual(expectedMetadata));
344-
}
345-
346327
#if FEATURE_APPDOMAIN
347328
/// <summary>
348329
/// Test that task items can be successfully constructed based on a task item from another appdomain.

src/Utilities/TaskItem.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -480,12 +480,6 @@ IEnumerable<KeyValuePair<string, string>> IMetadataContainer.EnumerateMetadata()
480480
return EnumerateMetadataLazy();
481481
}
482482

483-
void IMetadataContainer.ImportMetadata(IEnumerable<KeyValuePair<string, string>> metadata)
484-
{
485-
_metadata ??= new CopyOnWriteDictionary<string>(MSBuildNameIgnoreCaseComparer.Default);
486-
_metadata.SetItems(metadata.Select(kvp => new KeyValuePair<string, string>(kvp.Key, kvp.Value ?? string.Empty)));
487-
}
488-
489483
private IEnumerable<KeyValuePair<string, string>> EnumerateMetadataEager()
490484
{
491485
if (_metadata == null)

0 commit comments

Comments
 (0)