public async Task <CodeCompletionResults> CodeCompleteAtAsync(ISourceFile sourceFile, int index, int line, int column, List <UnsavedFile> unsavedFiles, char previousChar, string filter)
        {
            var result = new CodeCompletionResults();

            var dataAssociation = GetAssociatedData(sourceFile);

            var response = await dataAssociation.Solution.Server.AutoComplete(sourceFile.FilePath, unsavedFiles.FirstOrDefault()?.Contents, line, column);

            if (response != null)
            {
                foreach (var completion in response)
                {
                    var newCompletion = new CodeCompletionData()
                    {
                        Suggestion   = completion.CompletionText,
                        Priority     = 1,
                        Hint         = completion.DisplayText,
                        BriefComment = completion.Description?.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(),
                        Kind         = FromOmniSharpKind(completion.Kind)
                    };

                    if (filter == string.Empty || completion.CompletionText.StartsWith(filter))
                    {
                        result.Completions.Add(newCompletion);
                    }
                }

                result.Contexts = CompletionContext.AnyType;
            }

            return(result);
        }
        public override async Task <CodeCompletionResults> CodeCompleteAtAsync(IEditor editor, int index, int line, int column, List <UnsavedFile> unsavedFiles, char lastChar, string filter = "")
        {
            var results = new CodeCompletionResults();

            string text = string.Empty;

            await Dispatcher.UIThread.InvokeAsync(() =>
            {
                text = editor.Document.Text;
            });

            var completionSet = engine.GetCompletions(metaData, text, index);

            if (completionSet != null)
            {
                foreach (var completion in completionSet.Completions)
                {
                    results.Completions.Add(new CodeCompletionData(completion.DisplayText, completion.InsertText, completion.RecommendedCursorOffset)
                    {
                        BriefComment = completion.Description,
                        Kind         = FromAvaloniaCompletionKind(completion.Kind),
                        RecommendImmediateSuggestions = completion.InsertText.Contains("=") || completion.InsertText.EndsWith('.')
                    });
                }
            }

            results.Contexts = CompletionContext.AnyType;

            return(await Task.FromResult(results));
        }
        public void SetCursor(int index, int line, int column, List <UnsavedFile> unsavedFiles)
        {
            if (!intellisenseControl.IsVisible)
            {
                _requestingData = true;
                intellisenseQueryRunner.InvokeAsync(() =>
                {
                    CodeCompletionResults result = null;
                    intellisenseJobRunner.InvokeAsync(() =>
                    {
                        var task = languageService.CodeCompleteAtAsync(file, index, line, column, unsavedFiles);
                        task.Wait();

                        result = task.Result;
                    }).Wait();

                    Dispatcher.UIThread.InvokeAsync(() =>
                    {
                        SetCompletionData(result);

                        _requestingData = false;

                        UpdateFilter(editor.CaretOffset, false);

                        intellisenseControl.IsVisible = !_hidden;
                    });
                });
            }
        }
Exemple #4
0
        private void SetCompletionData(CodeCompletionResults completionData)
        {
            if (_shell.DebugMode)
            {
                _console.WriteLine(completionData.Contexts.ToString());
            }

            if (!completionData.Contexts.HasFlag(CompletionContext.NaturalLanguage) && (completionData.Contexts != CompletionContext.Unexposed || completionData.Contexts == CompletionContext.Unknown))
            {
                if (IncludeSnippets && !(completionData.Contexts.HasFlag(CompletionContext.ArrowMemberAccess) || completionData.Contexts.HasFlag(CompletionContext.DotMemberAccess)))
                {
                    InsertSnippets(completionData.Completions);
                }

                foreach (var result in completionData.Completions)
                {
                    CompletionDataViewModel currentCompletion = null;

                    currentCompletion = unfilteredCompletions.BinarySearch(c => c.Title, result.Suggestion);

                    if (currentCompletion == null)
                    {
                        unfilteredCompletions.Add(new CompletionDataViewModel(result));
                    }
                    else
                    {
                        currentCompletion.Overloads++;
                    }
                }
            }
        }
