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

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

@ -0,0 +1,35 @@ @@ -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 @@ @@ -74,6 +74,9 @@
<Page Include="Cases\Issue1435.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Cases\Issue1546.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Cases\Issue775.xaml">
<SubType>Designer</SubType>
</Page>

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

@ -38,7 +38,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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);

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

@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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);

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

@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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;
}

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

@ -38,7 +38,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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;

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

@ -40,10 +40,10 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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);

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

@ -30,7 +30,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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);

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

@ -43,7 +43,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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 { @@ -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;

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

@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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;

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

@ -45,7 +45,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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);
}

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

@ -42,7 +42,7 @@ namespace ILSpy.BamlDecompiler.Handlers { @@ -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);

2
ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs

@ -29,7 +29,7 @@ namespace ILSpy.BamlDecompiler.Rewrite { @@ -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 {

2
ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs

@ -59,7 +59,7 @@ namespace ILSpy.BamlDecompiler.Rewrite @@ -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;

2
ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs

@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Rewrite { @@ -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;

4
ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs

@ -48,11 +48,11 @@ namespace ILSpy.BamlDecompiler.Rewrite { @@ -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));

14
ILSpy.BamlDecompiler/XamlContext.cs

@ -164,6 +164,10 @@ namespace ILSpy.BamlDecompiler { @@ -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 { @@ -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;

Loading…
Cancel
Save