示例#1
0
        protected async Task <IEnumerable <AutoCompleteResponse> > FindCompletionsAsync(string filename, string source, bool wantSnippet = false)
        {
            var testFile = new TestFile(filename, source);

            using (var host = CreateOmniSharpHost(testFile))
            {
                var point = testFile.Content.GetPointFromPosition();

                var request = new AutoCompleteRequest
                {
                    Line             = point.Line,
                    Column           = point.Offset,
                    FileName         = testFile.FileName,
                    Buffer           = testFile.Content.Code,
                    WordToComplete   = GetPartialWord(testFile.Content),
                    WantMethodHeader = true,
                    WantSnippet      = wantSnippet,
                    WantReturnType   = true
                };

                var requestHandler = GetRequestHandler(host);

                return(await requestHandler.Handle(request));
            }
        }
        private IEnumerable <AutoCompleteResponse> MakeSnippetedResponses(AutoCompleteRequest request, ISymbol symbol)
        {
            var completions  = new List <AutoCompleteResponse>();
            var methodSymbol = symbol as IMethodSymbol;

            if (methodSymbol != null)
            {
                if (methodSymbol.Parameters.Any(p => p.IsOptional))
                {
                    completions.Add(MakeAutoCompleteResponse(request, symbol, false));
                }
                completions.Add(MakeAutoCompleteResponse(request, symbol));
                return(completions);
            }
            var typeSymbol = symbol as INamedTypeSymbol;

            if (typeSymbol != null)
            {
                completions.Add(MakeAutoCompleteResponse(request, symbol));
                foreach (var ctor in typeSymbol.InstanceConstructors)
                {
                    completions.Add(MakeAutoCompleteResponse(request, ctor));
                }
                return(completions);
            }
            return(new[] { MakeAutoCompleteResponse(request, symbol) });
        }
示例#3
0
        public IEnumerable <CompletionData> GetCompletions(string editorText, bool includeImportableTypes)
        {
            int cursorOffset = editorText.IndexOf("$", StringComparison.Ordinal);

            if (cursorOffset == -1)
            {
                throw new ArgumentException("Editor text should contain a $");
            }

            TextLocation cursorPosition = TestHelpers.GetLineAndColumnFromIndex(editorText, cursorOffset);
            string       partialWord    = GetPartialWord(editorText);

            editorText = editorText.Replace("$", "");

            var project = new FakeProject();

            project.AddFile(editorText);
            _solution.Projects.Add(project);
            var provider = new AutoCompleteHandler(_solution, new BufferParser(_solution), new Logger(Verbosity.Quiet), new OmniSharpConfiguration());
            var request  = new AutoCompleteRequest
            {
                FileName       = "myfile",
                WordToComplete = partialWord,
                Buffer         = editorText,
                Line           = cursorPosition.Line,
                Column         = cursorPosition.Column,
                WantDocumentationForEveryCompletionResult = false,
                WantImportableTypes = includeImportableTypes,
                WantMethodHeader    = true,
                WantReturnType      = true,
                WantSnippet         = true
            };

            return(provider.CreateProvider(request));
        }
示例#4
0
        public IEnumerable <ICompletionData> GetCompletions(string editorText)
        {
            int cursorOffset = editorText.IndexOf("$", StringComparison.Ordinal);

            if (cursorOffset == -1)
            {
                throw new ArgumentException("Editor text should contain a $");
            }

            TextLocation cursorPosition = TestHelpers.GetLineAndColumnFromIndex(editorText, cursorOffset);
            string       partialWord    = GetPartialWord(editorText);

            editorText = editorText.Replace("$", "");

            var project = new FakeProject();

            project.AddFile(editorText);
            _solution.Projects.Add(project);
            var provider = new AutoCompleteHandler(new BufferParser(_solution), new Logger());
            var request  = new AutoCompleteRequest
            {
                FileName       = "myfile",
                WordToComplete = partialWord,
                Buffer         = editorText,
                Line           = cursorPosition.Line,
                Column         = cursorPosition.Column,
            };

            return(provider.CreateProvider(request));
        }
