From f576cae6c30970d04a37f6073dc2c84525276516 Mon Sep 17 00:00:00 2001 From: Yoshi Askharoun Date: Mon, 19 Feb 2024 00:10:15 -0600 Subject: [PATCH] Fix assembly:// imports that don't specify a namespace --- libs/UIX.Asm/Disassembler.cs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libs/UIX.Asm/Disassembler.cs b/libs/UIX.Asm/Disassembler.cs index 5710c92..1304ce6 100644 --- a/libs/UIX.Asm/Disassembler.cs +++ b/libs/UIX.Asm/Disassembler.cs @@ -102,13 +102,19 @@ public class Disassembler if (scheme == "assembly") { // Assume 'host' is an assembly name and path represents a C# namespace - var assemblyUriParts = uri.Split('/'); - - var importedNamespace = assemblyUriParts[^1]; - namespacePrefix = importedNamespace.Split('.', '/', '\\', '!')[^1]; - - System.Reflection.AssemblyName assemblyName = new(assemblyUriParts[^2]); - uri = $"{scheme}://{assemblyName.Name}/{importedNamespace}"; + var path = uri[(schemeLength + 3)..]; + var nsIndex = path.IndexOf('/'); + if (nsIndex >= 0) + { + var importedNamespace = path[(nsIndex + 1)..]; + namespacePrefix = importedNamespace.Split('.', '/', '\\', '!')[^1]; + } + else + { + // No namespace was specified, assume we're importing the whole assembly + System.Reflection.AssemblyName assemblyName = new(path); + namespacePrefix = assemblyName.Name; + } } else { @@ -202,7 +208,9 @@ public class Disassembler } var runtimeType = constantValue.GetType(); - var typeSchema = _loadResult.ImportTables.TypeImports.FirstOrDefault(t => t.RuntimeType == runtimeType); + var typeSchema = _loadResult.ImportTables.TypeImports.FirstOrDefault(t => t.RuntimeType == runtimeType) + ?? _loadResult.ImportTables.TypeImports.FirstOrDefault(t => t.RuntimeType == runtimeType.BaseType) + ?? throw new Exception($"Failed to find type schema for '{runtimeType.Name}' in {_loadResult.Uri}"); constants.Add((c, typeSchema, constantValue)); }