Browse Source

Remove RuntimeHostConfigurationOption

Max Katz 3 years ago
parent
commit
5553958238

+ 0 - 4
packages/Avalonia/AvaloniaBuildTasks.targets

@@ -20,10 +20,6 @@
     <None Remove="**\*.axaml" />
     <None Remove="**\*.paml" />
   </ItemGroup>
-
-  <ItemGroup Condition="'$(AvaloniaUseCompiledBindingsByDefault)' == 'true'">
-    <RuntimeHostConfigurationOption Include="Avalonia.UseCompiledBindingsByDefault" Value="true" />
-  </ItemGroup>
   
   <UsingTask TaskName="GenerateAvaloniaResourcesTask"
              AssemblyFile="$(AvaloniaBuildTasksLocation)"

+ 1 - 1
src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs

@@ -42,7 +42,7 @@ namespace Avalonia.Build.Tasks
             string output, bool verifyIl, bool defaultCompileBindings, MessageImportance logImportance, string strongNameKey,
             bool skipXamlCompilation)
         {
-            return Compile(engine, input, references, projectDirectory, output, verifyIl, logImportance, strongNameKey, skipXamlCompilation, debuggerLaunch:false);
+            return Compile(engine, input, references, projectDirectory, output, verifyIl, defaultCompileBindings, logImportance, strongNameKey, skipXamlCompilation, debuggerLaunch:false);
         }
 
         internal static CompileResult Compile(IBuildEngine engine, string input, string[] references,

+ 59 - 1
src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs

@@ -4,6 +4,8 @@ using System.Reflection;
 using System.Text;
 using Avalonia.Markup.Xaml.XamlIl;
 
+#nullable enable
+
 namespace Avalonia.Markup.Xaml
 {
     public static class AvaloniaRuntimeXamlLoader
@@ -26,6 +28,22 @@ namespace Avalonia.Markup.Xaml
                 return Load(stream, localAssembly, rootInstance, uri, designMode);
             }
         }
+        
+        /// <summary>
+        /// Loads XAML from a string.
+        /// </summary>
+        /// <param name="xaml">The string containing the XAML.</param>
+        /// <param name="configuration">Xaml loader configuration.</param>
+        /// <returns>The loaded object.</returns>
+        public static object Load(string xaml, RuntimeXamlLoaderConfiguration configuration)
+        {
+            Contract.Requires<ArgumentNullException>(xaml != null);
+
+            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xaml)))
+            {
+                return Load(stream, configuration);
+            }
+        }
 
         /// <summary>
         /// Loads XAML from a stream.
@@ -38,7 +56,17 @@ namespace Avalonia.Markup.Xaml
         /// <returns>The loaded object.</returns>
         public static object Load(Stream stream, Assembly localAssembly, object rootInstance = null, Uri uri = null,
             bool designMode = false)
-            => AvaloniaXamlIlRuntimeCompiler.Load(stream, localAssembly, rootInstance, uri, designMode);
+            => AvaloniaXamlIlRuntimeCompiler.Load(stream, localAssembly, rootInstance, uri, designMode, false);
+        
+        /// <summary>
+        /// Loads XAML from a stream.
+        /// </summary>
+        /// <param name="stream">The stream containing the XAML.</param>
+        /// <param name="configuration">Xaml loader configuration.</param>
+        /// <returns>The loaded object.</returns>
+        public static object Load(Stream stream, RuntimeXamlLoaderConfiguration configuration)
+            => AvaloniaXamlIlRuntimeCompiler.Load(stream, configuration.LocalAssembly, configuration.RootInstance,
+                configuration.BaseUri, configuration.DesignMode, configuration.UseCompiledBindingsByDefault);
 
         /// <summary>
         /// Parse XAML from a string.
@@ -60,4 +88,34 @@ namespace Avalonia.Markup.Xaml
             => (T)Parse(xaml, localAssembly);
             
     }
