internal void RemoveNode(LibraryNode node) { lock (this) { _root = _root.Clone(); _root.RemoveNode(node); _updateCount++; } }
private void RemoveGlobalNode(ref LibraryNode node) { foreach (LibraryNode child in node.Children) { if (child.NodeType == LibraryNode.LibraryNodeType.Package) { LibraryNode globalnode = new LibraryNode(child); node.RemoveNode(child); foreach (LibraryNode gchild in globalnode.Children) { node.AddNode(gchild); } break; } } }
private void ApplyUpdates(bool assumeLockHeld) { if (!assumeLockHeld) { if (!_searching.Wait(0)) { // Didn't get the lock immediately, which means we are // currently searching. Once the search is done, updates // will be applied. return; } } try { lock (_updates) { if (_updates.Count == 0) { return; } // re-create root node here because we may have handed out // the node before and don't want to mutate it's list. _root = _root.Clone(); _updateCount += 1; foreach (var kv in _updates) { switch (kv.Key) { case UpdateType.Add: _root.AddNode(kv.Value); break; case UpdateType.Remove: _root.RemoveNode(kv.Value); break; default: Debug.Fail("Unsupported update type " + kv.Key.ToString()); break; } } _updates.Clear(); } } finally { if (!assumeLockHeld) { _searching.Release(); } } }
public LibraryNode Parse(LibraryTask task) { this.filename = task.FileName; this.moduleId = task.ModuleID; LibraryNode filenode = new LibraryNode(System.IO.Path.GetFileName(filename), LibraryNode.LibraryNodeType.PhysicalContainer, moduleId); LibraryNode globalnode = new LibraryNode("(Global Scope)", LibraryNode.LibraryNodeType.Package, moduleId); start = new SourceLocation(0, 0); end = new SourceLocation(0, 0); globalnode.StartLine = start.line; globalnode.StartCol = start.col; filenode.AddNode(globalnode); try { if (task.Text == null) { lexer.SetSource(File.ReadAllText(filename), 0); } else { lexer.SetSource(task.Text, 0); } Lex(); while (_token > 0 && !lexer.IsEob()) { try { switch (_token) { case (int)Token.FUNCTION: Lex(); if (_token == '(') // ignoring function literals for now - josh { MatchBraces('{', '}'); } else { LibraryNode fnode = ParseFunction(false); if (fnode.NodeType == LibraryNode.LibraryNodeType.Members) { globalnode.AddNode(fnode); } else { filenode.AddNode(fnode); } } break; case (int)Token.DOUBLE_COLON: Lex(); continue; case (int)Token.IDENTIFIER: LibraryNode inode = ParseClassOrTable(true); if (inode != null) { globalnode.AddNode(inode); } /* * else * { * SkipToEndOfTheLine(); * } */ break; case (int)Token.CLASS: Lex(); filenode.AddNode(ParseClassOrTable(false)); break; case (int)Token.ENUM: Lex(); LibraryNode enode = ParseEnum(); globalnode.AddNode(enode); break; case (int)Token.LINE_COMMENT: Lex(); break; default: SkipToEndOfTheLine(); break; } } catch (Exception e) { if (parselogging) { logger.Log(filename + ": " + e.Message); } Lex(); } } } catch (Exception e) { if (parselogging) { logger.Log("cannot read " + filename + ": " + e.Message); } } if (filenode.Children[0].Children.Count == 0) { filenode.RemoveNode(filenode.Children[0]); } globalnode.EndLine = end.line; globalnode.EndCol = end.col; return(filenode); }