Esempio n. 1
0
        public override async Task <RadCompletionContext> GetContextAsync(IDocument document, SnapshotPoint triggerLocation, SnapshotSpan applicableToSpan, CancellationToken cancellationToken)
        {
            if (!_autocompleteFunctions)
            {
                return(RadCompletionContext.Empty);
            }

            var analysisResult = await document.DocumentAnalysis.GetAnalysisResultAsync(triggerLocation.Snapshot);

            var completionItems = analysisResult.Root.Tokens
                                  .AsParallel()
                                  .WithCancellation(cancellationToken)
                                  .Where(t => t.Type == Core.Tokens.RadAsmTokenType.FunctionName)
                                  .Cast <IDefinitionToken>()
                                  .Select(t => _navigationTokenService.CreateToken(t, document))
                                  .Select(t => new CompletionItem(t, FunctionIcon));

            return(new RadCompletionContext(completionItems.ToList()));
        }
        private IEnumerable <CompletionItem> GetScopedCompletions(IDocument document, IAnalysisResult analysisResult, SnapshotPoint triggerPoint, CancellationToken cancellationToken)
        {
            CompletionItem CreateCompletionItem(IAnalysisToken analysisToken, ImageElement imageElement) =>
            new CompletionItem(_navigationTokenService.CreateToken((IDefinitionToken)analysisToken, document), imageElement);

            var currentBlock = analysisResult.GetBlock(triggerPoint);

            while (currentBlock != null)
            {
                foreach (var token in currentBlock.Tokens)
                {
                    cancellationToken.ThrowIfCancellationRequested();

                    if (_autocompleteLabels && token.Type == RadAsmTokenType.Label)
                    {
                        yield return(CreateCompletionItem(token, LabelIcon)); break;
                    }
                    else if (_autocompleteVariables)
                    {
                        switch (token.Type)
                        {
                        case RadAsmTokenType.GlobalVariable:
                            yield return(CreateCompletionItem(token, GlobalVariableIcon)); break;

                        case RadAsmTokenType.LocalVariable:
                            yield return(CreateCompletionItem(token, LocalVariableIcon)); break;

                        case RadAsmTokenType.FunctionParameter:
                            yield return(CreateCompletionItem(token, ArgumentIcon)); break;
                        }
                    }
                }

                currentBlock = currentBlock.Parent;
            }
        }