+    
+    public class RuntimeXamlLoaderConfiguration
+    {
+        /// <summary>
+        /// The URI of the XAML being loaded.
+        /// </summary>
+        public Uri? BaseUri { get; set; }
+
+        /// <summary>
+        /// Default assembly for clr-namespace:.
+        /// </summary>
+        public Assembly LocalAssembly { get; set; }
+            
+        /// <summary>
+        /// The optional instance into which the XAML should be loaded.
+        /// </summary>
+        public object? RootInstance { get; set; }
+            
+        /// <summary>
+        /// Defines is CompiledBinding should be used by default.
+        /// Default is 'false'.
+        /// </summary>
+        public bool UseCompiledBindingsByDefault { get; set; } = false;
+
+        /// <summary>
+        /// Indicates whether the XAML is being loaded in design mode.
+        /// Default is 'false'.
+        /// </summary>
+        public bool DesignMode { get; set; } = false;
+    }
 }

+ 10 - 16
src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaXamlIlRuntimeCompiler.cs

@@ -24,8 +24,6 @@ namespace Avalonia.Markup.Xaml.XamlIl
 {
     static class AvaloniaXamlIlRuntimeCompiler
     {
-        private const string UseCompileBindingsByDefaultConfigSwitch = "Avalonia.UseCompiledBindingsByDefault";
-
 #if !RUNTIME_XAML_CECIL
         private static SreTypeSystem _sreTypeSystem;
         private static Type _ignoresAccessChecksFromAttribute;
@@ -152,12 +150,12 @@ namespace Avalonia.Markup.Xaml.XamlIl
         }
         
 
-        static object LoadSre(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode)
+        static object LoadSre(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode, bool useCompiledBindingsByDefault)
         {
             var success = false;
             try
             {
-                var rv = LoadSreCore(xaml, localAssembly, rootInstance, uri, isDesignMode);
+                var rv = LoadSreCore(xaml, localAssembly, rootInstance, uri, isDesignMode, useCompiledBindingsByDefault);
                 success = true;
                 return rv;
             }
@@ -169,7 +167,7 @@ namespace Avalonia.Markup.Xaml.XamlIl
         }
 
         
-        static object LoadSreCore(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode)
+        static object LoadSreCore(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode, bool useCompiledBindingsByDefault)
         {
 
             InitializeSre();
@@ -180,16 +178,14 @@ namespace Avalonia.Markup.Xaml.XamlIl
             var clrPropertyBuilder = tb.DefineNestedType("ClrProperties_" + Guid.NewGuid().ToString("N"));
             var indexerClosureType = _sreBuilder.DefineType("IndexerClosure_" + Guid.NewGuid().ToString("N"));
             var trampolineBuilder = _sreBuilder.DefineType("Trampolines_" + Guid.NewGuid().ToString("N"));
-
-            bool compileBindingsByDefault = AppContext.TryGetSwitch(UseCompileBindingsByDefaultConfigSwitch, out var compileBindingsSwitchValue) && compileBindingsSwitchValue;
-
+            
             var compiler = new AvaloniaXamlIlCompiler(new AvaloniaXamlIlCompilerConfiguration(_sreTypeSystem, asm,
                 _sreMappings, _sreXmlns, AvaloniaXamlIlLanguage.CustomValueConverter,
                 new XamlIlClrPropertyInfoEmitter(_sreTypeSystem.CreateTypeBuilder(clrPropertyBuilder)),
                 new XamlIlPropertyInfoAccessorFactoryEmitter(_sreTypeSystem.CreateTypeBuilder(indexerClosureType)),
                 new XamlIlTrampolineBuilder(_sreTypeSystem.CreateTypeBuilder(trampolineBuilder))), 
                 _sreEmitMappings,
-                _sreContextType) { EnableIlVerification = true, DefaultCompileBindings = compileBindingsByDefault };
+                _sreContextType) { EnableIlVerification = true, DefaultCompileBindings = useCompiledBindingsByDefault };
 
             IXamlType overrideType = null;
             if (rootInstance != null)
@@ -254,15 +250,15 @@ namespace Avalonia.Markup.Xaml.XamlIl
         }
         
         public static object Load(Stream stream, Assembly localAssembly, object rootInstance, Uri uri,
-            bool isDesignMode)
+            bool isDesignMode, bool useCompiledBindingsByDefault)
         {
             string xaml;
             using (var sr = new StreamReader(stream))
                 xaml = sr.ReadToEnd();
 #if RUNTIME_XAML_CECIL
-            return LoadCecil(xaml, localAssembly, rootInstance, uri);
+            return LoadCecil(xaml, localAssembly, rootInstance, uri, useCompiledBindingsByDefault);
 #else
-            return LoadSre(xaml, localAssembly, rootInstance, uri, isDesignMode);
+            return LoadSre(xaml, localAssembly, rootInstance, uri, isDesignMode, useCompiledBindingsByDefault);
 #endif
         }
 
