public IEnumerable <IConceptInfo> FindByType(Type conceptType) { if (!_initialized) { Initialize(); } return(_dslContainer.FindByType(conceptType)); }
private void CheckSemantics(DslContainer dslContainer) { var sw = Stopwatch.StartNew(); // Validations are grouped by concept type, for group performance diagnostics. var validationsByConcept = new MultiDictionary <Type, Action>(); foreach (var conceptValidation in dslContainer.FindByType <IValidatedConcept>()) { validationsByConcept.Add(conceptValidation.GetType(), () => conceptValidation.CheckSemantics(dslContainer)); } var validationStopwatches = new Dictionary <Type, Stopwatch>(); foreach (var validationsGroup in validationsByConcept) { var validationStopwatch = Stopwatch.StartNew(); foreach (var validation in validationsGroup.Value) { validation.Invoke(); } validationStopwatch.Stop(); validationStopwatches.Add(validationsGroup.Key, validationStopwatch); } foreach (var validationStopwatch in validationStopwatches.OrderByDescending(vsw => vsw.Value.Elapsed.TotalSeconds).Take(3)) { _performanceLogger.Write(validationStopwatch.Value, () => "CheckSemantics total time for " + validationStopwatch.Key.Name + "."); } _performanceLogger.Write(sw, "CheckSemantics"); }
private void ExpandMacroConcepts(DslContainer dslContainer) { var swTotal = Stopwatch.StartNew(); var sw = Stopwatch.StartNew(); int iteration = 0; var iterationCreatedConcepts = new List <IConceptInfo>(); int lastNewConceptTime = 0; var lastNewConceptTimeByIteration = new List <int>(); var lastNewConceptTimeByMacro = new Dictionary <string, int>(); var recommendedMacroOrder = _macroOrderRepository.Load().ToDictionary(m => m.EvaluatorName, m => m.EvaluatorOrder); var macroEvaluators = ListMacroEvaluators(recommendedMacroOrder); var macroStopwatches = macroEvaluators.ToDictionary(macro => macro.Name, macro => new Stopwatch()); var createdTypesInIteration = new List <CreatedTypesInIteration>(dslContainer.Concepts.Count() * 5); _performanceLogger.Write(sw, "ExpandMacroConcepts initialization (" + macroEvaluators.Count + " evaluators, " + dslContainer.Concepts.Count() + " parsed concepts resolved, " + dslContainer.UnresolvedConceptsCount() + " unresolved)."); do { iteration++; if (iteration > MacroIterationLimit) { throw new DslSyntaxException(string.Format( "Possible infinite loop detected with recursive macro concept {1}. Iteration limit ({0}) exceeded while expanding macro.", MacroIterationLimit, iterationCreatedConcepts.First().GetShortDescription())); } iterationCreatedConcepts.Clear(); _logger.Trace("Expanding macro concepts, iteration {0}.", iteration); foreach (var macroEvaluator in macroEvaluators) { macroStopwatches[macroEvaluator.Name].Start(); foreach (var conceptInfo in dslContainer.FindByType(macroEvaluator.Implements, macroEvaluator.ImplementsDerivations).ToList()) { var macroCreatedConcepts = macroEvaluator.Evaluate(conceptInfo, dslContainer); CsUtility.Materialize(ref macroCreatedConcepts); if (macroCreatedConcepts != null && macroCreatedConcepts.Any()) { _logger.Trace(() => "Evaluating macro " + macroEvaluator.Name + " on " + conceptInfo.GetShortDescription() + "."); var aiCreatedConcepts = AlternativeInitialization.InitializeNonparsableProperties(macroCreatedConcepts, _logger); var newUniqueConcepts = dslContainer.AddNewConceptsAndReplaceReferences(aiCreatedConcepts); newUniqueConcepts.AddRange(dslContainer.AddNewConceptsAndReplaceReferences(macroCreatedConcepts)); _logger.Trace(() => LogCreatedConcepts(dslContainer, macroCreatedConcepts, newUniqueConcepts)); iterationCreatedConcepts.AddRange(newUniqueConcepts); // Optimization analysis: if (newUniqueConcepts.Count > 0) { lastNewConceptTimeByMacro[macroEvaluator.Name] = ++lastNewConceptTime; } createdTypesInIteration.AddRange(newUniqueConcepts.Select(nuc => new CreatedTypesInIteration { Macro = macroEvaluator.Name, Created = nuc.BaseConceptInfoType().Name, Iteration = iteration })); } } macroStopwatches[macroEvaluator.Name].Stop(); } lastNewConceptTimeByIteration.Add(lastNewConceptTime); _performanceLogger.Write(sw, "ExpandMacroConcepts iteration " + iteration + " (" + iterationCreatedConcepts.Count + " new concepts, " + dslContainer.UnresolvedConceptsCount() + " left unresolved)."); } while (iterationCreatedConcepts.Count > 0); _evaluatorsOrderLogger.Trace(() => swTotal.Elapsed + "\r\n" + ReportLastEvaluationOrder(lastNewConceptTimeByMacro, lastNewConceptTimeByIteration)); foreach (var macroStopwatch in macroStopwatches.OrderByDescending(msw => msw.Value.Elapsed.TotalSeconds).Take(5)) { _performanceLogger.Write(macroStopwatch.Value, () => "ExpandMacroConcepts total time for " + macroStopwatch.Key + "."); } _logger.Trace(() => LogCreatedTypesInIteration(createdTypesInIteration)); dslContainer.ReportErrorForUnresolvedConcepts(); SaveMacroEvaluationOrder(lastNewConceptTimeByMacro); _performanceLogger.Write(swTotal, "ExpandMacroConcepts."); }