Exemple #5
0
        public async Task <CodeCompletionResults> DoCompletionRequestAsync(int index, int line, int column)
        {
            CodeCompletionResults results = null;

            var completions = await LanguageService.CodeCompleteAtAsync(ProjectFile, index, line, column, UnsavedFiles.ToList());

            results = completions;

            return(results);
        }
        private void SetCompletionData(CodeCompletionResults completionData)
        {
            if (_studio.DebugMode)
            {
                _console.WriteLine(completionData.Contexts.ToString());
            }

            if (completionData.StartOffset.HasValue)
            {
                _recommendedInsertionOffset = completionData.StartOffset;
            }
            else
            {
                _recommendedInsertionOffset = null;
            }

            if (!completionData.Contexts.HasFlag(CompletionContext.NaturalLanguage) && (completionData.Contexts != CompletionContext.Unexposed || completionData.Contexts == CompletionContext.Unknown))
            {
                if (IncludeSnippets && !(completionData.Contexts.HasFlag(CompletionContext.ArrowMemberAccess) || completionData.Contexts.HasFlag(CompletionContext.DotMemberAccess)))
                {
                    InsertSnippets(completionData.Completions);
                }

                recommendedCompletion = null;

                foreach (var result in completionData.Completions)
                {
                    CompletionDataViewModel currentCompletion = null;

                    currentCompletion = unfilteredCompletions.BinarySearch(c => c.FilterText, result.FilterText);

                    if (currentCompletion == null)
                    {
                        currentCompletion = new CompletionDataViewModel(result);
                        unfilteredCompletions.Add(currentCompletion);
                    }
                    else
                    {
                        currentCompletion.Overloads++;
                    }

                    if (result.SelectionBehavior != CompletionItemSelectionBehavior.Default)
                    {
                        if (recommendedCompletion == null || (recommendedCompletion != null && result.Priority > recommendedCompletion.Priority))
                        {
                            recommendedCompletion = currentCompletion;
                        }
                    }
                }
            }
        }
        private void SetCompletionData(CodeCompletionResults completionData)
        {
            unfilteredCompletions.Clear();

            foreach (var result in completionData.Completions)
            {
                CompletionDataViewModel currentCompletion = null;

                currentCompletion = unfilteredCompletions.BinarySearch(c => c.Title, result.Suggestion);

                if (currentCompletion == null)
                {
                    unfilteredCompletions.Add(CompletionDataViewModel.Create(result));
                }
                else
                {
                    currentCompletion.Overloads++;
                }
            }
        }
        public async Task <CodeCompletionResults> CodeCompleteAtAsync(ISourceFile file, int index, int line, int column,
                                                                      List <UnsavedFile> unsavedFiles, char lastChar, string filter)
        {
            var clangUnsavedFiles = new List <ClangUnsavedFile>();

            foreach (var unsavedFile in unsavedFiles)
            {
                clangUnsavedFiles.Add(new ClangUnsavedFile(unsavedFile.FileName, unsavedFile.Contents));
            }

            var result = new CodeCompletionResults();

            await clangAccessJobRunner.InvokeAsync(() =>
            {
                var translationUnit = GetAndParseTranslationUnit(file, clangUnsavedFiles);

                if (translationUnit != null)
                {
                    var completionResults = translationUnit.CodeCompleteAt(file.Location, line, column, clangUnsavedFiles.ToArray(),
                                                                           CodeCompleteFlags.IncludeBriefComments | CodeCompleteFlags.IncludeMacros | CodeCompleteFlags.IncludeCodePatterns);
                    completionResults.Sort();

                    result.Contexts = (CompletionContext)completionResults.Contexts;

                    if (result.Contexts == CompletionContext.Unexposed && lastChar == ':')
                    {
                        result.Contexts = CompletionContext.AnyType; // special case Class::<- here static class member access.
                    }

                    foreach (var codeCompletion in completionResults.Results)
                    {
                        var typedText = string.Empty;

                        var hint = string.Empty;

                        if (codeCompletion.CompletionString.Availability == AvailabilityKind.Available || codeCompletion.CompletionString.Availability == AvailabilityKind.Deprecated)
                        {
                            foreach (var chunk in codeCompletion.CompletionString.Chunks)
                            {
                                if (chunk.Kind == CompletionChunkKind.TypedText)
                                {
                                    typedText = chunk.Text;
                                }

                                hint += chunk.Text;

                                switch (chunk.Kind)
                                {
                                case CompletionChunkKind.LeftParen:
                                case CompletionChunkKind.LeftAngle:
                                case CompletionChunkKind.LeftBrace:
                                case CompletionChunkKind.LeftBracket:
                                case CompletionChunkKind.RightAngle:
                                case CompletionChunkKind.RightBrace:
                                case CompletionChunkKind.RightBracket:
                                case CompletionChunkKind.RightParen:
                                case CompletionChunkKind.Placeholder:
                                case CompletionChunkKind.Comma:
                                    break;

                                default:
                                    hint += " ";
                                    break;
                                }
                            }

                            if (filter == string.Empty || typedText.StartsWith(filter))
                            {
                                var completion = new CodeCompletionData
                                {
                                    Suggestion   = typedText,
                                    Priority     = codeCompletion.CompletionString.Priority,
                                    Kind         = FromClangKind(codeCompletion.CursorKind),
                                    Hint         = hint,
                                    BriefComment = codeCompletion.CompletionString.BriefComment
                                };

                                result.Completions.Add(completion);

                                if (completion.Kind == CodeCompletionKind.OverloadCandidate)
                                {
                                    Console.WriteLine("TODO Implement overload candidate.");
                                }
                            }
                        }
                    }

                    completionResults.Dispose();
                }
            });

            return(result);
        }
