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