/// <summary> /// Creates the memory index any child. /// </summary> /// <param name="unknownIndex">Index of the unknown.</param> /// <returns>Child node</returns> public virtual LocationCollectorNode CreateMemoryIndexAnyChild(MemoryIndex unknownIndex) { MemoryIndexCollectorNode node = new MemoryIndexCollectorNode(unknownIndex); addAnyChild(node); return(node); }
/// <summary> /// Creates the memory index child. /// </summary> /// <param name="name">The name.</param> /// <param name="memoryIndex">Index of the memory.</param> /// <returns>Child node</returns> public virtual LocationCollectorNode CreateMemoryIndexChild(string name, MemoryIndex memoryIndex) { MemoryIndexCollectorNode node = new MemoryIndexCollectorNode(memoryIndex); addChild(node, name); return(node); }
/// <summary> /// Collects the temporary variables. /// </summary> /// <param name="treeIndexCollector">The tree index collector.</param> /// <param name="temporaryPathSegment">The temporary path segment.</param> /// <exception cref="System.NotImplementedException">Temporary memory index is visited more than once</exception> public void CollectTemporary(TreeIndexCollector treeIndexCollector, TemporaryPathSegment temporaryPathSegment) { if (TemporaryNodes.ContainsKey(temporaryPathSegment.TemporaryIndex)) { throw new NotImplementedException("Temporary memory index is visited more than once"); } MemoryIndexCollectorNode node = new MemoryIndexCollectorNode(temporaryPathSegment.TemporaryIndex); node.IsMust = true; TemporaryNodes.Add(temporaryPathSegment.TemporaryIndex, node); treeIndexCollector.AddNode(node); HasRootNode = true; }
private bool processAlias(MemoryIndex index) { if (lastCreatedNode == null) { if (parentNode != null && lastSegment != null) { if (lastSegment.IsAny) { if (testAndProcessReturnedAnyNode(parentNode, index)) { MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(index); newNode.IsMust = false; currentNode.addAnyChild(newNode); collector.AddNode(newNode); } } else { if (testAndProcessReturnedNode(lastSegment.Name, parentNode, isMust, index)) { MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(index); newNode.IsMust = isMust; currentNode.addChild(newNode, lastSegment.Name); collector.AddNode(newNode); } } return(true); } else { return(false); } } else { lastCreatedNode.SetMemoryIndex(index); collector.AddNode(lastCreatedNode); return(true); } }
private void processIndexSegment(IndexSegment segment) { lastSegment = segment; if (segment.IsAny) { if (currentNode.AnyChildNode != null) { parentNode = currentNode; currentNode = currentNode.AnyChildNode; } else { MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(null); newNode.IsMust = false; currentNode.addAnyChild(newNode); parentNode = currentNode; currentNode = newNode; lastCreatedNode = newNode; } } else { if (currentNode.NamedChildNodes != null && currentNode.NamedChildNodes.ContainsKey(segment.Name)) { parentNode = currentNode; currentNode = currentNode.NamedChildNodes[segment.Name]; } else { MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(null); newNode.IsMust = isMust; currentNode.addChild(newNode, segment.Name); parentNode = currentNode; currentNode = newNode; lastCreatedNode = newNode; } } }
public void VisitTemporaryIndex(TemporaryIndex index) { MemoryIndexCollectorNode node; if (!rootNode.TemporaryNodes.TryGetValue(index.RootIndex, out node)) { MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(index.RootIndex); newNode.IsMust = isMust; rootNode.TemporaryNodes.Add(index.RootIndex, newNode); currentNode = newNode; } else { currentNode = node; } processIndexPath(index); if (!processAlias(index)) { if (isMust) { rootNode.TemporaryNodes.Remove(index.RootIndex); MemoryIndexCollectorNode newNode = new MemoryIndexCollectorNode(index.RootIndex); newNode.IsMust = isMust; rootNode.TemporaryNodes.Add(index.RootIndex, newNode); } else { MemoryIndexCollectorNode childNode = rootNode.TemporaryNodes[index.RootIndex]; collector.AddNode(childNode); childNode.TargetIndex = index; childNode.SourceIndex = index; childNode.IsMust = false; } } }