/// <summary>
        /// Adds any types and namespaces, imported at the start of the document, to the declarations.
        /// </summary>
        private void AddImports(IntellisenseDeclarations declarations, DocumentTreeNode document)
        {
            // add imports to declarations
            foreach (var importNamespace in document.Imports.Keys)
            {
                ImportedNamespaceTreeNode importedNodes = document.Imports[importNamespace];

                foreach (var member in importedNodes.SourceOrigin.GetMembers(false))
                {
                    declarations.Add(member.ToTreeNode());
                }

                declarations.Add(importedNodes);
            }
        }
        private IntellisenseDeclarations GetScopedIntellisenseDeclarations(int lineNum)
        {
            // get the node that the caret is in
            var scopedParseTree = compiledProject.GetScope(fileName, lineNum);
            var declarations = new IntellisenseDeclarations();

            AddMembersFromScopeTree(declarations, scopedParseTree);
            AddKeywords(declarations, scopedParseTree);
            AddImports(declarations, GetDocument(scopedParseTree));
            AddReferences(declarations, (ProjectTreeNode)compiledProject.ParseTree);

            declarations.Sort();

            return declarations;
        }
        private void AddReferences(IntellisenseDeclarations declarations, ProjectTreeNode project)
        {
            var namespaces = new List<IBooParseTreeNode>();

            foreach (var ns in project.ReferencedNamespaces.Keys)
            {
                namespaces.Add(project.ReferencedNamespaces[ns]);
            }

            declarations.AddRange(namespaces);
        }
        /// <summary>
        /// Adds members from the current scope (flattened, so all containing scopes are included) to
        /// the declarations.
        /// </summary>
        private void AddMembersFromScopeTree(IntellisenseDeclarations declarations, IBooParseTreeNode scopedParseTree)
        {
            var parseTreeFlattener = new BooParseTreeNodeFlatterner();

            declarations.AddRange(parseTreeFlattener.FlattenFrom(scopedParseTree));
        }
        private void AddMemberLookupDeclarations(IntellisenseDeclarations declarations, string lineSource, int line)
        {
            var members = GetMembersFromCurrentScope(line, lineSource);

            members.ForEach(e =>
            {
                IBooParseTreeNode node = e.ToTreeNode();

                if (node != null)
                    declarations.Add(node);
            });

            declarations.Sort();
        }
        /// <summary>
        /// Adds keywords based on the current scope to the declarations.
        /// </summary>
        private void AddKeywords(IntellisenseDeclarations declarations, IBooParseTreeNode scopedParseTree)
        {
            var keywords = new TypeKeywordResolver();

            declarations.Add(keywords.GetForScope(scopedParseTree));
        }
        private void AddSpecialTypes(IntellisenseDeclarations declarations)
        {
            ISourceOrigin origin = new TypeSourceOrigin(typeof(string));

            declarations.Add(origin.ToTreeNode());
        }