From 76f9c8fdc5831c4571147cf098b082741ea49f44 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 12 Jun 2019 10:22:38 +0300 Subject: [PATCH] Removed legacy XAML loader --- .gitmodules | 3 - .../Remote/RemoteDesignerEntryPoint.cs | 6 +- .../Avalonia.Markup.Xaml.csproj | 20 +- .../AvaloniaTypeConverters.cs | 107 ----- .../AvaloniaXamlLoader.cs | 159 +------ .../Converters/AvaloniaEventConverter.cs | 99 ----- .../AvaloniaPropertyTypeConverter.cs | 1 - .../Converters/BitmapTypeConverter.cs | 3 +- .../Converters/FontFamilyTypeConverter.cs | 1 - .../Converters/IconTypeConverter.cs | 1 - .../Converters/NullableTypeConverter.cs | 89 ---- .../Converters/ParseTypeConverter.cs | 79 ---- .../Converters/SelectorTypeConverter.cs | 27 -- .../Converters/SetterValueTypeConverter.cs | 49 --- src/Markup/Avalonia.Markup.Xaml/Extensions.cs | 41 +- .../MarkupExtensions/BindingExtension.cs | 14 +- .../DynamicResourceExtension.cs | 9 +- .../RelativeSourceExtension.cs | 7 +- .../MarkupExtensions/ResourceInclude.cs | 12 +- .../StaticResourceExtension.cs | 22 +- .../MarkupExtensions/StyleIncludeExtension.cs | 9 +- .../PortableXaml/AttributeExtensions.cs | 39 -- .../AvaloniaMemberAttributeProvider.cs | 83 ---- .../PortableXaml/AvaloniaNameScope.cs | 56 --- .../AvaloniaRuntimeTypeProvider.cs | 147 ------- .../AvaloniaTypeAttributeProvider.cs | 117 ------ .../PortableXaml/AvaloniaXamlContext.cs | 31 -- .../PortableXaml/AvaloniaXamlObjectWriter.cs | 222 ---------- .../PortableXaml/AvaloniaXamlSchemaContext.cs | 327 --------------- .../PortableXaml/AvaloniaXamlType.cs | 388 ------------------ .../PortableXaml/TypeDescriptorExtensions.cs | 101 ----- .../PortableXaml/portable.xaml.github | 1 - .../Templates/TemplateContent.cs | 32 +- .../Templates/TemplateLoader.cs | 26 -- .../AvaloniaXamlIlLanguage.cs | 11 +- .../XamlIl/Runtime/XamlIlRuntimeHelpers.cs | 2 - src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs | 34 ++ .../Avalonia.DesignerSupport.TestApp/App.xaml | 6 +- .../Avalonia.DesignerSupport.TestApp.csproj | 2 +- .../MainWindow.xaml | 6 +- .../DesignerSupportTests.cs | 17 +- .../AvaloniaPropertyConverterTest.cs | 26 +- .../Xaml/BasicTests.cs | 70 ---- .../Xaml/EventTests.cs | 14 - .../Xaml/StyleTests.cs | 4 +- .../Xaml/XamlTestHelpers.cs | 3 +- 46 files changed, 108 insertions(+), 2415 deletions(-) delete mode 100644 src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaEventConverter.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/Converters/NullableTypeConverter.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/Converters/ParseTypeConverter.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/Converters/SelectorTypeConverter.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/Converters/SetterValueTypeConverter.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AttributeExtensions.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaMemberAttributeProvider.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaNameScope.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaRuntimeTypeProvider.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaTypeAttributeProvider.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlContext.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlObjectWriter.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/TypeDescriptorExtensions.cs delete mode 160000 src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github delete mode 100644 src/Markup/Avalonia.Markup.Xaml/Templates/TemplateLoader.cs create mode 100644 src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs diff --git a/.gitmodules b/.gitmodules index 22a241f120e..10c780c09fd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github"] - path = src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github - url = https://github.com/AvaloniaUI/Portable.Xaml.git [submodule "nukebuild/Numerge"] path = nukebuild/Numerge url = https://github.com/kekekeks/Numerge.git diff --git a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs index 801ed74ca02..a0e86a53b04 100644 --- a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs +++ b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs @@ -9,7 +9,6 @@ using Avalonia.Remote.Protocol.Designer; using Avalonia.Remote.Protocol.Viewport; using Avalonia.Threading; -using Portable.Xaml; namespace Avalonia.DesignerSupport.Remote { @@ -206,7 +205,6 @@ private static void OnTransportMessage(IAvaloniaRemoteTransportConnection transp } catch (Exception e) { - var xamlException = e as XamlException; var xmlException = e as XmlException; s_transport.Send(new UpdateXamlResultMessage @@ -216,8 +214,8 @@ private static void OnTransportMessage(IAvaloniaRemoteTransportConnection transp { ExceptionType = e.GetType().FullName, Message = e.Message.ToString(), - LineNumber = xamlException?.LineNumber ?? xmlException?.LineNumber, - LinePosition = xamlException?.LinePosition ?? xmlException?.LinePosition, + LineNumber = xmlException?.LineNumber, + LinePosition = xmlException?.LinePosition, } }); } diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index 8ce29e5b8ee..996cfdbc525 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -11,12 +11,8 @@ - - - - @@ -24,25 +20,12 @@ - - - - - - - - - - - - - @@ -52,7 +35,6 @@ - @@ -76,11 +58,11 @@ - + diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs deleted file mode 100644 index f967bdf0af0..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.ComponentModel; -using System.Collections.Generic; -using System.Globalization; -using Avalonia.Collections; -using Avalonia.Controls; -using Avalonia.Markup.Xaml.Converters; -using Avalonia.Media.Imaging; -using Avalonia.Styling; -using Avalonia.Controls.Templates; - -namespace Avalonia.Markup.Xaml -{ - using System.Reflection; - using Avalonia.Media; - - /// - /// Maintains a repository of s for XAML parsing on top of those - /// maintained by . - /// - /// - /// The default method of defining type converters using - /// isn't powerful enough for our purposes: - /// - /// - It doesn't handle non-constructed generic types (such as ) - /// - Type converters which require XAML features cannot be defined in non-XAML assemblies and - /// so can't be referenced using - /// - Many types have a static `Parse(string)` method which can be used implicitly; this class - /// detects such methods and auto-creates a type converter - /// - public static class AvaloniaTypeConverters - { - // When adding item to that list make sure to modify AvaloniaXamlIlLanguage - private static Dictionary _converters = new Dictionary() - { - { typeof(AvaloniaList<>), typeof(AvaloniaListConverter<>) }, - { typeof(AvaloniaProperty), typeof(AvaloniaPropertyTypeConverter) }, - { typeof(IBitmap), typeof(BitmapTypeConverter) }, - { typeof(IList), typeof(PointsListTypeConverter) }, - { typeof(IMemberSelector), typeof(MemberSelectorTypeConverter) }, - { typeof(Selector), typeof(SelectorTypeConverter) }, - { typeof(TimeSpan), typeof(TimeSpanTypeConverter) }, - { typeof(WindowIcon), typeof(IconTypeConverter) }, - { typeof(CultureInfo), typeof(CultureInfoConverter) }, - { typeof(Uri), typeof(AvaloniaUriTypeConverter) }, - { typeof(FontFamily), typeof(FontFamilyTypeConverter) }, - { typeof(EventInfo), typeof(AvaloniaEventConverter) }, - }; - - internal static Type GetBuiltinTypeConverter(Type type) - { - _converters.TryGetValue(type, out var result); - return result; - } - - /// - /// Tries to lookup a for a type. - /// - /// The type. - /// The type converter. - public static Type GetTypeConverter(Type type) - { - if (type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - var inner = GetTypeConverter(type.GetGenericArguments()[0]); - if (inner == null) - return null; - return typeof(NullableTypeConverter<>).MakeGenericType(inner); - } - - if (_converters.TryGetValue(type, out var result)) - { - return result; - } - - // Converters for non-constructed generic types can't be specified using - // TypeConverterAttribute. Allow them to be registered here and handle them sanely. - if (type.IsConstructedGenericType && - _converters.TryGetValue(type.GetGenericTypeDefinition(), out result)) - { - return result?.MakeGenericType(type.GetGenericArguments()); - } - - // If the type isn't a primitive or a type that XAML already handles, but has a static - // Parse method, use that - if (!type.IsPrimitive && - type != typeof(DateTime) && - type != typeof(Uri) && - ParseTypeConverter.HasParseMethod(type)) - { - result = typeof(ParseTypeConverter<>).MakeGenericType(type); - _converters.Add(type, result); - return result; - } - - _converters.Add(type, null); - return null; - } - - /// - /// Registers a type converter for a type. - /// - /// The type. Maybe be a non-constructed generic type. - /// The converter type. Maybe be a non-constructed generic type. - public static void Register(Type type, Type converterType) => _converters[type] = converterType; - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs index 45424e67bb2..e8f2439f46a 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs @@ -15,7 +15,6 @@ using Avalonia.Markup.Data; using Avalonia.Markup.Xaml.PortableXaml; using Avalonia.Platform; -using Portable.Xaml; namespace Avalonia.Markup.Xaml { @@ -26,71 +25,14 @@ public class AvaloniaXamlLoader { public bool IsDesignMode { get; set; } - public static bool UseLegacyXamlLoader { get; set; } = false; - - /// - /// Initializes a new instance of the class. - /// - public AvaloniaXamlLoader() - { - } - /// /// Loads the XAML into a Avalonia component. /// /// The object to load the XAML into. public static void Load(object obj) { - Contract.Requires(obj != null); - - var loader = new AvaloniaXamlLoader(); - loader.Load(obj.GetType(), obj); - } - - /// - /// Loads the XAML for a type. - /// - /// The type. - /// - /// The optional instance into which the XAML should be loaded. - /// - /// The loaded object. - public object Load(Type type, object rootInstance = null) - { - Contract.Requires(type != null); - - // HACK: Currently Visual Studio is forcing us to change the extension of xaml files - // in certain situations, so we try to load .xaml and if that's not found we try .xaml. - // Ideally we'd be able to use .xaml everywhere - var assetLocator = AvaloniaLocator.Current.GetService(); - - if (assetLocator == null) - { - throw new InvalidOperationException( - "Could not create IAssetLoader : maybe Application.RegisterServices() wasn't called?"); - } - - foreach (var uri in GetUrisFor(assetLocator, type)) - { - if (assetLocator.Exists(uri)) - { - using (var stream = assetLocator.Open(uri)) - { - var initialize = rootInstance as ISupportInitialize; - initialize?.BeginInit(); - try - { - return Load(stream, type.Assembly, rootInstance, uri); - } - finally - { - initialize?.EndInit(); - } - } - } - } - - throw new FileNotFoundException("Unable to find view for " + type.FullName); + throw new XamlLoadException( + $"No precompiled XAML found for {obj.GetType()}, make sure to specify x:Class and include your XAML file as AvaloniaResource"); } /// @@ -100,11 +42,8 @@ public object Load(Type type, object rootInstance = null) /// /// A base URI to use if is relative. /// - /// - /// The optional instance into which the XAML should be loaded. - /// /// The loaded object. - public object Load(Uri uri, Uri baseUri = null, object rootInstance = null) + public object Load(Uri uri, Uri baseUri = null) { Contract.Requires(uri != null); @@ -133,7 +72,7 @@ public object Load(Uri uri, Uri baseUri = null, object rootInstance = null) using (var stream = asset.stream) { var absoluteUri = uri.IsAbsoluteUri ? uri : new Uri(baseUri, uri); - return Load(stream, asset.assembly, rootInstance, absoluteUri); + return Load(stream, asset.assembly, null, absoluteUri); } } @@ -166,95 +105,9 @@ public object Load(string xaml, Assembly localAssembly = null, object rootInstan /// /// The URI of the XAML /// The loaded object. - public object Load(Stream stream, Assembly localAssembly, object rootInstance = null, Uri uri = null) - { - if (!UseLegacyXamlLoader) - return AvaloniaXamlIlRuntimeCompiler.Load(stream, localAssembly, rootInstance, uri, IsDesignMode); - - - var readerSettings = new XamlXmlReaderSettings() - { - BaseUri = uri, - LocalAssembly = localAssembly, - ProvideLineInfo = true, - }; - - var context = IsDesignMode ? AvaloniaXamlSchemaContext.DesignInstance : AvaloniaXamlSchemaContext.Instance; - var reader = new XamlXmlReader(stream, context, readerSettings); - - object result = LoadFromReader( - reader, - AvaloniaXamlContext.For(readerSettings, rootInstance)); - - var topLevel = result as TopLevel; - - if (topLevel != null) - { - DelayedBinding.ApplyBindings(topLevel); - } - - return result; - } - - internal static object LoadFromReader(XamlReader reader, AvaloniaXamlContext context = null, IAmbientProvider parentAmbientProvider = null) - { - var writer = AvaloniaXamlObjectWriter.Create( - (AvaloniaXamlSchemaContext)reader.SchemaContext, - context, - parentAmbientProvider); + public object Load(Stream stream, Assembly localAssembly, object rootInstance = null, Uri uri = null) + => AvaloniaXamlIlRuntimeCompiler.Load(stream, localAssembly, rootInstance, uri, IsDesignMode); - XamlServices.Transform(reader, writer); - writer.ApplyAllDelayedProperties(); - return writer.Result; - } - - internal static object LoadFromReader(XamlReader reader) - { - //return XamlServices.Load(reader); - return LoadFromReader(reader, null); - } - - - private static readonly DataContractSerializer s_xamlInfoSerializer = - new DataContractSerializer(typeof(AvaloniaResourceXamlInfo)); - /// - /// Gets the URI for a type. - /// - /// - /// The type. - /// The URI. - private static IEnumerable GetUrisFor(IAssetLoader assetLocator, Type type) - { - var asm = type.GetTypeInfo().Assembly.GetName().Name; - var xamlInfoUri = new Uri($"avares://{asm}/!AvaloniaResourceXamlInfo"); - var typeName = type.FullName; - if (typeName == null) - throw new ArgumentException("Type doesn't have a FullName"); - - if (assetLocator.Exists(xamlInfoUri)) - { - using (var xamlInfoStream = assetLocator.Open(xamlInfoUri)) - { - var assetDoc = XDocument.Load(xamlInfoStream); - XNamespace assetNs = assetDoc.Root.Attribute("xmlns").Value; - XNamespace arrayNs = "http://schemas.microsoft.com/2003/10/Serialization/Arrays"; - Dictionary xamlInfo = - assetDoc.Root.Element(assetNs + "ClassToResourcePathIndex").Elements(arrayNs + "KeyValueOfstringstring") - .ToDictionary(entry =>entry.Element(arrayNs + "Key").Value, - entry => entry.Element(arrayNs + "Value").Value); - - if (xamlInfo.TryGetValue(typeName, out var rv)) - { - yield return new Uri($"avares://{asm}{rv}"); - yield break; - } - } - } - - yield return new Uri("resm:" + typeName + ".xaml?assembly=" + asm); - yield return new Uri("resm:" + typeName + ".paml?assembly=" + asm); - } - public static object Parse(string xaml, Assembly localAssembly = null) => new AvaloniaXamlLoader().Load(xaml, localAssembly); diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaEventConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaEventConverter.cs deleted file mode 100644 index 665e71bfeae..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaEventConverter.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.ComponentModel; -using System.Globalization; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using Avalonia.Controls; -using Avalonia.Markup.Xaml.PortableXaml; -using Portable.Xaml; - -namespace Avalonia.Markup.Xaml.Converters -{ - internal class AvaloniaEventConverter : TypeConverter - { - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - var text = value as string; - if (text != null) - { - var rootObjectProvider = context.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider; - var destinationTypeProvider = context.GetService(typeof(IDestinationTypeProvider)) as IDestinationTypeProvider; - if (rootObjectProvider != null && destinationTypeProvider != null) - { - var target = rootObjectProvider.RootObject; - var eventType = destinationTypeProvider.GetDestinationType(); - var eventParameters = eventType.GetRuntimeMethods().First(r => r.Name == "Invoke").GetParameters(); - // go in reverse to match System.Xaml behaviour - var methods = target.GetType().GetRuntimeMethods().Reverse(); - - // find based on exact match parameter types first - foreach (var method in methods) - { - if (method.Name != text) - continue; - var parameters = method.GetParameters(); - if (eventParameters.Length != parameters.Length) - continue; - if (parameters.Length == 0) - return method.CreateDelegate(eventType, target); - - for (int i = 0; i < parameters.Length; i++) - { - var param = parameters[i]; - var eventParam = eventParameters[i]; - if (param.ParameterType != eventParam.ParameterType) - break; - if (i == parameters.Length - 1) - return method.CreateDelegate(eventType, target); - } - } - - // EnhancedXaml: Find method with compatible base class parameters - foreach (var method in methods) - { - if (method.Name != text) - continue; - var parameters = method.GetParameters(); - if (parameters.Length == 0 || eventParameters.Length != parameters.Length) - continue; - - for (int i = 0; i < parameters.Length; i++) - { - var param = parameters[i]; - var eventParam = eventParameters[i]; - if (!param.ParameterType.GetTypeInfo().IsAssignableFrom(eventParam.ParameterType.GetTypeInfo())) - break; - if (i == parameters.Length - 1) - return method.CreateDelegate(eventType, target); - } - } - - var contextProvider = (IXamlSchemaContextProvider)context.GetService(typeof(IXamlSchemaContextProvider)); - var avaloniaContext = (AvaloniaXamlSchemaContext)contextProvider.SchemaContext; - - if (avaloniaContext.IsDesignMode) - { - // We want to ignore missing events in the designer, so if event handler - // wasn't found create an empty delegate. - var lambdaExpression = Expression.Lambda( - eventType, - Expression.Empty(), - eventParameters.Select(x => Expression.Parameter(x.ParameterType))); - return lambdaExpression.Compile(); - } - else - { - throw new XamlObjectWriterException($"Referenced value method {text} in type {target.GetType()} indicated by event {eventType.FullName} was not found"); - } - } - } - return base.ConvertFrom(context, culture, value); - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs index 18a7fe9ab6a..b42bd536191 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs @@ -11,7 +11,6 @@ using Avalonia.Markup.Xaml.Templates; using Avalonia.Styling; using Avalonia.Utilities; -using Portable.Xaml.ComponentModel; namespace Avalonia.Markup.Xaml.Converters { diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/BitmapTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/BitmapTypeConverter.cs index bfee7b953b5..c75c54554e9 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/BitmapTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/BitmapTypeConverter.cs @@ -8,8 +8,7 @@ namespace Avalonia.Markup.Xaml.Converters { - using Portable.Xaml.ComponentModel; - using System.ComponentModel; + using System.ComponentModel; public class BitmapTypeConverter : TypeConverter { diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/FontFamilyTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/FontFamilyTypeConverter.cs index 863e8fbbce0..e92c1557730 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/FontFamilyTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/FontFamilyTypeConverter.cs @@ -7,7 +7,6 @@ using Avalonia.Media; -using Portable.Xaml.ComponentModel; namespace Avalonia.Markup.Xaml.Converters { diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs index f3972ffe188..3a2f41bd3d3 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs @@ -9,7 +9,6 @@ namespace Avalonia.Markup.Xaml.Converters { - using Portable.Xaml.ComponentModel; using System.ComponentModel; public class IconTypeConverter : TypeConverter diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/NullableTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/NullableTypeConverter.cs deleted file mode 100644 index 5e7a31da560..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/NullableTypeConverter.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Globalization; - -namespace Avalonia.Markup.Xaml.Converters -{ - public class NullableTypeConverter : TypeConverter where T : TypeConverter, new() - { - private TypeConverter _inner; - - public NullableTypeConverter() - { - _inner = new T(); - } - - public NullableTypeConverter(TypeConverter inner) - { - _inner = inner; - } - - - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) - { - if (value == null) - return null; - return _inner.ConvertTo(context, culture, value, destinationType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - if (value == null) - return null; - if (value as string == "") - return null; - return _inner.ConvertFrom(context, culture, value); - } - - public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues) - { - return _inner.CreateInstance(context, propertyValues); - } - - public override bool GetStandardValuesSupported(ITypeDescriptorContext context) - { - return _inner.GetStandardValuesSupported(context); - } - - public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) - { - return _inner.GetStandardValuesExclusive(context); - } - - public override bool GetCreateInstanceSupported(ITypeDescriptorContext context) - { - return _inner.GetCreateInstanceSupported(context); - } - - public override bool GetPropertiesSupported(ITypeDescriptorContext context) - { - return _inner.GetPropertiesSupported(context); - } - - public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) - { - return _inner.GetStandardValues(context); - } - - public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) - { - return _inner.GetProperties(context, value, attributes); - } - - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) - { - return _inner.CanConvertTo(context, destinationType); - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - return _inner.CanConvertFrom(context, sourceType); - } - - public override bool IsValid(ITypeDescriptorContext context, object value) - { - return _inner.IsValid(context, value); - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/ParseTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/ParseTypeConverter.cs deleted file mode 100644 index bfb446fa15c..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/ParseTypeConverter.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.ComponentModel; -using System.Globalization; -using System.Reflection; - -namespace Avalonia.Markup.Xaml.Converters -{ - /// - /// Base class for type converters which call a static Parse method. - /// - public abstract class ParseTypeConverter : TypeConverter - { - protected const BindingFlags PublicStatic = BindingFlags.Public | BindingFlags.Static; - protected static readonly Type[] StringParameter = new[] { typeof(string) }; - protected static readonly Type[] StringIFormatProviderParameters = new[] { typeof(string), typeof(IFormatProvider) }; - - /// - /// Checks whether a type has a suitable Parse method. - /// - /// The type. - /// True if the type has a suitable parse method, otherwise false. - public static bool HasParseMethod(Type type) - { - return type.GetMethod("Parse", PublicStatic, null, StringIFormatProviderParameters, null) != null || - type.GetMethod("Parse", PublicStatic, null, StringParameter, null) != null; - } - } - - /// - /// A type converter which calls a static Parse method. - /// - /// The type with the Parse method. - public class ParseTypeConverter : ParseTypeConverter - { - private static Func _parse; - private static Func _parseWithFormat; - - static ParseTypeConverter() - { - var method = typeof(T).GetMethod("Parse", PublicStatic, null, StringIFormatProviderParameters, null); - - if (method != null) - { - _parseWithFormat = (Func)method - .CreateDelegate(typeof(Func)); - return; - } - - method = typeof(T).GetMethod("Parse", PublicStatic, null, StringParameter, null); - - if (method != null) - { - _parse = (Func)method.CreateDelegate(typeof(Func)); - } - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - return sourceType == typeof(string); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - if (value != null) - { - if (_parse != null) - { - return _parse(value.ToString()); - } - else if (_parseWithFormat != null) - { - return _parseWithFormat(value.ToString(), culture); - } - } - - return null; - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/SelectorTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/SelectorTypeConverter.cs deleted file mode 100644 index 54234fe406d..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/SelectorTypeConverter.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Globalization; -using Avalonia.Markup.Parsers; - -namespace Avalonia.Markup.Xaml.Converters -{ - using Portable.Xaml.ComponentModel; - using System.ComponentModel; - - public class SelectorTypeConverter : TypeConverter - { - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - return sourceType == typeof(string); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - var parser = new SelectorParser(context.ResolveType); - - return parser.Parse((string)value); - } - } -} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/SetterValueTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/SetterValueTypeConverter.cs deleted file mode 100644 index 81cda6db1f0..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/SetterValueTypeConverter.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using Avalonia.Styling; -using Portable.Xaml; -using Portable.Xaml.ComponentModel; -using System.ComponentModel; -using Portable.Xaml.Markup; -using System; -using System.Globalization; - -namespace Avalonia.Markup.Xaml.Converters -{ - public class SetterValueTypeConverter : TypeConverter - { - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - return sourceType == typeof(string); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - object setter = context.GetService().TargetObject; - var schemaContext = context.GetService().SchemaContext; - - return ConvertSetterValue(context, schemaContext, culture, (setter as Setter), value); - } - - [Obsolete("TODO: try assosiate Setter.Value property with SetterValueTypeConverter, so far coouldn't make it :(")] - internal static object ConvertSetterValue(ITypeDescriptorContext dcontext, XamlSchemaContext context, CultureInfo info, Setter setter, object value) - { - Type targetType = setter?.Property?.PropertyType; - - if (targetType == null) - { - return value; - } - - var ttConv = context.GetXamlType(targetType)?.TypeConverter?.ConverterInstance; - - if (ttConv != null) - { - value = ttConv.ConvertFromString(dcontext, info, value as string); - } - - return value; - } - } -} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/Extensions.cs b/src/Markup/Avalonia.Markup.Xaml/Extensions.cs index c6b914ba72e..fe3fd44c1c4 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Extensions.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Extensions.cs @@ -3,8 +3,6 @@ using System.ComponentModel; using System.Linq; using Avalonia.Markup.Xaml.XamlIl.Runtime; -using Portable.Xaml; -using Portable.Xaml.Markup; namespace Avalonia.Markup.Xaml { @@ -13,42 +11,19 @@ internal static class Extensions public static T GetService(this IServiceProvider sp) => (T)sp?.GetService(typeof(T)); - public static Uri GetContextBaseUri(this IServiceProvider ctx) - { - var properService = ctx.GetService(); - if (properService != null) - return properService.BaseUri; - // Ugly hack with casts - return Portable.Xaml.ComponentModel.TypeDescriptorExtensions.GetBaseUri((ITypeDescriptorContext)ctx); - } + public static Uri GetContextBaseUri(this IServiceProvider ctx) => ctx.GetService().BaseUri; - public static T GetFirstParent(this IServiceProvider ctx) where T : class - { - var parentStack = ctx.GetService(); - if (parentStack != null) - return parentStack.Parents.OfType().FirstOrDefault(); - return Portable.Xaml.ComponentModel.TypeDescriptorExtensions.GetFirstAmbientValue((ITypeDescriptorContext)ctx); - } - - public static T GetLastParent(this IServiceProvider ctx) where T : class - { - var parentStack = ctx.GetService(); - if (parentStack != null) - return parentStack.Parents.OfType().LastOrDefault(); - return Portable.Xaml.ComponentModel.TypeDescriptorExtensions.GetLastOrDefaultAmbientValue( - (ITypeDescriptorContext)ctx); - } + public static T GetFirstParent(this IServiceProvider ctx) where T : class + => ctx.GetService().Parents.OfType().FirstOrDefault(); + + public static T GetLastParent(this IServiceProvider ctx) where T : class + => ctx.GetService().Parents.OfType().LastOrDefault(); public static IEnumerable GetParents(this IServiceProvider sp) { - var stack = sp.GetService(); - if (stack != null) - return stack.Parents.OfType(); + return sp.GetService().Parents.OfType(); + - var context = (ITypeDescriptorContext)sp; - var schemaContext = context.GetService().SchemaContext; - var ambientProvider = context.GetService(); - return ambientProvider.GetAllAmbientValues(schemaContext.GetXamlType(typeof(T))).OfType(); } public static Type ResolveType(this IServiceProvider ctx, string namespacePrefix, string type) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs index 223716ae3ba..726f4221f80 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs @@ -10,14 +10,9 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions using Avalonia.Data.Converters; using Avalonia.Markup.Data; using Avalonia.Styling; - using Portable.Xaml; - using Portable.Xaml.ComponentModel; - using Portable.Xaml.Markup; - using PortableXaml; using System.ComponentModel; - [MarkupExtensionReturnType(typeof(IBinding))] - public class BindingExtension : MarkupExtension + public class BindingExtension { public BindingExtension() { @@ -28,12 +23,7 @@ public BindingExtension(string path) Path = path; } - public override object ProvideValue(IServiceProvider serviceProvider) - { - return ProvideTypedValue(serviceProvider); - } - - public Binding ProvideTypedValue(IServiceProvider serviceProvider) + public Binding ProvideValue(IServiceProvider serviceProvider) { var descriptorContext = (ITypeDescriptorContext)serviceProvider; diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs index 48e55dc2513..0a9289bec95 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs @@ -7,13 +7,10 @@ using System.Reactive.Linq; using Avalonia.Controls; using Avalonia.Data; -using Portable.Xaml; -using Portable.Xaml.ComponentModel; -using Portable.Xaml.Markup; namespace Avalonia.Markup.Xaml.MarkupExtensions { - public class DynamicResourceExtension : MarkupExtension, IBinding + public class DynamicResourceExtension : IBinding { private IResourceNode _anchor; @@ -28,9 +25,7 @@ public DynamicResourceExtension(string resourceKey) public object ResourceKey { get; set; } - public override object ProvideValue(IServiceProvider serviceProvider) => ProvideTypedValue(serviceProvider); - - public IBinding ProvideTypedValue(IServiceProvider serviceProvider) + public IBinding ProvideValue(IServiceProvider serviceProvider) { var provideTarget = serviceProvider.GetService(); diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cs index 2f7256fa22d..f690a5ff0e6 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cs @@ -3,11 +3,10 @@ using System; using Avalonia.Data; -using Portable.Xaml.Markup; namespace Avalonia.Markup.Xaml.MarkupExtensions { - public class RelativeSourceExtension : MarkupExtension + public class RelativeSourceExtension { public RelativeSourceExtension() { @@ -18,7 +17,7 @@ public RelativeSourceExtension(RelativeSourceMode mode) Mode = mode; } - public override object ProvideValue(IServiceProvider serviceProvider) + public RelativeSource ProvideValue(IServiceProvider serviceProvider) { return new RelativeSource { @@ -38,4 +37,4 @@ public override object ProvideValue(IServiceProvider serviceProvider) public int AncestorLevel { get; set; } = 1; } -} \ No newline at end of file +} diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs index 323a341f6ae..3525628a796 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs @@ -1,15 +1,13 @@ using System; using System.ComponentModel; using Avalonia.Controls; -using Portable.Xaml.ComponentModel; -using Portable.Xaml.Markup; namespace Avalonia.Markup.Xaml.MarkupExtensions { /// /// Loads a resource dictionary from a specified URL. /// - public class ResourceInclude : MarkupExtension, IResourceProvider + public class ResourceInclude :IResourceProvider { private Uri _baseUri; private IResourceDictionary _loaded; @@ -52,13 +50,7 @@ bool IResourceProvider.TryGetResource(object key, out object value) return Loaded.TryGetResource(key, out value); } - /// - public override object ProvideValue(IServiceProvider serviceProvider) - { - return ProvideTypedValue(serviceProvider); - } - - public ResourceInclude ProvideTypedValue(IServiceProvider serviceProvider) + public ResourceInclude ProvideValue(IServiceProvider serviceProvider) { var tdc = (ITypeDescriptorContext)serviceProvider; _baseUri = tdc?.GetContextBaseUri(); diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs index ea913db5986..d6b170ae9db 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs @@ -7,13 +7,10 @@ using System.Reflection; using Avalonia.Controls; using Avalonia.Markup.Data; -using Portable.Xaml; -using Portable.Xaml.ComponentModel; -using Portable.Xaml.Markup; namespace Avalonia.Markup.Xaml.MarkupExtensions { - public class StaticResourceExtension : MarkupExtension + public class StaticResourceExtension { public StaticResourceExtension() { @@ -26,26 +23,13 @@ public StaticResourceExtension(string resourceKey) public string ResourceKey { get; set; } - public override object ProvideValue(IServiceProvider serviceProvider) + public object ProvideValue(IServiceProvider serviceProvider) { - - // Look upwards though the ambient context for IResourceProviders which might be able // to give us the resource. foreach (var resourceProvider in serviceProvider.GetParents()) { - // We override XamlType.CanAssignTo in BindingXamlType so the results we get back - // from GetAllAmbientValues aren't necessarily of the correct type. - - if (AvaloniaXamlLoader.UseLegacyXamlLoader - && resourceProvider is IControl control && control.StylingParent != null) - { - // If we've got to a control that has a StylingParent then it's probably - // a top level control and its StylingParent is pointing to the global - // styles. If this is case just do a FindResource on it. - return control.FindResource(ResourceKey); - } - else if (resourceProvider.TryGetResource(ResourceKey, out var value)) + if (resourceProvider.TryGetResource(ResourceKey, out var value)) { return value; } diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleIncludeExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleIncludeExtension.cs index d9345738fcd..a323050c319 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleIncludeExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleIncludeExtension.cs @@ -3,23 +3,18 @@ using Avalonia.Markup.Xaml.Styling; using Avalonia.Styling; -using Portable.Xaml; -using Portable.Xaml.ComponentModel; using System.ComponentModel; -using Portable.Xaml.Markup; using System; namespace Avalonia.Markup.Xaml.MarkupExtensions { - [MarkupExtensionReturnType(typeof(IStyle))] - public class StyleIncludeExtension : MarkupExtension + public class StyleIncludeExtension { public StyleIncludeExtension() { } - public override object ProvideValue(IServiceProvider serviceProvider) => ProvideTypedValue(serviceProvider); - public IStyle ProvideTypedValue(IServiceProvider serviceProvider) + public IStyle ProvideValue(IServiceProvider serviceProvider) { return new StyleInclude(serviceProvider.GetContextBaseUri()) { Source = Source }; } diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AttributeExtensions.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AttributeExtensions.cs deleted file mode 100644 index 2a23b7e0688..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AttributeExtensions.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Avalonia.Markup.Xaml.Templates; -using avm = Avalonia.Metadata; -using pm = Portable.Xaml.Markup; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - internal static class AttributeExtensions - { - public static pm.XamlDeferLoadAttribute ToPortableXaml(this avm.TemplateContentAttribute attrib) - { - if (attrib == null) - { - return null; - } - - return new pm.XamlDeferLoadAttribute(typeof(TemplateLoader), typeof(TemplateContent)); - } - - public static pm.AmbientAttribute ToPortableXaml(this avm.AmbientAttribute attrib) - { - if (attrib == null) - { - return null; - } - - return new pm.AmbientAttribute(); - } - - public static pm.DependsOnAttribute ToPortableXaml(this avm.DependsOnAttribute attrib) - { - if (attrib == null) - { - return null; - } - - return new pm.DependsOnAttribute(attrib.Name); - } - } -} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaMemberAttributeProvider.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaMemberAttributeProvider.cs deleted file mode 100644 index 529cbab9385..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaMemberAttributeProvider.cs +++ /dev/null @@ -1,83 +0,0 @@ -using Avalonia.Markup.Xaml.Converters; -using Avalonia.Styling; -using Portable.Xaml.ComponentModel; -using System.ComponentModel; -using System; -using System.Linq; -using System.Reflection; -using avm = Avalonia.Metadata; -using pm = Portable.Xaml.Markup; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - public class AvaloniaMemberAttributeProvider : ICustomAttributeProvider - { - public AvaloniaMemberAttributeProvider(MemberInfo info) - { - _info = info; - } - - public object[] GetCustomAttributes(bool inherit) - { - throw new NotImplementedException(); - } - - public object[] GetCustomAttributes(Type attributeType, bool inherit) - { - Attribute result = null; - - if (attributeType == typeof(pm.XamlDeferLoadAttribute)) - { - result = _info.GetCustomAttribute(inherit) - .ToPortableXaml(); - } - else if (attributeType == typeof(pm.AmbientAttribute)) - { - result = _info.GetCustomAttribute(inherit) - .ToPortableXaml(); - } - else if (attributeType == typeof(pm.DependsOnAttribute)) - { - result = _info.GetCustomAttribute(inherit) - .ToPortableXaml(); - } - else if (attributeType == typeof(TypeConverterAttribute) && - _info.DeclaringType == typeof(Setter) && - _info.Name == nameof(Setter.Value)) - { - //actually it never comes here looks like if property type is object - //Portable.Xaml is not searching for Type Converter - result = new TypeConverterAttribute(typeof(SetterValueTypeConverter)); - } - else if (attributeType == typeof(TypeConverterAttribute) && _info is EventInfo) - { - // If a type converter for `EventInfo` is registered, then use that to convert - // event handler values. This is used by the designer to override the lookup - // for event handlers with a null handler. - var eventConverter = AvaloniaTypeConverters.GetTypeConverter(typeof(EventInfo)); - - if (eventConverter != null) - { - result = new TypeConverterAttribute(eventConverter); - } - } - - if (result == null) - { - var attr = _info.GetCustomAttributes(attributeType, inherit); - return (attr as object[]) ?? attr.ToArray(); - } - else - { - return new object[] { result }; - } - } - - public bool IsDefined(Type attributeType, bool inherit) - { - throw new NotImplementedException(); - } - - private readonly MemberInfo _info; - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaNameScope.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaNameScope.cs deleted file mode 100644 index 6f855bafa13..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaNameScope.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Collections.Generic; -using Avalonia.Controls; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - internal class AvaloniaNameScope : Portable.Xaml.Markup.INameScope - { - public object Instance { get; set; } - - private Dictionary _names = new Dictionary(); - - public object FindName(string name) - { - object result; - if (_names.TryGetValue(name, out result)) - return result; - return null; - } - - public void RegisterName(string name, object scopedElement) - { - if (scopedElement != null) - _names.Add(name, scopedElement); - - //TODO: ??? - //var control = scopedElement as Control; - - //if (control != null) - //{ - // var nameScope = (Instance as INameScope) ?? control.FindNameScope(); - - // if (nameScope != null) - // { - // nameScope.Register(name, scopedElement); - // } - //} - } - - public void UnregisterName(string name) - { - } - - public void RegisterOnNameScope(object target) - { - var nameScope = target as INameScope; - - if (nameScope != null) - { - foreach (var v in _names) - { - nameScope.Register(v.Key, v.Value); - } - } - } - } -} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaRuntimeTypeProvider.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaRuntimeTypeProvider.cs deleted file mode 100644 index eb52e317b86..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaRuntimeTypeProvider.cs +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Avalonia.Controls; -using Avalonia.Data; -using Avalonia.Markup.Xaml.Templates; -using Avalonia.Media; -using Avalonia.Metadata; -using Avalonia.Platform; -using Avalonia.Styling; - -namespace Avalonia.Markup.Xaml.Context -{ - using ClrNamespaceInfo = Tuple; - - public interface IRuntimeTypeProvider - { - Type FindType(string xamlNamespace, string name, Type[] genArgs); - - IEnumerable ReferencedAssemblies { get; } - } - - public class AvaloniaRuntimeTypeProvider : IRuntimeTypeProvider - { - private const string ClrNamespace = "clr-namespace:"; - // private const string AvaloniaNs = "https://github.com/avaloniaui"; - - private static readonly IEnumerable ForcedAssemblies = new[] - { - typeof(AvaloniaObject).GetTypeInfo().Assembly, - typeof(Animation.Animation).GetTypeInfo().Assembly, - typeof(Control).GetTypeInfo().Assembly, - typeof(Style).GetTypeInfo().Assembly, - typeof(DataTemplate).GetTypeInfo().Assembly, - typeof(SolidColorBrush).GetTypeInfo().Assembly, - typeof(Binding).GetTypeInfo().Assembly, - }; - - private Dictionary> _namespaces = new Dictionary>(); - - private List _scanned = new List(); - - public IEnumerable ReferencedAssemblies => _scanned; - - public AvaloniaRuntimeTypeProvider() - { - ScanAssemblies(ForcedAssemblies); - ScanNewAssemblies(); - } - - private static bool IsClrNamespace(string ns) - { - return ns.StartsWith(ClrNamespace); - } - - private static Assembly GetAssembly(string assemblyName) - { - return Assembly.Load(new AssemblyName(assemblyName)); - } - - private void ScanAssemblies(IEnumerable assemblies) - { - foreach (var assembly in assemblies) - { - var namespaces = assembly.GetCustomAttributes() - .Select(x => new { x.XmlNamespace, x.ClrNamespace }) - .GroupBy(x => x.XmlNamespace); - - foreach (var nsa in namespaces) - { - HashSet reg; - - if (!_namespaces.TryGetValue(nsa.Key, out reg)) - { - _namespaces[nsa.Key] = reg = new HashSet>(); - } - - foreach (var child in nsa) - { - reg.Add(new ClrNamespaceInfo(child.ClrNamespace, assembly)); - } - } - - _scanned.Add(assembly); - } - } - - private void ScanNewAssemblies() - { - IEnumerable assemblies = AppDomain.CurrentDomain.GetAssemblies(); - - if (assemblies != null) - { - assemblies = assemblies.Except(_scanned); - ScanAssemblies(assemblies); - } - } - - private Dictionary _typeCache = new Dictionary(); - - public Type FindType(string xamlNamespace, string name, Type[] genArgs) - { - if (IsClrNamespace(xamlNamespace)) - { - //we need to handle only xaml url namespaces for avalonia, - //the other namespaces are handled well in portable.xaml - return null; - } - - string key = $"{xamlNamespace}:{name}"; - - Type type; - - if (_typeCache.TryGetValue(key, out type)) - { - return type; - } - - HashSet reg; - - if (!_namespaces.TryGetValue(xamlNamespace, out reg)) - { - return null; - } - - if (genArgs != null) - name += "`" + genArgs.Length; - - foreach (var ns in reg) - { - var n = ns.Item1 + "." + name; - var t = ns.Item2.GetType(n); - if (t != null) - { - _typeCache[key] = t; - return t; - } - } - - return null; - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaTypeAttributeProvider.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaTypeAttributeProvider.cs deleted file mode 100644 index 7558a5df0bd..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaTypeAttributeProvider.cs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) The Perspex Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using Portable.Xaml.ComponentModel; -using System.ComponentModel; -using System; -using System.Linq; -using System.Reflection; -using avm = Avalonia.Metadata; -using pm = Portable.Xaml.Markup; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - internal class AvaloniaTypeAttributeProvider : ICustomAttributeProvider - { - public AvaloniaTypeAttributeProvider(Type type) - { - _type = type; - } - - public object[] GetCustomAttributes(bool inherit) - { - throw new NotImplementedException(); - } - - public object[] GetCustomAttributes(Type attributeType, bool inherit) - { - Attribute result = null; - - var ti = _type.GetTypeInfo(); - - if (attributeType == typeof(pm.ContentPropertyAttribute)) - { - result = GetContentPropertyAttribute(inherit); - } - else if (attributeType == typeof(pm.RuntimeNamePropertyAttribute)) - { - if (_namedType.IsAssignableFrom(ti)) - { - result = new pm.RuntimeNamePropertyAttribute(nameof(INamed.Name)); - } - } - else if (attributeType == typeof(TypeConverterAttribute)) - { - var builtin = AvaloniaTypeConverters.GetBuiltinTypeConverter(_type); - if (builtin != null) - result = new TypeConverterAttribute(builtin); - result = result ?? ti.GetCustomAttribute(attributeType, inherit); - - if (result == null) - { - var convType = AvaloniaTypeConverters.GetTypeConverter(_type); - - if (convType != null) - { - result = new TypeConverterAttribute(convType); - } - } - } - else if (attributeType == typeof(pm.AmbientAttribute)) - { - result = ti.GetCustomAttribute(inherit) - .ToPortableXaml(); - } - - if (result == null) - { - var attr = ti.GetCustomAttributes(attributeType, inherit); - return (attr as object[]) ?? attr.ToArray(); - } - else - { - return new object[] { result }; - } - } - - public bool IsDefined(Type attributeType, bool inherit) - { - throw new NotImplementedException(); - } - - private readonly TypeInfo _namedType = typeof(INamed).GetTypeInfo(); - - private readonly Type _type; - - private Attribute GetContentPropertyAttribute(bool inherit) - { - var type = _type; - - while (type != null) - { - var properties = type.GetTypeInfo().DeclaredProperties - .Where(x => x.GetCustomAttribute() != null); - string result = null; - - foreach (var property in properties) - { - if (result != null) - { - throw new Exception($"Content property defined more than once on {type}."); - } - - result = property.Name; - } - - if (result != null) - { - return new pm.ContentPropertyAttribute(result); - } - - type = inherit ? type.GetTypeInfo().BaseType : null; - } - - return null; - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlContext.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlContext.cs deleted file mode 100644 index c159b551b79..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlContext.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Portable.Xaml; -using Portable.Xaml.Markup; -using System; -using System.Reflection; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - public class AvaloniaXamlContext : IUriContext - { - private AvaloniaXamlContext() - { - } - - public Assembly LocalAssembly { get; private set; } - - public Uri BaseUri { get; set; } - - public object RootInstance { get; private set; } - - internal static AvaloniaXamlContext For(XamlXmlReaderSettings sett, - object rootInstance) - { - return new AvaloniaXamlContext() - { - BaseUri = sett.BaseUri, - LocalAssembly = sett.LocalAssembly, - RootInstance = rootInstance - }; - } - } -} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlObjectWriter.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlObjectWriter.cs deleted file mode 100644 index 9fa6c26c351..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlObjectWriter.cs +++ /dev/null @@ -1,222 +0,0 @@ -using Avalonia.Data; -using Portable.Xaml; -using Portable.Xaml.ComponentModel; -using System.ComponentModel; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Avalonia.Controls; -using Portable.Xaml.Schema; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - class AvaloniaXamlObjectWriter : XamlObjectWriter - { - private static Dictionary DesignDirectives = new Dictionary - { - ["DataContext"] = "DataContext", - ["DesignWidth"] = "Width", ["DesignHeight"] = "Height", ["PreviewWith"] = "PreviewWith" - } - .ToDictionary(p => new XamlDirective( - new[] {"http://schemas.microsoft.com/expression/blend/2008"}, p.Key, - XamlLanguage.Object, null, AllowedMemberLocations.Attribute), p => p.Value); - - private readonly AvaloniaXamlSchemaContext _schemaContext; - - public static AvaloniaXamlObjectWriter Create( - AvaloniaXamlSchemaContext schemaContext, - AvaloniaXamlContext context, - IAmbientProvider parentAmbientProvider = null) - { - var nameScope = new AvaloniaNameScope { Instance = context?.RootInstance }; - - var writerSettings = new XamlObjectWriterSettings() - { - ExternalNameScope = nameScope, - RegisterNamesOnExternalNamescope = true, - RootObjectInstance = context?.RootInstance - }; - - return new AvaloniaXamlObjectWriter(schemaContext, - writerSettings.WithContext(context), - nameScope, - parentAmbientProvider); - } - - private readonly DelayedValuesHelper _delayedValuesHelper = new DelayedValuesHelper(); - - private AvaloniaNameScope _nameScope; - - private AvaloniaXamlObjectWriter( - AvaloniaXamlSchemaContext schemaContext, - XamlObjectWriterSettings settings, - AvaloniaNameScope nameScope, - IAmbientProvider parentAmbientProvider) - : base(schemaContext, settings, parentAmbientProvider) - { - _nameScope = nameScope; - _schemaContext = schemaContext; - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - if (_nameScope != null && Result != null) - { - _nameScope.RegisterOnNameScope(Result); - } - } - - base.Dispose(disposing); - } - - public void ApplyAllDelayedProperties() - { - //HACK: We need this because Begin/EndInit ordering is broken - _delayedValuesHelper.ApplyAll(); - } - - protected internal override void OnAfterProperties(object value) - { - _delayedValuesHelper.EndInit(value); - - base.OnAfterProperties(value); - } - - protected internal override void OnBeforeProperties(object value) - { - if (value != null) - _delayedValuesHelper.BeginInit(value); - - base.OnBeforeProperties(value); - } - - protected internal override bool OnSetValue(object target, XamlMember member, object value) - { - if (_delayedValuesHelper.TryAdd(target, member, value)) - { - return true; - } - - return base.OnSetValue(target, member, value); - } - - public override void WriteStartMember(XamlMember property) - { - foreach(var d in DesignDirectives) - if (property == d.Key && _schemaContext.IsDesignMode) - { - base.WriteStartMember(new XamlMember(d.Value, - typeof(Design).GetMethod("Get" + d.Value, BindingFlags.Static | BindingFlags.Public), - typeof(Design).GetMethod("Set" + d.Value, BindingFlags.Static | BindingFlags.Public), - SchemaContext)); - return; - } - base.WriteStartMember(property); - } - - private class DelayedValuesHelper - { - private int _cnt; - - private HashSet _targets = new HashSet(); - - private IList _values = new List(); - - private IEnumerable Values => _values; - - public void BeginInit(object target) - { - ++_cnt; - - AddTargetIfNeeded(target); - } - - public void EndInit(object target) - { - --_cnt; - - if (_cnt == 0) - { - ApplyAll(); - } - } - - public bool TryAdd(object target, XamlMember member, object value) - { - if (value is IBinding) - { - Add(new DelayedValue(target, member, value)); - - return true; - } - - return false; - } - - private void Add(DelayedValue value) - { - _values.Add(value); - - var target = value.Target; - - if (!_targets.Contains(value.Target)) - { - _targets.Add(target); - (target as ISupportInitialize)?.BeginInit(); - } - } - - private void AddTargetIfNeeded(object target) - { - if (!_targets.Contains(target)) - { - Add(new DelayedValue(target, null, null)); - } - } - - public void ApplyAll() - { - //TODO: revisit this - //apply delayed values and clear - //that's the last object let's set all delayed bindings - foreach (var dv in Values.Where(v => v.Member != null)) - { - dv.Member.Invoker.SetValue(dv.Target, dv.Value); - } - - //TODO: check/add some order of end init - //currently we are sending end init in the order of - //objects creation - foreach (var v in Values) - { - var target = v.Target; - - if (_targets.Contains(target)) - { - _targets.Remove(target); - (target as ISupportInitialize)?.EndInit(); - } - } - - _targets.Clear(); - _values.Clear(); - } - - private class DelayedValue - { - public DelayedValue(object target, XamlMember member, object value) - { - Target = target; - Member = member; - Value = value; - } - - public XamlMember Member { get; } - public object Target { get; } - public object Value { get; } - } - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs deleted file mode 100644 index 326db884a62..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs +++ /dev/null @@ -1,327 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Avalonia.Data; -using Avalonia.Markup.Xaml.Context; -using Avalonia.Markup.Xaml.MarkupExtensions; -using Avalonia.Markup.Xaml.Styling; -using Portable.Xaml; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - internal class AvaloniaXamlSchemaContext : XamlSchemaContext - { - private static AvaloniaXamlSchemaContext s_instance; - private static AvaloniaXamlSchemaContext s_designInstance; - - public static AvaloniaXamlSchemaContext Instance - { - get - { - if (s_instance == null) - { - s_instance = Create(); - } - - return s_instance; - } - } - - public static AvaloniaXamlSchemaContext DesignInstance - { - get - { - if (s_designInstance == null) - { - s_designInstance = Create(); - s_designInstance.IsDesignMode = true; - } - - return s_designInstance; - } - } - - public bool IsDesignMode { get; private set; } - public static AvaloniaXamlSchemaContext Create(IRuntimeTypeProvider typeProvider = null) - { - return new AvaloniaXamlSchemaContext(typeProvider ?? new AvaloniaRuntimeTypeProvider()); - } - - private AvaloniaXamlSchemaContext(IRuntimeTypeProvider typeProvider) - //better not set the references assemblies - //TODO: check this on iOS - //: base(typeProvider.ReferencedAssemblies) - { - Contract.Requires(typeProvider != null); - - _avaloniaTypeProvider = typeProvider; - } - - private IRuntimeTypeProvider _avaloniaTypeProvider; - - protected override XamlType GetXamlType(string xamlNamespace, string name, params XamlType[] typeArguments) - { - XamlType type = null; - try - { - type = ResolveXamlTypeName(xamlNamespace, name, typeArguments, false); - - if (type == null) - { - type = base.GetXamlType(xamlNamespace, name, typeArguments); - } - } - catch (Exception e) - { - //TODO: log or wrap exception - throw e; - } - return type; - } - - private XamlType ResolveXamlTypeName(string xmlNamespace, string xmlLocalName, XamlType[] typeArguments, bool required) - { - Type[] genArgs = null; - if (typeArguments != null && typeArguments.Any()) - { - genArgs = typeArguments.Select(t => t?.UnderlyingType).ToArray(); - - if (genArgs.Any(t => t == null)) - { - return null; - } - } - - // MarkupExtension type could omit "Extension" part in XML name. - Type type = _avaloniaTypeProvider.FindType(xmlNamespace, - xmlLocalName, - genArgs) ?? - _avaloniaTypeProvider.FindType(xmlNamespace, - xmlLocalName + "Extension", - genArgs); - - if (type != null) - { - Type extType; - if (_wellKnownExtensionTypes.TryGetValue(type, out extType)) - { - type = extType; - } - } - - if (type == null) - { - //let's try the simple types - //in Portable xaml like xmlns:sys='clr-namespace:System;assembly=mscorlib' - //and sys:Double is not resolved properly - return ResolveSimpleTypeName(xmlNamespace, xmlLocalName); - } - - return GetXamlType(type); - } - - #region Workaround for bug in Portablexaml system types like double,int etc ... - - private static Type[] _simpleTypes = new Type[] - { - typeof(bool), - typeof(byte), - typeof(char), - typeof(decimal), - typeof(double), - typeof(Int16), - typeof(Int32), - typeof(Int64), - typeof(float), - typeof(string), - typeof(TimeSpan), - typeof(Uri), - }; - - private static Dictionary, XamlType> _simpleXamlTypes; - - //in Portable xaml like xmlns:sys='clr-namespace:System;assembly=mscorlib' - //and sys:Double is not resolved properly - [Obsolete("TODO: remove once it's fixed in Portable.xaml")] - private static XamlType ResolveSimpleTypeName(string xmlNamespace, string xmlLocalName) - { - if (_simpleXamlTypes == null) - { - _simpleXamlTypes = new Dictionary, XamlType>(); - - foreach (var type in _simpleTypes) - { - string asmName = type.GetTypeInfo().Assembly.GetName().Name; - string ns = $"clr-namespace:{type.Namespace};assembly={asmName}"; - var xamlType = XamlLanguage.AllTypes.First(t => t.UnderlyingType == type); - _simpleXamlTypes.Add(new Tuple(ns, type.Name), xamlType); - } - } - - XamlType result; - - var key = new Tuple(xmlNamespace, xmlLocalName); - - _simpleXamlTypes.TryGetValue(key, out result); - - return result; - } - - #endregion Workaround for bug in Portablexaml system types like double,int etc ... - - protected internal override ICustomAttributeProvider GetCustomAttributeProvider(Type type) - => new AvaloniaTypeAttributeProvider(type); - - protected internal override ICustomAttributeProvider GetCustomAttributeProvider(MemberInfo member) - => new AvaloniaMemberAttributeProvider(member); - - public override XamlType GetXamlType(Type type) - { - XamlType result = null; - - if (_cachedTypes.TryGetValue(type, out result)) - { - return result; - } - - _cachedTypes[type] = result = GetAvaloniaXamlType(type) ?? base.GetXamlType(type); - - return result; - } - - private static readonly Dictionary _wellKnownExtensionTypes = new Dictionary() - { - { typeof(Binding), typeof(BindingExtension) }, - { typeof(StyleInclude), typeof(StyleIncludeExtension) }, - }; - - private XamlType GetAvaloniaXamlType(Type type) - { - //if type is extension get the original type to check - var origType = _wellKnownExtensionTypes.FirstOrDefault(v => v.Value == type).Key; - - if (typeof(IBinding).GetTypeInfo().IsAssignableFrom((origType ?? type).GetTypeInfo())) - { - return new BindingXamlType(type, this); - } - - if (origType != null || - typeof(AvaloniaObject).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) - { - return new AvaloniaXamlType(type, this); - } - - return null; - } - - protected internal override XamlMember GetAttachableProperty(string attachablePropertyName, MethodInfo getter, MethodInfo setter) - { - var key = MemberKey.Create(getter ?? setter, attachablePropertyName, "a"); - - XamlMember result; - - if (_cachedMembers.TryGetValue(key, out result)) - { - return result; - } - - var type = (getter ?? setter).DeclaringType; - - var prop = AvaloniaPropertyRegistry.Instance.FindRegistered(type, attachablePropertyName); - - if (prop != null) - { - result = new AvaloniaAttachedPropertyXamlMember( - prop, attachablePropertyName, - getter, setter, this); - } - - if (result == null) - { - result = base.GetAttachableProperty(attachablePropertyName, getter, setter); - } - - return _cachedMembers[key] = result; - } - - protected internal override XamlMember GetProperty(PropertyInfo pi) - { - Type objType = pi.DeclaringType; - string name = pi.Name; - - XamlMember result; - - var key = MemberKey.Create(pi, "p"); - - if (_cachedMembers.TryGetValue(key, out result)) - { - return result; - } - - var avProp = AvaloniaPropertyRegistry.Instance.FindRegistered(objType, name); - - if (avProp != null) - { - result = new AvaloniaPropertyXamlMember(avProp, pi, this); - } - - if (result == null) - { - result = new PropertyXamlMember(pi, this); - } - - return _cachedMembers[key] = result; - } - - private Dictionary _cachedTypes = new Dictionary(); - - private Dictionary _cachedMembers = new Dictionary(); - - private struct MemberKey - { - public static MemberKey Create(MemberInfo m, string name, string memberType) - { - return new MemberKey(m.DeclaringType, name, memberType); - } - - public static MemberKey Create(MemberInfo m, string memberType) - { - return Create(m, m.Name, memberType); - } - - public MemberKey(Type type, object member, string memberType) - { - Type = type; - Member = member; - MemberType = memberType; - } - - public Type Type { get; } - - public object Member { get; } - - public string MemberType { get; } - - public override string ToString() - { - return $"{MemberType}:{Type.Namespace}:{Type.Name}.{Member}"; - } - } - - - public override bool TryGetCompatibleXamlNamespace(string xamlNamespace, out string compatibleNamespace) - { - //Forces XamlXmlReader to not ignore our namespace in design mode if mc:Ignorable is set - if (IsDesignMode && - xamlNamespace == "http://schemas.microsoft.com/expression/blend/2008") - { - compatibleNamespace = xamlNamespace; - return true; - } - - return base.TryGetCompatibleXamlNamespace(xamlNamespace, out compatibleNamespace); - } - - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs deleted file mode 100644 index 10cf7169128..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs +++ /dev/null @@ -1,388 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Data; -using Avalonia.Markup.Data; -using Avalonia.Metadata; -using Avalonia.Styling; -using Portable.Xaml; -using Portable.Xaml.Schema; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.Reflection; -using System.Xml.Serialization; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - using Converters; - using PropertyKey = Tuple; - - public class AvaloniaXamlType : XamlType - { - static readonly AvaloniaPropertyTypeConverter propertyTypeConverter = new AvaloniaPropertyTypeConverter(); - - public AvaloniaXamlType(Type underlyingType, XamlSchemaContext schemaContext) : - base(underlyingType, schemaContext) - { - } - - protected override XamlMember LookupAttachableMember(string name) - { - var m = base.LookupAttachableMember(name); - - if (m == null) - { - // Might be an AddOwnered attached property. - var avProp = AvaloniaPropertyRegistry.Instance.FindRegistered(UnderlyingType, name); - - if (avProp?.IsAttached == true) - { - return new AvaloniaPropertyXamlMember(avProp, this); - } - } - - return m; - } - - protected override XamlMember LookupMember(string name, bool skipReadOnlyCheck) - { - var m = base.LookupMember(name, skipReadOnlyCheck); - - if (m == null && !name.Contains(".")) - { - //so far Portable.xaml haven't found the member/property - //but what if we have AvaloniaProperty - //without setter and/or without getter - //let's try to find the AvaloniaProperty as a fallback - var avProp = AvaloniaPropertyRegistry.Instance.FindRegistered(UnderlyingType, name); - - if (avProp != null && !(skipReadOnlyCheck && avProp.IsReadOnly)) - { - m = new AvaloniaPropertyXamlMember(avProp, this); - } - } - - return m; - } - } - - public class BindingXamlType : XamlType - { - private static List _notAssignable = - new List - { - typeof (IXmlSerializable) - }; - - public BindingXamlType(Type underlyingType, XamlSchemaContext schemaContext) : - base(underlyingType, schemaContext) - { - } - - public override bool CanAssignTo(XamlType xamlType) - { - return !_notAssignable.Contains(xamlType.UnderlyingType); - } - } - - public class PropertyXamlMember : XamlMember - { - public PropertyXamlMember(PropertyInfo propertyInfo, XamlSchemaContext schemaContext) - : base(propertyInfo, schemaContext) - { - } - - protected PropertyXamlMember(string attachablePropertyName, - MethodInfo getter, MethodInfo setter, XamlSchemaContext schemaContext) - : base(attachablePropertyName, getter, setter, schemaContext) - { - } - - protected PropertyXamlMember(string name, XamlType declaringType, bool isAttachable) - : base(name, declaringType, isAttachable) - { - } - - private bool IsReadOnlyCollectionProperty - { - get - { - //Collection properties like: - //MultiBinding.Bindings, Panel.Children, Control.Styles, - //need to be readonly for Portable.Xaml - //Collection properties like: - //Grid.RowDefinitions, Grid.ColumnDefinitions - //need to be set only once, and subsequent changes to be - //added to collection - //TODO: investigate is this good enough as solution ??? - //We can add some ReadOnyXamlPropertyCollectionAttribute to cover this - return Type.IsCollection; - } - } - - private bool HasCollectionTypeConverter - { - get - { - return Type.IsCollection && Type.TypeConverter != null; - } - } - - protected override MethodInfo LookupUnderlyingSetter() - { - //if we have content property a list - //we have some issues in portable.xaml - //but if the list is read only, this is solving the problem - - if (IsReadOnlyCollectionProperty && - !HasCollectionTypeConverter) - { - return null; - } - - return base.LookupUnderlyingSetter(); - } - - protected override XamlMemberInvoker LookupInvoker() - { - //if we have a IList property and it has TypeConverter - //Portable.xaml need to be able to set the value - //but instead directly set new value we'll sync the lists - bool updateListInsteadSet = HasCollectionTypeConverter; - return new PropertyInvoker(this) - { - UpdateListInsteadSet = updateListInsteadSet - }; - } - - protected override bool LookupIsUnknown() => false; - - protected override XamlType LookupType() - { - var propType = GetPropertyType(); - - if (propType != null) - { - if (propType == typeof(IEnumerable)) - { - //TODO: Portable.xaml is not handling well IEnumerable - //let's threat IEnumerable property as list - //revisit this when smarter solution is found - propType = typeof(IList); - } - - return DeclaringType.SchemaContext.GetXamlType(propType); - } - - return base.LookupType(); - } - - protected virtual Type GetPropertyType() - { - return (UnderlyingMember as PropertyInfo)?.PropertyType; - } - - private IList _dependsOn; - - protected override IList LookupDependsOn() - { - if (_dependsOn == null) - { - var attrib = UnderlyingMember.GetCustomAttribute(true); - - if (attrib != null) - { - var member = DeclaringType.GetMember(attrib.Name); - - _dependsOn = new XamlMember[] { member }; - } - else - { - _dependsOn = base.LookupDependsOn(); - } - } - - return _dependsOn; - } - - private PropertyKey PropertyKey() - => new PropertyKey(DeclaringType.UnderlyingType, Name); - - private class PropertyInvoker : XamlMemberInvoker - { - public bool UpdateListInsteadSet { get; set; } = false; - - public PropertyInvoker(XamlMember member) : base(member) - { - } - - public override void SetValue(object instance, object value) - { - //can't make it work to assign TypeConverter to Setter.Value - //so we need it hard coded - //TODO: try to assosiate TypeConverter with Setter.Value - //and remove this lines - if (instance is Setter && - Member.Name == nameof(Setter.Value) && - value is string) - { - value = SetterValueTypeConverter.ConvertSetterValue(null, - Member.DeclaringType.SchemaContext, CultureInfo.InvariantCulture, - instance as Setter, - value); - } - - if (UpdateListInsteadSet && - value != null && - UpdateListInsteadSetValue(instance, value)) - { - return; - } - - base.SetValue(instance, value); - } - - private bool UpdateListInsteadSetValue(object instance, object value) - { - object old = GetValue(instance); - - if (Equals(old, value)) - { - //don't set the same collection value - return true; - } - else if (old is IList && value is IList) - { - var oldList = (IList)old; - var curList = (IList)value; - - oldList.Clear(); - - foreach (object item in curList) - { - oldList.Add(item); - } - - return true; - } - - return false; - } - } - } - - public class AvaloniaPropertyXamlMember : PropertyXamlMember - { - private bool? _assignBinding; - - public bool AssignBinding => (bool)(_assignBinding ?? (_assignBinding = UnderlyingMember?.GetCustomAttribute() != null)); - - public AvaloniaProperty Property { get; } - - public AvaloniaPropertyXamlMember(AvaloniaProperty property, - PropertyInfo propertyInfo, - XamlSchemaContext schemaContext) : - base(propertyInfo, schemaContext) - { - Property = property; - } - - public AvaloniaPropertyXamlMember(AvaloniaProperty property, XamlType type) : - base(property.Name, type, false) - { - Property = property; - } - - protected AvaloniaPropertyXamlMember(AvaloniaProperty property, - string attachablePropertyName, - MethodInfo getter, MethodInfo setter, XamlSchemaContext schemaContext) - : base(attachablePropertyName, getter, setter, schemaContext) - { - Property = property; - } - - protected override XamlMemberInvoker LookupInvoker() - { - return new AvaloniaPropertyInvoker(this); - } - - protected override bool LookupIsReadOnly() - { - return Property.IsReadOnly; - } - - protected override Type GetPropertyType() - { - return Property.PropertyType; - } - - private class AvaloniaPropertyInvoker : XamlMemberInvoker - { - public AvaloniaPropertyInvoker(XamlMember member) : base(member) - { - } - - public override void SetValue(object instance, object value) - { - if (Property != null) - { - var obj = ((IAvaloniaObject)instance); - if (value is IBinding) - { - if (!Member.AssignBinding) - ApplyBinding(obj, (IBinding)value); - else - obj.SetValue(Property, value); - } - else - { - obj.SetValue(Property, value); - } - } - else - { - base.SetValue(instance, value); - } - } - - public override object GetValue(object instance) - { - if (Property != null && !Property.IsAttached) - { - return ((IAvaloniaObject)instance).GetValue(Property); - } - else - { - return base.GetValue(instance); - } - } - - private void ApplyBinding(IAvaloniaObject obj, IBinding binding) - { - var control = obj as IControl; - var property = Property; - - if (control != null && property != Control.DataContextProperty) - DelayedBinding.Add(control, property, binding); - else - obj.Bind(property, binding); - } - - private AvaloniaProperty Property => Member.Property; - - private new AvaloniaPropertyXamlMember Member => - (AvaloniaPropertyXamlMember)base.Member; - } - } - - public class AvaloniaAttachedPropertyXamlMember : AvaloniaPropertyXamlMember - { - public AvaloniaAttachedPropertyXamlMember(AvaloniaProperty property, - string attachablePropertyName, - MethodInfo getter, MethodInfo setter, - XamlSchemaContext schemaContext) - : base(property, attachablePropertyName, getter, setter, schemaContext) - { - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/TypeDescriptorExtensions.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/TypeDescriptorExtensions.cs deleted file mode 100644 index a48f400af21..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/TypeDescriptorExtensions.cs +++ /dev/null @@ -1,101 +0,0 @@ -using Avalonia.Markup.Xaml.PortableXaml; -using Portable.Xaml.Markup; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.ComponentModel; - -namespace Portable.Xaml.ComponentModel -{ - internal static class TypeDescriptorExtensions - { - /// - /// Gets the service from ITypeDescriptorContext - /// usually in TypeConverter in xaml reader context - /// examples: - /// context.GetService<IXamlTypeResolver>() - /// context.GetService<IXamlNamespaceResolver>() - /// context.GetService<IXamlNameProvider>() - /// context.GetService<INamespacePrefixLookup>() - /// context.GetService<IXamlSchemaContextProvider>() - /// context.GetService<IRootObjectProvider>() - /// context.GetService<IProvideValueTarget>() - /// - /// Service Type - /// The TypeDescriptor context. - /// - public static T GetService(this ITypeDescriptorContext ctx) where T : class - { - return ctx.GetService(typeof(T)) as T; - } - - public static Type ResolveType(this ITypeDescriptorContext ctx, string namespacePrefix, string type) - { - var tr = ctx.GetService(); - - string name = string.IsNullOrEmpty(namespacePrefix) ? type : $"{namespacePrefix}:{type}"; - - return tr?.Resolve(name); - } - - public static T GetFirstAmbientValue(this ITypeDescriptorContext ctx) where T : class - { - var amb = ctx.GetService(); - var sc = ctx.GetService().SchemaContext; - - // Because GetFirstParent uses XamlType.CanAssignTo it returns values that - // aren't actually of the correct type. Use GetAllAmbientValues instead. - return amb.GetAllAmbientValues(sc.GetXamlType(typeof(T))).OfType().FirstOrDefault(); - } - - public static T GetLastOrDefaultAmbientValue(this ITypeDescriptorContext ctx) where T : class - { - return ctx.GetAllAmbientValues().LastOrDefault() as T; - } - - public static IEnumerable GetAllAmbientValues(this ITypeDescriptorContext ctx) where T : class - { - var amb = ctx.GetService(); - var sc = ctx.GetService().SchemaContext; - - return amb.GetAllAmbientValues(sc.GetXamlType(typeof(T))).OfType(); - } - - public static Uri GetBaseUri(this ITypeDescriptorContext ctx) - { - return ctx.GetWriterSettings()?.Context?.BaseUri; - } - - public static Assembly GetLocalAssembly(this ITypeDescriptorContext ctx) - { - return ctx.GetWriterSettings()?.Context?.LocalAssembly; - } - - public static AvaloniaXamlContext GetAvaloniaXamlContext(this ITypeDescriptorContext ctx) - { - return ctx.GetWriterSettings()?.Context; - } - - public static XamlObjectWriterSettings WithContext(this XamlObjectWriterSettings settings, AvaloniaXamlContext context) - { - return new AvaloniaXamlObjectWriterSettings(settings, context); - } - - private static AvaloniaXamlObjectWriterSettings GetWriterSettings(this ITypeDescriptorContext ctx) - { - return ctx.GetService().GetParentSettings() as AvaloniaXamlObjectWriterSettings; - } - - private class AvaloniaXamlObjectWriterSettings : XamlObjectWriterSettings - { - public AvaloniaXamlObjectWriterSettings(XamlObjectWriterSettings settings, AvaloniaXamlContext context) - : base(settings) - { - Context = context; - } - - public AvaloniaXamlContext Context { get; } - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github deleted file mode 160000 index ab552617372..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ab5526173722b8988bc5ca3c03c8752ce89c0975 diff --git a/src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs b/src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs index ff367c0e134..ead373d3801 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs @@ -7,42 +7,16 @@ namespace Avalonia.Markup.Xaml.Templates { - using Portable.Xaml; - - public class TemplateContent + + public static class TemplateContent { - public TemplateContent(IEnumerable namespaces, XamlReader reader, - IAmbientProvider ambientProvider) - { - ParentAmbientProvider = ambientProvider; - List = new XamlNodeList(reader.SchemaContext); - - //we need to rpeserve all namespace and prefixes to writer - //otherwise they are lost. a bug in Portable.xaml or by design ?? - foreach (var ns in namespaces) - { - List.Writer.WriteNamespace(ns); - } - - XamlServices.Transform(reader, List.Writer); - } - - public XamlNodeList List { get; } - - private IAmbientProvider ParentAmbientProvider { get; } - - public IControl Load() - { - return (IControl)AvaloniaXamlLoader.LoadFromReader(List.GetReader(), parentAmbientProvider: ParentAmbientProvider); - } - public static IControl Load(object templateContent) { if (templateContent is Func direct) { return (IControl)direct(null); } - return ((TemplateContent)templateContent).Load(); + throw new ArgumentException(nameof(templateContent)); } } } diff --git a/src/Markup/Avalonia.Markup.Xaml/Templates/TemplateLoader.cs b/src/Markup/Avalonia.Markup.Xaml/Templates/TemplateLoader.cs deleted file mode 100644 index e29485ddb04..00000000000 --- a/src/Markup/Avalonia.Markup.Xaml/Templates/TemplateLoader.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -namespace Avalonia.Markup.Xaml.Templates -{ - using Portable.Xaml; - using Portable.Xaml.ComponentModel; - using System.ComponentModel; - using System; - - public class TemplateLoader : XamlDeferringLoader - { - public override object Load(XamlReader xamlReader, IServiceProvider serviceProvider) - { - var tdc = (ITypeDescriptorContext)serviceProvider; - var ns = tdc.GetService(); - var ambientProvider = tdc.GetService(); - return new TemplateContent(ns.GetNamespacePrefixes(), xamlReader, ambientProvider); - } - - public override XamlReader Save(object value, IServiceProvider serviceProvider) - { - return ((TemplateContent)value).List.GetReader(); - } - } -} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs index 581dbcdac7e..c25e1186d07 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs @@ -28,15 +28,14 @@ public static XamlIlLanguageTypeMappings Configure(IXamlIlTypeSystem typeSystem) XmlnsAttributes = { typeSystem.GetType("Avalonia.Metadata.XmlnsDefinitionAttribute"), - typeSystem.FindType("Portable.Xaml.Markup.XmlnsDefinitionAttribute") }, ContentAttributes = { typeSystem.GetType("Avalonia.Metadata.ContentAttribute") }, - ProvideValueTarget = typeSystem.GetType("Portable.Xaml.Markup.IProvideValueTarget"), - RootObjectProvider = typeSystem.GetType("Portable.Xaml.IRootObjectProvider"), - UriContextProvider = typeSystem.GetType("Portable.Xaml.Markup.IUriContext"), + ProvideValueTarget = typeSystem.GetType("Avalonia.Markup.Xaml.IProvideValueTarget"), + RootObjectProvider = typeSystem.GetType("Avalonia.Markup.Xaml.IRootObjectProvider"), + UriContextProvider = typeSystem.GetType("Avalonia.Markup.Xaml.IUriContext"), ParentStackProvider = typeSystem.GetType("Avalonia.Markup.Xaml.XamlIl.Runtime.IAvaloniaXamlIlParentStackProvider"), @@ -47,7 +46,6 @@ public static XamlIlLanguageTypeMappings Configure(IXamlIlTypeSystem typeSystem) runtimeHelpers.FindMethod(m => m.Name == "DeferredTransformationFactoryV1"), UsableDuringInitializationAttributes = { - typeSystem.GetType("Portable.Xaml.Markup.UsableDuringInitializationAttribute"), typeSystem.GetType("Avalonia.Metadata.UsableDuringInitializationAttribute"), }, InnerServiceProviderFactoryMethod = @@ -79,15 +77,12 @@ void AddType(IXamlIlType type, IXamlIlType conv) void Add(string type, string conv) => AddType(typeSystem.GetType(type), typeSystem.GetType(conv)); - - //Add("Avalonia.AvaloniaProperty","Avalonia.Markup.Xaml.Converters.AvaloniaPropertyTypeConverter"); Add("Avalonia.Media.Imaging.IBitmap","Avalonia.Markup.Xaml.Converters.BitmapTypeConverter"); var ilist = typeSystem.GetType("System.Collections.Generic.IList`1"); AddType(ilist.MakeGenericType(typeSystem.GetType("Avalonia.Point")), typeSystem.GetType("Avalonia.Markup.Xaml.Converters.PointsListTypeConverter")); Add("Avalonia.Controls.Templates.IMemberSelector", "Avalonia.Markup.Xaml.Converters.MemberSelectorTypeConverter"); - Add("Avalonia.Styling.Selector","Avalonia.Markup.Xaml.Converters.SelectorTypeConverter"); Add("Avalonia.Controls.WindowIcon","Avalonia.Markup.Xaml.Converters.IconTypeConverter"); Add("System.Globalization.CultureInfo", "System.ComponentModel.CultureInfoConverter"); Add("System.Uri", "Avalonia.Markup.Xaml.Converters.AvaloniaUriTypeConverter"); diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs index 70b7fe6aec4..2d8ea643ac7 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs @@ -4,8 +4,6 @@ using System.Reflection; using Avalonia.Controls; using Avalonia.Data; -using Portable.Xaml; -using Portable.Xaml.Markup; // ReSharper disable UnusedMember.Global // ReSharper disable UnusedParameter.Global diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs b/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs new file mode 100644 index 00000000000..06cc85101ae --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs @@ -0,0 +1,34 @@ +using System; + +namespace Avalonia.Markup.Xaml +{ + public interface IProvideValueTarget + { + object TargetObject { get; } + object TargetProperty { get; } + } + + public interface IRootObjectProvider + { + object RootObject { get; } + } + + public interface IUriContext + { + Uri BaseUri { get; set; } + } + + public interface IXamlTypeResolver + { + Type Resolve (string qualifiedTypeName); + } + + + public class ConstructorArgumentAttribute : Attribute + { + public ConstructorArgumentAttribute(string name) + { + + } + } +} diff --git a/tests/Avalonia.DesignerSupport.TestApp/App.xaml b/tests/Avalonia.DesignerSupport.TestApp/App.xaml index 214bcd87971..56c0e8059a3 100644 --- a/tests/Avalonia.DesignerSupport.TestApp/App.xaml +++ b/tests/Avalonia.DesignerSupport.TestApp/App.xaml @@ -1,6 +1,8 @@ - + - \ No newline at end of file + diff --git a/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj b/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj index ebe64b89ce5..6bba5e7348e 100644 --- a/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj +++ b/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj @@ -31,6 +31,6 @@ - + diff --git a/tests/Avalonia.DesignerSupport.TestApp/MainWindow.xaml b/tests/Avalonia.DesignerSupport.TestApp/MainWindow.xaml index 6938bd8c49a..f90e5beaa69 100644 --- a/tests/Avalonia.DesignerSupport.TestApp/MainWindow.xaml +++ b/tests/Avalonia.DesignerSupport.TestApp/MainWindow.xaml @@ -1,5 +1,7 @@  + Title="TESTAPP" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + x:Class="Avalonia.DesignerSupport.TestApp.MainWindow">