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); }
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))); }
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); }