public async Task CompiledCode() { const string code = @" import os os.mkdir() "; var analysis = await GetAnalysisAsync(code); var hs = new HoverSource(new PlainTextDocumentationSource()); var hover = hs.GetHover(analysis, new SourceLocation(3, 6)); hover.contents.value.Should().Contain("Create a directory"); }
public async Task <Hover> Hover(TextDocumentPositionParams @params, CancellationToken cancellationToken) { var uri = @params.textDocument.uri; _log?.Log(TraceEventType.Verbose, $"Hover in {uri} at {@params.position}"); var analysis = await Document.GetAnalysisAsync(uri, Services, CompletionAnalysisTimeout, cancellationToken); if (analysis != null) { return(_hoverSource.GetHover(analysis, @params.position)); } return(null); }
public async Task BasicTypes() { const string code = @" x = 'str' class C: '''Class C is awesome''' def method(self, a:int, b) -> float: '''Returns a float!!!''' return 1.0 def func(a, b): '''Does nothing useful''' return 1 y = func(1, 2) string = str "; var analysis = await GetAnalysisAsync(code); var hs = new HoverSource(new PlainTextDocumentationSource()); var hover = hs.GetHover(analysis, new SourceLocation(2, 2)); hover.contents.value.Should().Be("x: str"); hover = hs.GetHover(analysis, new SourceLocation(2, 7)); hover.Should().BeNull(); hover = hs.GetHover(analysis, new SourceLocation(4, 7)); hover.contents.value.Should().Be("class C\n\nClass C is awesome"); hover = hs.GetHover(analysis, new SourceLocation(6, 9)); hover.contents.value.Should().Be("C.method(a: int, b) -> float\n\nReturns a float!!!"); hover = hs.GetHover(analysis, new SourceLocation(6, 22)); hover.contents.value.Should().Be("a: int"); hover = hs.GetHover(analysis, new SourceLocation(10, 7)); hover.contents.value.Should().Be("func(a, b)\n\nDoes nothing useful"); hover = hs.GetHover(analysis, new SourceLocation(14, 2)); hover.contents.value.Should().Be("y: int"); hover = hs.GetHover(analysis, new SourceLocation(15, 2)); hover.contents.value.Should().StartWith("class str\n\nstr(object='') -> str"); }
public async Task FStringExpressions() { const string code = @" some = '' f'{some' Fr'{some' f'{some}' f'hey {some}' "; var analysis = await GetAnalysisAsync(code); var hs = new HoverSource(new PlainTextDocumentationSource()); AssertHover(hs, analysis, new SourceLocation(3, 4), @"some: str", new SourceSpan(3, 4, 3, 8)); AssertHover(hs, analysis, new SourceLocation(4, 5), @"some: str", new SourceSpan(4, 5, 4, 9)); AssertHover(hs, analysis, new SourceLocation(5, 4), @"some: str", new SourceSpan(5, 4, 5, 8)); hs.GetHover(analysis, new SourceLocation(6, 3)).Should().BeNull(); AssertHover(hs, analysis, new SourceLocation(6, 8), @"some: str", new SourceSpan(6, 8, 6, 12)); }
private static void AssertHover(HoverSource hs, IDocumentAnalysis analysis, SourceLocation position, string hoverText, SourceSpan?span = null) { var hover = hs.GetHover(analysis, position); if (hoverText.EndsWith("*")) { // Check prefix first, but then show usual message for mismatched value if (!hover.contents.value.StartsWith(hoverText.Remove(hoverText.Length - 1))) { Assert.AreEqual(hoverText, hover.contents.value); } } else { Assert.AreEqual(hoverText, hover.contents.value); } if (span.HasValue) { hover.range.Should().Be((Range)span.Value); } }
private static void AssertNoHover(HoverSource hs, IDocumentAnalysis analysis, SourceLocation position) { var hover = hs.GetHover(analysis, position); hover.Should().BeNull(); }