internal static DecomposeStructNode InsertDecompositionForStructVariable(Diagram parentDiagram, LiveVariable liveStructVariable, ITypeUnificationResultFactory unificationResultFactory) { NIType variableType = liveStructVariable.Variable.Type; DecomposeStructNode decomposeStruct = TupleNodeHelpers.CreateDecomposeStructNodeWithFacades( parentDiagram, variableType); Terminal structInputTerminal = decomposeStruct.InputTerminals[0]; liveStructVariable.ConnectToTerminalAsInputAndUnifyVariables( structInputTerminal, unificationResultFactory); return(decomposeStruct); }
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 static DecomposeStructNode CreateDecomposeStructNodeWithFacades(Diagram parentDiagram, NIType structType) { var decomposeStructNode = new DecomposeStructNode(parentDiagram, structType); AutoBorrowNodeFacade nodeFacade = AutoBorrowNodeFacade.GetNodeFacade(decomposeStructNode); TypeVariableSet typeVariableSet = parentDiagram.GetTypeVariableSet(); foreach (var pair in decomposeStructNode.OutputTerminals.Zip(structType.GetFields())) { Terminal outputTerminal = pair.Key; NIType elementType = pair.Value.GetDataType(); TypeVariableReference elementTypeVariable = typeVariableSet.CreateTypeVariableReferenceFromNIType(elementType); nodeFacade[outputTerminal] = new SimpleTerminalFacade(outputTerminal, elementTypeVariable); } TypeVariableReference structTypeVariable = typeVariableSet.CreateTypeVariableReferenceFromNIType(structType); Terminal inputTerminal = decomposeStructNode.InputTerminals[0]; nodeFacade[inputTerminal] = new SimpleTerminalFacade(inputTerminal, structTypeVariable); return(decomposeStructNode); }
public void Execute(DfirRoot dfirRoot, CompileCancellationToken cancellationToken) { LiveVariable liveUnboundedLifetimeVariable; while (_lifetimeVariableAssociation.TryGetLiveVariableWithUnboundedLifetime(out liveUnboundedLifetimeVariable)) { Diagram parentDiagram = liveUnboundedLifetimeVariable.Terminal.ParentDiagram; NIType variableType = liveUnboundedLifetimeVariable.Variable.Type; if (variableType.IsCluster()) { DecomposeTupleNode decomposeTuple = InsertDecompositionForTupleVariable( parentDiagram, liveUnboundedLifetimeVariable, _unificationResultFactory); foreach (Terminal outputTerminal in decomposeTuple.OutputTerminals) { _lifetimeVariableAssociation.MarkVariableLive(outputTerminal.GetFacadeVariable(), outputTerminal); } _lifetimeVariableAssociation.MarkVariableConsumed(liveUnboundedLifetimeVariable.Variable); continue; } if (variableType.IsValueClass() && variableType.GetFields().Any()) { DecomposeStructNode decomposeStruct = InsertDecompositionForStructVariable( parentDiagram, liveUnboundedLifetimeVariable, _unificationResultFactory); foreach (Terminal outputTerminal in decomposeStruct.OutputTerminals) { _lifetimeVariableAssociation.MarkVariableLive(outputTerminal.GetFacadeVariable(), outputTerminal); } _lifetimeVariableAssociation.MarkVariableConsumed(liveUnboundedLifetimeVariable.Variable); continue; } InsertDropForVariable(parentDiagram, liveUnboundedLifetimeVariable, _unificationResultFactory); _lifetimeVariableAssociation.MarkVariableConsumed(liveUnboundedLifetimeVariable.Variable); } }