@@ -296,7 +292,7 @@ namespace Avalonia.Markup.Xaml.XamlIl
         }
 
         private static Dictionary<string, Type> _cecilGeneratedCache = new Dictionary<string, Type>();
-        static object LoadCecil(string xaml, Assembly localAssembly, object rootInstance, Uri uri)
+        static object LoadCecil(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool useCompiledBindingsByDefault)
         {
             if (uri == null)
                 throw new InvalidOperationException("Please, go away");
@@ -330,8 +326,6 @@ namespace Avalonia.Markup.Xaml.XamlIl
             
             var tb = _cecilTypeSystem.CreateTypeBuilder(def);
             
-            bool compileBindingsByDefault = AppContext.TryGetSwitch(UseCompileBindingsByDefaultConfigSwitch, out var compileBindingsSwitchValue) && compileBindingsSwitchValue;
-
             var compiler = new AvaloniaXamlIlCompiler(new XamlIlTransformerConfiguration(_cecilTypeSystem,
                     localAssembly == null ? null : _cecilTypeSystem.FindAssembly(localAssembly.GetName().Name),
                     _cecilMappings, XamlIlXmlnsMappings.Resolve(_cecilTypeSystem, _cecilMappings),
@@ -339,7 +333,7 @@ namespace Avalonia.Markup.Xaml.XamlIl
                 _cecilEmitMappings,
                 _cecilTypeSystem.CreateTypeBuilder(contextDef))
                 {
-                    DefaultCompileBindings = compileBindingsByDefault
+                    DefaultCompileBindings = useCompiledBindingsByDefault
                 };
             compiler.ParseAndCompile(xaml, uri.ToString(), tb, overrideType);
             var asmPath = Path.Combine(_cecilEmitDir, safeUri + ".dll");

+ 21 - 0
tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs

@@ -1569,6 +1569,27 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
             }
         }
         
+        [Fact]
+        public void Uses_RuntimeLoader_Configuration_To_Enabled_Compiled()
+        {
+            using (UnitTestApplication.Start(TestServices.StyledWindow))
+            {
+                var xaml = @"
+<local:AssignBindingControl xmlns='https://github.com/avaloniaui'
+        xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
+        xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.MarkupExtensions;assembly=Avalonia.Markup.Xaml.UnitTests'
+        X='{Binding StringProperty, DataType=local:TestDataContext}' />";
+                var control = (AssignBindingControl)AvaloniaRuntimeXamlLoader.Load(xaml, new RuntimeXamlLoaderConfiguration
+                {
+                    UseCompiledBindingsByDefault = true
+                });
+                var compiledPath = ((CompiledBindingExtension)control.X).Path;
+
+                var node = Assert.IsType<PropertyElement>(Assert.Single(compiledPath.Elements));
+                Assert.Equal(typeof(string), node.Property.PropertyType);
+            }
+        }
+        
         void Throws(string type, Action cb)
         {
             try