[XamlC] skip static .cctor while looking for default .ctor (#718)

This commit is contained in:
Stephane Delcroix 2017-01-28 00:32:45 +01:00 коммит произвёл E.Z. Hart
Родитель 5d8575b77c
Коммит 1d3e7cf380
4 изменённых файлов: 161 добавлений и 1 удалений

Просмотреть файл

@ -70,7 +70,7 @@ namespace Xamarin.Forms.Build.Tasks
if (typeConverter != null)
{
var isExtendedConverter = typeConverter.ImplementsInterface(module.Import(typeof (IExtendedTypeConverter)));
var typeConverterCtor = typeConverter.Resolve().Methods.Single(md => md.IsConstructor && md.Parameters.Count == 0);
var typeConverterCtor = typeConverter.Resolve().Methods.Single(md => md.IsConstructor && md.Parameters.Count == 0 && !md.IsStatic);
var typeConverterCtorRef = module.Import(typeConverterCtor);
var convertFromInvariantStringDefinition = isExtendedConverter
? module.Import(typeof (IExtendedTypeConverter))

Просмотреть файл

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Xamarin.Forms.Xaml.UnitTests"
x:Class="Xamarin.Forms.Xaml.UnitTests.Bz45299">
<local:Bz45299Control
BackgroundColor="Silver"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand" x:Name="ctrl">
<local:Bz45299Control.PortraitLayout>
<local:Bz45299OrientationLayout Count="3" Spacing="1" />
</local:Bz45299Control.PortraitLayout>
</local:Bz45299Control>
</ContentPage>

Просмотреть файл

@ -0,0 +1,140 @@
using System;
using System.Collections.Generic;
using NUnit.Framework;
using Xamarin.Forms;
using Xamarin.Forms.Core.UnitTests;
namespace Xamarin.Forms.Xaml.UnitTests
{
public class Bz45299Control : ContentView
{
public static readonly BindableProperty PortraitLayoutProperty =
BindableProperty.Create(nameof(PortraitLayout), typeof(Bz45299OrientationLayout), typeof(Bz45299Control));
public Bz45299OrientationLayout PortraitLayout {
get { return (Bz45299OrientationLayout)GetValue(PortraitLayoutProperty); }
set { this.SetValue(PortraitLayoutProperty, value); }
}
}
public class Bz45299OrientationLayout : BindableObject
{
public static readonly BindableProperty SizeProperty =
BindableProperty.Create(nameof(Size), typeof(Bz45299UISize), typeof(Bz45299OrientationLayout), Bz45299UISize.Zero);
public Bz45299UISize Size {
get { return (Bz45299UISize)GetValue(SizeProperty); }
set { SetValue(SizeProperty, value); }
}
public static readonly BindableProperty SpacingProperty =
BindableProperty.Create(nameof(Spacing), typeof(Bz45299UILength), typeof(Bz45299OrientationLayout), Bz45299UILength.Zero);
public Bz45299UILength Spacing {
get { return (Bz45299UILength)GetValue(SpacingProperty); }
set { SetValue(SpacingProperty, value); }
}
public static readonly BindableProperty CountProperty =
BindableProperty.Create(nameof(Count), typeof(int), typeof(Bz45299OrientationLayout), 1);
public int Count {
get { return (int)GetValue(CountProperty); }
set { SetValue(CountProperty, value); }
}
}
[TypeConverter(typeof(Bz45299UILengthTypeConverter))]
public class Bz45299UILength
{
public static Bz45299UILength Zero => new Bz45299UILength { Value = 0 };
public double Value { get; set; }
public static implicit operator string(Bz45299UILength uiLength) => uiLength.Value.ToString();
public static implicit operator double(Bz45299UILength uiLength) => uiLength.Value;
public static implicit operator Bz45299UILength(string value) => Zero;
public static implicit operator Bz45299UILength(long value) => Zero;
public static implicit operator Bz45299UILength(ulong value) => Zero;
public static implicit operator Bz45299UILength(int value) => Zero;
public static implicit operator Bz45299UILength(uint value) => Zero;
public static implicit operator Bz45299UILength(double value) => Zero;
public static implicit operator Bz45299UILength(float value) => Zero;
}
public class Bz45299UILengthTypeConverter : TypeConverter
{
static readonly Type StringType = typeof(string);
public override bool CanConvertFrom(Type sourceType)
{
if (sourceType != StringType)
return false;
return true;
}
public override object ConvertFromInvariantString(string value) => Bz45299UILength.Zero;
}
[TypeConverter(typeof(Bz45299UISizeTypeConverter))]
public class Bz45299UISize
{
public static Bz45299UISize Zero => new Bz45299UISize { Width = 0, Height = 0 };
public Bz45299UILength Width { get; set; }
public Bz45299UILength Height { get; set; }
public static implicit operator Bz45299UISize(string value) => Zero;
public static implicit operator Size(Bz45299UISize uiSize) => new Size(uiSize.Width, uiSize.Height);
public static implicit operator Bz45299UISize(Size size) => new Bz45299UISize { Width = size.Width, Height = size.Height };
}
public class Bz45299UISizeTypeConverter : TypeConverter
{
private static readonly Type StringType = typeof(string);
public override bool CanConvertFrom(Type sourceType)
{
if (sourceType != StringType)
return false;
return true;
}
public override object ConvertFromInvariantString(string value) => Bz45299UISize.Zero;
}
public partial class Bz45299 : ContentPage
{
public Bz45299()
{
InitializeComponent();
}
public Bz45299(bool useCompiledXaml)
{
//this stub will be replaced at compile time
}
[TestFixture]
class Tests
{
[SetUp]
public void Setup()
{
Device.PlatformServices = new MockPlatformServices();
}
[TearDown]
public void TearDown()
{
Device.PlatformServices = null;
}
[TestCase(true)]
[TestCase(false)]
public void XamlCCustomTypeConverter(bool useCompiledXaml)
{
var p = new Bz45299(useCompiledXaml);
Assert.AreEqual(0d, p.ctrl.PortraitLayout.Spacing.Value);
}
}
}
}

Просмотреть файл

@ -418,6 +418,9 @@
<Compile Include="Issues\Bz42531.xaml.cs">
<DependentUpon>Bz42531.xaml</DependentUpon>
</Compile>
<Compile Include="Issues\Bz45299.xaml.cs">
<DependentUpon>Bz45299.xaml</DependentUpon>
</Compile>
<Compile Include="Issues\Bz43733.xaml.cs">
<DependentUpon>Bz43733.xaml</DependentUpon>
</Compile>
@ -760,6 +763,9 @@
<EmbeddedResource Include="Issues\Bz42531.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Include="Issues\Bz45299.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Include="Issues\Bz43733.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>