bool IDfirNodeVisitor <bool> .VisitIterateTunnel(IterateTunnel iterateTunnel) { Terminal iteratorInput = iterateTunnel.InputTerminals.ElementAt(0), itemOutput = iterateTunnel.OutputTerminals.ElementAt(0); LifetimeTypeVariableGroup lifetimeTypeVariableGroup = LifetimeTypeVariableGroup.CreateFromTerminal(iteratorInput); TypeVariableReference loopLifetimeReference = _typeVariableSet.CreateReferenceToLifetimeType(itemOutput.GetDiagramLifetime()); TypeVariableReference itemTypeVariable = _typeVariableSet.CreateReferenceToNewTypeVariable(); TypeVariableReference implementsIteratorTypeVariable = _typeVariableSet.CreateReferenceToNewTypeVariable( new Constraint[] { new IteratorTraitConstraint(itemTypeVariable) }); ReferenceInputTerminalLifetimeGroup group = CreateTerminalLifetimeGroup(InputReferenceMutability.RequireMutable, lifetimeTypeVariableGroup); group.AddTerminalFacade(iteratorInput, implementsIteratorTypeVariable, default(TypeVariableReference)); _nodeFacade[itemOutput] = new SimpleTerminalFacade(itemOutput, itemTypeVariable); TypeVariableReference intermediateTypeVariable = _typeVariableSet.CreateReferenceToOptionType(itemTypeVariable); VariableReference intermediateVariable = iterateTunnel.GetVariableSet().CreateNewVariable( iterateTunnel.ParentStructure.ParentDiagram.GetLifetimeGraphIdentifier().Id, intermediateTypeVariable, false); intermediateVariable.Name = iterateTunnel.IntermediateValueName; iterateTunnel.IntermediateValueVariable = intermediateVariable; iterateTunnel.IteratorNextFunctionType = new FunctionType( Signatures.IteratorNextType, new TypeVariableReference[] { implementsIteratorTypeVariable, itemTypeVariable, group.LifetimeType }); return(true); }
bool IDfirNodeVisitor <bool> .VisitIterateTunnel(IterateTunnel iterateTunnel) { Terminal iteratorInput = iterateTunnel.InputTerminals.ElementAt(0), itemOutput = iterateTunnel.OutputTerminals.ElementAt(0); LifetimeTypeVariableGroup lifetimeTypeVariableGroup = LifetimeTypeVariableGroup.CreateFromTerminal(iteratorInput); TypeVariableReference loopLifetimeReference = _typeVariableSet.CreateReferenceToLifetimeType(itemOutput.GetDiagramLifetime()); TypeVariableReference itemTypeVariable = _typeVariableSet.CreateReferenceToNewTypeVariable(); TypeVariableReference implementsIteratorTypeVariable = _typeVariableSet.CreateReferenceToNewTypeVariable( new Constraint[] { new IteratorTraitConstraint(itemTypeVariable) }); _nodeFacade .CreateInputLifetimeGroup(InputReferenceMutability.RequireMutable, lifetimeTypeVariableGroup.LazyNewLifetime, lifetimeTypeVariableGroup.LifetimeType) .AddTerminalFacade(iteratorInput, implementsIteratorTypeVariable, default(TypeVariableReference)); _nodeFacade[itemOutput] = new SimpleTerminalFacade(itemOutput, itemTypeVariable); return(true); }
bool IDfirNodeVisitor <bool> .VisitLockTunnel(LockTunnel lockTunnel) { Terminal lockInput = lockTunnel.InputTerminals.ElementAt(0), referenceOutput = lockTunnel.OutputTerminals.ElementAt(0); LifetimeTypeVariableGroup lifetimeTypeVariableGroup = LifetimeTypeVariableGroup.CreateFromTerminal(lockInput); TypeVariableReference dataVariableType = _typeVariableSet.CreateReferenceToNewTypeVariable(); TypeVariableReference lockType = _typeVariableSet.CreateReferenceToLockingCellType(dataVariableType); CreateTerminalLifetimeGroup(InputReferenceMutability.AllowImmutable, lifetimeTypeVariableGroup) .AddTerminalFacade(lockInput, lockType, default(TypeVariableReference)); Lifetime innerLifetime = referenceOutput.GetDiagramLifetime(); TypeVariableReference referenceType = _typeVariableSet.CreateReferenceToReferenceType( true, lockType, _typeVariableSet.CreateReferenceToLifetimeType(innerLifetime)); _nodeFacade[referenceOutput] = new SimpleTerminalFacade(referenceOutput, referenceType); return(true); }