Browse Source

Minor cleanup

Max Katz 2 năm trước cách đây
mục cha
commit
d764a6a5fb

+ 10 - 0
src/Avalonia.Build.Tasks/Extensions.cs

@@ -7,6 +7,16 @@ namespace Avalonia.Build.Tasks
     {
         static string FormatErrorCode(BuildEngineErrorCode code) => $"AVLN:{(int)code:0000}";
 
+        public static void LogError(this IBuildEngine engine, BuildEngineErrorCode code, string file, Exception ex,
+            int lineNumber = 0, int linePosition = 0)
+        {
+#if DEBUG
+            LogError(engine, code, file, ex.ToString(), lineNumber, linePosition);
+#else
+            LogError(engine, code, file, ex.Message, lineNumber, linePosition);
+#endif
+        }
+        
         public static void LogError(this IBuildEngine engine, BuildEngineErrorCode code, string file, string message,
             int lineNumber = 0, int linePosition = 0)
         {

+ 8 - 12
src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs

@@ -94,7 +94,7 @@ namespace Avalonia.Build.Tasks
             }
             catch (Exception ex)
             {
-                engine.LogError(BuildEngineErrorCode.Unknown, "", ex.Message);
+                engine.LogError(BuildEngineErrorCode.Unknown, "", ex);
                 return new CompileResult(false);
             }
         }
@@ -302,7 +302,7 @@ namespace Avalonia.Build.Tasks
                             linePosition = xe.LinePosition;
                         }
 
-                        engine.LogError(BuildEngineErrorCode.TransformError, res.FilePath, e.Message, lineNumber, linePosition);
+                        engine.LogError(BuildEngineErrorCode.TransformError, res.FilePath, e, lineNumber, linePosition);
                         return false;
                     }
                 }
@@ -313,11 +313,11 @@ namespace Avalonia.Build.Tasks
                 }
                 catch (XamlDocumentParseException e)
                 {
-                    engine.LogError(BuildEngineErrorCode.TransformError, e.FilePath, e.Message, e.LineNumber, e.LinePosition);
+                    engine.LogError(BuildEngineErrorCode.TransformError, e.FilePath, e, e.LineNumber, e.LinePosition);
                 }
                 catch (XamlParseException e)
                 {
-                    engine.LogError(BuildEngineErrorCode.TransformError, "", e.Message, e.LineNumber, e.LinePosition);
+                    engine.LogError(BuildEngineErrorCode.TransformError, "", e, e.LineNumber, e.LinePosition);
                 }
 
                 foreach (var document in parsedXamlDocuments)
@@ -403,15 +403,11 @@ namespace Avalonia.Build.Tasks
                                     if (i[c].OpCode == OpCodes.Call)
                                     {
                                         var op = i[c].Operand as MethodReference;
-                                        
-                                        // TODO: Throw an error
-                                        // This usually happens when the same XAML resource was added twice for some weird reason
-                                        // We currently support it for dual-named default theme resources
                                         if (op != null
                                             && op.Name == TrampolineName)
                                         {
-                                            foundXamlLoader = true;
-                                            break;
+                                            throw new InvalidProgramException("Same XAML file was loaded twice." +
+                                                "Make sure there is no x:Class duplicates no files were added to the AvaloniaResource msbuild items group twice.");
                                         }
                                         if (op != null
                                             && op.Name == "Load"
@@ -455,7 +451,7 @@ namespace Avalonia.Build.Tasks
                             var compiledBuildMethod = document.BuildMethod == null ?
                                 null :
                                 typeSystem.GetTypeReference(builder).Resolve()
-                                    .Methods.First(m => m.Name == document.BuildMethod.Name);
+                                    .Methods.First(m => m.Name == document.BuildMethod?.Name);
                             var parameterlessConstructor = compiledBuildMethod != null ?
                                 null :
                                 classTypeDefinition.GetConstructors().FirstOrDefault(c =>
@@ -492,7 +488,7 @@ namespace Avalonia.Build.Tasks
                             lineNumber = xe.LineNumber;
                             linePosition = xe.LinePosition;
                         }
-                        engine.LogError(BuildEngineErrorCode.EmitError, res.FilePath, e.Message, lineNumber, linePosition);
+                        engine.LogError(BuildEngineErrorCode.EmitError, res.FilePath, e, lineNumber, linePosition);
                         return false;
                     }
                     res.Remove();

+ 0 - 1
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs

@@ -53,7 +53,6 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
                     var method = context.GetAvaloniaTypes().RuntimeHelpers
                         .FindMethod(m => m.Name == "CreateRootServiceProviderV2");
                     codeGen.EmitCall(method);
-                    context.RuntimeContext.Factory(codeGen);
                 }
 
                 return XamlILNodeEmitResult.Type(0, Type.GetClrType());

+ 9 - 7
src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs

@@ -1,7 +1,7 @@
 using System;
 using System.IO;
 using Avalonia.Platform;
-
+#nullable enable
 namespace Avalonia.Markup.Xaml
 {
     /// <summary>
@@ -32,9 +32,10 @@ namespace Avalonia.Markup.Xaml
         /// A base URI to use if <paramref name="uri"/> is relative.
         /// </param>
         /// <returns>The loaded object.</returns>
-        public static object Load(Uri uri, Uri baseUri = null)
+        public static object Load(Uri uri, Uri? baseUri = null)
         {
-            Contract.Requires<ArgumentNullException>(uri != null);
+            if (uri is null)
+                throw new ArgumentNullException(nameof(uri));
 
             var assetLocator = AvaloniaLocator.Current.GetService<IAssetLoader>();
 
@@ -44,14 +45,16 @@ namespace Avalonia.Markup.Xaml
                     "Could not create IAssetLoader : maybe Application.RegisterServices() wasn't called?");
             }
 
+            var absoluteUri = uri.IsAbsoluteUri
+                ? uri
+                : new Uri(baseUri ?? throw new InvalidOperationException("Cannot load relative Uri when BaseUri is null"), uri);
+
             var compiledLoader = assetLocator.GetAssembly(uri, baseUri)
                 ?.GetType("CompiledAvaloniaXaml.!XamlLoader")
                 ?.GetMethod("TryLoad", new[] {typeof(string)});
             if (compiledLoader != null)
             {
-                var uriString = (!uri.IsAbsoluteUri && baseUri != null ? new Uri(baseUri, uri) : uri)
-                    .ToString();
-                var compiledResult = compiledLoader.Invoke(null, new object[] {uriString});
+                var compiledResult = compiledLoader.Invoke(null, new object[] {absoluteUri.ToString()});
                 if (compiledResult != null)
                     return compiledResult;
             }
@@ -63,7 +66,6 @@ namespace Avalonia.Markup.Xaml
                 var asset = assetLocator.OpenAndGetAssembly(uri, baseUri);
                 using (var stream = asset.stream)
                 {
-                    var absoluteUri = uri.IsAbsoluteUri ? uri : new Uri(baseUri, uri);
                     return runtimeLoader.Load(new RuntimeXamlLoaderDocument(absoluteUri, stream), new RuntimeXamlLoaderConfiguration
                     {
                         LocalAssembly = asset.assembly