Skip to content

Commit

Permalink
Merge pull request #2857 from icsharpcode/handle-logical-resource-names
Browse files Browse the repository at this point in the history
  • Loading branch information
siegfriedpammer authored Dec 3, 2022
2 parents 598bc2c + 7cb8e65 commit fb9b665
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@ interface IProjectFileWriter
/// </summary>
/// <param name="target">The target to write to.</param>
/// <param name="project">The information about the project being created.</param>
/// <param name="files">A collection of source files to be included into the project, each item is a pair
/// of the project entry type and the file path.</param>
/// <param name="files">A collection of source files to be included into the project.</param>
/// <param name="module">The module being decompiled.</param>
void Write(TextWriter target, IProjectInfoProvider project, IEnumerable<(string itemType, string fileName)> files, PEFile module);
void Write(TextWriter target, IProjectInfoProvider project, IEnumerable<ProjectItemInfo> files, PEFile module);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.Solution;
using ICSharpCode.Decompiler.Util;

namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
{
Expand All @@ -43,7 +44,7 @@ sealed class ProjectFileWriterDefault : IProjectFileWriter
public void Write(
TextWriter target,
IProjectInfoProvider project,
IEnumerable<(string itemType, string fileName)> files,
IEnumerable<ProjectItemInfo> files,
PEFile module)
{
const string ns = "http://schemas.microsoft.com/developer/msbuild/2003";
Expand Down Expand Up @@ -162,13 +163,18 @@ public void Write(
}
w.WriteEndElement(); // </ItemGroup> (References)

foreach (IGrouping<string, string> gr in from f in files group f.fileName by f.itemType into g orderby g.Key select g)
foreach (IGrouping<string, ProjectItemInfo> gr in files.GroupBy(f => f.ItemType).OrderBy(g => g.Key))
{
w.WriteStartElement("ItemGroup");
foreach (string file in gr.OrderBy(f => f, StringComparer.OrdinalIgnoreCase))
foreach (var item in gr.OrderBy(f => f.FileName, StringComparer.OrdinalIgnoreCase))
{
w.WriteStartElement(gr.Key);
w.WriteAttributeString("Include", file);
w.WriteAttributeString("Include", item.FileName);
if (item.AdditionalProperties != null)
{
foreach (var (key, value) in item.AdditionalProperties)
w.WriteAttributeString(key, value);
}
w.WriteEndElement();
}
w.WriteEndElement();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ enum ProjectType { Default, WinForms, Wpf, Web }
public void Write(
TextWriter target,
IProjectInfoProvider project,
IEnumerable<(string itemType, string fileName)> files,
IEnumerable<ProjectItemInfo> files,
PEFile module)
{
using (XmlTextWriter xmlWriter = new XmlTextWriter(target))
Expand All @@ -76,7 +76,7 @@ public void Write(
}
}

static void Write(XmlTextWriter xml, IProjectInfoProvider project, IEnumerable<(string itemType, string fileName)> files, PEFile module)
static void Write(XmlTextWriter xml, IProjectInfoProvider project, IEnumerable<ProjectItemInfo> files, PEFile module)
{
xml.WriteStartElement("Project");

Expand Down Expand Up @@ -188,27 +188,27 @@ static void WriteProjectInfo(XmlTextWriter xml, IProjectInfoProvider project)
}
}

static void WriteMiscellaneousPropertyGroup(XmlTextWriter xml, IEnumerable<(string itemType, string fileName)> files)
static void WriteMiscellaneousPropertyGroup(XmlTextWriter xml, IEnumerable<ProjectItemInfo> files)
{
var (itemType, fileName) = files.FirstOrDefault(t => t.itemType == "ApplicationIcon");
var (itemType, fileName) = files.FirstOrDefault(t => t.ItemType == "ApplicationIcon");
if (fileName != null)
xml.WriteElementString("ApplicationIcon", fileName);

(itemType, fileName) = files.FirstOrDefault(t => t.itemType == "ApplicationManifest");
(itemType, fileName) = files.FirstOrDefault(t => t.ItemType == "ApplicationManifest");
if (fileName != null)
xml.WriteElementString("ApplicationManifest", fileName);

if (files.Any(t => t.itemType == "EmbeddedResource"))
if (files.Any(t => t.ItemType == "EmbeddedResource"))
xml.WriteElementString("RootNamespace", string.Empty);
// TODO: We should add CustomToolNamespace for resources, otherwise we should add empty RootNamespace
}

static void WriteResources(XmlTextWriter xml, IEnumerable<(string itemType, string fileName)> files)
static void WriteResources(XmlTextWriter xml, IEnumerable<ProjectItemInfo> files)
{
// remove phase
foreach (var (itemType, fileName) in files.Where(t => t.itemType == "EmbeddedResource"))
foreach (var item in files.Where(t => t.ItemType == "EmbeddedResource"))
{
string buildAction = Path.GetExtension(fileName).ToUpperInvariant() switch {
string buildAction = Path.GetExtension(item.FileName).ToUpperInvariant() switch {
".CS" => "Compile",
".RESX" => "EmbeddedResource",
_ => "None"
Expand All @@ -217,18 +217,23 @@ static void WriteResources(XmlTextWriter xml, IEnumerable<(string itemType, stri
continue;

xml.WriteStartElement(buildAction);
xml.WriteAttributeString("Remove", fileName);
xml.WriteAttributeString("Remove", item.FileName);
xml.WriteEndElement();
}

// include phase
foreach (var (itemType, fileName) in files.Where(t => t.itemType == "EmbeddedResource"))
foreach (var item in files.Where(t => t.ItemType == "EmbeddedResource"))
{
if (Path.GetExtension(fileName) == ".resx")
if (Path.GetExtension(item.FileName) == ".resx")
continue;

xml.WriteStartElement("EmbeddedResource");
xml.WriteAttributeString("Include", fileName);
xml.WriteAttributeString("Include", item.FileName);
if (item.AdditionalProperties != null)
{
foreach (var (key, value) in item.AdditionalProperties)
xml.WriteAttributeString(key, value);
}
xml.WriteEndElement();
}
}
Expand Down
Loading

0 comments on commit fb9b665

Please sign in to comment.