Browse Source

Fix #1546: Fix PresentationOptionsAttributeHandler

pull/1556/head
Siegfried Pammer 6 years ago
parent
commit
49586c77cb
  1. 6
      ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs
  2. 35
      ILSpy.BamlDecompiler.Tests/Cases/Issue1546.xaml
  3. 3
      ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj
  4. 2
      ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs
  5. 2
      ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs
  6. 2
      ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs
  7. 2
      ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs
  8. 4
      ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs
  9. 2
      ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs
  10. 4
      ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs
  11. 2
      ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs
  12. 2
      ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs
  13. 2
      ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs
  14. 2
      ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs
  15. 2
      ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs
  16. 2
      ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs
  17. 4
      ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs
  18. 14
      ILSpy.BamlDecompiler/XamlContext.cs

6
ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs

@ -107,6 +107,12 @@ namespace ILSpy.BamlDecompiler.Tests
RunTest("cases/issue1435"); RunTest("cases/issue1435");
} }
[Test]
public void Issue1546()
{
RunTest("cases/issue1546");
}
#region RunTest #region RunTest
void RunTest(string name) void RunTest(string name)
{ {

35
ILSpy.BamlDecompiler.Tests/Cases/Issue1546.xaml

@ -0,0 +1,35 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:System="clr-namespace:System;assembly=mscorlib">
<SolidColorBrush x:Key="brushText">#f1f1f1</SolidColorBrush>
<SolidColorBrush x:Key="brushNormal">#2d2d30</SolidColorBrush>
<SolidColorBrush x:Key="brushFocused">#3f3f41</SolidColorBrush>
<SolidColorBrush x:Key="brushHighlight">#007acc</SolidColorBrush>
<SolidColorBrush x:Key="brushControlBackground">#333337</SolidColorBrush>
<SolidColorBrush x:Key="brushControlInactiveBorder">#3f3f3f</SolidColorBrush>
<SolidColorBrush x:Key="brushControlInactiveText">#999999</SolidColorBrush>
<SolidColorBrush x:Key="brushControlActive">#686868</SolidColorBrush>
<SolidColorBrush x:Key="brushControlActiveBorder">#9e9e9e</SolidColorBrush>
<Color x:Key="colorText">#f1f1f1</Color>
<Color x:Key="colorNormal">#2d2d30</Color>
<Color x:Key="colorFocused">#3f3f41</Color>
<Color x:Key="colorRED">#b20000</Color>
<Color x:Key="colorRED2">#990000</Color>
<Color x:Key="colorGREEN">#009700</Color>
<Color x:Key="colorGREEN2">#007400</Color>
<Color x:Key="colorHover">#1c97ea</Color>
<Color x:Key="colorHighlight">#007acc</Color>
<Color x:Key="colorControlBackground">#333337</Color>
<Color x:Key="colorControlInactiveBorder">#3f3f3f</Color>
<Color x:Key="colorControlInactiveText">#999999</Color>
<Color x:Key="colorControlActive">#686868</Color>
<Color x:Key="colorControlActiveBorder">#9e9e9e</Color>
<SolidColorBrush x:Key="ComboBoxNormalBorderBrush" Color="#e3e9ef" />
<SolidColorBrush x:Key="ComboBoxNormalBackgroundBrush" Color="#fff" />
<SolidColorBrush x:Key="ComboBoxDisabledForegroundBrush" Color="#888" />
<SolidColorBrush x:Key="ComboBoxDisabledBackgroundBrush" Color="#eee" />
<SolidColorBrush x:Key="ComboBoxDisabledBorderBrush" Color="#888" />
<Color x:Key="GrayLightExColorKey">#FFD1D1D1</Color>
<SolidColorBrush x:Key="GrayLightExColorSolidKey" PresentationOptions:Freeze="true" Color="{StaticResource GrayLightExColorKey}" />
<Color x:Key="GrayLightColorKey">#FFA3A3A3</Color>
<SolidColorBrush x:Key="GrayLightColorSolidKey" PresentationOptions:Freeze="true" Color="{StaticResource GrayLightColorKey}" />
<Color x:Key="GrayColorKey">#FF747474</Color>
</ResourceDictionary>

3
ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj

@ -74,6 +74,9 @@
<Page Include="Cases\Issue1435.xaml"> <Page Include="Cases\Issue1435.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="Cases\Issue1546.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Cases\Issue775.xaml"> <Page Include="Cases\Issue775.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Page> </Page>

2
ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs

@ -38,7 +38,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
var key = (XamlResourceKey)node.Annotation; var key = (XamlResourceKey)node.Annotation;
var bamlElem = new BamlElement(node); 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); parent.Xaml.Element.Add(bamlElem.Xaml.Element);
key.KeyElement = bamlElem; key.KeyElement = bamlElem;
base.Translate(ctx, node, bamlElem); base.Translate(ctx, node, bamlElem);

2
ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs

@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
public BamlElement Translate(XamlContext ctx, BamlNode node, BamlElement parent) { public BamlElement Translate(XamlContext ctx, BamlNode node, BamlElement parent) {
var record = (ConstructorParameterTypeRecord)((BamlRecordNode)node).Record; 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 elem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension
var bamlElem = new BamlElement(node); var bamlElem = new BamlElement(node);

2
ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs

@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
var record = (DefAttributeRecord)((BamlRecordNode)node).Record; var record = (DefAttributeRecord)((BamlRecordNode)node).Record;
var attrName = ctx.ResolveString(record.NameId); 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; return null;
} }

2
ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs

@ -38,7 +38,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
var key = (XamlResourceKey)node.Annotation; var key = (XamlResourceKey)node.Annotation;
var bamlElem = new BamlElement(node); 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); parent.Xaml.Element.Add(bamlElem.Xaml.Element);
bamlElem.Xaml.Element.Value = ctx.ResolveString(record.ValueId); bamlElem.Xaml.Element.Value = ctx.ResolveString(record.ValueId);
key.KeyElement = bamlElem; key.KeyElement = bamlElem;

