示例#1
0
        public override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var progress = ProgressManager.For(request, cancellationToken);
            var work     = ProgressManager.WorkDone(request, new WorkDoneProgressBegin
            {
                Title   = "Resolve symbol definition location",
                Message = "Begin resolving definition under caret"
            });

            var editorData = DResolverWrapper.CreateEditorData(request, cancellationToken);
            var results    = DResolverWrapper.ResolveHoveredCodeLoosely(editorData, out LooseResolution.NodeResolutionAttempt resolutionAttempt, out ISyntaxRegion syntaxRegion);

            var result = new LocationOrLocationLinks(
                results.Select(ExpressionTypeEvaluation.GetResultMember)
                .Select(node => ToLocationOrLocationLink(node, Capability.LinkSupport, syntaxRegion)));

            progress?.OnNext(new Container <LocationOrLocationLink>(result));
            work.OnCompleted();

            return(Task.FromResult(progress != null ? new LocationOrLocationLinks() : result));
        }
        public bool Update(Document doc = null)
        {
            lastResults = DResolverWrapper.ResolveHoveredCodeLoosely(out ctxt, out ed, out resultResolutionAttempt, doc);

            return(lastResults != null && lastResults.Length > 0);
        }
示例#3
0
        public override Task <LocationContainer> Handle(ReferenceParams request, CancellationToken cancellationToken)
        {
            var workDone = ProgressManager.WorkDone(request, new WorkDoneProgressBegin
            {
                Title      = "Begin resolving references",
                Percentage = 0
            });

            var editorData       = DResolverWrapper.CreateEditorData(request, cancellationToken);
            var nodeSymbolToFind = DResolverWrapper
                                   .ResolveHoveredCodeLoosely(editorData, out LooseResolution.NodeResolutionAttempt _, out ISyntaxRegion _)
                                   .Select(ExpressionTypeEvaluation.GetResultMember)
                                   .FirstOrDefault();

            if (nodeSymbolToFind == null)
            {
                workDone.OnNext(new WorkDoneProgressReport()
                {
                    Message    = "No symbol found",
                    Percentage = 100
                });
                workDone.OnCompleted();
                return(Task.FromResult(new LocationContainer()));
            }

            var modules = editorData.ParseCache.EnumRootPackagesSurroundingModule(editorData.SyntaxTree)
                          .SelectMany(package => (IEnumerable <DModule>)package)
                          .Where(module => module != null)
                          .OrderBy(module => module.FileName)
                          .ToList();

            var progress           = ProgressManager.For(request, cancellationToken);
            var allFoundReferences = new List <Location>();
            var ctxt          = ResolutionContext.Create(editorData, true);
            int progressIndex = 0;

            foreach (var module in modules)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    break;
                }

                try
                {
                    var references = ReferencesFinder.SearchModuleForASTNodeReferences(module, nodeSymbolToFind, ctxt, request.Context.IncludeDeclaration)
                                     .Where(region => region != null)
                                     .OrderBy(region => region.Location)
                                     .Select(region => ToLocation(region, module))
                                     .Where(location => location != default)
                                     .ToList();
                    progressIndex++;
                    if (references.Count > 0)
                    {
                        workDone.OnNext(new WorkDoneProgressReport
                        {
                            Message    = "Scanned " + module.FileName,
                            Percentage = ((double)progressIndex / modules.Count) * 100.0
                        });
                        allFoundReferences.AddRange(references);
                        progress?.OnNext(new Container <Location>(allFoundReferences));
                    }
                }
                catch (Exception ex)
                {
                    workDone.OnError(ex);
                    if (progress != null)
                    {
                        progress.OnError(ex);
                        return(Task.FromResult(new LocationContainer()));
                    }
                    return(Task.FromException <LocationContainer>(ex));
                }
            }

            workDone.OnCompleted();
            progress?.OnCompleted();

            // if $progress sent, result must be empty
            return(Task.FromResult(progress != null ? new LocationContainer()
                : new LocationContainer(allFoundReferences)));
        }
示例#4
0
        public override Task <DocumentHighlightContainer> Handle(DocumentHighlightParams request,
                                                                 CancellationToken cancellationToken)
        {
            var workDone = ProgressManager.WorkDone(request, new WorkDoneProgressBegin
            {
                Title      = "Begin finding highlights",
                Percentage = 0
            });

            var editorData       = DResolverWrapper.CreateEditorData(request, cancellationToken);
            var nodeSymbolToFind = DResolverWrapper
                                   .ResolveHoveredCodeLoosely(editorData, out LooseResolution.NodeResolutionAttempt _,
                                                              out ISyntaxRegion _)
                                   .Select(GetResultMember)
                                   .FirstOrDefault();

            if (nodeSymbolToFind == null)
            {
                workDone.OnNext(new WorkDoneProgressReport()
                {
                    Message    = "No symbol found",
                    Percentage = 100
                });
                workDone.OnCompleted();
                return(Task.FromResult(new DocumentHighlightContainer()));
            }

            var progress = ProgressManager.For(request, cancellationToken);
            List <DocumentHighlight> allFoundReferences;
            var ctxt = ResolutionContext.Create(editorData, true);

            try
            {
                allFoundReferences = cancellationToken.IsCancellationRequested
                    ? new List <DocumentHighlight>()
                    : ReferencesFinder
                                     .SearchModuleForASTNodeReferences(editorData.SyntaxTree, nodeSymbolToFind, ctxt)
                                     .Where(region => region != null)
                                     .OrderBy(region => region.Location)
                                     .Select(ToDocumentHighlight)
                                     .ToList();
            }
            catch (Exception ex)
            {
                workDone.OnError(ex);
                if (progress != null)
                {
                    progress.OnError(ex);
                    return(Task.FromResult(new DocumentHighlightContainer()));
                }

                return(Task.FromException <DocumentHighlightContainer>(ex));
            }

            if (allFoundReferences.Count > 0)
            {
                progress?.OnNext(new DocumentHighlightContainer(allFoundReferences));
            }

            workDone.OnCompleted();
            progress?.OnCompleted();

            return(Task.FromResult(progress != null
                ? new DocumentHighlightContainer()
                : new DocumentHighlightContainer(allFoundReferences)));
        }
        public bool Update(Document doc = null)
        {
            lastResults = DResolverWrapper.ResolveHoveredCodeLoosely(out ed, out resultResolutionAttempt, out lastSyntaxObject, lastDoc = (doc ?? IdeApp.Workbench.ActiveDocument));

            return(lastResults != null && lastResults.Length > 0);
        }