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}"); }
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; } } }
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); }
public void ConnectToTerminalAsInputAndUnifyVariables(Terminal connectTo, ITypeUnificationResultFactory unificationResultFactory) { Wire.Create(Terminal.ParentDiagram, Terminal, connectTo); AutoBorrowNodeFacade.GetNodeFacade(connectTo.ParentNode)[connectTo] .UnifyWithConnectedWireTypeAsNodeInput(Variable, unificationResultFactory); }