public void StructConstructorContainingDroppableType_Execute_DroppableValueDropped() { DfirRoot function = DfirRoot.Create(); var structConstructorNode = new StructConstructorNode(function.BlockDiagram, FakeDropStructType); FunctionalNode fakeDrop = CreateFakeDropWithId(function.BlockDiagram, 1); Wire.Create(function.BlockDiagram, fakeDrop.OutputTerminals[0], structConstructorNode.InputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); Assert.IsTrue(executionInstance.RuntimeServices.DroppedFakeDropIds.Contains(1)); }
bool IDfirNodeVisitor <bool> .VisitStructConstructorNode(StructConstructorNode structConstructorNode) { NIType structType = structConstructorNode.Type; foreach (var pair in structConstructorNode.InputTerminals.Zip(structType.GetFields())) { Terminal inputTerminal = pair.Key; _nodeFacade[inputTerminal] = new SimpleTerminalFacade( inputTerminal, _typeVariableSet.CreateTypeVariableReferenceFromNIType(pair.Value.GetDataType())); } _nodeFacade[structConstructorNode.OutputTerminals[0]] = new SimpleTerminalFacade( structConstructorNode.OutputTerminals[0], _typeVariableSet.CreateTypeVariableReferenceFromNIType(structType)); return(true); }
public void StructConstructorIntoStructFieldAccessorWithNullFieldName_SetVariableTypes_VoidFieldVariableType() { DfirRoot function = DfirRoot.Create(); var structConstructorNode = new StructConstructorNode(function.BlockDiagram, StructType); ConnectConstantToInputTerminal(structConstructorNode.InputTerminals[0], NITypes.Int32, false); ConnectConstantToInputTerminal(structConstructorNode.InputTerminals[1], NITypes.Boolean, false); var structFieldAccessor = new StructFieldAccessorNode(function.BlockDiagram, new string[] { null }); Wire.Create(function.BlockDiagram, structConstructorNode.OutputTerminals[0], structFieldAccessor.StructInputTerminal); RunSemanticAnalysisUpToSetVariableTypes(function); VariableReference fieldVariable = structFieldAccessor.OutputTerminals[0].GetTrueVariable(); Assert.IsTrue(fieldVariable.Type.GetReferentType().IsVoid()); }
public void UnconsumedStructVariable_AutomaticNodeInsertion_StructIsDecomposedAndElementsAreDropped() { DfirRoot function = DfirRoot.Create(); var constructorNode = new StructConstructorNode(function.BlockDiagram, StructType); Constant constant = Constant.Create(function.BlockDiagram, string.Empty, DataTypes.StringSliceType.CreateImmutableReference()); var stringFromSlice = new FunctionalNode(function.BlockDiagram, Signatures.StringFromSliceType); Wire.Create(function.BlockDiagram, constant.OutputTerminal, stringFromSlice.InputTerminals[0]); Wire.Create(function.BlockDiagram, stringFromSlice.OutputTerminals[1], constructorNode.InputTerminals[0]); RunCompilationUpToAutomaticNodeInsertion(function); DecomposeStructNode decomposeStruct = AssertDiagramContainsNodeWithSources <DecomposeStructNode>(function.BlockDiagram, constructorNode.OutputTerminals[0]); Assert.AreEqual(StructType, decomposeStruct.Type); DropNode dropNode = AssertDiagramContainsNodeWithSources <DropNode>(function.BlockDiagram, decomposeStruct.OutputTerminals[0]); AssertDropInputVariableHasType(dropNode, NITypes.String); }
public void StructConstructorIntoStructFieldAccessor_Execute_FieldValuesAccessed() { DfirRoot function = DfirRoot.Create(); var structConstructorNode = new StructConstructorNode(function.BlockDiagram, StructType); ConnectConstantToInputTerminal(structConstructorNode.InputTerminals[0], NITypes.Int32, 5, false); ConnectConstantToInputTerminal(structConstructorNode.InputTerminals[1], NITypes.Boolean, true, false); var structFieldAccessor = new StructFieldAccessorNode(function.BlockDiagram, new string[] { "_0", "_1" }); Wire.Create(function.BlockDiagram, structConstructorNode.OutputTerminals[0], structFieldAccessor.StructInputTerminal); FunctionalNode inspect0 = ConnectInspectToOutputTerminal(structFieldAccessor.OutputTerminals[0]); FunctionalNode inspect1 = ConnectInspectToOutputTerminal(structFieldAccessor.OutputTerminals[1]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); byte[] inspectValue = executionInstance.GetLastValueFromInspectNode(inspect0); AssertByteArrayIsInt32(inspectValue, 5); inspectValue = executionInstance.GetLastValueFromInspectNode(inspect1); AssertByteArrayIsBoolean(inspectValue, true); }
public void VisitConstructor(Constructor constructor) { NIType dependencyType = constructor.Type; if (dependencyType.IsValueClass() && dependencyType.GetFields().Count() > 0) { var structConstructorNode = new StructConstructorNode(_currentDiagram, dependencyType); _map.AddMapping(constructor, structConstructorNode); _map.MapTerminalsInOrder(constructor, structConstructorNode); return; } else if (dependencyType.IsUnion()) { int index = 0; { var input = (ConstructorTerminal)constructor.InputTerminals.First(); string fieldName = input.FieldName; int current = 0; foreach (NIType field in dependencyType.GetFields()) { if (field.GetName() == fieldName) { index = current; break; } ++current; } } var variantConstructorNode = new VariantConstructorNode(_currentDiagram, dependencyType, index); _map.AddMapping(constructor, variantConstructorNode); _map.MapTerminalsInOrder(constructor, variantConstructorNode); return; } else { Constant constant = Constant.CreateConstantWithDefaultValue(_currentDiagram, dependencyType); _map.AddMapping(constructor, constant); _map.MapTerminalsInOrder(constructor, constant); } }
public bool VisitStructConstructorNode(StructConstructorNode structConstructorNode) { structConstructorNode.InputTerminals.ForEach(ValidateRequiredInputTerminal); return(true); }
bool IDfirNodeVisitor <bool> .VisitStructConstructorNode(StructConstructorNode structConstructorNode) { structConstructorNode.InputTerminals.ForEach(MarkTrueVariableOfTerminalConsumed); MarkFacadeVariableOfTerminalLive(structConstructorNode.OutputTerminals[0]); return(true); }
bool IDfirNodeVisitor <bool> .VisitStructConstructorNode(StructConstructorNode structConstructorNode) { structConstructorNode.UnifyNodeInputTerminalTypes(_typeUnificationResults); return(true); }