1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#region Task TaskName="Flatten"
#region Using
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
#endregion
#region Comment
/////////////////////////////////////////////////////////////////////////////////////////////////
/// TASK Flatten
/////////////////////////////////////////////////////////////////////////////////////////////////
// Destructure items into a "flat" list of metadata. The output is a list of (Name, Value) pairs,
// each corresponding to one item metadata. Semi-colon-separated lists will also expand to many
// items in the output list, with the metadata name shared among them.
// Example:
// INPUT:
// <QtMoc>
// <InputFile>foo.h</InputFile>
// <IncludePath>C:\FOO;D:\BAR</IncludePath>
// </QtMoc>
// OUTPUT:
// <Result>
// <Name>InputFile</Name>
// <Value>foo.h</Value>
// </Result>
// <Result>
// <Name>IncludePath</Name>
// <Value>C:\FOO</Value>
// </Result>
// <Result>
// <Name>IncludePath</Name>
// <Value>D:\BAR</Value>
// </Result>
// Parameters:
// in ITaskItem[] Items: list of items to flatten
// in string[] Metadata: names of metadata to look for; omit to include all metadata
// out ITaskItem[] Result: list of metadata from all items
#endregion
namespace QtVsTools.QtMsBuild.Tasks
{
public static class Flatten
{
public static bool Execute(
#region Parameters
Microsoft.Build.Framework.ITaskItem[] Items,
out Microsoft.Build.Framework.ITaskItem[] Result,
System.String[] Metadata = null)
#endregion
{
#region Code
Result = new ITaskItem[] { };
var reserved = new HashSet<string>
{
"AccessedTime", "CreatedTime", "DefiningProjectDirectory",
"DefiningProjectExtension", "DefiningProjectFullPath", "DefiningProjectName",
"Directory", "Extension", "Filename", "FullPath", "Identity", "ModifiedTime",
"RecursiveDir", "RelativeDir", "RootDir"
};
if (Metadata == null)
Metadata = Array.Empty<string>();
var requestedNames = new HashSet<string>(Metadata.Where(x => !string.IsNullOrEmpty(x)));
var newItems = new List<ITaskItem>();
foreach (var item in Items) {
var itemName = item.ItemSpec;
var names = item.MetadataNames.Cast<string>().Where(x => !reserved.Contains(x)
&& (!requestedNames.Any() || requestedNames.Contains(x)));
foreach (string name in names) {
var values = item.GetMetadata(name).Split(';');
foreach (string value in values.Where(v => !string.IsNullOrEmpty(v))) {
newItems.Add(new TaskItem(string.Format("{0}={1}", name, value),
new Dictionary<string, string>
{
{ "Item", itemName },
{ "Name", name },
{ "Value", value }
}));
}
}
}
Result = newItems.ToArray();
#endregion
return true;
}
}
}
#endregion
|