Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
            }
        }