Пример #1
0
 internal void RemoveNode(LibraryNode node) {
     lock (this) {
         _root = _root.Clone();
         _root.RemoveNode(node);
         _updateCount++;
     }
 }
Пример #2
0
        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;
                }
            }
        }
Пример #3
0
        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();
                }
            }
        }
Пример #4
0
        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);
        }