Beispiel #1
0
        public ExecutionTypeNode_I[] Build(ExecutionEnsureContext context, GenericInstanceType inputType, out Type[] underlyingTypes)
        {
            underlyingTypes = null;

            if (inputType.GenericArguments.Count <= 0)
            {
                return(new ExecutionTypeNode_I[0]);
            }

            var types = new ExecutionTypeNode_I[inputType.GenericArguments.Count];

            underlyingTypes = new Type[inputType.GenericArguments.Count];



            for (var i = 0; i < inputType.GenericArguments.Count; i++)
            {
                var genericArgument = inputType.GenericArguments[i];

                types[i] = Execution.Types.Ensuring.Ensure(context, genericArgument, cloneContext: true);

                if (types[i].Type.SourceTypeReference == null)
                {
                    throw new Exception("null type reference");
                }

                underlyingTypes[i] = types[i].Type.UnderlyingType;
            }

            return(types);
        }
Beispiel #2
0
        private void SetNode(ExecutionTypeNode_I arrayStemType, ExecutionTypeNode_I node)
        {
            if (arrayStemType.Arrays == null)

            {
                arrayStemType.Arrays = new ExecutionTypeNode_I[5];
            }

            var foundSlot    = false;
            int currentIndex = 0;

            for (; currentIndex < arrayStemType.Arrays.Length; currentIndex++)
            {
                var arrayNode = arrayStemType.Arrays[currentIndex];

                if (arrayNode == null)
                {
                    foundSlot = true;
                    break;
                }
            }

            if (!foundSlot)
            {
                var tempArrays = new ExecutionTypeNode_I[arrayStemType.Arrays.Length + 5];

                Array.Copy(arrayStemType.Arrays, 0, tempArrays, 0, arrayStemType.Arrays.Length);

                arrayStemType.Arrays = tempArrays;
            }

            arrayStemType.Arrays[currentIndex] = node;
        }
        private bool CheckForBranch(ExecutionTypeNode_I blueprintNode, ExecutionTypeNode_I[] typeArguments,
                                    out ExecutionGenericInstanceTypeNode executionTypeNode)
        {
            executionTypeNode = null;

            var generics = blueprintNode.Generics;

            if (generics == null)
            {
                return(false);
            }

            for (int i = 0; i < generics.Length; i++)
            {
                var genericInstanceNode = generics[i];

                if (genericInstanceNode?.Arguments?.Length != typeArguments.Length)
                {
                    continue;
                }

                var ok = true;

                for (var j = 0; j < genericInstanceNode.Arguments.Length; j++)
                {
                    var argument = genericInstanceNode.Arguments[j];

                    if (ReferenceEquals(argument, typeArguments[j]))
                    {
                        continue;
                    }

                    ok = false;

                    break;
                }

                if (!ok)
                {
                    continue;
                }

                executionTypeNode = genericInstanceNode;

                return(true);
            }

            return(false);
        }
Beispiel #4
0
        private bool CheckForBranch(ExecutionTypeNode_I arrayStemType, ArrayType arrayType, out ExecutionTypeNode_I ensure)
        {
            if (arrayStemType.Arrays != null && arrayStemType.Arrays.Length > 0)
            {
                for (int i = 0; i < arrayStemType.Arrays.Length; i++)
                {
                    var arrayNode = arrayStemType.Arrays[i];

                    if (arrayNode?.Rank == arrayType.Rank)
                    {
                        ensure = (ExecutionTypeNode_I)arrayNode;
                        return(true);
                    }
                }
            }
            ensure = null;

            return(false);
        }