Skip to content

Commit 1f35703

Browse files
committed
optim: Avoid abundant error for compilation
1 parent 7a20010 commit 1f35703

File tree

1 file changed

+65
-19
lines changed

1 file changed

+65
-19
lines changed

services/ModCompileLoadService.cs

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ public static class ModCompileLoadService
3030
private static readonly Dictionary<string, MetadataReference> mod_ref = new();
3131

3232
private static bool compileMod(ModDeclare pModDecl, IEnumerable<MetadataReference> pDefaultInc,
33-
string[] pAddInc, Dictionary<string, MetadataReference> pModInc, bool pForce = false,
33+
string[] pAddInc, Dictionary<string, MetadataReference> pModInc, out string pCompileErrors, bool pForce = false,
3434
bool pDisableOptionalDepen = false)
3535
{
36+
pCompileErrors = string.Empty;
3637
var available_optional_depens = pDisableOptionalDepen
3738
? new List<string>()
3839
: pModDecl.OptionalDependencies.Where(pModInc.ContainsKey).ToList();
@@ -192,14 +193,7 @@ void LoadAddInc()
192193

193194
if (!result.Success)
194195
{
195-
StringBuilder diags = new StringBuilder();
196-
foreach (var diagnostic in result.Diagnostics)
197-
{
198-
if (diagnostic.Severity != DiagnosticSeverity.Error) continue;
199-
diags.AppendLine(diagnostic.ToString());
200-
}
201-
202-
LogService.LogError(diags.ToString());
196+
pCompileErrors = CollectCompileErrors(result.Diagnostics);
203197
return false;
204198
}
205199

@@ -215,6 +209,41 @@ void LoadAddInc()
215209
return true;
216210
}
217211

212+
private static string CollectCompileErrors(IEnumerable<Diagnostic> pDiagnostics)
213+
{
214+
StringBuilder diags = new StringBuilder();
215+
foreach (var diagnostic in pDiagnostics)
216+
{
217+
if (diagnostic.Severity != DiagnosticSeverity.Error) continue;
218+
diags.AppendLine(diagnostic.ToString());
219+
}
220+
221+
return diags.ToString().TrimEnd();
222+
}
223+
224+
private static void LogCompileFailure(string pModUid, string pCompileErrors)
225+
{
226+
if (string.IsNullOrWhiteSpace(pCompileErrors))
227+
{
228+
LogService.LogError($"Failed to compile mod {pModUid}");
229+
return;
230+
}
231+
232+
LogService.LogError($"Failed to compile mod {pModUid}:\n{pCompileErrors}");
233+
}
234+
235+
private static void LogCompileFailureWithOptionalDependencies(string pModUid, string pCompileErrors)
236+
{
237+
if (string.IsNullOrWhiteSpace(pCompileErrors))
238+
{
239+
LogService.LogWarning($"Failed to compile mod {pModUid} with optional dependencies, but succeeded after disabling them");
240+
return;
241+
}
242+
243+
LogService.LogWarning(
244+
$"Failed to compile mod {pModUid} with optional dependencies, but succeeded after disabling them:\n{pCompileErrors}");
245+
}
246+
218247
/// <summary>
219248
/// Prepare references for mod nodes
220249
/// </summary>
@@ -276,27 +305,44 @@ public static bool compileMod(ModDependencyNode pModNode, bool pForce = false)
276305
return true;
277306
}
278307

279-
bool compile_result = false;
280-
281-
bool disable_optional_depen = false;
282-
RECOMPILE:
308+
bool compile_result;
309+
bool has_available_optional_depen = pModNode.mod_decl.OptionalDependencies.Any(mod_ref.ContainsKey);
310+
string compile_errors;
283311
compile_result =
284312
compileMod(pModNode.mod_decl, _default_ref,
285-
pModNode.GetAdditionReferences(!disable_optional_depen).ToArray(), mod_ref, pForce,
286-
disable_optional_depen
313+
pModNode.GetAdditionReferences().ToArray(), mod_ref, out compile_errors, pForce
287314
);
288315
if (compile_result)
289316
{
290317
mod_ref[pModNode.mod_decl.UID] =
291318
MetadataReference.CreateFromFile(Path.Combine(Paths.CompiledModsPath,
292319
$"{pModNode.mod_decl.UID}.dll"));
293320
}
294-
else if (!disable_optional_depen && pModNode.mod_decl.OptionalDependencies.Length > 0)
321+
else if (has_available_optional_depen)
295322
{
296323
LogService.LogWarning(
297324
$"Cannot compile mod {pModNode.mod_decl.UID} with Optional Dependencies, try to disable them");
298-
disable_optional_depen = true;
299-
goto RECOMPILE;
325+
string compile_errors_without_optional_depen;
326+
compile_result =
327+
compileMod(pModNode.mod_decl, _default_ref,
328+
pModNode.GetAdditionReferences(false).ToArray(), mod_ref, out compile_errors_without_optional_depen,
329+
pForce, true
330+
);
331+
if (compile_result)
332+
{
333+
mod_ref[pModNode.mod_decl.UID] =
334+
MetadataReference.CreateFromFile(Path.Combine(Paths.CompiledModsPath,
335+
$"{pModNode.mod_decl.UID}.dll"));
336+
LogCompileFailureWithOptionalDependencies(pModNode.mod_decl.UID, compile_errors);
337+
}
338+
else
339+
{
340+
LogCompileFailure(pModNode.mod_decl.UID, compile_errors_without_optional_depen);
341+
}
342+
}
343+
else
344+
{
345+
LogCompileFailure(pModNode.mod_decl.UID, compile_errors);
300346
}
301347

302348
if (!compile_result)
@@ -676,4 +722,4 @@ public static void loadInfoOfBepInExPlugins()
676722
WorldBoxMod.AllRecognizedMods[mod] = ModState.LOADED;
677723
}
678724
}
679-
}
725+
}

0 commit comments

Comments
 (0)