private CodeMethodReferenceExpression CreateSetupResourcesMethod(List <ExpressionContainer> expressions, Dictionary <string, CodePropertyReferenceExpression> resourceReferences) { CodeMemberMethod method = new CodeMemberMethod { Attributes = MemberAttributes.Private, Name = NameGeneratorHelper.ASSIGN_RESOURCE_TO_RESOURCE_METHOD_NAME, }; // Create dependency graph to check for cycle in resource assignment Dictionary <string, DependencyNode> dependencies = resourceReferences.ToDictionary(x => x.Value.PropertyName, x => new DependencyNode(x.Value.PropertyName)); foreach (ExpressionContainer expression in expressions) { string source = expression.TargetObject; string targetKey = expression.Expression.GetValue(ResourceExpression.KEY); string target = resourceReferences[targetKey].PropertyName; dependencies[source].Add(dependencies[target]); } // Check for cycle List <DependencyNode> processedNodes = new List <DependencyNode>(); List <DependencyNode> waitingNodes = dependencies.Values.ToList(); while (waitingNodes.Any()) { DependencyNode node = waitingNodes.FirstOrDefault(x => x.Dependencies.All(o => o.IsMarked)); if (node == null) { Log.LogError("Error : Circular references in Resources"); throw new InvalidOperationException("Cirular references"); } node.IsMarked = true; processedNodes.Add(node); waitingNodes.Remove(node); } // If no cycles, we have the order to assign all resources in correct order Dictionary <DependencyNode, IEnumerable <ExpressionContainer> > orderedExpressions = processedNodes.ToDictionary(x => x, x => expressions.Where(o => o.TargetObject == x.Id)); foreach (DependencyNode node in processedNodes) { foreach (ExpressionContainer expression in orderedExpressions[node]) { string resourceKey = expression.Expression.GetValue(ResourceExpression.KEY); method.Statements.Add(SetValueStatement(CodeGeneratorHelper.GetPropertyReference(expression.TargetObject), expression.TargetField, resourceReferences[resourceKey])); } } Methods.Add(method); return(CodeGeneratorHelper.GetMethodReference(method)); }
private CodeMethodReferenceExpression CreateSetupResourceForViewElementMethod(List <ExpressionContainer> expressions, Dictionary <string, CodePropertyReferenceExpression> resourceReferences) { CodeMemberMethod method = new CodeMemberMethod { Attributes = MemberAttributes.Private, Name = NameGeneratorHelper.ASSIGN_RESOURCE_TO_VIEW_METHOD_NAME, }; foreach (ExpressionContainer expression in expressions) { string resourceKey = expression.Expression.GetValue(ResourceExpression.KEY); method.Statements.Add(SetValueStatement(CodeGeneratorHelper.GetPropertyReference(expression.TargetObject), expression.TargetField, resourceReferences[resourceKey])); } Methods.Add(method); return(CodeGeneratorHelper.GetMethodReference(method)); }
private CodeMethodReferenceExpression CreateAssignTranslationMethod(List <ExpressionContainer> expressions, CodePropertyReferenceExpression localizationServiceReference) { CodeMemberMethod method = new CodeMemberMethod { Attributes = MemberAttributes.Private, Name = NameGeneratorHelper.ASSIGN_TRANSLATION_METHOD_NAME, }; foreach (ExpressionContainer expression in expressions) { CodeMethodInvokeExpression valueReference = GenerateStatementToGetTranslation(localizationServiceReference, expression.Expression); method.Statements.Add(SetValueStatement(CodeGeneratorHelper.GetPropertyReference(expression.TargetObject), expression.TargetField, valueReference)); } Methods.Add(method); return(CodeGeneratorHelper.GetMethodReference(method)); }