diff --git a/ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs b/ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs index be9039601..b5cb07263 100644 --- a/ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs +++ b/ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs @@ -107,6 +107,12 @@ namespace ILSpy.BamlDecompiler.Tests RunTest("cases/issue1435"); } + [Test] + public void Issue1546() + { + RunTest("cases/issue1546"); + } + #region RunTest void RunTest(string name) { diff --git a/ILSpy.BamlDecompiler.Tests/Cases/Issue1546.xaml b/ILSpy.BamlDecompiler.Tests/Cases/Issue1546.xaml new file mode 100644 index 000000000..c09ce5b77 --- /dev/null +++ b/ILSpy.BamlDecompiler.Tests/Cases/Issue1546.xaml @@ -0,0 +1,35 @@ + + #f1f1f1 + #2d2d30 + #3f3f41 + #007acc + #333337 + #3f3f3f + #999999 + #686868 + #9e9e9e + #f1f1f1 + #2d2d30 + #3f3f41 + #b20000 + #990000 + #009700 + #007400 + #1c97ea + #007acc + #333337 + #3f3f3f + #999999 + #686868 + #9e9e9e + + + + + + #FFD1D1D1 + + #FFA3A3A3 + + #FF747474 + \ No newline at end of file diff --git a/ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj b/ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj index 198bbe621..5971fd32c 100644 --- a/ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj +++ b/ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj @@ -74,6 +74,9 @@ MSBuild:Compile + + MSBuild:Compile + Designer diff --git a/ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs b/ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs index 12d0c22fe..f5844bd41 100644 --- a/ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs @@ -38,7 +38,7 @@ namespace ILSpy.BamlDecompiler.Handlers { var key = (XamlResourceKey)node.Annotation; var bamlElem = new BamlElement(node); - bamlElem.Xaml = new XElement(ctx.GetXamlNsName("Key", parent.Xaml)); + bamlElem.Xaml = new XElement(ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml, parent.Xaml)); parent.Xaml.Element.Add(bamlElem.Xaml.Element); key.KeyElement = bamlElem; base.Translate(ctx, node, bamlElem); diff --git a/ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs index 7bc103727..278586687 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs @@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers { public BamlElement Translate(XamlContext ctx, BamlNode node, BamlElement parent) { var record = (ConstructorParameterTypeRecord)((BamlRecordNode)node).Record; - var elem = new XElement(ctx.GetXamlNsName("TypeExtension", parent.Xaml)); + var elem = new XElement(ctx.GetKnownNamespace("TypeExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml)); elem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension var bamlElem = new BamlElement(node); diff --git a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs index 221c29aa3..8b141d002 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs @@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers { var record = (DefAttributeRecord)((BamlRecordNode)node).Record; var attrName = ctx.ResolveString(record.NameId); - parent.Xaml.Element.Add(new XAttribute(ctx.GetXamlNsName(attrName), record.Value)); + parent.Xaml.Element.Add(new XAttribute(ctx.GetKnownNamespace(attrName, XamlContext.KnownNamespace_Xaml), record.Value)); return null; } diff --git a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs index b92a5588a..0068ba4ac 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs @@ -38,7 +38,7 @@ namespace ILSpy.BamlDecompiler.Handlers { var key = (XamlResourceKey)node.Annotation; var bamlElem = new BamlElement(node); - bamlElem.Xaml = new XElement(ctx.GetXamlNsName("Key", parent.Xaml)); + bamlElem.Xaml = new XElement(ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml, parent.Xaml)); parent.Xaml.Element.Add(bamlElem.Xaml.Element); bamlElem.Xaml.Element.Value = ctx.ResolveString(record.ValueId); key.KeyElement = bamlElem; diff --git a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs index 0b45d8583..8b6080248 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs @@ -40,10 +40,10 @@ namespace ILSpy.BamlDecompiler.Handlers { var key = (XamlResourceKey)node.Annotation; var bamlElem = new BamlElement(node); - bamlElem.Xaml = new XElement(ctx.GetXamlNsName("Key", parent.Xaml)); + bamlElem.Xaml = new XElement(ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml, parent.Xaml)); parent.Xaml.Element.Add(bamlElem.Xaml.Element); - var typeElem = new XElement(ctx.GetXamlNsName("TypeExtension", parent.Xaml)); + var typeElem = new XElement(ctx.GetKnownNamespace("TypeExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml)); typeElem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), typeName)); bamlElem.Xaml.Element.Add(typeElem); diff --git a/ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs index d5b0e73aa..ab36554b4 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs @@ -30,7 +30,7 @@ namespace ILSpy.BamlDecompiler.Handlers { public BamlElement Translate(XamlContext ctx, BamlNode node, BamlElement parent) { var record = (LiteralContentRecord)((BamlRecordNode)node).Record; - var elem = new XElement(ctx.GetXamlNsName("XData", parent.Xaml)); + var elem = new XElement(ctx.GetKnownNamespace("XData", XamlContext.KnownNamespace_Xaml, parent.Xaml)); var content = XElement.Parse(record.Value); elem.Add(content); diff --git a/ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs index 64a54695b..463acedc2 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs @@ -43,7 +43,7 @@ namespace ILSpy.BamlDecompiler.Handlers { if (record.IsType) { var value = ctx.ResolveType(record.ValueId); - var typeElem = new XElement(ctx.GetXamlNsName("TypeExtension", parent.Xaml)); + var typeElem = new XElement(ctx.GetKnownNamespace("TypeExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml)); typeElem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), ctx.ToString(parent.Xaml, value))); key = typeElem; @@ -82,7 +82,7 @@ namespace ILSpy.BamlDecompiler.Handlers { attrName = ctx.ToString(parent.Xaml, xName); } - var staticElem = new XElement(ctx.GetXamlNsName("StaticExtension", parent.Xaml)); + var staticElem = new XElement(ctx.GetKnownNamespace("StaticExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml)); staticElem.AddAnnotation(ctx.ResolveType(0xfda6)); // Known type - StaticExtension staticElem.Add(new XElement(ctx.GetPseudoName("Ctor"), attrName)); key = staticElem; diff --git a/ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs index 01d648ef7..e0f3f728a 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs @@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers { var record = (PresentationOptionsAttributeRecord)((BamlRecordNode)node).Record; var attrName = ctx.ResolveString(record.NameId); - var attr = new XAttribute(ctx.GetXamlNsName(attrName, parent.Xaml), record.Value); + var attr = new XAttribute(ctx.GetKnownNamespace(attrName, XamlContext.KnownNamespace_PresentationOptions, parent.Xaml), record.Value); parent.Xaml.Element.Add(attr); return null; diff --git a/ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs index c084b76e6..822fc0627 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs @@ -45,7 +45,7 @@ namespace ILSpy.BamlDecompiler.Handlers { return new XAttribute(xamlProp.ToXName(ctx, parent.Xaml, true), value); if (xamlProp.PropertyName == "Name" && elemType.ResolvedType.GetDefinition()?.ParentModule.IsMainModule == true) - return new XAttribute(ctx.GetXamlNsName("Name"), value); + return new XAttribute(ctx.GetKnownNamespace("Name", XamlContext.KnownNamespace_Xaml), value); return new XAttribute(xamlProp.ToXName(ctx, parent.Xaml, false), value); } diff --git a/ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs index 45a94f91e..aa29642af 100644 --- a/ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs +++ b/ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs @@ -42,7 +42,7 @@ namespace ILSpy.BamlDecompiler.Handlers { elem.Xaml.Element.AddAnnotation(elemAttr); parent.Xaml.Element.Add(elem.Xaml.Element); - var typeElem = new XElement(ctx.GetXamlNsName("TypeExtension", parent.Xaml)); + var typeElem = new XElement(ctx.GetKnownNamespace("TypeExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml)); typeElem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), typeName)); elem.Xaml.Element.Add(typeElem); diff --git a/ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs b/ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs index b8e902119..a8c5ac22b 100644 --- a/ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs +++ b/ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs @@ -29,7 +29,7 @@ namespace ILSpy.BamlDecompiler.Rewrite { XName key; public void Run(XamlContext ctx, XDocument document) { - key = ctx.GetXamlNsName("Key"); + key = ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml); bool doWork; do { diff --git a/ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs b/ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs index fe2912ff9..82ab77302 100644 --- a/ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs +++ b/ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs @@ -59,7 +59,7 @@ namespace ILSpy.BamlDecompiler.Rewrite { var result = new List<(LongSet, EventRegistration[])>(); - var xClass = document.Root.Elements().First().Attribute(ctx.GetXamlNsName("Class")); + var xClass = document.Root.Elements().First().Attribute(ctx.GetKnownNamespace("Class", XamlContext.KnownNamespace_Xaml)); if (xClass == null) return result; diff --git a/ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs b/ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs index e05eee62e..e2411672f 100644 --- a/ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs +++ b/ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs @@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Rewrite { XName ctor; public void Run(XamlContext ctx, XDocument document) { - key = ctx.GetXamlNsName("Key"); + key = ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml); ctor = ctx.GetPseudoName("Ctor"); bool doWork; diff --git a/ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs b/ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs index 332454d17..2e2d25e59 100644 --- a/ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs +++ b/ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs @@ -48,11 +48,11 @@ namespace ILSpy.BamlDecompiler.Rewrite { elem.Name = xamlType.ToXName(ctx); - var attrName = ctx.GetXamlNsName("Class", elem); + var attrName = ctx.GetKnownNamespace("Class", XamlContext.KnownNamespace_Xaml, elem); var attrs = elem.Attributes().ToList(); if (typeDef.Accessibility != ICSharpCode.Decompiler.TypeSystem.Accessibility.Public) { - var classModifierName = ctx.GetXamlNsName("ClassModifier", elem); + var classModifierName = ctx.GetKnownNamespace("ClassModifier", XamlContext.KnownNamespace_Xaml, elem); attrs.Insert(0, new XAttribute(classModifierName, "internal")); } attrs.Insert(0, new XAttribute(attrName, type.ResolvedType.FullName)); diff --git a/ILSpy.BamlDecompiler/XamlContext.cs b/ILSpy.BamlDecompiler/XamlContext.cs index 6afe81eee..50063cf6e 100644 --- a/ILSpy.BamlDecompiler/XamlContext.cs +++ b/ILSpy.BamlDecompiler/XamlContext.cs @@ -164,6 +164,10 @@ namespace ILSpy.BamlDecompiler { return ns; } + public const string KnownNamespace_Xaml = "http://schemas.microsoft.com/winfx/2006/xaml"; + public const string KnownNamespace_Presentation = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; + public const string KnownNamespace_PresentationOptions = "http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"; + public string TryGetXmlNamespace(IModule assembly, string typeNamespace) { if (assembly == null) return null; @@ -184,16 +188,16 @@ namespace ILSpy.BamlDecompiler { possibleXmlNs.Add(xmlNs); } - if (possibleXmlNs.Contains("http://schemas.microsoft.com/winfx/2006/xaml/presentation")) - return "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; + if (possibleXmlNs.Contains(KnownNamespace_Presentation)) + return KnownNamespace_Presentation; return possibleXmlNs.FirstOrDefault(); } - public XName GetXamlNsName(string name, XElement elem = null) { - var xNs = GetXmlNamespace("http://schemas.microsoft.com/winfx/2006/xaml"); + public XName GetKnownNamespace(string name, string xmlNamespace, XElement context = null) { + var xNs = GetXmlNamespace(xmlNamespace); XName xName; - if (elem != null && xNs == elem.GetDefaultNamespace()) + if (context != null && xNs == context.GetDefaultNamespace()) xName = name; else xName = xNs + name;