4
ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs

@ -40,10 +40,10 @@ namespace ILSpy.BamlDecompiler.Handlers {
var key = (XamlResourceKey)node.Annotation; var key = (XamlResourceKey)node.Annotation;
var bamlElem = new BamlElement(node); 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); 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.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension
typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), typeName)); typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), typeName));
bamlElem.Xaml.Element.Add(typeElem); bamlElem.Xaml.Element.Add(typeElem);

2
ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs

@ -30,7 +30,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
public BamlElement Translate(XamlContext ctx, BamlNode node, BamlElement parent) { public BamlElement Translate(XamlContext ctx, BamlNode node, BamlElement parent) {
var record = (LiteralContentRecord)((BamlRecordNode)node).Record; 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); var content = XElement.Parse(record.Value);
elem.Add(content); elem.Add(content);

4
ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs

@ -43,7 +43,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
if (record.IsType) { if (record.IsType) {
var value = ctx.ResolveType(record.ValueId); 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.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension
typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), ctx.ToString(parent.Xaml, value))); typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), ctx.ToString(parent.Xaml, value)));
key = typeElem; key = typeElem;
@ -82,7 +82,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
attrName = ctx.ToString(parent.Xaml, xName); 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.AddAnnotation(ctx.ResolveType(0xfda6)); // Known type - StaticExtension
staticElem.Add(new XElement(ctx.GetPseudoName("Ctor"), attrName)); staticElem.Add(new XElement(ctx.GetPseudoName("Ctor"), attrName));
key = staticElem; key = staticElem;

2
ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs

@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
var record = (PresentationOptionsAttributeRecord)((BamlRecordNode)node).Record; var record = (PresentationOptionsAttributeRecord)((BamlRecordNode)node).Record;
var attrName = ctx.ResolveString(record.NameId); 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); parent.Xaml.Element.Add(attr);
return null; return null;

