Ejemplo n.º 1
0
        private void SolveConditionContexts(
            [NotNull] GraphDataFlowConditionalNode node,
            [NotNull] LogicExpressionBase expression,
            [NotNull] GraphNode[] path)
        {
            var trueChanges  = new List <(ValueVariantBase, IDataValue)>();
            var falseChanges = new List <(ValueVariantBase, IDataValue)>();

            if (!SolveExpression(node.EnterAnalysisContext, expression, trueChanges, falseChanges))
            {
                Log.Information("Logic: {Operator} -> {Expression}",
                                expression.Operator,
                                expression);
            }

            foreach (var grouping in trueChanges.GroupBy(x => x.Item1, x => x.Item2))
            {
                var(variant, dataValue) = (grouping.Key, grouping.ToArray());
                var newVariant = variant.Clone(node.EnterAnalysisContext, path);
                newVariant.Value = ValueUtilities.IterateValues(dataValue, variant.Value, dataValue.Length + 1,
                                                                ValueUtilities.IterateValuesAndFunc);
                node.TrueExitAnalysisContext[variant] = newVariant;
            }

            foreach (var grouping in falseChanges.GroupBy(x => x.Item1, x => x.Item2))
            {
                var(variant, dataValue) = (grouping.Key, grouping.ToArray());
                var newVariant = variant.Clone(node.EnterAnalysisContext, path);
                newVariant.Value = ValueUtilities.IterateValues(dataValue, variant.Value, dataValue.Length + 1,
                                                                ValueUtilities.IterateValuesAndFunc);
                node.FalseExitAnalysisContext[variant] = newVariant;
            }
        }
        public ItemValueVariantBase ResolveToSingle(AnalysisContext context, IEnumerable <ItemValueVariantBase> variants)
        {
            var variantsArray = variants.ToArray();

            switch (variantsArray.Length)
            {
            case 0:
                Log.Debug("Unexpected 0 variants");
                return(null);

            case 1:
                return(variantsArray[0]);

            default:
            {
                var valueInterval = ValueUtilities.IterateValues(variantsArray.Select(x => x.Value),
                                                                 ValueUtilities.IterateValuesOrFunc);

                var indexes = variantsArray.Select(x => x.Index).Aggregate((current, next) => current | next);

                var combinedVariant = new CombinedItemVariant(
                    valueInterval,
                    StorageVariable,
                    InnerTypeRef,
                    indexes,
                    variantsArray,
                    context);

                return(combinedVariant);
            }
            }
        }
            public override VariableValueVariantBase Create(AnalysisContext context)
            {
                var arrayVariant = Values[0].Clone(context);

                foreach (var index in arrayVariant.IndexRange.Iterate(IntegerLiteral.One))
                {
                    var variants    = Values.Select(x => x[context, index]).ToArray();
                    var itemVariant = variants[0].Clone(context);
                    itemVariant.Value = ValueUtilities.IterateValues(
                        variants.Select(x => x.Value),
                        ValueUtilities.IterateValuesOrFunc);

                    if (!Equals(itemVariant.Value, arrayVariant[context, index].Value))
                    {
                        arrayVariant[context, index] = itemVariant;
                    }
                }

                return(arrayVariant);
            }