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));
        }