예제 #1
0
        public async Task ShouldNotIncludeUsagesFromLoadedFilesWhenOnlyThisFileIsTrue()
        {
            using (var testProject = await TestAssets.Instance.GetTestProjectAsync("CakeProject", shadowCopy: false))
                using (var host = CreateOmniSharpHost(testProject.Directory))
                {
                    var fileName = Path.Combine(testProject.Directory, "build.cake");

                    await GetUpdateBufferHandler(host).Handle(new UpdateBufferRequest
                    {
                        Buffer   = "Information(\"Hello World\");",
                        FileName = Path.Combine(testProject.Directory, "foo.cake"),
                        FromDisk = false
                    });
                    await GetUpdateBufferHandler(host).Handle(new UpdateBufferRequest
                    {
                        Buffer   = "#load foo.cake\nInformation(\"Hello World\");",
                        FileName = fileName,
                        FromDisk = false
                    });

                    var request = new FindUsagesRequest
                    {
                        FileName     = fileName,
                        Line         = 1,
                        Column       = 1,
                        OnlyThisFile = true
                    };

                    var requestHandler = GetRequestHandler(host);
                    var response       = await requestHandler.Handle(request);

                    Assert.Single(response.QuickFixes);
                }
        }
예제 #2
0
        public override async Task <CodeLens> Handle(CodeLens request, CancellationToken token)
        {
            var omnisharpRequest = new FindUsagesRequest
            {
                FileName          = Helpers.FromUri(request.Data.ToObject <Uri>()),
                Column            = (int)request.Range.Start.Character,
                Line              = (int)request.Range.Start.Line,
                OnlyThisFile      = false,
                ExcludeDefinition = true
            };

            var omnisharpResponse = await _findUsagesHandler.Handle(omnisharpRequest);

            var length = omnisharpResponse?.QuickFixes?.Count() ?? 0;

            var jsonCamelCaseContract = new JsonSerializer
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };

            request = request with {
                Command = new Command
                {
                    Title     = length == 1 ? "1 reference" : $"{length} references",
                    Name      = "omnisharp/client/findReferences",
                    Arguments = new JArray(
                        new[]
        public async Task <QuickFixResponse> FindUsages(FindUsagesRequest request)
        {
            var document = _workspace.GetDocument(request.FileName);
            var response = new QuickFixResponse();

            if (document != null)
            {
                var semanticModel = await document.GetSemanticModelAsync();

                var sourceText = await document.GetTextAsync();

                var position   = sourceText.Lines.GetPosition(new LinePosition(request.Line - 1, request.Column - 1));
                var symbol     = SymbolFinder.FindSymbolAtPosition(semanticModel, position, _workspace);
                var definition = await SymbolFinder.FindSourceDefinitionAsync(symbol, _workspace.CurrentSolution);

                var usages = request.OnlyThisFile
                    ? await SymbolFinder.FindReferencesAsync(definition ?? symbol, _workspace.CurrentSolution, ImmutableHashSet.Create(document))
                    : await SymbolFinder.FindReferencesAsync(definition ?? symbol, _workspace.CurrentSolution);

                var locations = new List <Location>();

                foreach (var usage in usages.Where(u => u.Definition.CanBeReferencedByName || (symbol as IMethodSymbol)?.MethodKind == MethodKind.Constructor))
                {
                    foreach (var location in usage.Locations)
                    {
                        locations.Add(location.Location);
                    }

                    if (!request.ExcludeDefinition)
                    {
                        var definitionLocations = usage.Definition.Locations
                                                  .Where(loc => loc.IsInSource && (!request.OnlyThisFile || loc.SourceTree.FilePath == request.FileName));

                        foreach (var location in definitionLocations)
                        {
                            locations.Add(location);
                        }
                    }
                }

                var quickFixTasks = locations.Select(async l => await GetQuickFix(l));

                var quickFixes = await Task.WhenAll(quickFixTasks);

                response = new QuickFixResponse(quickFixes.Distinct()
                                                .OrderBy(q => q.FileName)
                                                .ThenBy(q => q.Line)
                                                .ThenBy(q => q.Column));
            }

            return(response);
        }
예제 #4
0
        public async override Task <LocationContainer> Handle(ReferenceParams request, CancellationToken token)
        {
            var omnisharpRequest = new FindUsagesRequest
            {
                FileName          = Helpers.FromUri(request.TextDocument.Uri),
                Column            = Convert.ToInt32(request.Position.Character),
                Line              = Convert.ToInt32(request.Position.Line),
                OnlyThisFile      = false,
                ExcludeDefinition = !request.Context.IncludeDeclaration
            };

            var omnisharpResponse = await _findUsagesHandler.Handle(omnisharpRequest);

            return(omnisharpResponse.QuickFixes?.Select(x => new Location
            {
                Uri = Helpers.ToUri(x.FileName),
                Range = x.ToRange()
            }).ToArray());
        }
예제 #5
0
        private async Task <QuickFixResponse> FindUsagesAsync(TestFile[] testFiles, bool onlyThisFile, bool excludeDefinition = false)
        {
            SharedOmniSharpTestHost.AddFilesToWorkspace(testFiles);
            var file  = testFiles.Single(tf => tf.Content.HasPosition);
            var point = file.Content.GetPointFromPosition();

            var requestHandler = GetRequestHandler(SharedOmniSharpTestHost);

            var request = new FindUsagesRequest
            {
                Line              = point.Line,
                Column            = point.Offset,
                FileName          = file.FileName,
                Buffer            = file.Content.Code,
                OnlyThisFile      = onlyThisFile,
                ExcludeDefinition = excludeDefinition
            };

            return(await requestHandler.Handle(request));
        }
예제 #6
0
        public async Task Returns_Usages()
        {
            const string source = @"
    public class F$$oo
    {
        public string prop { get; set; }
    }

    public class FooConsumer
    {
        public FooConsumer()
        {
            var temp = new Foo();
            var prop = foo.prop;
        }
    }";

            var testfile = new TestFile("a.cs", source);

            using (var testProject = await TestAssets.Instance.GetTestProjectAsync("EmptyProject"))
            {
                using (var host = CreateOmniSharpHost(testProject.Directory))
                {
                    var filePath = AddTestFile(testProject, testfile);
                    await WaitForFileUpdate(filePath, host);

                    var point   = testfile.Content.GetPointFromPosition();
                    var request = new FindUsagesRequest()
                    {
                        FileName = filePath,
                        Line     = point.Line,
                        Column   = point.Offset,
                        Buffer   = testfile.Content.Code
                    };

                    var actual = await host.GetResponse <FindUsagesRequest, QuickFixResponse>(OmniSharpEndpoints.FindUsages, request);

                    Assert.Equal(2, actual.QuickFixes.Count());
                }
            }
        }
        public async override Task <CodeLens> Handle(CodeLens request, CancellationToken token)
        {
            var omnisharpRequest = new FindUsagesRequest
            {
                FileName          = Helpers.FromUri(request.Data.ToObject <Uri>()),
                Column            = (int)request.Range.Start.Character,
                Line              = (int)request.Range.Start.Line,
                OnlyThisFile      = false,
                ExcludeDefinition = true
            };

            var omnisharpResponse = await _findUsagesHandler.Handle(omnisharpRequest);

            var length = omnisharpResponse?.QuickFixes?.Count() ?? 0;

            request.Command = new Command
            {
                Title = length == 1 ? "1 reference" : $"{length} references"
                        // TODO: Hook up command.
            };

            return(request);
        }