diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/LocalFunctions.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/LocalFunctions.cs index ca3ae943f..c4d784fd4 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/LocalFunctions.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/LocalFunctions.cs @@ -134,6 +134,7 @@ namespace LocalFunctions } } } + Console.WriteLine(t2); return StaticInvokeAsFunc(MixedLocalFunction2Delegate) + StaticInvokeAsFunc(MixedLocalFunction2Delegate) + StaticInvokeAsFunc(StaticMethod1) + StaticInvokeAsFunc(StaticMethod1) + StaticInvokeAsFunc(NonStaticMethod3) + StaticInvokeAsFunc(StaticMethod5) + new Func(StaticMethod4)(null) + StaticInvokeAsFunc2(StaticMethod4) + new Func, int>(StaticInvokeAsFunc2)(StaticMethod4); int NonStaticMethod3() { diff --git a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj index 571f107bf..0e7fcdcac 100644 --- a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj +++ b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj @@ -421,6 +421,7 @@ + diff --git a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs index 241f0bdf4..f70e6ba0f 100644 --- a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs +++ b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs @@ -16,6 +16,8 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. +#nullable enable + using System; using System.IO; using System.Linq; @@ -36,7 +38,7 @@ namespace ICSharpCode.Decompiler.Metadata { } - public AssemblyResolutionException(IAssemblyReference reference, Exception innerException) + public AssemblyResolutionException(IAssemblyReference reference, Exception? innerException) : base($"Failed to resolve assembly: '{reference}'", innerException) { this.Reference = reference; @@ -46,10 +48,10 @@ namespace ICSharpCode.Decompiler.Metadata public interface IAssemblyResolver { #if !VSADDIN - PEFile Resolve(IAssemblyReference reference); - PEFile ResolveModule(PEFile mainModule, string moduleName); - Task ResolveAsync(IAssemblyReference reference); - Task ResolveModuleAsync(PEFile mainModule, string moduleName); + PEFile? Resolve(IAssemblyReference reference); + PEFile? ResolveModule(PEFile mainModule, string moduleName); + Task ResolveAsync(IAssemblyReference reference); + Task ResolveModuleAsync(PEFile mainModule, string moduleName); #endif } @@ -68,7 +70,7 @@ namespace ICSharpCode.Decompiler.Metadata /// For .NET Core framework references, the WholeProjectDecompiler will omit the /// assembly reference if the runtimePack is already included as an SDK. /// - public virtual bool IsSharedAssembly(IAssemblyReference reference, out string runtimePack) + public virtual bool IsSharedAssembly(IAssemblyReference reference, out string? runtimePack) { runtimePack = null; return false; @@ -79,9 +81,9 @@ namespace ICSharpCode.Decompiler.Metadata { string Name { get; } string FullName { get; } - Version Version { get; } - string Culture { get; } - byte[] PublicKeyToken { get; } + Version? Version { get; } + string? Culture { get; } + byte[]? PublicKeyToken { get; } bool IsWindowsRuntime { get; } bool IsRetargetable { get; } @@ -89,9 +91,9 @@ namespace ICSharpCode.Decompiler.Metadata public class AssemblyNameReference : IAssemblyReference { - string fullName; + string? fullName; - public string Name { get; private set; } + public string Name { get; private set; } = string.Empty; public string FullName { get { @@ -132,11 +134,11 @@ namespace ICSharpCode.Decompiler.Metadata } } - public Version Version { get; private set; } + public Version? Version { get; private set; } - public string Culture { get; private set; } + public string? Culture { get; private set; } - public byte[] PublicKeyToken { get; private set; } + public byte[]? PublicKeyToken { get; private set; } public bool IsWindowsRuntime { get; private set; } @@ -234,11 +236,11 @@ namespace ICSharpCode.Decompiler.Metadata } } - public Version Version => entry.Version; + public Version? Version => entry.Version; public string Culture => Metadata.GetString(entry.Culture); - byte[] IAssemblyReference.PublicKeyToken => GetPublicKeyToken(); + byte[]? IAssemblyReference.PublicKeyToken => GetPublicKeyToken(); - public byte[] GetPublicKeyToken() + public byte[]? GetPublicKeyToken() { if (entry.PublicKeyOrToken.IsNil) return null; diff --git a/ICSharpCode.Decompiler/Metadata/Dom.cs b/ICSharpCode.Decompiler/Metadata/Dom.cs index de21e0ba3..bc9f06a9f 100644 --- a/ICSharpCode.Decompiler/Metadata/Dom.cs +++ b/ICSharpCode.Decompiler/Metadata/Dom.cs @@ -1,4 +1,6 @@ -using System; +#nullable enable + +using System; using System.Collections.Immutable; using System.IO; using System.Reflection; @@ -32,7 +34,7 @@ namespace ICSharpCode.Decompiler.Metadata public virtual ResourceType ResourceType => ResourceType.Embedded; public virtual ManifestResourceAttributes Attributes => ManifestResourceAttributes.Public; public abstract string Name { get; } - public abstract Stream TryOpenStream(); + public abstract Stream? TryOpenStream(); } public class ByteArrayResource : Resource @@ -98,12 +100,16 @@ namespace ICSharpCode.Decompiler.Metadata return ResourceType.Linked; } - public override unsafe Stream TryOpenStream() + public override unsafe Stream? TryOpenStream() { if (ResourceType != ResourceType.Embedded) return null; var headers = Module.Reader.PEHeaders; + if (headers.CorHeader == null) + return null; var resources = headers.CorHeader.ResourcesDirectory; + if (resources.RelativeVirtualAddress == 0) + return null; var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress); if (sectionData.Length == 0) throw new BadImageFormatException("RVA could not be found in any section!"); @@ -231,7 +237,7 @@ namespace ICSharpCode.Decompiler.Metadata public class GenericContext { - readonly MetadataReader metadata; + readonly MetadataReader? metadata; readonly TypeDefinitionHandle declaringType; readonly MethodDefinitionHandle method; @@ -268,7 +274,7 @@ namespace ICSharpCode.Decompiler.Metadata public string GetGenericTypeParameterName(int index) { GenericParameterHandle genericParameter = GetGenericTypeParameterHandleOrNull(index); - if (genericParameter.IsNil) + if (genericParameter.IsNil || metadata == null) return index.ToString(); return metadata.GetString(metadata.GetGenericParameter(genericParameter).Name); } @@ -276,23 +282,27 @@ namespace ICSharpCode.Decompiler.Metadata public string GetGenericMethodTypeParameterName(int index) { GenericParameterHandle genericParameter = GetGenericMethodTypeParameterHandleOrNull(index); - if (genericParameter.IsNil) + if (genericParameter.IsNil || metadata == null) return index.ToString(); return metadata.GetString(metadata.GetGenericParameter(genericParameter).Name); } public GenericParameterHandle GetGenericTypeParameterHandleOrNull(int index) { - GenericParameterHandleCollection genericParameters; - if (declaringType.IsNil || index < 0 || index >= (genericParameters = metadata.GetTypeDefinition(declaringType).GetGenericParameters()).Count) + if (declaringType.IsNil || index < 0 || metadata == null) + return MetadataTokens.GenericParameterHandle(0); + var genericParameters = metadata.GetTypeDefinition(declaringType).GetGenericParameters(); + if (index >= genericParameters.Count) return MetadataTokens.GenericParameterHandle(0); return genericParameters[index]; } public GenericParameterHandle GetGenericMethodTypeParameterHandleOrNull(int index) { - GenericParameterHandleCollection genericParameters; - if (method.IsNil || index < 0 || index >= (genericParameters = metadata.GetMethodDefinition(method).GetGenericParameters()).Count) + if (method.IsNil || index < 0 || metadata == null) + return MetadataTokens.GenericParameterHandle(0); + var genericParameters = metadata.GetMethodDefinition(method).GetGenericParameters(); + if (index >= genericParameters.Count) return MetadataTokens.GenericParameterHandle(0); return genericParameters[index]; } diff --git a/ICSharpCode.Decompiler/Metadata/PEFile.cs b/ICSharpCode.Decompiler/Metadata/PEFile.cs index 2b8192a90..f2a57ab0f 100644 --- a/ICSharpCode.Decompiler/Metadata/PEFile.cs +++ b/ICSharpCode.Decompiler/Metadata/PEFile.cs @@ -16,6 +16,8 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. +#nullable enable + using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -121,7 +123,7 @@ namespace ICSharpCode.Decompiler.Metadata Reader.Dispose(); } - Dictionary typeLookup; + Dictionary? typeLookup; /// /// Finds the top-level-type with the specified name. @@ -152,7 +154,7 @@ namespace ICSharpCode.Decompiler.Metadata return default; } - Dictionary typeForwarderLookup; + Dictionary? typeForwarderLookup; /// /// Finds the type forwarder with the specified name. @@ -176,7 +178,7 @@ namespace ICSharpCode.Decompiler.Metadata return default; } - MethodSemanticsLookup methodSemanticsLookup; + MethodSemanticsLookup? methodSemanticsLookup; internal MethodSemanticsLookup MethodSemanticsLookup { get { diff --git a/ICSharpCode.Decompiler/Util/LazyInit.cs b/ICSharpCode.Decompiler/Util/LazyInit.cs index 6f95ca130..d19344cd4 100644 --- a/ICSharpCode.Decompiler/Util/LazyInit.cs +++ b/ICSharpCode.Decompiler/Util/LazyInit.cs @@ -16,13 +16,15 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. +#nullable enable +using System.Diagnostics.CodeAnalysis; using System.Threading; namespace ICSharpCode.Decompiler.Util { public static class LazyInit { - public static T VolatileRead(ref T location) where T : class + public static T VolatileRead(ref T location) where T : class? { return Volatile.Read(ref location); } @@ -32,9 +34,10 @@ namespace ICSharpCode.Decompiler.Util /// - If target is null: stores newValue in target and returns newValue. /// - If target is not null: returns target. /// - public static T GetOrSet(ref T target, T newValue) where T : class + [return: NotNullIfNotNull("newValue")] + public static T? GetOrSet(ref T? target, T? newValue) where T : class { - T oldValue = Interlocked.CompareExchange(ref target, newValue, null); + T? oldValue = Interlocked.CompareExchange(ref target, newValue, null); return oldValue ?? newValue; } } diff --git a/ICSharpCode.Decompiler/Util/NullAttributes.cs b/ICSharpCode.Decompiler/Util/NullAttributes.cs new file mode 100644 index 000000000..cf3c9249b --- /dev/null +++ b/ICSharpCode.Decompiler/Util/NullAttributes.cs @@ -0,0 +1,18 @@ +#if !NETCORE + +#nullable enable + +namespace System.Diagnostics.CodeAnalysis +{ + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true)] + internal sealed class NotNullIfNotNullAttribute : Attribute + { + public string ParameterName { get; } + + public NotNullIfNotNullAttribute(string parameterName) + { + ParameterName = parameterName; + } + } +} +#endif diff --git a/ILSpy.AddIn/ILSpy.AddIn.csproj b/ILSpy.AddIn/ILSpy.AddIn.csproj index 31fc45fc9..0e5e53060 100644 --- a/ILSpy.AddIn/ILSpy.AddIn.csproj +++ b/ILSpy.AddIn/ILSpy.AddIn.csproj @@ -14,6 +14,7 @@ ILSpy 1.7.1.0 1.7.1.0 + 9.0 False true diff --git a/ILSpy/ILSpy.csproj b/ILSpy/ILSpy.csproj index 29f2e2085..c150d99b5 100644 --- a/ILSpy/ILSpy.csproj +++ b/ILSpy/ILSpy.csproj @@ -4,7 +4,7 @@ net472 WinExe - 8.0 + 9.0 False false false diff --git a/ILSpy/LoadedAssembly.cs b/ILSpy/LoadedAssembly.cs index 2a7ed4e53..cc23499dc 100644 --- a/ILSpy/LoadedAssembly.cs +++ b/ILSpy/LoadedAssembly.cs @@ -35,6 +35,8 @@ using ICSharpCode.Decompiler.TypeSystem.Implementation; using ICSharpCode.Decompiler.Util; using ICSharpCode.ILSpy.Options; +#nullable enable + namespace ICSharpCode.ILSpy { /// @@ -61,9 +63,9 @@ namespace ICSharpCode.ILSpy public sealed class LoadResult { - public PEFile PEFile { get; } - public Exception PEFileLoadException { get; } - public LoadedPackage Package { get; } + public PEFile? PEFile { get; } + public Exception? PEFileLoadException { get; } + public LoadedPackage? Package { get; } public LoadResult(PEFile peFile) { @@ -80,12 +82,12 @@ namespace ICSharpCode.ILSpy readonly AssemblyList assemblyList; readonly string fileName; readonly string shortName; - readonly IAssemblyResolver providedAssemblyResolver; + readonly IAssemblyResolver? providedAssemblyResolver; - public LoadedAssembly ParentBundle { get; } + public LoadedAssembly? ParentBundle { get; } public LoadedAssembly(AssemblyList assemblyList, string fileName, - Task stream = null, IAssemblyResolver assemblyResolver = null, string pdbFileName = null) + Task? stream = null, IAssemblyResolver? assemblyResolver = null, string? pdbFileName = null) { this.assemblyList = assemblyList ?? throw new ArgumentNullException(nameof(assemblyList)); this.fileName = fileName ?? throw new ArgumentNullException(nameof(fileName)); @@ -96,7 +98,7 @@ namespace ICSharpCode.ILSpy this.shortName = Path.GetFileNameWithoutExtension(fileName); } - public LoadedAssembly(LoadedAssembly bundle, string fileName, Task stream, IAssemblyResolver assemblyResolver = null) + public LoadedAssembly(LoadedAssembly bundle, string fileName, Task? stream, IAssemblyResolver assemblyResolver = null) : this(bundle.assemblyList, fileName, stream, assemblyResolver) { this.ParentBundle = bundle; @@ -116,7 +118,7 @@ namespace ICSharpCode.ILSpy public ReferenceLoadInfo LoadedAssemblyReferencesInfo { get; } = new ReferenceLoadInfo(); - IDebugInfoProvider debugInfoProvider; + IDebugInfoProvider? debugInfoProvider; /// /// Gets the . @@ -135,14 +137,14 @@ namespace ICSharpCode.ILSpy if (loadResult.PEFile != null) return loadResult.PEFile; else - throw loadResult.PEFileLoadException; + throw loadResult.PEFileLoadException!; } /// /// Gets the . /// Returns null in case of load errors. /// - public PEFile GetPEFileOrNull() + public PEFile? GetPEFileOrNull() { try { @@ -160,7 +162,7 @@ namespace ICSharpCode.ILSpy /// Gets the . /// Returns null in case of load errors. /// - public async Task GetPEFileOrNullAsync() + public async Task GetPEFileOrNullAsync() { try { @@ -174,7 +176,7 @@ namespace ICSharpCode.ILSpy } } - ICompilation typeSystem; + ICompilation? typeSystem; /// /// Gets a type system containing all types from this assembly + primitive types from mscorlib. @@ -183,7 +185,7 @@ namespace ICSharpCode.ILSpy /// /// This is an uncached type system. /// - public ICompilation GetTypeSystemOrNull() + public ICompilation? GetTypeSystemOrNull() { return LazyInitializer.EnsureInitialized(ref this.typeSystem, () => { var module = GetPEFileOrNull(); @@ -196,10 +198,10 @@ namespace ICSharpCode.ILSpy } readonly object typeSystemWithOptionsLockObj = new object(); - ICompilation typeSystemWithOptions; - TypeSystemOptions currentTypeSystemOptions; + ICompilation? typeSystemWithOptions; + TypeSystemOptions? currentTypeSystemOptions; - public ICompilation GetTypeSystemOrNull(TypeSystemOptions options) + public ICompilation? GetTypeSystemOrNull(TypeSystemOptions options) { lock (typeSystemWithOptionsLockObj) { @@ -225,9 +227,9 @@ namespace ICSharpCode.ILSpy get { if (IsLoaded && !HasLoadError) { - PEFile module = GetPEFileOrNull(); + PEFile? module = GetPEFileOrNull(); var metadata = module?.Metadata; - string versionOrInfo = null; + string? versionOrInfo = null; if (metadata != null) { if (metadata.IsAssembly) @@ -278,14 +280,14 @@ namespace ICSharpCode.ILSpy /// /// Gets the PDB file name or null, if no PDB was found or it's embedded. /// - public string PdbFileName { get; private set; } + public string? PdbFileName { get; private set; } - async Task LoadAsync(Task streamTask) + async Task LoadAsync(Task? streamTask) { // runs on background thread - if (streamTask != null) + var stream = streamTask != null ? await streamTask.ConfigureAwait(false) : null; + if (stream != null) { - var stream = await streamTask; // Read the module from a precrafted stream if (!stream.CanSeek) { @@ -357,7 +359,7 @@ namespace ICSharpCode.ILSpy return new LoadResult(module); } - IDebugInfoProvider LoadDebugInfo(PEFile module) + IDebugInfoProvider? LoadDebugInfo(PEFile module) { if (DecompilerSettingsPanel.CurrentDecompilerSettings.UseDebugSymbols) { @@ -380,7 +382,7 @@ namespace ICSharpCode.ILSpy return null; } - public async Task LoadDebugInfo(string fileName) + public async Task LoadDebugInfo(string fileName) { this.PdbFileName = fileName; var assembly = await GetPEFileAsync().ConfigureAwait(false); @@ -393,7 +395,7 @@ namespace ICSharpCode.ILSpy readonly LoadedAssembly parent; readonly bool loadOnDemand; - readonly IAssemblyResolver providedAssemblyResolver; + readonly IAssemblyResolver? providedAssemblyResolver; readonly AssemblyList assemblyList; readonly LoadedAssembly[] alreadyLoadedAssemblies; readonly Task tfmTask; @@ -416,13 +418,13 @@ namespace ICSharpCode.ILSpy this.referenceLoadInfo = parent.LoadedAssemblyReferencesInfo; } - public PEFile Resolve(IAssemblyReference reference) + public PEFile? Resolve(IAssemblyReference reference) { return ResolveAsync(reference).GetAwaiter().GetResult(); } - Dictionary asmLookupByFullName; - Dictionary asmLookupByShortName; + Dictionary? asmLookupByFullName; + Dictionary? asmLookupByShortName; /// /// 0) if we're inside a package, look for filename.dll in parent directories @@ -436,9 +438,9 @@ namespace ICSharpCode.ILSpy /// 8) search C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /// 9) try to find match by asm name (no tfm/version) in loaded assemblies /// - public async Task ResolveAsync(IAssemblyReference reference) + public async Task ResolveAsync(IAssemblyReference reference) { - PEFile module; + PEFile? module; // 0) if we're inside a package, look for filename.dll in parent directories if (providedAssemblyResolver != null) { @@ -527,7 +529,9 @@ namespace ICSharpCode.ILSpy try { var module = await loaded.GetPEFileOrNullAsync().ConfigureAwait(false); - var reader = module?.Metadata; + if (module == null) + continue; + var reader = module.Metadata; if (reader == null || !reader.IsAssembly) continue; var asmDef = reader.GetAssemblyDefinition(); @@ -547,12 +551,12 @@ namespace ICSharpCode.ILSpy return result; } - public PEFile ResolveModule(PEFile mainModule, string moduleName) + public PEFile? ResolveModule(PEFile mainModule, string moduleName) { return ResolveModuleAsync(mainModule, moduleName).GetAwaiter().GetResult(); } - public async Task ResolveModuleAsync(PEFile mainModule, string moduleName) + public async Task ResolveModuleAsync(PEFile mainModule, string moduleName) { if (providedAssemblyResolver != null) { @@ -608,7 +612,7 @@ namespace ICSharpCode.ILSpy private MyUniversalResolver GetUniversalResolver() { - return LazyInitializer.EnsureInitialized(ref this.universalResolver, () => new MyUniversalResolver(this)); + return LazyInitializer.EnsureInitialized(ref this.universalResolver, () => new MyUniversalResolver(this))!; } public AssemblyReferenceClassifier GetAssemblyReferenceClassifier() @@ -619,7 +623,7 @@ namespace ICSharpCode.ILSpy /// /// Returns the debug info for this assembly. Returns null in case of load errors or no debug info is available. /// - public IDebugInfoProvider GetDebugInfoOrNull() + public IDebugInfoProvider? GetDebugInfoOrNull() { if (GetPEFileOrNull() == null) return null; @@ -634,7 +638,7 @@ namespace ICSharpCode.ILSpy } } - MyUniversalResolver universalResolver; + MyUniversalResolver? universalResolver; /// /// Wait until the assembly is loaded. diff --git a/ILSpy/LoadedPackage.cs b/ILSpy/LoadedPackage.cs index 5c889124f..9a72d987c 100644 --- a/ILSpy/LoadedPackage.cs +++ b/ILSpy/LoadedPackage.cs @@ -16,6 +16,8 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. +#nullable enable + using System; using System.Collections.Generic; using System.Diagnostics; @@ -45,7 +47,7 @@ namespace ICSharpCode.ILSpy /// /// Gets the LoadedAssembly instance representing this bundle. /// - internal LoadedAssembly LoadedAssembly { get; set; } + internal LoadedAssembly? LoadedAssembly { get; set; } public PackageKind Kind { get; } @@ -106,7 +108,7 @@ namespace ICSharpCode.ILSpy /// /// Load a .NET single-file bundle. /// - public static LoadedPackage FromBundle(string fileName) + public static LoadedPackage? FromBundle(string fileName) { using var memoryMappedFile = MemoryMappedFile.CreateFromFile(fileName, FileMode.Open, null, 0, MemoryMappedFileAccess.Read); var view = memoryMappedFile.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read); @@ -144,7 +146,7 @@ namespace ICSharpCode.ILSpy public override ManifestResourceAttributes Attributes => originalEntry.Attributes; public override string FullName => originalEntry.FullName; public override ResourceType ResourceType => originalEntry.ResourceType; - public override Stream TryOpenStream() => originalEntry.TryOpenStream(); + public override Stream? TryOpenStream() => originalEntry.TryOpenStream(); } sealed class ZipFileEntry : PackageEntry @@ -159,7 +161,7 @@ namespace ICSharpCode.ILSpy this.Name = entry.FullName; } - public override Stream TryOpenStream() + public override Stream? TryOpenStream() { Debug.WriteLine("Decompress " + Name); using var archive = ZipFile.OpenRead(zipFile); @@ -221,9 +223,9 @@ namespace ICSharpCode.ILSpy public string Name { get; } readonly LoadedPackage package; - readonly PackageFolder parent; + readonly PackageFolder? parent; - internal PackageFolder(LoadedPackage package, PackageFolder parent, string name) + internal PackageFolder(LoadedPackage package, PackageFolder? parent, string name) { this.package = package; this.parent = parent; @@ -233,7 +235,7 @@ namespace ICSharpCode.ILSpy public List Folders { get; } = new List(); public List Entries { get; } = new List(); - public PEFile Resolve(IAssemblyReference reference) + public PEFile? Resolve(IAssemblyReference reference) { var asm = ResolveFileName(reference.Name + ".dll"); if (asm != null) @@ -243,7 +245,7 @@ namespace ICSharpCode.ILSpy return parent?.Resolve(reference); } - public Task ResolveAsync(IAssemblyReference reference) + public Task ResolveAsync(IAssemblyReference reference) { var asm = ResolveFileName(reference.Name + ".dll"); if (asm != null) @@ -254,10 +256,10 @@ namespace ICSharpCode.ILSpy { return parent.ResolveAsync(reference); } - return Task.FromResult(null); + return Task.FromResult(null); } - public PEFile ResolveModule(PEFile mainModule, string moduleName) + public PEFile? ResolveModule(PEFile mainModule, string moduleName) { var asm = ResolveFileName(moduleName + ".dll"); if (asm != null) @@ -267,7 +269,7 @@ namespace ICSharpCode.ILSpy return parent?.ResolveModule(mainModule, moduleName); } - public Task ResolveModuleAsync(PEFile mainModule, string moduleName) + public Task ResolveModuleAsync(PEFile mainModule, string moduleName) { var asm = ResolveFileName(moduleName + ".dll"); if (asm != null) @@ -278,12 +280,12 @@ namespace ICSharpCode.ILSpy { return parent.ResolveModuleAsync(mainModule, moduleName); } - return Task.FromResult(null); + return Task.FromResult(null); } - readonly Dictionary assemblies = new Dictionary(StringComparer.OrdinalIgnoreCase); + readonly Dictionary assemblies = new Dictionary(StringComparer.OrdinalIgnoreCase); - internal LoadedAssembly ResolveFileName(string name) + internal LoadedAssembly? ResolveFileName(string name) { if (package.LoadedAssembly == null) return null;