Skip to content

Commit c2084bc

Browse files
Refactor Oxide Resolver logging
1 parent aa18a70 commit c2084bc

1 file changed

Lines changed: 61 additions & 15 deletions

File tree

src/Common/OxideResolver.cs

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ public class OxideResolver : MetadataReferenceResolver
1010
private readonly ILogger _logger;
1111
private readonly AppConfiguration _appConfiguration;
1212
private readonly string _runtimePath;
13-
1413
private readonly HashSet<PortableExecutableReference> _referenceCache;
14+
public override bool ResolveMissingAssemblies => true;
1515

1616
public OxideResolver(ILogger<OxideResolver> logger, AppConfiguration appConfiguration)
1717
{
@@ -23,22 +23,21 @@ public OxideResolver(ILogger<OxideResolver> logger, AppConfiguration appConfigur
2323

2424
public override bool Equals(object? other) => other?.Equals(this) ?? false;
2525

26-
public override int GetHashCode() => _logger.GetHashCode();
26+
public override int GetHashCode() => GetType().GetHashCode();
2727

2828
public override ImmutableArray<PortableExecutableReference> ResolveReference(string reference, string? baseFilePath,
2929
MetadataReferenceProperties properties)
3030
{
31-
_logger.LogInformation("Resolve: {Reference} {BaseFilePath}", reference, baseFilePath);
31+
_logger.LogInformation("Resolving: {Reference} {BaseFilePath}", reference, baseFilePath);
3232
return ImmutableArray<PortableExecutableReference>.Empty;
3333
}
3434

35-
public override bool ResolveMissingAssemblies => true;
35+
public override PortableExecutableReference? ResolveMissingAssembly(MetadataReference metadataReference, AssemblyIdentity assemblyIdentity) =>
36+
Resolve(metadataReference, assemblyIdentity);
3637

37-
public override PortableExecutableReference? ResolveMissingAssembly(MetadataReference definition, AssemblyIdentity referenceIdentity) =>
38-
Reference(definition.Display!);
39-
40-
public PortableExecutableReference? Reference(string? name)
38+
public PortableExecutableReference? Resolve(MetadataReference metadataReference, AssemblyIdentity assemblyIdentity)
4139
{
40+
string? name = metadataReference.Display;
4241
if (string.IsNullOrWhiteSpace(name))
4342
{
4443
return null;
@@ -52,25 +51,72 @@ public override ImmutableArray<PortableExecutableReference> ResolveReference(str
5251
return reference;
5352
}
5453

55-
if (name.Equals("System.Private.CoreLib"))
54+
if (name.Equals("System.Private.CoreLib.dll"))
5655
{
5756
name = "mscorlib.dll";
5857
}
5958

60-
FileInfo fileSystem = new(Path.Combine(_appConfiguration.GetDirectoryConfiguration().Libraries, name));
59+
string path = Path.Combine(_appConfiguration.GetDirectoryConfiguration().Libraries, name);
60+
FileInfo fileInfo = new(path);
61+
62+
_logger.LogDebug("Attempting to resolve {0} [{1}] from {2}", name, assemblyIdentity.Version, fileInfo.FullName);
63+
64+
if (fileInfo.Exists)
65+
{
66+
reference = MetadataReference.CreateFromFile(fileInfo.FullName);
67+
_referenceCache.Add(reference);
68+
return reference;
69+
}
70+
71+
fileInfo = new FileInfo(Path.Combine(_runtimePath, name));
6172

62-
if (fileSystem.Exists)
73+
if (fileInfo.Exists)
6374
{
64-
reference = MetadataReference.CreateFromFile(fileSystem.FullName);
75+
reference = MetadataReference.CreateFromFile(fileInfo.FullName);
6576
_referenceCache.Add(reference);
6677
return reference;
6778
}
6879

69-
fileSystem = new FileInfo(Path.Combine(_runtimePath, name));
80+
_logger.LogError("Unable to find required dependency {0}", name);
81+
return null;
82+
}
83+
84+
public PortableExecutableReference? AddReference(string? name)
85+
{
86+
if (string.IsNullOrWhiteSpace(name))
87+
{
88+
return null;
89+
}
90+
91+
PortableExecutableReference? reference = _referenceCache.FirstOrDefault(r =>
92+
Path.GetFileName(r.Display) == name);
93+
94+
if (reference != null)
95+
{
96+
return reference;
97+
}
98+
99+
if (name.Equals("System.Private.CoreLib.dll"))
100+
{
101+
name = "mscorlib.dll";
102+
}
103+
104+
string path = Path.Combine(_appConfiguration.GetDirectoryConfiguration().Libraries, name);
105+
FileInfo fileInfo = new(path);
106+
107+
_logger.LogDebug("Adding reference {0} from {1}", name, fileInfo.FullName);
108+
109+
if (fileInfo.Exists)
110+
{
111+
reference = MetadataReference.CreateFromFile(fileInfo.FullName);
112+
_referenceCache.Add(reference);
113+
return reference;
114+
}
70115

71-
if (fileSystem.Exists)
116+
fileInfo = new FileInfo(Path.Combine(_runtimePath, name));
117+
if (fileInfo.Exists)
72118
{
73-
reference = MetadataReference.CreateFromFile(fileSystem.FullName);
119+
reference = MetadataReference.CreateFromFile(fileInfo.FullName);
74120
_referenceCache.Add(reference);
75121
return reference;
76122
}

0 commit comments

Comments
 (0)