private static void GetFactories(MetadataLogService metadataLogService, out ESMAnalyzer analyzer, out TES5ObjectCallFactory objectCallFactory, out TES5ReferenceFactory referenceFactory, out TES5ValueFactory valueFactory, out TES5ChainedCodeChunkFactory chainedCodeChunkFactory, out TES5AdditionalBlockChangesPass additionalBlockChangesPass)
 {
     analyzer = new ESMAnalyzer(DataDirectory.TES4GameFileName);
     TES5TypeInferencer typeInferencer = new TES5TypeInferencer(analyzer, BuildTarget.StandaloneSourcePath);
     TES5ObjectPropertyFactory objectPropertyFactory = new TES5ObjectPropertyFactory(typeInferencer);
     objectCallFactory = new TES5ObjectCallFactory(typeInferencer);
     referenceFactory = new TES5ReferenceFactory(objectCallFactory, objectPropertyFactory);
     valueFactory = new TES5ValueFactory(objectCallFactory, referenceFactory, objectPropertyFactory, analyzer, typeInferencer, metadataLogService);
     TES5ObjectCallArgumentsFactory objectCallArgumentsFactory = new TES5ObjectCallArgumentsFactory(valueFactory);
     TES5ValueFactoryFunctionFiller.FillFunctions(valueFactory, objectCallFactory, objectCallArgumentsFactory, referenceFactory, objectPropertyFactory, analyzer, typeInferencer, metadataLogService);
     TES5VariableAssignationConversionFactory assignationConversionFactory = new TES5VariableAssignationConversionFactory(objectCallFactory, referenceFactory, valueFactory, typeInferencer);
     TES5ReturnFactory returnFactory = new TES5ReturnFactory(objectCallFactory);
     chainedCodeChunkFactory = new TES5ChainedCodeChunkFactory(valueFactory, returnFactory, assignationConversionFactory);
     additionalBlockChangesPass = new TES5AdditionalBlockChangesPass(objectCallFactory, referenceFactory);
 }
        private static void GetFactories(MetadataLogService metadataLogService, ESMAnalyzer esmAnalyzer, out TES5ObjectCallFactory objectCallFactory, out TES5ChainedCodeChunkFactory chainedCodeChunkFactory, out TES5AdditionalBlockChangesPass additionalBlockChangesPass)
        {
            TES5TypeInferencer        typeInferencer        = new TES5TypeInferencer(esmAnalyzer);
            TES5ObjectPropertyFactory objectPropertyFactory = new TES5ObjectPropertyFactory(typeInferencer);

            objectCallFactory = new TES5ObjectCallFactory(typeInferencer);
            TES5ReferenceFactory           referenceFactory           = new TES5ReferenceFactory(objectCallFactory, objectPropertyFactory, esmAnalyzer);
            TES5ValueFactory               valueFactory               = new TES5ValueFactory(objectCallFactory, referenceFactory, esmAnalyzer);
            TES5ObjectCallArgumentsFactory objectCallArgumentsFactory = new TES5ObjectCallArgumentsFactory(valueFactory);

            TES5ValueFactoryFunctionFiller.FillFunctions(valueFactory, objectCallFactory, objectCallArgumentsFactory, referenceFactory, objectPropertyFactory, metadataLogService, esmAnalyzer);
            TES5VariableAssignationConversionFactory assignationConversionFactory = new TES5VariableAssignationConversionFactory(objectCallFactory, referenceFactory, valueFactory, typeInferencer);
            TES5ReturnFactory returnFactory = new TES5ReturnFactory(objectCallFactory);

            chainedCodeChunkFactory    = new TES5ChainedCodeChunkFactory(valueFactory, returnFactory, assignationConversionFactory);
            additionalBlockChangesPass = new TES5AdditionalBlockChangesPass(objectCallFactory, referenceFactory);
        }
        public static BuildTargetAdvanced ConstructAdvanced(BuildTargetSimple buildTarget, BuildLogServiceCollection buildLogServices, ESMAnalyzer esmAnalyzer, TES5TypeInferencer typeInferencer)
        {
            switch (buildTarget.Name)
            {
            case StandaloneName:
            {
                StandaloneParsingService standaloneParsingService = new StandaloneParsingService(new SyntaxErrorCleanParser(new TES4OBScriptGrammar()));
                return(new BuildTargetAdvanced(buildTarget, new Standalone.TranspileCommand(standaloneParsingService, buildLogServices.MetadataLogService, esmAnalyzer), new Standalone.BuildScopeCommand(standaloneParsingService, esmAnalyzer, new TES5PropertyFactory(esmAnalyzer)), new Standalone.WriteCommand()));
            }

            case TIFName:
            {
                FragmentsParsingService fragmentsParsingService = new FragmentsParsingService(new SyntaxErrorCleanParser(new TES4ObscriptCodeGrammar()));
                return(new BuildTargetAdvanced(buildTarget, new TIF.TranspileCommand(fragmentsParsingService, buildLogServices.MetadataLogService, esmAnalyzer), new TIF.BuildScopeCommand(new TES5PropertyFactory(esmAnalyzer), new FragmentsReferencesBuilder(esmAnalyzer)), new TIF.WriteCommand()));
            }

            case PFName:
            {
                return(new BuildTargetAdvanced(buildTarget, new PF.TranspileCommand(), new PF.BuildScopeCommand(), new PF.WriteCommand()));
            }

            case QFName:
            {
                FragmentsParsingService        fragmentsParsingService    = new FragmentsParsingService(new SyntaxErrorCleanParser(new TES4ObscriptCodeGrammar()));
                TES5ObjectCallFactory          objectCallFactory          = new TES5ObjectCallFactory(typeInferencer);
                TES5ObjectPropertyFactory      objectPropertyFactory      = new TES5ObjectPropertyFactory(typeInferencer);
                TES5ReferenceFactory           referenceFactory           = new TES5ReferenceFactory(objectCallFactory, objectPropertyFactory, esmAnalyzer);
                TES5ValueFactory               valueFactory               = new TES5ValueFactory(objectCallFactory, referenceFactory, esmAnalyzer);
                TES5ObjectCallArgumentsFactory objectCallArgumentsFactory = new TES5ObjectCallArgumentsFactory(valueFactory);
                TES5ValueFactoryFunctionFiller.FillFunctions(valueFactory, objectCallFactory, objectCallArgumentsFactory, referenceFactory, objectPropertyFactory, buildLogServices.MetadataLogService, esmAnalyzer);
                TES5VariableAssignationConversionFactory assignationConversionFactory = new TES5VariableAssignationConversionFactory(objectCallFactory, referenceFactory, valueFactory, typeInferencer);
                TES5ReturnFactory           returnFactory            = new TES5ReturnFactory(objectCallFactory);
                TES5ChainedCodeChunkFactory chainedCodeChunkFactory  = new TES5ChainedCodeChunkFactory(valueFactory, returnFactory, assignationConversionFactory);
                TES5FragmentFactory         fragmentFactory          = new TES5FragmentFactory(chainedCodeChunkFactory);
                ObjectiveHandlingFactory    objectiveHandlingFactory = new ObjectiveHandlingFactory(objectCallFactory);
                QFFragmentFactory           qfFragmentFactory        = new QFFragmentFactory(buildLogServices.MappedTargetsLogService, objectiveHandlingFactory, esmAnalyzer);
                QF.WriteCommand             writeCommand             = new QF.WriteCommand(qfFragmentFactory);
                return(new BuildTargetAdvanced(buildTarget, new QF.TranspileCommand(fragmentsParsingService, fragmentFactory), new QF.BuildScopeCommand(new TES5PropertyFactory(esmAnalyzer), new FragmentsReferencesBuilder(esmAnalyzer)), writeCommand));
            }

            default:
            {
                throw new InvalidOperationException("Unknown target " + buildTarget.Name);
            }
            }
        }