private void ScopeToCompletions(HashSet <Completion> completionList, Scope scope, IAst[] stack)
        {
            var symbols = scope.MakeCompletionList("");

            foreach (var symbol in symbols.Where(s => s != null))
            {
                if (symbol.IsNameValid && !symbol.IsAbstract() && !IsSpecialSymbol(symbol))
                {
                    completionList.Add(MyCompletion.FromSymbol(symbol, stack));
                }
            }
        }
        private void SmartComplete(MyCompletion completion, int positionBefore, int positionAfter, ITextBuffer buffer)
        {
            var completionType  = completion.CompletionType;
            var newLineText     = GetNewLineText(new SnapshotPoint(_textView.TextSnapshot, positionAfter));
            var currentSnapshot = buffer.CurrentSnapshot;

            var textAfterCaret = positionAfter < currentSnapshot.Length
                                 ? currentSnapshot.GetText(positionAfter, (currentSnapshot.Length - (positionAfter + 1)))
                                 : "";

            var textBeforeCaret = currentSnapshot.GetText(0, positionBefore);

            // Need to map to PrettyPrint output without comments and other insignificant trash
            var nextSymbol = textAfterCaret.FirstOrDefault(c => c != ' ' && c != '\r' && c != '\n');
            var prevSymbol = textBeforeCaret.Reverse().FirstOrDefault(c => c != ' ');

            var line     = _textView.Caret.ContainingTextViewLine;
            var lineText = line.Extent.GetText();
            var indent   = string.Join("", lineText.TakeWhile(c => char.IsWhiteSpace(c) || c == '\t'));

            if (completionType == CompletionType.Property && prevSymbol != ':' && nextSymbol != ':')
            {
                SmartCompleteProperty(positionAfter, buffer);
            }
            else if (completionType == CompletionType.Node && nextSymbol != '{' && !completion.IsPropertyValue)
            {
                SmartCompleteNode(positionAfter, buffer, newLineText, indent);
            }
            else if (completionType == CompletionType.ContentFunctionRef && nextSymbol != '(')
            {
                //SmartCompleteContentFunctionRef(positionAfter, buffer, newLineText, indent);
            }
            else if (completionType == CompletionType.TypeFunctionRef && nextSymbol != '(')
            {
                SmartCompleteTypeFunctionRef(positionAfter, buffer, newLineText, indent);
            }
            else if (completionType == CompletionType.ContentFunctionRefWithParams && nextSymbol != '(')
            {
                SmartCompleteContentFunctionRefWithParams(positionAfter, buffer, newLineText, indent);
            }
            else if (completionType == CompletionType.TypeFunctionRefWithParams && nextSymbol != '(')
            {
                SmartCompleteTypeFunctionRefWithParams(positionAfter, buffer, newLineText, indent);
            }
        }