コード例 #1
0
        private async Task <(CodeStructureResponse, TestFile)> GetCodeStructureAsync(string contents)
        {
            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"), contents);

                    var request = new CodeStructureRequest
                    {
                        FileName = testFile.FileName
                    };

                    var updateBufferRequest = new UpdateBufferRequest
                    {
                        Buffer   = testFile.Content.Code,
                        FileName = testFile.FileName,
                        FromDisk = false
                    };

                    await GetUpdateBufferHandler(host).Handle(updateBufferRequest);

                    var requestHandler = GetRequestHandler(host);

                    return(await requestHandler.Handle(request), testFile);
                }
        }
コード例 #2
0
        void RequestUpdateBuffer(ChunkVertexBuilder vertexBuilder, ChunkMeshUpdatePriority priority)
        {
            for (int z = 0; z < MeshSegments.Z; z++)
            {
                for (int y = 0; y < MeshSegments.Y; y++)
                {
                    for (int x = 0; x < MeshSegments.X; x++)
                    {
                        var opaqueRequest = new UpdateBufferRequest
                        {
                            VertexBuilder = vertexBuilder,
                            Segment       = new IntVector3(x, y, z),
                            Translucece   = false,
                            Priority      = priority,
                            RequestTime   = TimeSpan.FromTicks(Environment.TickCount)
                        };
                        updateBufferRequests.Enqueue(opaqueRequest);

                        var translucentRequest = new UpdateBufferRequest
                        {
                            VertexBuilder = vertexBuilder,
                            Segment       = new IntVector3(x, y, z),
                            Translucece   = true,
                            Priority      = priority,
                            RequestTime   = TimeSpan.FromTicks(Environment.TickCount)
                        };
                        updateBufferRequests.Enqueue(translucentRequest);
                    }
                }
            }
        }
コード例 #3
0
        private async Task <QuickFixResponse> FindDiagnostics(string contents, bool includeFileName)
        {
            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"), contents);

                    var request = new CodeCheckRequest
                    {
                        FileName = includeFileName ? testFile.FileName : string.Empty,
                    };

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

                    await GetUpdateBufferHandler(host).Handle(updateBufferRequest);

                    var requestHandler = GetRequestHandler(host);

                    return(await requestHandler.Handle(request));
                }
        }
コード例 #4
0
        public async Task UpdateBufferReadsFromDisk()
        {
            const string newCode = "public class MyClass {}";

            var fileName = Path.GetTempPath() + Guid.NewGuid().ToString() + ".cs";
            var testFile = new TestFile(fileName, string.Empty);

            using (var host = CreateOmniSharpHost(testFile))
            {
                File.WriteAllText(fileName, newCode);

                var request = new UpdateBufferRequest
                {
                    FileName = fileName,
                    FromDisk = true
                };

                await host.Workspace.BufferManager.UpdateBufferAsync(request);

                var document = host.Workspace.GetDocument(fileName);
                var text     = await document.GetTextAsync();

                Assert.Equal(newCode, text.ToString());
            }
        }
コード例 #5
0
        private async Task RefreshAsync(OutputRefresh refresh)
        {
            // Re-evaluate project instance so we can determine compile items properly.
            var projectInstance = _projectInstanceEvaluator.Evaluate(refresh.ProjectInstance);

            foreach (var documentChangeInfo in refresh.DocumentChangeInfos.Values)
            {
                try
                {
                    // Force update the OmniSharp Workspace for component declaration changes.

                    var componentDeclarationLocation = documentChangeInfo.FilePath;
                    var isCompileItem   = IsCompileItem(documentChangeInfo.RelativeFilePath, projectInstance);
                    var wasACompileItem = false;
                    lock (_lastSeenCompileItems)
                    {
                        _lastSeenCompileItems.TryGetValue(documentChangeInfo.FilePath, out wasACompileItem);
                        _lastSeenCompileItems[documentChangeInfo.FilePath] = isCompileItem;
                    }

                    if (!isCompileItem && wasACompileItem)
                    {
                        // Output document should no longer be considered as a compile item, clear the workspace content for it.
                        var request = new Request()
                        {
                            FileName = componentDeclarationLocation,
                            Buffer   = string.Empty,
                        };
                        await _updateBufferDispatcher.UpdateBufferAsync(request);
                    }
                    else if (isCompileItem)
                    {
                        // Force update the OmniSharp Workspace for component declaration changes.
                        var request = new UpdateBufferRequest()
                        {
                            FileName = componentDeclarationLocation,
                            FromDisk = true,
                        };
                        await _updateBufferDispatcher.UpdateBufferAsync(request);
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError("Unexpected error when updating workspace representation of '" + documentChangeInfo.FilePath + "': " + ex);
                }
            }

            OnRefreshWorkCompleting();
        }
コード例 #6
0
        private async Task <CompletionResponse> FindCompletionsAsync(string filename, string source, OmniSharpTestHost host, char?triggerChar = null, TestFile[] additionalFiles = null)
        {
            var testFile = new TestFile(filename, source);

            var files = new[] { testFile };

            if (additionalFiles is object)
            {
                files = files.Concat(additionalFiles).ToArray();
            }

            host.AddFilesToWorkspace(files);
            var point = testFile.Content.GetPointFromPosition();

            var request = new CompletionRequest
            {
                Line              = point.Line,
                Column            = point.Offset,
                FileName          = testFile.FileName,
                Buffer            = testFile.Content.Code,
                CompletionTrigger = triggerChar is object?CompletionTriggerKind.TriggerCharacter : CompletionTriggerKind.Invoked,
                TriggerCharacter  = triggerChar
            };

            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));
        }
