示例#1
0
        protected override void VisitNode(Node node)
        {
            TypeVariableSet      typeVariableSet = node.GetTypeVariableSet();
            AutoBorrowNodeFacade nodeFacade      = AutoBorrowNodeFacade.GetNodeFacade(node);
            var primitive    = node as PrimitiveTypeNode;
            var selfTypeNode = node as SelfTypeNode;

            if (primitive != null)
            {
                nodeFacade[primitive.OutputTerminal] = new SimpleTerminalFacade(
                    primitive.OutputTerminal,
                    typeVariableSet.CreateTypeVariableReferenceFromNIType(primitive.Type));
                return;
            }
            if (selfTypeNode != null)
            {
                foreach (Terminal inputTerminal in selfTypeNode.InputTerminals)
                {
                    TypeVariableReference typeVariable = typeVariableSet.CreateReferenceToNewTypeVariable();
                    nodeFacade[inputTerminal] = new SimpleTerminalFacade(inputTerminal, typeVariable);
                }
                return;
            }
            throw new NotSupportedException($"Unsupported node type: {node.GetType().Name}");
        }
示例#2
0
        public void UpdateOutputTerminals(int outputTerminalCount)
        {
            AutoBorrowNodeFacade nodeFacade = AutoBorrowNodeFacade.GetNodeFacade(this);
            var immutableReferenceType      = NITypes.Void.CreateImmutableReference();
            int currentOutputTerminalCount  = OutputTerminals.Count();

            if (currentOutputTerminalCount < outputTerminalCount)
            {
                for (; currentOutputTerminalCount < outputTerminalCount; ++currentOutputTerminalCount)
                {
                    var terminal = CreateTerminal(Direction.Output, immutableReferenceType, "outer lifetime");
                    nodeFacade[terminal] = new SimpleTerminalFacade(terminal, terminal.GetTypeVariableSet().CreateReferenceToNewTypeVariable());
                }
            }
            else if (currentOutputTerminalCount > outputTerminalCount)
            {
                int i = currentOutputTerminalCount - 1;
                while (i >= 0 && currentOutputTerminalCount > outputTerminalCount)
                {
                    Terminal outputTerminal = OutputTerminals.ElementAt(i);
                    if (!outputTerminal.IsConnected)
                    {
                        RemoveTerminalAtIndex(outputTerminal.Index);
                        --currentOutputTerminalCount;
                    }
                    --i;
                }
            }
        }
