@@ -223,19 +223,23 @@ public void BuildParseOptions()
223223
224224 public void SortModulesByDependencies ( )
225225 {
226- if ( Options . Modules . All ( m => m . Libraries . Any ( ) || m == Options . SystemModule ) )
226+ if ( ! Options . DoAllModulesHaveLibraries ( ) )
227+ return ;
228+
229+ var sortedModules = Options . Modules . TopologicalSort ( m =>
227230 {
228- var sortedModules = Options . Modules . TopologicalSort ( m =>
229- {
230- return from library in Context . Symbols . Libraries
231- where m . Libraries . Contains ( library . FileName )
232- from module in Options . Modules
233- where library . Dependencies . Intersect ( module . Libraries ) . Any ( )
234- select module ;
235- } ) ;
236- Options . Modules . Clear ( ) ;
237- Options . Modules . AddRange ( sortedModules ) ;
238- }
231+ var dependencies = ( from library in Context . Symbols . Libraries
232+ where m . Libraries . Contains ( library . FileName )
233+ from module in Options . Modules
234+ where library . Dependencies . Intersect ( module . Libraries ) . Any ( )
235+ select module ) . ToList ( ) ;
236+ if ( m != Options . SystemModule )
237+ m . Dependencies . Add ( Options . SystemModule ) ;
238+ m . Dependencies . AddRange ( dependencies ) ;
239+ return dependencies ;
240+ } ) ;
241+ Options . Modules . Clear ( ) ;
242+ Options . Modules . AddRange ( sortedModules ) ;
239243 }
240244
241245 public bool ParseLibraries ( )
@@ -384,9 +388,7 @@ public void SaveCode(IEnumerable<GeneratorOutput> outputs)
384388
385389 public void CompileCode ( AST . Module module )
386390 {
387- var assemblyFile = Path . Combine ( Options . OutputDir ,
388- string . IsNullOrEmpty ( module . LibraryName ) ?
389- "out.dll" : module . LibraryName + ".dll" ) ;
391+ var assemblyFile = Path . Combine ( Options . OutputDir , module . LibraryName + ".dll" ) ;
390392
391393 var docFile = Path . ChangeExtension ( assemblyFile , ".xml" ) ;
392394
@@ -421,7 +423,7 @@ public void CompileCode(AST.Module module)
421423 ! compilerParameters . ReferencedAssemblies . Contains ( libraryMappings [ d ] ) )
422424 . Select ( l => libraryMappings [ l ] ) ) . ToArray ( ) ) ;
423425
424- Diagnostics . Message ( "Compiling {0 }..." , module . LibraryName ) ;
426+ Diagnostics . Message ( $ "Compiling { module . LibraryName } ...") ;
425427 CompilerResults compilerResults ;
426428 using ( var codeProvider = new CSharpCodeProvider (
427429 new Dictionary < string , string > {
@@ -440,21 +442,33 @@ public void CompileCode(AST.Module module)
440442 HasCompilationErrors = errors . Count > 0 ;
441443 if ( ! HasCompilationErrors )
442444 {
443- var injector = new Injector ( ) ;
444- injector . ReadAssembly ( assemblyFile ) ;
445- var moduleInitializer = injector . GetModuleInitializer ( ) ;
446- if ( moduleInitializer != null )
447- {
448- injector . InjectInitializer ( moduleInitializer ) ;
449- injector . WriteAssembly ( assemblyFile , null ) ;
450- }
445+ InjectModuleInitializer ( assemblyFile ) ;
451446 Diagnostics . Message ( "Compilation succeeded." ) ;
452447 var wrapper = Path . Combine ( outputDir , assemblyFile ) ;
453448 foreach ( var library in module . Libraries )
454449 libraryMappings [ library ] = wrapper ;
455450 }
456451 }
457452
453+ /// <summary>
454+ /// Injects a module initializer, if any, i.e. code executed right after an
455+ /// assembly is loaded and before any other code in it.
456+ /// <para>The run-time supports it but C# does not so we inject it in the
457+ /// compiled assembly by manually adding IL instructions.</para>
458+ /// </summary>
459+ /// <param name="assemblyFile">The assembly to inject a module initializer to.</param>
460+ private static void InjectModuleInitializer ( string assemblyFile )
461+ {
462+ var injector = new Injector ( ) ;
463+ injector . ReadAssembly ( assemblyFile ) ;
464+ var moduleInitializer = injector . GetModuleInitializer ( ) ;
465+ if ( moduleInitializer != null )
466+ {
467+ injector . InjectInitializer ( moduleInitializer ) ;
468+ injector . WriteAssembly ( assemblyFile , null ) ;
469+ }
470+ }
471+
458472 public void AddTranslationUnitPass ( TranslationUnitPass pass )
459473 {
460474 Context . TranslationUnitPasses . AddPass ( pass ) ;
0 commit comments