コード例 #7
0
        private async Task <RunCodeActionResponse> RunRefactoringsAsync(string code, string identifier)
        {
            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"), code);
                    var requestHandler = GetRunCodeActionsHandler(host);

                    var span  = testFile.Content.GetSpans().Single();
                    var range = testFile.Content.GetRangeFromSpan(span);

                    var request = new RunCodeActionRequest
                    {
                        Line                         = range.Start.Line,
                        Column                       = range.Start.Offset,
                        Selection                    = GetSelection(range),
                        FileName                     = testFile.FileName,
                        Buffer                       = testFile.Content.Code,
                        Identifier                   = identifier,
                        WantsTextChanges             = true,
                        WantsAllCodeActionOperations = true
                    };

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

                    await GetUpdateBufferHandler(host).Handle(updateBufferRequest);

                    return(await requestHandler.Handle(request));
                }
        }
コード例 #8
0
        private async Task <IEnumerable <OmniSharpCodeAction> > FindRefactoringsAsync(string code)
        {
            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"), code);
                    var requestHandler = GetGetCodeActionsHandler(host);

                    var span  = testFile.Content.GetSpans().Single();
                    var range = testFile.Content.GetRangeFromSpan(span);

                    var request = new GetCodeActionsRequest
                    {
                        Line      = range.Start.Line,
                        Column    = range.Start.Offset,
                        FileName  = testFile.FileName,
                        Buffer    = testFile.Content.Code,
                        Selection = GetSelection(range),
                    };

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

                    await GetUpdateBufferHandler(host).Handle(updateBufferRequest);

                    var response = await requestHandler.Handle(request);

                    return(response.CodeActions);
                }
        }
コード例 #9
0
        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));
                }
        }
コード例 #10
0
        public async Task <ObjectResult> UpdateBuffer(UpdateBufferRequest request)
        {
            await _workspace.BufferManager.UpdateBuffer(request);

            return(new ObjectResult(true));
        }
コード例 #11
0
        public async Task ShouldSupportIncrementalChanges()
        {
            using (var testProject = await TestAssets.Instance.GetTestProjectAsync("CakeProject", shadowCopy: false))
                using (var host = CreateOmniSharpHost(testProject.Directory))
                {
                    var fileName = Path.Combine(testProject.Directory, "build.cake");

                    var updateBufferRequest = new UpdateBufferRequest
                    {
                        FileName = fileName,
                        Buffer   = CakeBuildSrc,
                        FromDisk = false
                    };
                    await GetUpdateBufferHandler(host).Handle(updateBufferRequest);

                    updateBufferRequest = new UpdateBufferRequest
                    {
                        FileName = fileName,
                        FromDisk = false,
                        Changes  = new[]
                        {
                            new LinePositionSpanTextChange
                            {
                                StartLine   = 0,
                                StartColumn = 33,
                                EndLine     = 0,
                                EndColumn   = 40,
                                NewText     = "Foobar"
                            },
                            new LinePositionSpanTextChange
                            {
                                StartLine   = 2,
                                StartColumn = 6,
                                EndLine     = 2,
                                EndColumn   = 13,
                                NewText     = "Foobar"
                            },
                            new LinePositionSpanTextChange
                            {
                                StartLine   = 5,
                                StartColumn = 2,
                                EndLine     = 5,
                                EndColumn   = 13,
                                NewText     = "Verbose"
                            }
                        }
                    };
                    await GetUpdateBufferHandler(host).Handle(updateBufferRequest);

                    var sourceText = await host.Workspace.GetDocument(fileName).GetTextAsync();

                    var fullPath   = Path.GetFullPath(fileName).Replace('\\', '/');
                    var startIndex = 0;
                    for (var i = sourceText.Lines.Count - 1; i >= 0; i--)
                    {
                        var text = sourceText.Lines[i].ToString();

                        if (text.Equals($"#line 1 \"{fullPath}\"", StringComparison.OrdinalIgnoreCase))
                        {
                            startIndex = i + 1;
                            break;
                        }
                    }

                    var expectedLines = CakeBuildModified.Split('\n').ToList();
                    for (var i = 0; i < expectedLines.Count; i++)
                    {
                        Assert.Equal(sourceText.Lines[startIndex + i].ToString(), expectedLines[i].TrimEnd('\r', '\n'));
                    }
                }
        }