示例#3
0
        protected override void VisitWire(Wire wire)
        {
            TypeVariableReference wireTypeVariable = wire.GetTypeVariableSet()
                                                     .CreateReferenceToNewTypeVariable(Enumerable.Empty <Constraint>());

            AutoBorrowNodeFacade wireFacade = AutoBorrowNodeFacade.GetNodeFacade(wire);

            foreach (var terminal in wire.Terminals)
            {
                wireFacade[terminal] = new SimpleTerminalFacade(terminal, wireTypeVariable);
            }
        }
        public void FunctionNodeWithNonReferenceInSignatureParameter_CreateNodeFacades_CreatesSimpleFacadeForTerminal()
        {
            NIType         signatureType  = Signatures.VectorInsertType;
            DfirRoot       dfirRoot       = DfirRoot.Create();
            FunctionalNode functionalNode = new FunctionalNode(dfirRoot.BlockDiagram, signatureType);

            RunSemanticAnalysisUpToCreateNodeFacades(dfirRoot);

            AutoBorrowNodeFacade nodeFacade    = AutoBorrowNodeFacade.GetNodeFacade(functionalNode);
            Terminal             inputTerminal = functionalNode.InputTerminals[2];

            Assert.IsInstanceOfType(nodeFacade[inputTerminal], typeof(SimpleTerminalFacade));
        }
        public void FunctionNodeWithSelectReferenceSignature_CreateNodeFacades_CreatesFacades()
        {
            NIType         signatureType  = Signatures.SelectReferenceType;
            DfirRoot       dfirRoot       = DfirRoot.Create();
            FunctionalNode functionalNode = new FunctionalNode(dfirRoot.BlockDiagram, signatureType);

            RunSemanticAnalysisUpToCreateNodeFacades(dfirRoot);

            AutoBorrowNodeFacade nodeFacade    = AutoBorrowNodeFacade.GetNodeFacade(functionalNode);
            Terminal             inputTerminal = functionalNode.InputTerminals[1];

            Assert.IsNotInstanceOfType(nodeFacade[inputTerminal], typeof(SimpleTerminalFacade));
        }
        public void FunctionNodeWithMutableInOutSignatureParameter_CreateNodeFacades_CreatesTrueAndFacadeVariablesForBothTerminals()
        {
            NIType         signatureType  = Signatures.MutablePassthroughType;
            DfirRoot       dfirRoot       = DfirRoot.Create();
            FunctionalNode functionalNode = new FunctionalNode(dfirRoot.BlockDiagram, signatureType);

            RunSemanticAnalysisUpToCreateNodeFacades(dfirRoot);

            AutoBorrowNodeFacade nodeFacade    = AutoBorrowNodeFacade.GetNodeFacade(functionalNode);
            Terminal             inputTerminal = functionalNode.InputTerminals[0];

            Assert.IsNotNull(nodeFacade[inputTerminal]);
            Terminal outputTerminal = functionalNode.OutputTerminals[0];

            Assert.IsNotNull(nodeFacade[outputTerminal]);
        }
        public void FunctionNodeWithSelectReferenceSignatureAndMutableValuesWired_SetVariableTypes_MutableReferenceTypeSetOnOutput()
        {
            NIType         signatureType  = Signatures.SelectReferenceType;
            DfirRoot       dfirRoot       = DfirRoot.Create();
            FunctionalNode functionalNode = new FunctionalNode(dfirRoot.BlockDiagram, signatureType);

            ConnectConstantToInputTerminal(functionalNode.InputTerminals[1], NITypes.Int32, true);
            ConnectConstantToInputTerminal(functionalNode.InputTerminals[2], NITypes.Int32, true);

            RunSemanticAnalysisUpToSetVariableTypes(dfirRoot);

            AutoBorrowNodeFacade nodeFacade             = AutoBorrowNodeFacade.GetNodeFacade(functionalNode);
            Terminal             outputTerminal         = functionalNode.OutputTerminals[1];
            VariableReference    outputTerminalVariable = outputTerminal.GetTrueVariable();

            Assert.IsTrue(outputTerminalVariable.Type.IsMutableReferenceType());
            Assert.IsTrue(outputTerminalVariable.Type.GetReferentType().IsInt32());
        }
        public void FunctionNodeWithSelectReferenceSignatureAndSameLifetimeImmutableReferencesWired_SetVariableTypes_SameLifetimeSetOnOutput()
        {
            NIType             signatureType  = Signatures.SelectReferenceType;
            DfirRoot           dfirRoot       = DfirRoot.Create();
            FunctionalNode     functionalNode = new FunctionalNode(dfirRoot.BlockDiagram, signatureType);
            ExplicitBorrowNode borrow         = ConnectExplicitBorrowToInputTerminals(functionalNode.InputTerminals[1], functionalNode.InputTerminals[2]);

            ConnectConstantToInputTerminal(borrow.InputTerminals[0], NITypes.Int32, false);
            ConnectConstantToInputTerminal(borrow.InputTerminals[1], NITypes.Int32, false);

            RunSemanticAnalysisUpToSetVariableTypes(dfirRoot);

            AutoBorrowNodeFacade nodeFacade     = AutoBorrowNodeFacade.GetNodeFacade(functionalNode);
            Terminal             inputTerminal  = functionalNode.InputTerminals[1];
            Lifetime             inputLifetime  = inputTerminal.GetTrueVariable().Lifetime;
            Terminal             outputTerminal = functionalNode.OutputTerminals[1];

            Assert.AreEqual(inputLifetime, outputTerminal.GetTrueVariable().Lifetime);
        }
示例#9
0
 public void ConnectToTerminalAsInputAndUnifyVariables(Terminal connectTo, ITypeUnificationResultFactory unificationResultFactory)
 {
     Wire.Create(Terminal.ParentDiagram, Terminal, connectTo);
     AutoBorrowNodeFacade.GetNodeFacade(connectTo.ParentNode)[connectTo]
     .UnifyWithConnectedWireTypeAsNodeInput(Variable, unificationResultFactory);
 }