示例#5
0
        public async override Task <CompletionList> Handle(CompletionParams request, CancellationToken token)
        {
            var omnisharpRequest = new AutoCompleteRequest()
            {
                FileName = Helpers.FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line),
                WantKind = true,
                WantDocumentationForEveryCompletionResult = true,
                WantReturnType = true,
                WantSnippet    = Capability.CompletionItem?.SnippetSupport ?? false
            };

            var omnisharpResponse = await _autoCompleteHandler.Handle(omnisharpRequest);

            var completions = new Dictionary <string, List <CompletionItem> >();

            foreach (var response in omnisharpResponse)
            {
                var isSnippet  = !string.IsNullOrEmpty(response.Snippet);
                var text       = isSnippet ? response.Snippet : response.CompletionText;
                var textFormat = isSnippet ? InsertTextFormat.Snippet : InsertTextFormat.PlainText;

                var completionItem = new CompletionItem
                {
                    Label  = response.CompletionText,
                    Detail = !string.IsNullOrEmpty(response.ReturnType) ?
                             response.DisplayText :
                             $"{response.ReturnType} {response.DisplayText}",
                    Documentation    = response.Description,
                    Kind             = GetCompletionItemKind(response.Kind),
                    InsertText       = text,
                    InsertTextFormat = textFormat,
                };

                if (!completions.ContainsKey(completionItem.Label))
                {
                    completions[completionItem.Label] = new List <CompletionItem>();
                }
                completions[completionItem.Label].Add(completionItem);
            }

            var result = new List <CompletionItem>();

            foreach (var key in completions.Keys)
            {
                var suggestion    = completions[key][0];
                var overloadCount = completions[key].Count - 1;

                if (overloadCount > 0)
                {
                    // indicate that there is more
                    suggestion.Detail = $"{suggestion.Detail} (+ {overloadCount} overload(s))";
                }

                result.Add(suggestion);
            }

            return(new CompletionList(result));
        }
        public static IEnumerable <string> GetSelectedIds(this AutoCompleteRequest request)
        {
            if (request.HasSelectedIds())
            {
                return(request.SelectedIds);
            }

            return(new List <string>());
        }
        private IEnumerable <AutoCompleteResponse> MakeSnippetedResponses(AutoCompleteRequest request, IMethodSymbol methodSymbol, string completionText, bool preselect, bool isSuggestionMode)
        {
            var completions = new List <AutoCompleteResponse>();

            if (methodSymbol.Parameters.Any(p => p.IsOptional))
            {
                completions.Add(MakeAutoCompleteResponse(request, methodSymbol, completionText, preselect, isSuggestionMode, includeOptionalParams: false));
            }

            completions.Add(MakeAutoCompleteResponse(request, methodSymbol, completionText, preselect, isSuggestionMode));

            return(completions);
        }
        private IEnumerable <AutoCompleteResponse> MakeSnippetedResponses(AutoCompleteRequest request, ISymbol symbol, string completionText, bool preselect, bool isSuggestionMode)
        {
            switch (symbol)
            {
            case IMethodSymbol methodSymbol:
                return(MakeSnippetedResponses(request, methodSymbol, completionText, preselect, isSuggestionMode));

            case INamedTypeSymbol typeSymbol:
                return(MakeSnippetedResponses(request, typeSymbol, completionText, preselect, isSuggestionMode));

            default:
                return(new[] { MakeAutoCompleteResponse(request, symbol, completionText, preselect, isSuggestionMode) });
            }
        }
        private AutoCompleteResponse MakeAutoCompleteResponse(AutoCompleteRequest request, ISymbol symbol, string completionText, bool preselect, bool isSuggestionMode, bool includeOptionalParams = true)
        {
            var displayNameGenerator = new SnippetGenerator();

            displayNameGenerator.IncludeMarkers            = false;
            displayNameGenerator.IncludeOptionalParameters = includeOptionalParams;

            var response = new AutoCompleteResponse();

            response.CompletionText = completionText;

            // TODO: Do something more intelligent here
            response.DisplayText = displayNameGenerator.Generate(symbol);

            response.IsSuggestionMode = isSuggestionMode;

            if (request.WantDocumentationForEveryCompletionResult)
            {
                response.Description = DocumentationConverter.ConvertDocumentation(symbol.GetDocumentationCommentXml(), _formattingOptions.NewLine);
            }

            if (request.WantReturnType)
            {
                response.ReturnType = ReturnTypeFormatter.GetReturnType(symbol);
            }

            if (request.WantKind)
            {
                response.Kind = symbol.GetKind();
            }

            if (request.WantSnippet)
            {
                var snippetGenerator = new SnippetGenerator();
                snippetGenerator.IncludeMarkers            = true;
                snippetGenerator.IncludeOptionalParameters = includeOptionalParams;
                response.Snippet = snippetGenerator.Generate(symbol);
            }

            if (request.WantMethodHeader)
            {
                response.MethodHeader = displayNameGenerator.Generate(symbol);
            }

            response.Preselect = preselect;

            return(response);
        }
        public async Task <IEnumerable <AutoCompleteResponse> > Handle(AutoCompleteRequest request)
        {
            var documents      = _workspace.GetDocuments(request.FileName);
            var wordToComplete = request.WordToComplete;
            var completions    = new HashSet <AutoCompleteResponse>();

            foreach (var document in documents)
            {
                var sourceText = await document.GetTextAsync();

                var position = sourceText.GetTextPosition(request);
                var service  = CompletionService.GetService(document);
                var options  = new OmniSharpCompletionOptions(
                    ShowItemsFromUnimportedNamespaces: _omniSharpOptions.RoslynExtensionsOptions.EnableImportCompletion,
                    ForceExpandedCompletionIndexCreation: false);
                var completionList = await OmniSharpCompletionService.GetCompletionsAsync(service, document, position, trigger : default, roles : null, options, CancellationToken.None);
        public override Task <AutoCompleteReply> AutoComplete(AutoCompleteRequest request, ServerCallContext context)
        {
            var reply = new AutoCompleteReply();

            if (!string.IsNullOrEmpty(request.SearchQuery))
            {
                var productMatches = _products
                                     .Where(p => p.Name.StartsWith(request.SearchQuery, StringComparison.CurrentCultureIgnoreCase))
                                     .Select(p => new AutoCompleteItem {
                    EAN = p.EAN, Name = p.Name
                })
                                     .Take(10);
                reply.Items.AddRange(productMatches);
            }
            return(Task.FromResult(reply));
        }
        public object Any(AutoCompleteRequest request)
        {
            var multiResult = Client().MultiSearch(ms => ms
                .Search<AutoComplete>("Artist",
                    i =>
                        i.Index("autocomplete")
                            .Type("autocomplete")
                            .Skip((request.Offset) * request.Limit)
                            .Take(request.Limit)
                            .Query(
                                q =>
                                    q.Filtered(
                                        x => x.Query(f => f.Match(m => m.OnField(a => a.ObjectType).Query("Artist"))
                                                          &&
                                                          f.Match(m1 => m1.OnField(m2 => m2.Name).Query(request.Query))))))
                .Search<AutoComplete>("Song",
                    i =>
                        i.Index("autocomplete")
                            .Type("autocomplete")
                            .Skip((request.Offset) * request.Limit)
                            .Take(request.Limit)
                            .Query(
                                q =>
                                    q.Filtered(
                                        x => x.Query(f => f.Match(m => m.OnField(a => a.ObjectType).Query("Song"))
                                                          &&
                                                          f.Match(m1 => m1.OnField(m2 => m2.Name).Query(request.Query))))))
                .Search<AutoComplete>("Album",
                    i =>
                        i.Index("autocomplete")
                            .Type("autocomplete")
                            .Skip((request.Offset) * request.Limit)
                            .Take(request.Limit)
                            .Query(
                                q =>
                                    q.Filtered(
                                        x => x.Query(f => f.Match(m => m.OnField(a => a.ObjectType).Query("Album"))
                                                          &&
                                                          f.Match(m1 => m1.OnField(m2 => m2.Name).Query(request.Query)))))));

            return new
            {
                artists = multiResult.GetResponse<AutoComplete>("Artist").Documents.Distinct(),
                songs = multiResult.GetResponse<AutoComplete>("Song").Documents.Distinct(),
                albums = multiResult.GetResponse<AutoComplete>("Album").Documents.Distinct()
            };
        }
        private IEnumerable <AutoCompleteResponse> MakeSnippetedResponses(AutoCompleteRequest request, INamedTypeSymbol typeSymbol, string completionText, bool preselect, bool isSuggestionMode)
        {
            var completions = new List <AutoCompleteResponse>
            {
                MakeAutoCompleteResponse(request, typeSymbol, completionText, preselect, isSuggestionMode)
            };

            if (typeSymbol.TypeKind != TypeKind.Enum)
            {
                foreach (var ctor in typeSymbol.InstanceConstructors)
                {
                    completions.Add(MakeAutoCompleteResponse(request, ctor, completionText, preselect, isSuggestionMode));
                }
            }

            return(completions);
        }
        public async Task <IActionResult> AutoComplete([FromBody] AutoCompleteRequest request)
        {
            _workspace.EnsureBufferUpdated(request);

            var completions = new List <AutoCompleteResponse>();

            var documents = _workspace.GetDocuments(request.FileName);

            foreach (var document in documents)
            {
                var sourceText = await document.GetTextAsync();

                var position = sourceText.Lines.GetPosition(new LinePosition(request.Line - 1, request.Column - 1));
                var model    = await document.GetSemanticModelAsync();

                var symbols        = Recommender.GetRecommendedSymbolsAtPosition(model, position, _workspace);
                var context        = CSharpSyntaxContext.CreateContext(_workspace, model, position);
                var keywordHandler = new KeywordContextHandler();
                var keywords       = keywordHandler.Get(context, model, position);

                foreach (var keyword in keywords)
                {
                    completions.Add(new AutoCompleteResponse
                    {
                        CompletionText = keyword,
                        DisplayText    = keyword,
                        Snippet        = keyword
                    });
                }

                foreach (var symbol in symbols.Where(s => s.Name.StartsWith(request.WordToComplete, StringComparison.OrdinalIgnoreCase)))
                {
                    if (request.WantSnippet)
                    {
                        completions.AddRange(MakeSnippetedResponses(request, symbol));
                    }
                    else
                    {
                        completions.Add(MakeAutoCompleteResponse(request, symbol));
                    }
                }
            }

            return(new ObjectResult(completions));
        }
示例#15
0
        public async Task <CollectionResult <IdTextPair> > GetArtistListAsync([FromQuery] AutoCompleteRequest request)
        {
            await Task.CompletedTask;

            var query = _unitOfWork.Repository <ArtistBson>()
                        .Select(x => new IdTextPair
            {
                Id   = x.Id.ToString(),
                Text = x.Name
            });

            if (request?.SelectedIds != null && request.SelectedIds.Any())
            {
                return(query.Where(x => request.SelectedIds.Contains(x.Id)).ToCollectionResult());
            }

            return(query.ToCollectionResult(request));
        }
示例#16
0
            public object Any(AutoCompleteRequest request)
            {
                try
                {
                    var sb = new StringBuilder("autocomplete args: ");
                    sb.AppendFormat(" [UserId:{0}]", request.UserId);
                    sb.AppendFormat(" [ProjectId:{0}]", request.ProjectId);
                    sb.AppendFormat(" [FileId:{0}]", request.FileId);
                    sb.AppendFormat(" [Line:{0}]", request.Line);
                    sb.AppendFormat(" [Column:{0}]", request.Column);
                    log.Info(sb.ToString());

                    var fileRequest = new FileOperationRequest()
                    {
                        UserId = request.UserId,
                        ProjectId = request.ProjectId,
                        FileId = request.FileId,
                        CompleteCode = new FileCodeCompletionRequest()
                        {
                            AutoComplete = true,
                            LineNumber = request.Line,
                            ColumnNumber = request.Column,
                            CtrlSpace = true  // always true for now
                        },
                        Parse = new FileParseRequest()
                    };

                    FileOperationResponse response = AutocompleteServiceUtil.DoAutoComplete(fileRequest);

                    return response;
                }
                catch (Exception ex)
                {
                    log.Error(ex.ToString(), ex);
                    
                    return new ApiError()
                    {
                        FullName = ex.GetType().FullName,
                        Message = ex.Message,
                        StackTrace = ex.StackTrace
                    };
                }
            }
示例#17
0
            public object Any(AutoCompleteRequest request)
            {
                try
                {
                    var sb = new StringBuilder("autocomplete args: ");
                    sb.AppendFormat(" [UserId:{0}]", request.UserId);
                    sb.AppendFormat(" [ProjectId:{0}]", request.ProjectId);
                    sb.AppendFormat(" [FileId:{0}]", request.FileId);
                    sb.AppendFormat(" [Line:{0}]", request.Line);
                    sb.AppendFormat(" [Column:{0}]", request.Column);
                    log.Info(sb.ToString());

                    var fileRequest = new FileOperationRequest()
                    {
                        UserId       = request.UserId,
                        ProjectId    = request.ProjectId,
                        FileId       = request.FileId,
                        CompleteCode = new FileCodeCompletionRequest()
                        {
                            AutoComplete = true,
                            LineNumber   = request.Line,
                            ColumnNumber = request.Column,
                            CtrlSpace    = true // always true for now
                        },
                        Parse = new FileParseRequest()
                    };

                    FileOperationResponse response = AutocompleteServiceUtil.DoAutoComplete(fileRequest);

                    return(response);
                }
                catch (Exception ex)
                {
                    log.Error(ex.ToString(), ex);

                    return(new ApiError()
                    {
                        FullName = ex.GetType().FullName,
                        Message = ex.Message,
                        StackTrace = ex.StackTrace
                    });
                }
            }
        public static bool HasSelectedIds(this AutoCompleteRequest request)
        {
            if (request == null)
            {
                return(false);
            }

            if (request.SelectedIds == null)
            {
                return(false);
            }

            if (request.SelectedIds.Any())
            {
                return(true);
            }

            return(false);
        }
示例#19
0
        public IActionResult Tags(AutoCompleteRequest request)
        {
            var items = new List <IdTextPair>
            {
                new IdTextPair
                {
                    Id   = "1",
                    Text = "Brand New"
                },

                new IdTextPair
                {
                    Id   = "2",
                    Text = "Millennium"
                },
            };

            return(Json(items.ToCollectionResult(request)));
        }
示例#20
0
        protected async Task UpdateAutoComplete(ChangeEventArgs eventArgs)
        {
            searchText = (string)eventArgs.Value;
            var matchingItem = autoCompleteItems.FirstOrDefault(p => p.Name == searchText);

            if (matchingItem != null)
            {
                searchText = matchingItem.EAN;
                await AddItem();
            }
            else
            {
                var request = new AutoCompleteRequest {
                    SearchQuery = searchText
                };
                var reply = await InventoryClient.AutoCompleteAsync(request);

                autoCompleteItems = reply.Items.ToList();
            }
        }
示例#21
0
        public async Task <IEnumerable <AutoCompleteResponse> > Handle(AutoCompleteRequest request)
        {
            var documents      = _workspace.GetDocuments(request.FileName);
            var wordToComplete = request.WordToComplete;
            var completions    = new HashSet <AutoCompleteResponse>();

            foreach (var document in documents)
            {
                var sourceText = await document.GetTextAsync();

                var position = sourceText.Lines.GetPosition(new LinePosition(request.Line - 1, request.Column - 1));
                var model    = await document.GetSemanticModelAsync();

                AddKeywords(completions, model, position, request.WantKind, wordToComplete);

                var symbols = Recommender.GetRecommendedSymbolsAtPosition(model, position, _workspace);

                foreach (var symbol in symbols.Where(s => s.Name.IsValidCompletionFor(wordToComplete)))
                {
                    if (request.WantSnippet)
                    {
                        foreach (var completion in MakeSnippetedResponses(request, symbol))
                        {
                            completions.Add(completion);
                        }
                    }
                    else
                    {
                        completions.Add(MakeAutoCompleteResponse(request, symbol));
                    }
                }
            }

            return(completions
                   .OrderByDescending(c => c.CompletionText.IsValidCompletionStartsWithExactCase(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsValidCompletionStartsWithIgnoreCase(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsCamelCaseMatch(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsSubsequenceMatch(wordToComplete))
                   .ThenBy(c => c.CompletionText));
        }
        private AutoCompleteResponse MakeAutoCompleteResponse(AutoCompleteRequest request, ISymbol symbol, bool includeOptionalParams = true)
        {
            var response = new AutoCompleteResponse();

            response.CompletionText = symbol.Name;

            // TODO: Do something more intelligent here
            response.DisplayText = symbol.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat);

            if (request.WantDocumentationForEveryCompletionResult)
            {
                response.Description = symbol.GetDocumentationCommentXml();
            }

            if (request.WantReturnType)
            {
                response.ReturnType = ReturnTypeFormatter.GetReturnType(symbol);
            }

            if (request.WantSnippet)
            {
                var snippetGenerator = new SnippetGenerator();
                snippetGenerator.IncludeMarkers            = true;
                snippetGenerator.IncludeOptionalParameters = includeOptionalParams;
                response.Snippet = snippetGenerator.GenerateSnippet(symbol);
            }

            if (request.WantMethodHeader)
            {
                var snippetGenerator = new SnippetGenerator();
                snippetGenerator.IncludeMarkers            = false;
                snippetGenerator.IncludeOptionalParameters = includeOptionalParams;
                response.MethodHeader = snippetGenerator.GenerateSnippet(symbol);
            }

            return(response);
        }
        private async Task <IEnumerable <AutoCompleteResponse> > FindCompletionsAsync(string source, bool wantSnippet = false)
        {
            using (var testProject = await TestAssets.Instance.GetTestProjectAsync("CakeProject", shadowCopy: false))
                using (var host = CreateOmniSharpHost(testProject.Directory))
                {
                    var testFile = new TestFile(Path.Combine(testProject.Directory, "build.cake"), source);
                    var point    = testFile.Content.GetPointFromPosition();

                    var request = new AutoCompleteRequest
                    {
                        Line             = point.Line,
                        Column           = point.Offset,
                        FileName         = testFile.FileName,
                        Buffer           = testFile.Content.Code,
                        WordToComplete   = GetPartialWord(testFile.Content),
                        WantMethodHeader = true,
                        WantSnippet      = wantSnippet,
                        WantReturnType   = true
                    };

                    var updateBufferRequest = new UpdateBufferRequest
                    {
                        Buffer   = request.Buffer,
                        Column   = request.Column,
                        FileName = request.FileName,
                        Line     = request.Line,
                        FromDisk = false
                    };

                    await GetUpdateBufferHandler(host).Handle(updateBufferRequest);

                    var requestHandler = GetRequestHandler(host);

                    return(await requestHandler.Handle(request));
                }
        }
示例#24
0
        protected async Task <IEnumerable <AutoCompleteResponse> > FindCompletionsAsync(string filename, string source, bool wantSnippet = false, string triggerChar = null)
        {
            var testFile = new TestFile(filename, source);

            SharedOmniSharpTestHost.AddFilesToWorkspace(testFile);
            var point = testFile.Content.GetPointFromPosition();

            var request = new AutoCompleteRequest
            {
                Line             = point.Line,
                Column           = point.Offset,
                FileName         = testFile.FileName,
                Buffer           = testFile.Content.Code,
                WordToComplete   = GetPartialWord(testFile.Content),
                WantMethodHeader = true,
                WantSnippet      = wantSnippet,
                WantReturnType   = true,
                TriggerCharacter = triggerChar
            };

            var requestHandler = GetRequestHandler(SharedOmniSharpTestHost);

            return(await requestHandler.Handle(request));
        }
示例#25
0
        public async Task <IEnumerable <AutoCompleteResponse> > Handle(AutoCompleteRequest request)
        {
            var documents      = _workspace.GetDocuments(request.FileName);
            var wordToComplete = request.WordToComplete;
            var completions    = new HashSet <AutoCompleteResponse>();

            foreach (var document in documents)
            {
                var sourceText = await document.GetTextAsync();

                var position = sourceText.Lines.GetPosition(new LinePosition(request.Line, request.Column));

                var service        = CompletionService.GetService(document);
                var completionList = await service.GetCompletionsAsync(document, position);

                // Add keywords from the completion list. We'll use the recommender service to get symbols
                // to create snippets from.

                foreach (var item in completionList.Items)
                {
                    if (item.Tags.Contains(CompletionTags.Keyword))
                    {
                        // Note: For keywords, we'll just assume that the completion text is the same
                        // as the display text.
                        var keyword = item.DisplayText;
                        if (keyword.IsValidCompletionFor(wordToComplete))
                        {
                            var response = new AutoCompleteResponse()
                            {
                                CompletionText = item.DisplayText,
                                DisplayText    = item.DisplayText,
                                Snippet        = item.DisplayText,
                                Kind           = request.WantKind ? "Keyword" : null
                            };

                            completions.Add(response);
                        }
                    }
                }

                var model = await document.GetSemanticModelAsync();

                var symbols = await Recommender.GetRecommendedSymbolsAtPositionAsync(model, position, _workspace);

                foreach (var symbol in symbols.Where(s => s.Name.IsValidCompletionFor(wordToComplete)))
                {
                    if (request.WantSnippet)
                    {
                        foreach (var completion in MakeSnippetedResponses(request, symbol))
                        {
                            completions.Add(completion);
                        }
                    }
                    else
                    {
                        completions.Add(MakeAutoCompleteResponse(request, symbol));
                    }
                }
            }

            return(completions
                   .OrderByDescending(c => c.CompletionText.IsValidCompletionStartsWithExactCase(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsValidCompletionStartsWithIgnoreCase(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsCamelCaseMatch(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsSubsequenceMatch(wordToComplete))
                   .ThenBy(c => c.CompletionText));
        }
        private async Task <IEnumerable <AutoCompleteResponse> > FindCompletionsAsync(string source, AutoCompleteRequest request = null)
        {
            var workspace = await TestHelpers.CreateSimpleWorkspace(_plugInHost, source);

            var controller = new IntellisenseService(workspace, new FormattingOptions());

            if (request == null)
            {
                request = CreateRequest(source);
            }

            var response = await controller.Handle(request);

            var completions = response as IEnumerable <AutoCompleteResponse>;

            return(completions);
        }
示例#27
0
 // Method to call API End Point: Auto Complete https://tenor.com/gifapi#autocomplete
 public static IEnumerator AutoComplete(AutoCompleteRequest request, DelegateStringAnswer delegateAutoComplete)
 {
     return(_apiCallStringCollection(request.getQueryString(key), delegateAutoComplete));
 }
        public async Task <IEnumerable <AutoCompleteResponse> > Handle(AutoCompleteRequest request)
        {
            var documents      = _workspace.GetDocuments(request.FileName);
            var wordToComplete = request.WordToComplete;
            var completions    = new HashSet <AutoCompleteResponse>();

            foreach (var document in documents)
            {
                var sourceText = await document.GetTextAsync();

                var position       = sourceText.Lines.GetPosition(new LinePosition(request.Line, request.Column));
                var service        = CompletionService.GetService(document);
                var completionList = await service.GetCompletionsAsync(document, position);

                if (completionList != null)
                {
                    // Only trigger on space if Roslyn has object creation items
                    if (request.TriggerCharacter == " " && !completionList.Items.Any(i => i.IsObjectCreationCompletionItem()))
                    {
                        return(completions);
                    }

                    // get recommended symbols to match them up later with SymbolCompletionProvider
                    var semanticModel = await document.GetSemanticModelAsync();

                    var recommendedSymbols = (await Recommender.GetRecommendedSymbolsAtPositionAsync(semanticModel, position, _workspace)).ToArray();

                    var isSuggestionMode = completionList.SuggestionModeItem != null;
                    foreach (var item in completionList.Items)
                    {
                        var completionText = item.DisplayText;
                        var preselect      = item.Rules.MatchPriority == MatchPriority.Preselect;
                        if (completionText.IsValidCompletionFor(wordToComplete))
                        {
                            var symbols = await item.GetCompletionSymbolsAsync(recommendedSymbols, document);

                            if (symbols.Any())
                            {
                                foreach (var symbol in symbols)
                                {
                                    if (item.UseDisplayTextAsCompletionText())
                                    {
                                        completionText = item.DisplayText;
                                    }
                                    else if (item.TryGetInsertionText(out var insertionText))
                                    {
                                        completionText = insertionText;
                                    }
                                    else
                                    {
                                        completionText = symbol.Name;
                                    }

                                    if (symbol != null)
                                    {
                                        if (request.WantSnippet)
                                        {
                                            foreach (var completion in MakeSnippetedResponses(request, symbol, completionText, preselect, isSuggestionMode))
                                            {
                                                completions.Add(completion);
                                            }
                                        }
                                        else
                                        {
                                            completions.Add(MakeAutoCompleteResponse(request, symbol, completionText, preselect, isSuggestionMode));
                                        }
                                    }
                                }

                                // if we had any symbols from the completion, we can continue, otherwise it means
                                // the completion didn't have an associated symbol so we'll add it manually
                                continue;
                            }

                            // for other completions, i.e. keywords, create a simple AutoCompleteResponse
                            // we'll just assume that the completion text is the same
                            // as the display text.
                            var response = new AutoCompleteResponse()
                            {
                                CompletionText   = item.DisplayText,
                                DisplayText      = item.DisplayText,
                                Snippet          = item.DisplayText,
                                Kind             = request.WantKind ? item.Tags.First() : null,
                                IsSuggestionMode = isSuggestionMode,
                                Preselect        = preselect
                            };

                            completions.Add(response);
                        }
                    }
                }
            }

            return(completions
                   .OrderByDescending(c => c.CompletionText.IsValidCompletionStartsWithExactCase(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsValidCompletionStartsWithIgnoreCase(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsCamelCaseMatch(wordToComplete))
                   .ThenByDescending(c => c.CompletionText.IsSubsequenceMatch(wordToComplete))
                   .ThenBy(c => c.DisplayText, StringComparer.OrdinalIgnoreCase)
                   .ThenBy(c => c.CompletionText, StringComparer.OrdinalIgnoreCase));
        }
示例#29
0
        public override void Init(System.Html.Element element, Func <object> valueAccessor, Func <System.Collections.Dictionary> allBindingsAccessor, object viewModel, object context)
        {
            XrmLookupEditorButton footerButton = (XrmLookupEditorButton)allBindingsAccessor()["footerButton"];
            bool                showFooter     = (bool)allBindingsAccessor()["showFooter"];
            jQueryObject        container      = jQuery.FromElement(element);
            jQueryObject        inputField     = container.Find(".sparkle-input-lookup-part");
            jQueryObject        selectButton   = container.Find(".sparkle-input-lookup-button-part");
            EntityReference     _value         = new EntityReference(null, null, null);
            AutoCompleteOptions options        = new AutoCompleteOptions();

            options.MinLength = 100000; // Don't enable type down - use search button (or return)
            options.Delay     = 0;
            options.Position  = new Dictionary <string, object>("collision", "fit");
            bool justSelected         = false;
            int  totalRecordsReturned = 0;
            Action <AutoCompleteItem, bool> setValue = delegate(AutoCompleteItem item, bool setFocus)
            {
                if (_value == null)
                {
                    _value = new EntityReference(null, null, null);
                }
                string value = item.Label;
                inputField.Value(value);
                _value.Id          = ((Guid)item.Value);
                _value.Name        = item.Label;
                _value.LogicalName = (string)item.Data;
                justSelected       = true;
                TrySetObservable(valueAccessor, inputField, _value, setFocus);
            };

            // Set the value when selected
            options.Select = delegate(jQueryEvent e, AutoCompleteSelectEvent uiEvent)
            {
                // Note we assume that the binding has added an array of string items
                AutoCompleteItem item = (AutoCompleteItem)uiEvent.Item;
                string           data = ((string)item.Data);
                if (data == "footerlink" || data == null)
                {
                    footerButton.OnClick(item);
                    e.PreventDefault();
                    e.StopImmediatePropagation();
                    Script.Literal("return false;");
                }
                else
                {
                    setValue(item, true);
                    Script.Literal("return false;");
                }
            };

            options.Open = delegate(jQueryEvent e, jQueryObject o)
            {
                if (showFooter && totalRecordsReturned > 0)
                {
                    WidgetObject menu = (WidgetObject)Script.Literal("{0}.autocomplete({1})", inputField, "widget");
                    XrmLookupEditor.AddFooter(menu, totalRecordsReturned);
                }
            };

            options.Close = delegate(jQueryEvent e, jQueryObject o)
            {
                WidgetObject menu   = (WidgetObject)Script.Literal("{0}.autocomplete({1})", inputField, "widget");
                jQueryObject footer = menu.Next();
                if (footer.Length > 0 || footer.HasClass("sparkle-menu-footer"))
                {
                    footer.Hide();
                }
            };
            // Get the query command
            Action <string, Action <EntityCollection> > queryCommand = (Action <string, Action <EntityCollection> >)((object)allBindingsAccessor()["queryCommand"]);
            string nameAttribute     = ((string)allBindingsAccessor()["nameAttribute"]);
            string idAttribute       = ((string)allBindingsAccessor()["idAttribute"]);
            string typeCodeAttribute = ((string)allBindingsAccessor()["typeCodeAttribute"]);

            string[] columnAttributes = null;
            // If there multiple names, add them to the columnAttributes
            string[] columns = nameAttribute.Split(",");

            if (columns.Length > 1)
            {
                columnAttributes = columns;
                nameAttribute    = columnAttributes[0];
            }

            // wire up source to CRM search
            Action <AutoCompleteRequest, Action <AutoCompleteItem[]> > queryDelegate = delegate(AutoCompleteRequest request, Action <AutoCompleteItem[]> response)
            {
                Action <EntityCollection> queryCallBack = delegate(EntityCollection fetchResult)
                {
                    int  recordsFound          = fetchResult.Entities.Count;
                    bool noRecordsFound        = recordsFound == 0;
                    AutoCompleteItem[] results = new AutoCompleteItem[recordsFound + (footerButton != null ? 1 : 0) + (noRecordsFound ? 1 : 0)];

                    for (int i = 0; i < recordsFound; i++)
                    {
                        results[i]       = new AutoCompleteItem();
                        results[i].Label = (string)fetchResult.Entities[i].GetAttributeValue(nameAttribute);
                        results[i].Value = fetchResult.Entities[i].GetAttributeValue(idAttribute);
                        results[i].Data  = fetchResult.Entities[i].LogicalName;
                        GetExtraColumns(columnAttributes, fetchResult, results, i);

                        string typeCodeName = fetchResult.Entities[i].LogicalName;
                        // Get the type code from the name to find the icon
                        if (!string.IsNullOrEmpty(typeCodeAttribute))
                        {
                            typeCodeName = fetchResult.Entities[i].GetAttributeValue(typeCodeAttribute).ToString();
                        }

                        results[i].Image = MetadataCache.GetSmallIconUrl(typeCodeName);
                    }

                    if (fetchResult.TotalRecordCount > fetchResult.Entities.Count)
                    {
                        totalRecordsReturned = fetchResult.TotalRecordCount;
                    }
                    else
                    {
                        totalRecordsReturned = fetchResult.Entities.Count;
                    }
                    int itemsCount = recordsFound;
                    if (noRecordsFound)
                    {
                        AutoCompleteItem noRecordsItem = new AutoCompleteItem();
                        noRecordsItem.Label = SparkleResourceStrings.NoRecordsFound;
                        results[itemsCount] = noRecordsItem;
                        itemsCount++;
                    }
                    if (footerButton != null)
                    {
                        // Add the add new
                        AutoCompleteItem addNewLink = new AutoCompleteItem();
                        addNewLink.Label        = footerButton.Label;
                        addNewLink.Image        = footerButton.Image;
                        addNewLink.ColumnValues = null;
                        addNewLink.Data         = "footerlink";
                        results[itemsCount]     = addNewLink;
                    }
                    response(results);

                    // Disable it now so typing doesn't trigger a search
                    AutoCompleteOptions disableOption = new AutoCompleteOptions();
                    disableOption.MinLength = 100000;
                    inputField.Plugin <AutoCompleteObject>().AutoComplete(disableOption);
                };

                // Call the function with the correct 'this' context
                Script.Literal("{0}.call({1}.$parent,{2},{3})", queryCommand, context, request.Term, queryCallBack);
            };

            options.Source = queryDelegate;
            options.Focus  = delegate(jQueryEvent e, AutoCompleteFocusEvent uiEvent)
            {
                // Prevent the value being updated in the text box we scroll through the results
                Script.Literal("return false;");
            };
            inputField = inputField.Plugin <AutoCompleteObject>().AutoComplete(options);

            // Set render template
            ((RenderItemDelegate)Script.Literal("{0}.data('ui-autocomplete')", inputField))._renderItem = delegate(object ul, AutoCompleteItem item)
            {
                if (item.Data == null)
                {
                    return((object)jQuery.Select("<li class='ui-state-disabled'>" + item.Label + "</li>").AppendTo((jQueryObject)ul));
                }

                string html = "<a class='sparkle-menu-item'><span class='sparkle-menu-item-img'>";
                if (item.Image != null)
                {
                    html += @"<img src='" + item.Image + "'/>";
                }
                html += @"</span><span class='sparkle-menu-item-label'>" + item.Label + "</span><br>";

                if (item.ColumnValues != null && item.ColumnValues.Length > 0)
                {
                    foreach (string value in item.ColumnValues)
                    {
                        html += "<span class='sparkle-menu-item-moreinfo'>" + value + "</span>";
                    }
                }
                html += "</a>";
                return((object)jQuery.Select("<li>").Append(html).AppendTo((jQueryObject)ul));
            };

            // Add the click binding to show the drop down
            selectButton.Click(delegate(jQueryEvent e)
            {
                AutoCompleteOptions enableOption = new AutoCompleteOptions();
                enableOption.MinLength           = 0;
                inputField.Focus();
                inputField.Plugin <AutoCompleteObject>().AutoComplete(enableOption);
                inputField.Plugin <AutoCompleteObject>().AutoComplete(AutoCompleteMethod.Search);
            });

            // handle the field changing
            inputField.Change(delegate(jQueryEvent e)
            {
                string inputValue = inputField.GetValue();
                if (inputValue != _value.Name)
                {
                    // The name is different from the name of the lookup reference
                    // search to see if we can auto resolve it
                    TrySetObservable(valueAccessor, inputField, null, false);
                    AutoCompleteRequest lookup = new AutoCompleteRequest();
                    lookup.Term = inputValue;
                    Action <AutoCompleteItem[]> lookupResults = delegate(AutoCompleteItem[] results)
                    {
                        int selectableItems = 0;
                        // If there is only one, then auto-set
                        if (results != null)
                        {
                            foreach (AutoCompleteItem item in results)
                            {
                                if (isItemSelectable(item))
                                {
                                    selectableItems++;
                                }
                                if (selectableItems > 2)
                                {
                                    break;
                                }
                            }
                        }

                        if (selectableItems == 1)
                        {
                            // There is only a single value so set it now
                            setValue(results[0], false);
                        }
                        else
                        {
                            inputField.Value(String.Empty);
                        }
                    };

                    queryDelegate(lookup, lookupResults);
                }
            });

            Action disposeCallBack = delegate()
            {
                if ((bool)Script.Literal("$({0}).data('ui-autocomplete')!=undefined", inputField))
                {
                    Script.Literal("$({0}).autocomplete(\"destroy\")", inputField);
                }
            };

            //handle disposal (if KO removes by the template binding)
            Script.Literal("ko.utils.domNodeDisposal.addDisposeCallback({0}, {1})", element, (object)disposeCallBack);
            Knockout.BindingHandlers["validationCore"].Init(element, valueAccessor, allBindingsAccessor, null, null);

            // Bind return to searching
            inputField.Keydown(delegate(jQueryEvent e)
            {
                if (e.Which == 13 && !justSelected) // Return pressed - but we want to do a search not move to the next cell
                {
                    selectButton.Click();
                }
                else if (e.Which == 13)
                {
                    return;
                }
                switch (e.Which)
                {
                case 13:     // Return
                case 38:     // Up - don't navigate - but use the dropdown to select search results
                case 40:     // Down - don't navigate - but use the dropdown to select search results
                    e.PreventDefault();
                    e.StopPropagation();
                    break;
                }
                justSelected = false;
            });

            //Script.Literal("return { controlsDescendantBindings: true };");
        }
示例#30
0
        private async Task <IEnumerable <AutoCompleteResponse> > FindCompletionsAsync(string source, AutoCompleteRequest request = null)
        {
            var workspace  = TestHelpers.CreateSimpleWorkspace(source);
            var controller = new OmnisharpController(workspace, null);

            if (request == null)
            {
                request = CreateRequest(source);
            }

            var response = await controller.AutoComplete(request);

            var completions = response as IEnumerable <AutoCompleteResponse>;

            return(completions);
        }
示例#31
0
        public async Task <IActionResult> GetArtistList(AutoCompleteRequest request)
        {
            var artistCollection = await _albumApi.GetArtistListAsync(request);

            return(Json(artistCollection));
        }