in Sharpmake.Generators/VisualStudio/Vcxproj.cs [1234:1337]
private void GenerateFiltersFile(
IVcxprojGenerationContext context,
string filtersFileName,
IList<Tuple<string, List<Vcxproj.ProjectFile>>> allFileLists,
string relativeCopyDependenciesFileName,
Resolver resolver,
IList<string> generatedFiles,
IList<string> skipFiles
)
{
// write [].vcxproj.filters
var fileGenerator = new XmlFileGenerator(resolver);
using (fileGenerator.Declare("toolsVersion", context.DevelopmentEnvironmentsRange.MinDevEnv.GetVisualProjectToolsVersionString()))
{
fileGenerator.Write(Vcxproj.Template.Project.Filters.Begin);
}
HashSet<string> allFilters = new HashSet<string>();
foreach (var entry in allFileLists)
{
string type = entry.Item1;
var files = entry.Item2;
if (files.Count != 0)
{
using (fileGenerator.Declare("type", type))
{
// write include...
fileGenerator.Write(Vcxproj.Template.Project.ItemGroupBegin);
foreach (var file in files)
{
using (fileGenerator.Declare("file", file))
{
if (file.FilterPath.Length == 0)
{
fileGenerator.Write(Vcxproj.Template.Project.Filters.FileNoFilter);
}
else
{
fileGenerator.Write(Vcxproj.Template.Project.Filters.FileWithFilter);
allFilters.Add(file.FilterPath);
}
}
}
fileGenerator.Write(Vcxproj.Template.Project.ItemGroupEnd);
}
}
}
if (relativeCopyDependenciesFileName.Length > 0)
{
fileGenerator.Write(Vcxproj.Template.Project.ItemGroupBegin);
using (fileGenerator.Declare("fileName", relativeCopyDependenciesFileName))
{
fileGenerator.Write(Vcxproj.Template.Project.Filters.FileWithDependencyFilter);
}
fileGenerator.Write(Vcxproj.Template.Project.ItemGroupEnd);
}
// write filters...
if (allFilters.Count != 0)
{
List<string> allFiltersList = new List<string>();
// generate all possible parent filters
allFiltersList.AddRange(allFilters);
foreach (string filter in allFiltersList)
{
string[] parts = filter.Split(Util.WindowsSeparator);
string current = parts[0];
allFilters.Add(current);
for (int i = 1; i < parts.Length - 1; ++i)
{
current = current + Util.WindowsSeparator + parts[i];
allFilters.Add(current);
}
}
allFiltersList.Clear();
// sort filters
allFiltersList.AddRange(allFilters);
allFiltersList.Sort();
fileGenerator.Write(Vcxproj.Template.Project.ItemGroupBegin);
foreach (string filter in allFiltersList)
{
string guid = Util.BuildGuid(filter).ToString();
using (fileGenerator.Declare("name", filter))
using (fileGenerator.Declare("guid", guid))
fileGenerator.Write(Vcxproj.Template.Project.Filters.Filter);
}
fileGenerator.Write(Vcxproj.Template.Project.ItemGroupEnd);
}
fileGenerator.Write(Vcxproj.Template.Project.Filters.ProjectFiltersEnd);
// Write the project file
FileInfo projectFiltersFileInfo = new FileInfo(filtersFileName);
if (context.Builder.Context.WriteGeneratedFile(context.Project.GetType(), projectFiltersFileInfo, fileGenerator))
generatedFiles.Add(projectFiltersFileInfo.FullName);
else
skipFiles.Add(projectFiltersFileInfo.FullName);
}