@@ -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