Skip to main content


The Following Classes need extra context to explain the current workings. Not every feature of C# has been ported to F#.


The current ProjectComponentsBuilder for F# does not have support for the following:

  • mutanthelpers injection
  • auto generated code detection

The FindProjectFilesScanningProjectFolders method (the backup for if buildalyzer doesn't work) has not been tested. This was done because the FindProjectFilesScanningProjectFolders has been [deprecated] so any development would be a waste.


The Orchestrators works in a similar fashion to those in the CsharpMutantOrchestrator. This process starts with a method: Mutate(FSharpList<SynModuleOrNamespace>) inside the FsharpMutantOrchestrator. The FsharpMutantOrchestrator is only used as a starting point, after that the FsharpCoreOrchestrator takes over.

Inside the 'Core' is the actual process. This works by defining a Mutate() method which handles the iteration over a spesific part of a SyntaxTree. (SynExpr for example)

Inside the Mutate method (contained in FsharpCoreOrchestrator) we look for a specific Orchestrator in a Dictionary belonging to the type that the Mutate function handles. (the dictionary gets filled like this: _fsharpMutationsSynExpr.Add(typeof(SynExpr.Match), new MatchOrchestrator());) Once a specific orchestrator class has been found we initialize it and use it to iterate further. The Orchestrator itself defines how to iterate further.



Whilst implementing the Compile function we ran into some limitations. There is a flag (lastcompiled) that should be set on the last file in the compilation sequence. During our testing this flag remained unset and the compiler failed.


To solve this the flag get hardcoded on the file named Program.fs, this is because Program.fs is the last file in the project used to test the compile method.

This is also the reason the orchestrator works with FSharpList<SynModuleOrNamespace> and not ParsedInput. Because we need to set the flag on the ParsedInput. Therefore making it easier to use the FSharpList<SynModuleOrNamespace> until we ave set the flag.