public void HandleKeyword_KeywordIsImport_KeywordCompletionDataProviderIsCodeCompletionItemProvider()
        {
            HandlesImportKeyword();
            CodeCompletionItemProvider provider = codeCompletionBinding.KeywordCompletionItemProviderCreated as CodeCompletionItemProvider;

            Assert.IsNotNull(provider);
        }
Пример #2
0
        public static VBNetCompletionItemList GenerateCompletionData(this ExpressionResult expressionResult, ITextEditor editor, char pressedKey)
        {
            VBNetCompletionItemList result = new VBNetCompletionItemList();

            IResolver        resolver = ParserService.CreateResolver(editor.FileName);
            ParseInformation info     = ParserService.GetParseInformation(editor.FileName);

            if (info == null)
            {
                return(result);
            }

            List <ICompletionEntry> data = new List <ICompletionEntry>();

            bool        completingDotExpression = false;
            IReturnType resolvedType            = null;

            if (expressionResult.Context != ExpressionContext.Global && expressionResult.Context != ExpressionContext.TypeDeclaration)
            {
                if (expressionResult.Context == ExpressionContext.Importable &&
                    string.IsNullOrWhiteSpace(expressionResult.Expression))
                {
                    expressionResult.Expression = "Global";
                }
                else if (pressedKey == '\0')
                {
                    int idx = string.IsNullOrWhiteSpace(expressionResult.Expression)
                                                ? -1
                                                : expressionResult.Expression.LastIndexOf('.');

                    if (idx > -1)
                    {
                        expressionResult.Expression = expressionResult.Expression.Substring(0, idx);
                        // its the same as if . was pressed
                        completingDotExpression = true;
                    }
                    else
                    {
                        expressionResult.Expression = "";
                    }
                }

                var rr = resolver.Resolve(expressionResult, info, editor.Document.Text);

                if (rr == null || !rr.IsValid || (pressedKey != '.' && !completingDotExpression))
                {
                    if (((BitArray)expressionResult.Tag)[Tokens.Identifier])
                    {
                        data = new NRefactoryResolver(LanguageProperties.VBNet)
                               .CtrlSpace(editor.Caret.Line, editor.Caret.Column, info, editor.Document.Text, expressionResult.Context,
                                          ((NRefactoryCompletionItemList)result).ContainsItemsFromAllNamespaces);
                    }
                }
                else
                {
                    if (rr is MethodGroupResolveResult)
                    {
                        IMethod singleMethod = ((MethodGroupResolveResult)rr).GetMethodWithEmptyParameterList();
                        if (singleMethod != null)
                        {
                            rr = new MemberResolveResult(rr.CallingClass, rr.CallingMember, singleMethod);
                        }
                    }

                    if (rr is IntegerLiteralResolveResult && pressedKey == '.')
                    {
                        return(result);
                    }

                    data = rr.GetCompletionData(info.CompilationUnit.ProjectContent, ((NRefactoryCompletionItemList)result).ContainsItemsFromAllNamespaces) ?? new List <ICompletionEntry>();

                    resolvedType = rr.ResolvedType;
                }
            }

            bool addedKeywords = false;

            if (expressionResult.Tag != null && (expressionResult.Context != ExpressionContext.Importable) && pressedKey != '.' && !completingDotExpression)
            {
                AddVBNetKeywords(data, (BitArray)expressionResult.Tag);
                addedKeywords = true;
            }

            CodeCompletionItemProvider.ConvertCompletionData(result, data, expressionResult.Context);

            if (addedKeywords && result.Items.Any())
            {
                AddTemplates(editor, result);
            }

            string word = editor.GetWordBeforeCaret().Trim();

            IClass  c = GetCurrentClass(editor);
            IMember m = GetCurrentMember(editor);

            HandleKeyword(ref result, resolvedType, word, c, m, editor, pressedKey);

            AddSpecialItems(ref result, info, resolvedType, m, expressionResult, editor);

            char prevChar;

            if (pressedKey == '\0')               // ctrl+space
            {
                prevChar = editor.Caret.Offset > 0 ? editor.Document.GetCharAt(editor.Caret.Offset - 1) : '\0';
                word     = char.IsLetterOrDigit(prevChar) || prevChar == '_' ? editor.GetWordBeforeCaret() : "";

                if (!string.IsNullOrWhiteSpace(word))
                {
                    result.PreselectionLength = word.Length;
                }
            }

            prevChar = editor.Caret.Offset > 0 ? editor.Document.GetCharAt(editor.Caret.Offset - 1) : '\0';

            if (prevChar == '_')
            {
                result.PreselectionLength++;
            }

            result.SortItems();

            return(result);
        }