Exemple #9
0
        public async Task <CodeCompletionResults> CodeCompleteAtAsync(ISourceFile file, int index, int line, int column,
                                                                      List <UnsavedFile> unsavedFiles, string filter)
        {
            var clangUnsavedFiles = new List <ClangUnsavedFile>();

            foreach (var unsavedFile in unsavedFiles)
            {
                clangUnsavedFiles.Add(new ClangUnsavedFile(unsavedFile.FileName, unsavedFile.Contents));
            }

            var result = new CodeCompletionResults();

            await clangAccessJobRunner.InvokeAsync(() =>
            {
                var translationUnit = GetAndParseTranslationUnit(file, clangUnsavedFiles);

                var completionResults = translationUnit.CodeCompleteAt(file.Location, line, column, clangUnsavedFiles.ToArray(),
                                                                       CodeCompleteFlags.IncludeBriefComments | CodeCompleteFlags.IncludeMacros | CodeCompleteFlags.IncludeCodePatterns);
                completionResults.Sort();

                result.Contexts = (CompletionContext)completionResults.Contexts;

                foreach (var codeCompletion in completionResults.Results)
                {
                    var typedText = string.Empty;

                    var hint = string.Empty;

                    foreach (var chunk in codeCompletion.CompletionString.Chunks)
                    {
                        if (chunk.Kind == CompletionChunkKind.TypedText)
                        {
                            typedText = chunk.Text;
                        }

                        hint += chunk.Text;

                        switch (chunk.Kind)
                        {
                        case CompletionChunkKind.LeftParen:
                        case CompletionChunkKind.LeftAngle:
                        case CompletionChunkKind.LeftBrace:
                        case CompletionChunkKind.LeftBracket:
                        case CompletionChunkKind.RightAngle:
                        case CompletionChunkKind.RightBrace:
                        case CompletionChunkKind.RightBracket:
                        case CompletionChunkKind.RightParen:
                        case CompletionChunkKind.Placeholder:
                        case CompletionChunkKind.Comma:
                            break;

                        default:
                            hint += " ";
                            break;
                        }
                    }

                    if (filter == string.Empty || typedText.StartsWith(filter))
                    {
                        result.Completions.Add(new CodeCompletionData
                        {
                            Suggestion   = typedText,
                            Priority     = codeCompletion.CompletionString.Priority,
                            Kind         = FromClangKind(codeCompletion.CursorKind),
                            Hint         = hint,
                            BriefComment = codeCompletion.CompletionString.BriefComment
                        });
                    }
                }

                completionResults.Dispose();
            });

            return(result);
        }
        public async Task <CodeCompletionResults> CodeCompleteAtAsync(int index, int line, int column, IEnumerable <UnsavedFile> unsavedFiles, char previousChar, string filter)
        {
            if (_editor.SourceFile is MetaDataFile)
            {
                return(null);
            }

            var result = new CodeCompletionResults();

            var dataAssociation = GetAssociatedData(_editor);

            var workspace     = RoslynWorkspace.GetWorkspace(dataAssociation.Solution);
            var document      = workspace.GetDocument(_editor.SourceFile);
            var semanticModel = await document.GetSemanticModelAsync();

            var completionService = CompletionService.GetService(document);
            var data = await completionService.GetCompletionsAsync(document, index);

            if (data != null)
            {
                var recommendedSymbols = await Microsoft.CodeAnalysis.Recommendations.Recommender.GetRecommendedSymbolsAtPositionAsync(semanticModel, index, workspace);

                foreach (var completion in data.Items)
                {
                    var insertionText = completion.DisplayText;

                    if (completion.Properties.ContainsKey("InsertionText"))
                    {
                        insertionText = completion.Properties["InsertionText"];
                    }

                    var selectionBehavior = Languages.CompletionItemSelectionBehavior.Default;
                    int priority          = 0;

                    if (completion.Rules.SelectionBehavior != Microsoft.CodeAnalysis.Completion.CompletionItemSelectionBehavior.Default)
                    {
                        selectionBehavior = (Languages.CompletionItemSelectionBehavior)completion.Rules.SelectionBehavior;
                        priority          = completion.Rules.MatchPriority;
                    }

                    if (completion.Properties.ContainsKey("Provider") && completion.Properties["Provider"] == "Microsoft.CodeAnalysis.CSharp.Completion.Providers.SymbolCompletionProvider")
                    {
                        var symbols = recommendedSymbols.Where(x => x.Name == completion.Properties["SymbolName"] && (int)x.Kind == int.Parse(completion.Properties["SymbolKind"])).Distinct();

                        if (symbols != null && symbols.Any())
                        {
                            foreach (var symbol in symbols)
                            {
                                if (symbol != null)
                                {
                                    var newCompletion = new CodeCompletionData(symbol.Name, completion.FilterText, insertionText, null, selectionBehavior, priority);

                                    if (completion.Properties.ContainsKey("SymbolKind"))
                                    {
                                        newCompletion.Kind = FromOmniSharpKind(completion.Properties["SymbolKind"]);
                                    }

                                    var xmlDocumentation = symbol.GetDocumentationCommentXml();

                                    if (xmlDocumentation != string.Empty)
                                    {
                                        var docComment = DocumentationComment.From(xmlDocumentation, Environment.NewLine);
                                        newCompletion.BriefComment = docComment.SummaryText;
                                    }

                                    result.Completions.Add(newCompletion);
                                }
                            }
                        }
                    }
                    else
                    {
                        var newCompletion = new CodeCompletionData(completion.DisplayText, completion.FilterText, insertionText, null, selectionBehavior, priority);

                        if (completion.Properties.ContainsKey("SymbolKind"))
                        {
                            newCompletion.Kind = FromOmniSharpKind(completion.Properties["SymbolKind"]);
                        }

                        result.Completions.Add(newCompletion);
                    }
                }

                result.Contexts = Languages.CompletionContext.AnyType;
            }

            return(result);
        }
        public void SetCursor(int index, int line, int column, List <UnsavedFile> unsavedFiles, bool canUpdateSignature = true)
        {
            if (_lastIndex != index)
            {
                _lastIndex = index;

                if (canUpdateSignature)
                {
                    UpdateActiveParameterAndVisibility();
                }

                if (!intellisenseControl.IsVisible)
                {
                    unfilteredCompletions.Clear();

                    if (_shell.DebugMode)
                    {
                        _console.WriteLine("Set Cursor");
                    }

                    _requestingData = true;

                    char previousChar = '\0';

                    if (index >= 1)
                    {
                        previousChar = editor.Document.GetCharAt(index - 1);
                    }

                    intellisenseQueryRunner.InvokeAsync(() =>
                    {
                        CodeCompletionResults result = null;
                        intellisenseJobRunner.InvokeAsync(() =>
                        {
                            if (_shell.DebugMode)
                            {
                                _console.WriteLine($"Query Language Service {index}, {line}, {column}");
                            }

                            var task = languageService.CodeCompleteAtAsync(editor, index, line, column, unsavedFiles, previousChar);
                            task.Wait();

                            result = task.Result;
                        }).Wait();

                        if (result != null)
                        {
                            Dispatcher.UIThread.InvokeAsync(() =>
                            {
                                if (_shell.DebugMode)
                                {
                                    _console.WriteLine($"Set Completion Data {_hidden}");
                                }

                                SetCompletionData(result);

                                _requestingData = false;

                                if (unfilteredCompletions.Count > 0)
                                {
                                    UpdateFilter(editor.CaretOffset, false);
                                    intellisenseControl.IsVisible = !_hidden;
                                }
                                else
                                {
                                    _hidden = true;
                                }
                            });
                        }
                    });
                }
                else
                {
                    UpdateFilter(editor.CaretOffset, false);
                }
            }
        }
        public async Task<CodeCompletionResults> DoCompletionRequestAsync(int line, int column)
        {
            CodeCompletionResults results = null;

            var completions = await LanguageService.CodeCompleteAtAsync(ProjectFile, line, column, UnsavedFiles.ToList());
            results = new CodeCompletionResults { Completions = completions };

            return results;
        }