From e38edb258d6fe0855a0643ede0ffc18c2a214960 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Wed, 24 Apr 2024 00:34:35 -0700 Subject: [PATCH] Update XamlX (#15488) * Update XAMLX * And update XamlX again --------- Co-authored-by: Jumar Macato <16554748+jmacato@users.noreply.github.com> --- .../AvaloniaXamlIlLanguage.cs | 3 +- .../AvaloniaXamlIlClassesPropertyResolver.cs | 3 ++ ...aloniaXamlIlDeferredResourceTransformer.cs | 1 + ...aXamlIlOptionMarkupExtensionTransformer.cs | 2 + .../AvaloniaXamlIlSetterTransformer.cs | 2 + ...mlIlTransformInstanceAttachedProperties.cs | 2 + .../XamlIlAvaloniaPropertyHelper.cs | 1 + .../Avalonia.Markup.Xaml.Loader/xamlil.github | 2 +- .../Compiler/RoslynTypeSystem.cs | 41 +++++++++++++------ 9 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs index ad43e4a2bc..947714d4b0 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs @@ -182,7 +182,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions } public static bool CustomValueConverter(AstTransformationContext context, - IXamlAstValueNode node, IXamlType type, out IXamlAstValueNode result) + IXamlAstValueNode node, IReadOnlyList customAttributes, IXamlType type, + out IXamlAstValueNode result) { if (node is AvaloniaXamlIlOptionMarkupExtensionTransformer.OptionsMarkupExtensionNode optionsNode) { diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlClassesPropertyResolver.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlClassesPropertyResolver.cs index 23232dbcf3..6f188d8737 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlClassesPropertyResolver.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlClassesPropertyResolver.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using XamlX.Ast; using XamlX.Emit; @@ -61,6 +62,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public PropertySetterBinderParameters BinderParameters { get; } = new PropertySetterBinderParameters { AllowXNull = false }; public IReadOnlyList Parameters { get; } + public IReadOnlyList CustomAttributes => Array.Empty(); } class ClassBindingSetter : IXamlEmitablePropertySetter @@ -92,6 +94,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public PropertySetterBinderParameters BinderParameters { get; } = new PropertySetterBinderParameters { AllowXNull = false }; public IReadOnlyList Parameters { get; } + public IReadOnlyList CustomAttributes => Array.Empty(); } } } diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDeferredResourceTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDeferredResourceTransformer.cs index c4ee5df1da..06ec916fe7 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDeferredResourceTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDeferredResourceTransformer.cs @@ -99,6 +99,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public PropertySetterBinderParameters BinderParameters { get; } public IReadOnlyList Parameters { get; } + public IReadOnlyList CustomAttributes => _adder.CustomAttributes; public void Emit(IXamlILEmitter emitter) { diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlOptionMarkupExtensionTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlOptionMarkupExtensionTransformer.cs index 20f819240e..2b120286c4 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlOptionMarkupExtensionTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlOptionMarkupExtensionTransformer.cs @@ -339,6 +339,8 @@ internal class AvaloniaXamlIlOptionMarkupExtensionTransformer : IXamlAstTransfor public IXamlMethod MakeGenericMethod(IReadOnlyList typeArguments) => throw new NotImplementedException(); public IReadOnlyList CustomAttributes => Array.Empty(); + public IXamlParameterInfo GetParameterInfo(int index) => new AnonymousParameterInfo(Parameters[index], index); + public void EmitCall(XamlEmitContext context, IXamlILEmitter codeGen) { // At this point this extension will be called from MarkupExtensionEmitter. diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSetterTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSetterTransformer.cs index 8b5a893884..01612bff27 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSetterTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSetterTransformer.cs @@ -109,6 +109,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public IXamlType TargetType { get; } public PropertySetterBinderParameters BinderParameters { get; } public IReadOnlyList Parameters { get; } + public IReadOnlyList CustomAttributes => _method.CustomAttributes; + public void Emit(IXamlILEmitter codegen) { if (_type.IsValueType) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlTransformInstanceAttachedProperties.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlTransformInstanceAttachedProperties.cs index d98b60e835..c056f2b3f5 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlTransformInstanceAttachedProperties.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlTransformInstanceAttachedProperties.cs @@ -123,6 +123,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public IXamlType TargetType => _parent.DeclaringType; public PropertySetterBinderParameters BinderParameters { get; } = new PropertySetterBinderParameters(); public IReadOnlyList Parameters { get; } + public IReadOnlyList CustomAttributes => _parent.CustomAttributes; public void Emit(IXamlILEmitter emitter) { var so = _parent._config.WellKnownTypes.Object; @@ -178,6 +179,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public IReadOnlyList Parameters { get; } public IReadOnlyList CustomAttributes => DeclaringType.CustomAttributes; + public IXamlParameterInfo GetParameterInfo(int index) => new AnonymousParameterInfo(Parameters[index], index); public void EmitCall(IXamlILEmitter emitter) { diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs index 5ae8a8f182..387d153018 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs @@ -228,6 +228,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions public PropertySetterBinderParameters BinderParameters { get; } public IReadOnlyList Parameters { get; set; } + public IReadOnlyList CustomAttributes => Array.Empty(); public abstract void Emit(IXamlILEmitter emitter); diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github index 5683cc4f0e..941dafce49 160000 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github @@ -1 +1 @@ -Subproject commit 5683cc4f0e629ed30ad7bb6b5e920379ee5c344a +Subproject commit 941dafce490ffd21178f4493a7f0425e9d478e60 diff --git a/src/tools/Avalonia.Generators/Compiler/RoslynTypeSystem.cs b/src/tools/Avalonia.Generators/Compiler/RoslynTypeSystem.cs index 72ce2cca2f..59aaed2c11 100644 --- a/src/tools/Avalonia.Generators/Compiler/RoslynTypeSystem.cs +++ b/src/tools/Avalonia.Generators/Compiler/RoslynTypeSystem.cs @@ -152,8 +152,8 @@ internal class RoslynType : IXamlType _symbol.Constructors .Select(method => new RoslynConstructor(method, _assembly)) .ToList(); - - public IReadOnlyList CustomAttributes { get; } = new List(); + + public IReadOnlyList CustomAttributes { get; } = Array.Empty(); public IReadOnlyList GenericArguments { get; private set; } = new List(); @@ -189,6 +189,8 @@ internal class RoslynType : IXamlType public IXamlType GetEnumUnderlyingType() => null; public IReadOnlyList GenericParameters { get; } = new List(); + + public bool IsFunctionPointer => false; } internal class RoslynConstructor : IXamlConstructor @@ -212,10 +214,10 @@ internal class RoslynConstructor : IXamlConstructor public IReadOnlyList Parameters => _symbol.Parameters - .Select(parameter => parameter.Type) - .OfType() - .Select(type => new RoslynType(type, _assembly)) + .Select(parameter => new RoslynParameter(_assembly, parameter).ParameterType) .ToList(); + + public IXamlParameterInfo GetParameterInfo(int index) => new RoslynParameter(_assembly, _symbol.Parameters[index]); } internal class RoslynProperty : IXamlProperty @@ -243,12 +245,28 @@ internal class RoslynProperty : IXamlProperty public IXamlMethod Getter => _symbol.GetMethod == null ? null : new RoslynMethod(_symbol.GetMethod, _assembly); public IXamlMethod Setter => _symbol.SetMethod == null ? null : new RoslynMethod(_symbol.SetMethod, _assembly); - - public IReadOnlyList CustomAttributes { get; } = new List(); + + public IReadOnlyList CustomAttributes { get; } = Array.Empty(); public IReadOnlyList IndexerParameters { get; } = new List(); } +internal class RoslynParameter : IXamlParameterInfo +{ + private readonly RoslynAssembly _assembly; + private readonly IParameterSymbol _symbol; + + public RoslynParameter(RoslynAssembly assembly, IParameterSymbol symbol) + { + _assembly = assembly; + _symbol = symbol; + } + + public string Name => _symbol.Name; + public IXamlType ParameterType => new RoslynType((INamedTypeSymbol)_symbol.Type, _assembly); + public IReadOnlyList CustomAttributes => Array.Empty(); +} + internal class RoslynMethod : IXamlMethod { private readonly IMethodSymbol _symbol; @@ -277,14 +295,13 @@ internal class RoslynMethod : IXamlMethod public IXamlType ReturnType => new RoslynType((INamedTypeSymbol) _symbol.ReturnType, _assembly); public IReadOnlyList Parameters => - _symbol.Parameters.Select(parameter => parameter.Type) - .OfType() - .Select(type => new RoslynType(type, _assembly)) + _symbol.Parameters.Select(parameter => new RoslynParameter(_assembly, parameter).ParameterType) .ToList(); - + public IXamlType DeclaringType => new RoslynType((INamedTypeSymbol)_symbol.ReceiverType, _assembly); public IXamlMethod MakeGenericMethod(IReadOnlyList typeArguments) => null; - public IReadOnlyList CustomAttributes { get; } = new List(); + public IReadOnlyList CustomAttributes { get; } = Array.Empty(); + public IXamlParameterInfo GetParameterInfo(int index) => new RoslynParameter(_assembly, _symbol.Parameters[index]); }