Skip to content

Commit 79b1056

Browse files
Added proposed features from lsp 3.16 (#230)
* Switched from longs to ints when handling document lines and columns * Added proposed features from lsp 3.16 * Updated capabilities to include the ability to inspect handler descriptors * Added IStringEnumLike to deal with strongly typed strings that behave like enums but can be extended with other values based on clients * Added DocumentUri class to replace usage of Uri. It supports conversion from file system like paths (windows and unix), uri strings (scheme://...) and Uri. In addition it manages the funny serialization that VSCode does in regards to : on windows file systems. Co-authored-by: Tyler James Leonhardt <[email protected]>
1 parent 91f7859 commit 79b1056

File tree

173 files changed

+4405
-1124
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

173 files changed

+4405
-1124
lines changed

Directory.Build.targets

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,43 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project>
3-
<ItemGroup>
4-
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
5-
<PackageReference Include="Rocket.Surgery.MSBuild.SourceLink" Version="0.3.1" PrivateAssets="All" />
6-
</ItemGroup>
7-
<ItemGroup>
8-
<PackageReference Update="GitVersion.Tool" Version="5.2.4" />
9-
<PackageReference Update="JetBrains.ReSharper.CommandLineTools" Version="2019.3.4" />
10-
<PackageReference Update="Nuke.Common" Version="0.24.4" />
11-
<PackageReference Update="ReportGenerator" Version="4.5.2" />
12-
<PackageReference Update="Rocket.Surgery.Nuke.DotNetCore" Version="0.13.4" />
13-
</ItemGroup>
14-
<ItemGroup>
15-
<PackageReference Update="Microsoft.Extensions.Logging" Version="3.1.0" />
16-
<PackageReference Update="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" />
17-
<PackageReference Update="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
18-
<PackageReference Update="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.0" />
19-
<PackageReference Update="Microsoft.Extensions.Configuration" Version="3.1.0" />
20-
<PackageReference Update="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
21-
<PackageReference Update="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.0" />
22-
<PackageReference Update="Newtonsoft.Json" Version="11.0.2" />
23-
<PackageReference Update="Microsoft.NET.Test.Sdk" Version="16.5.0" />
24-
<PackageReference Update="xunit.runner.visualstudio" Version="2.4.1" />
25-
<PackageReference Update="xunit" Version="2.4.1" />
26-
<PackageReference Update="FluentAssertions" Version="5.10.2" />
27-
<PackageReference Update="NSubstitute" Version="4.2.1" />
28-
<PackageReference Update="Autofac" Version="4.8.1" />
29-
<PackageReference Update="Autofac.Extensions.DependencyInjection" Version="4.3.1" />
30-
<PackageReference Update="Serilog.Extensions.Logging" Version="2.0.2" />
31-
<PackageReference Update="Serilog.Sinks.XUnit" Version="1.0.21" />
32-
<PackageReference Update="XunitXml.TestLogger" Version="2.1.26" />
33-
<PackageReference Update="coverlet.collector" Version="1.2.0" />
34-
<PackageReference Update="coverlet.msbuild" Version="2.8.0" />
35-
<PackageReference Update="System.Reactive" Version="4.3.2" />
36-
<PackageReference Update="Microsoft.Reactive.Testing" Version="4.3.2" />
37-
<PackageReference Update="MediatR" Version="8.0.1" />
38-
<PackageReference Update="MediatR.Extensions.Microsoft.DependencyInjection" Version="8.0.0" />
39-
</ItemGroup>
3+
<ItemGroup>
4+
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All"/>
5+
<PackageReference Include="Rocket.Surgery.MSBuild.SourceLink" Version="0.3.1" PrivateAssets="All"/>
6+
</ItemGroup>
7+
<ItemGroup>
8+
<PackageReference Update="GitVersion.Tool" Version="5.2.4"/>
9+
<PackageReference Update="JetBrains.ReSharper.CommandLineTools" Version="2019.3.4"/>
10+
<PackageReference Update="Nuke.Common" Version="0.24.4"/>
11+
<PackageReference Update="ReportGenerator" Version="4.5.2"/>
12+
<PackageReference Update="Rocket.Surgery.Nuke.DotNetCore" Version="0.13.4"/>
13+
</ItemGroup>
14+
<ItemGroup>
15+
<PackageReference Update="Microsoft.Extensions.Logging" Version="3.1.0"/>
16+
<PackageReference Update="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0"/>
17+
<PackageReference Update="Microsoft.Extensions.Logging.Debug" Version="3.1.0"/>
18+
<PackageReference Update="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.0"/>
19+
<PackageReference Update="Microsoft.Extensions.Configuration" Version="3.1.0"/>
20+
<PackageReference Update="Microsoft.Extensions.DependencyInjection" Version="3.1.0"/>
21+
<PackageReference Update="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.0"/>
22+
<PackageReference Update="Newtonsoft.Json" Version="11.0.2"/>
23+
<PackageReference Update="Microsoft.NET.Test.Sdk" Version="16.5.0"/>
24+
<PackageReference Update="xunit.runner.visualstudio" Version="2.4.1"/>
25+
<PackageReference Update="xunit" Version="2.4.1"/>
26+
<PackageReference Update="FluentAssertions" Version="5.10.2"/>
27+
<PackageReference Update="NSubstitute" Version="4.2.1"/>
28+
<PackageReference Update="Autofac" Version="4.8.1"/>
29+
<PackageReference Update="Autofac.Extensions.DependencyInjection" Version="4.3.1"/>
30+
<PackageReference Update="Serilog.Extensions.Logging" Version="2.0.2"/>
31+
<PackageReference Update="Serilog.Sinks.XUnit" Version="1.0.21"/>
32+
<PackageReference Update="XunitXml.TestLogger" Version="2.1.26"/>
33+
<PackageReference Update="coverlet.collector" Version="1.2.0"/>
34+
<PackageReference Update="coverlet.msbuild" Version="2.8.0"/>
35+
<PackageReference Update="System.Reactive" Version="4.3.2"/>
36+
<PackageReference Update="Microsoft.Reactive.Testing" Version="4.3.2"/>
37+
<PackageReference Update="MediatR" Version="8.0.1"/>
38+
<PackageReference Update="MediatR.Extensions.Microsoft.DependencyInjection" Version="8.0.0"/>
39+
<PackageReference Update="Bogus" Version="29.0.1"/>
40+
<PackageReference Update="Snapper" Version="2.2.4"/>
41+
<PackageReference Update="Xunit.SkippableFact" Version="1.4.8" />
42+
</ItemGroup>
4043
</Project>

sample/SampleServer/Program.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,12 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Diagnostics;
4-
using System.Globalization;
5-
using System.Linq;
6-
using System.Threading;
72
using System.Threading.Tasks;
8-
using MediatR;
93
using Microsoft.Extensions.Configuration;
104
using Microsoft.Extensions.DependencyInjection;
115
using Microsoft.Extensions.Logging;
12-
using Newtonsoft.Json;
136
using Newtonsoft.Json.Linq;
14-
using OmniSharp.Extensions.LanguageServer;
15-
using OmniSharp.Extensions.LanguageServer.Protocol.Client;
16-
using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities;
177
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
18-
using OmniSharp.Extensions.LanguageServer.Protocol.Server;
198
using OmniSharp.Extensions.LanguageServer.Server;
209
using Serilog;
21-
using ILanguageServer = OmniSharp.Extensions.LanguageServer.Server.ILanguageServer;
2210

2311
namespace SampleServer
2412
{
@@ -60,6 +48,7 @@ static async Task MainAsync(string[] args)
6048
.WithHandler<FoldingRangeHandler>()
6149
.WithHandler<MyWorkspaceSymbolsHandler>()
6250
.WithHandler<MyDocumentSymbolHandler>()
51+
.WithHandler<SemanticTokens>()
6352
.WithServices(x => x.AddLogging(b => b.SetMinimumLevel(LogLevel.Trace)))
6453
.WithServices(services => {
6554
services.AddSingleton(provider => {

sample/SampleServer/SemanticTokens.cs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Microsoft.Extensions.Logging;
8+
using Newtonsoft.Json;
9+
using OmniSharp.Extensions.LanguageServer.Protocol;
10+
using OmniSharp.Extensions.LanguageServer.Protocol.Document.Server.Proposals;
11+
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
12+
using OmniSharp.Extensions.LanguageServer.Protocol.Models.Proposals;
13+
14+
namespace SampleServer
15+
{
16+
#pragma warning disable 618
17+
public class SemanticTokens : SemanticTokensHandler
18+
{
19+
private readonly ILogger _logger;
20+
21+
public SemanticTokens(ILogger<SemanticTokens> logger) : base(new SemanticTokensRegistrationOptions() {
22+
DocumentSelector = DocumentSelector.ForLanguage("csharp"),
23+
Legend = new SemanticTokensLegend(),
24+
DocumentProvider = new Supports<SemanticTokensDocumentProviderOptions>(true,
25+
new SemanticTokensDocumentProviderOptions() {
26+
Edits = true
27+
}),
28+
RangeProvider = true
29+
})
30+
{
31+
_logger = logger;
32+
}
33+
34+
public override async Task<OmniSharp.Extensions.LanguageServer.Protocol.Models.Proposals.SemanticTokens> Handle(
35+
SemanticTokensParams request, CancellationToken cancellationToken)
36+
{
37+
var result = await base.Handle(request, cancellationToken);
38+
_logger.LogInformation(JsonConvert.SerializeObject(result));
39+
return result;
40+
}
41+
42+
public override async Task<OmniSharp.Extensions.LanguageServer.Protocol.Models.Proposals.SemanticTokens> Handle(
43+
SemanticTokensRangeParams request, CancellationToken cancellationToken)
44+
{
45+
var result = await base.Handle(request, cancellationToken);
46+
_logger.LogInformation(JsonConvert.SerializeObject(result));
47+
return result;
48+
}
49+
50+
public override async Task<SemanticTokensOrSemanticTokensEdits> Handle(SemanticTokensEditsParams request,
51+
CancellationToken cancellationToken)
52+
{
53+
var result = await base.Handle(request, cancellationToken);
54+
_logger.LogInformation(JsonConvert.SerializeObject(result));
55+
return result;
56+
}
57+
58+
protected override async Task Tokenize(SemanticTokensBuilder builder, ITextDocumentIdentifierParams identifier,
59+
CancellationToken cancellationToken)
60+
{
61+
using var typesEnumerator = RotateEnum(SemanticTokenType.Defaults).GetEnumerator();
62+
using var modifiersEnumerator = RotateEnum(SemanticTokenModifier.Defaults).GetEnumerator();
63+
// you would normally get this from a common source that is managed by current open editor, current active editor, etc.
64+
var content = await File.ReadAllTextAsync(DocumentUri.GetFileSystemPath(identifier), cancellationToken);
65+
await Task.Yield();
66+
67+
foreach (var (line, text) in content.Split('\n').Select((text, line) => (line, text)))
68+
{
69+
var parts = text.TrimEnd().Split(';', ' ', '.', '"', '(', ')');
70+
var index = 0;
71+
foreach (var part in parts)
72+
{
73+
typesEnumerator.MoveNext();
74+
modifiersEnumerator.MoveNext();
75+
if (string.IsNullOrWhiteSpace(part)) continue;
76+
index = text.IndexOf(part, index, StringComparison.Ordinal);
77+
builder.Push(line, index, part.Length, typesEnumerator.Current, modifiersEnumerator.Current);
78+
}
79+
}
80+
}
81+
82+
protected override Task<SemanticTokensDocument>
83+
GetSemanticTokensDocument(ITextDocumentIdentifierParams @params, CancellationToken cancellationToken)
84+
{
85+
return Task.FromResult(new SemanticTokensDocument(GetRegistrationOptions().Legend));
86+
}
87+
88+
89+
private IEnumerable<T> RotateEnum<T>(IEnumerable<T> values)
90+
{
91+
while (true)
92+
{
93+
foreach (var item in values)
94+
yield return item;
95+
}
96+
}
97+
}
98+
#pragma warning restore 618
99+
}

0 commit comments

Comments
 (0)