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