2
ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs

@ -45,7 +45,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
return new XAttribute(xamlProp.ToXName(ctx, parent.Xaml, true), value); return new XAttribute(xamlProp.ToXName(ctx, parent.Xaml, true), value);
if (xamlProp.PropertyName == "Name" && elemType.ResolvedType.GetDefinition()?.ParentModule.IsMainModule == true) 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); return new XAttribute(xamlProp.ToXName(ctx, parent.Xaml, false), value);
} }

2
ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs

@ -42,7 +42,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
elem.Xaml.Element.AddAnnotation(elemAttr); elem.Xaml.Element.AddAnnotation(elemAttr);
parent.Xaml.Element.Add(elem.Xaml.Element); 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.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension
typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), typeName)); typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), typeName));
elem.Xaml.Element.Add(typeElem); elem.Xaml.Element.Add(typeElem);

2
ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs

@ -29,7 +29,7 @@ namespace ILSpy.BamlDecompiler.Rewrite {
XName key; XName key;
public void Run(XamlContext ctx, XDocument document) { public void Run(XamlContext ctx, XDocument document) {
key = ctx.GetXamlNsName("Key"); key = ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml);
bool doWork; bool doWork;
do { do {

2
ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs

@ -59,7 +59,7 @@ namespace ILSpy.BamlDecompiler.Rewrite
{ {
var result = new List<(LongSet, EventRegistration[])>(); 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) if (xClass == null)
return result; return result;

2
ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs

@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Rewrite {
XName ctor; XName ctor;
public void Run(XamlContext ctx, XDocument document) { public void Run(XamlContext ctx, XDocument document) {
key = ctx.GetXamlNsName("Key"); key = ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml);
ctor = ctx.GetPseudoName("Ctor"); ctor = ctx.GetPseudoName("Ctor");
bool doWork; bool doWork;

4
ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs

@ -48,11 +48,11 @@ namespace ILSpy.BamlDecompiler.Rewrite {
elem.Name = xamlType.ToXName(ctx); 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(); var attrs = elem.Attributes().ToList();
if (typeDef.Accessibility != ICSharpCode.Decompiler.TypeSystem.Accessibility.Public) { 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(classModifierName, "internal"));
} }
attrs.Insert(0, new XAttribute(attrName, type.ResolvedType.FullName)); attrs.Insert(0, new XAttribute(attrName, type.ResolvedType.FullName));

14
ILSpy.BamlDecompiler/XamlContext.cs

@ -164,6 +164,10 @@ namespace ILSpy.BamlDecompiler {
return ns; 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) { public string TryGetXmlNamespace(IModule assembly, string typeNamespace) {
if (assembly == null) if (assembly == null)
return null; return null;
@ -184,16 +188,16 @@ namespace ILSpy.BamlDecompiler {
possibleXmlNs.Add(xmlNs); possibleXmlNs.Add(xmlNs);
} }
if (possibleXmlNs.Contains("http://schemas.microsoft.com/winfx/2006/xaml/presentation")) if (possibleXmlNs.Contains(KnownNamespace_Presentation))
return "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; return KnownNamespace_Presentation;
return possibleXmlNs.FirstOrDefault(); return possibleXmlNs.FirstOrDefault();
} }
public XName GetXamlNsName(string name, XElement elem = null) { public XName GetKnownNamespace(string name, string xmlNamespace, XElement context = null) {
var xNs = GetXmlNamespace("http://schemas.microsoft.com/winfx/2006/xaml"); var xNs = GetXmlNamespace(xmlNamespace);
XName xName; XName xName;
if (elem != null && xNs == elem.GetDefaultNamespace()) if (context != null && xNs == context.GetDefaultNamespace())
xName = name; xName = name;
else else
xName = xNs + name; xName = xNs + name;

Loading…
Cancel
Save