1
1
using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Diagnostics ;
4
+ using System . Globalization ;
5
+ using System . Linq ;
6
+ using System . Threading ;
3
7
using System . Threading . Tasks ;
8
+ using MediatR ;
9
+ using Microsoft . Extensions . Configuration ;
4
10
using Microsoft . Extensions . DependencyInjection ;
5
11
using Microsoft . Extensions . Logging ;
12
+ using Newtonsoft . Json ;
13
+ using Newtonsoft . Json . Linq ;
6
14
using OmniSharp . Extensions . LanguageServer ;
15
+ using OmniSharp . Extensions . LanguageServer . Protocol . Client ;
16
+ using OmniSharp . Extensions . LanguageServer . Protocol . Client . Capabilities ;
17
+ using OmniSharp . Extensions . LanguageServer . Protocol . Models ;
7
18
using OmniSharp . Extensions . LanguageServer . Protocol . Server ;
8
19
using OmniSharp . Extensions . LanguageServer . Server ;
9
20
using Serilog ;
21
+ using ILanguageServer = OmniSharp . Extensions . LanguageServer . Server . ILanguageServer ;
10
22
11
23
namespace SampleServer
12
24
{
@@ -19,20 +31,22 @@ static void Main(string[] args)
19
31
20
32
static async Task MainAsync ( string [ ] args )
21
33
{
22
- //Debugger.Launch();
23
- //while (!System.Diagnostics.Debugger.IsAttached)
24
- //{
25
- // await Task.Delay(100);
26
- //}
34
+ // Debugger.Launch();
35
+ // while (!System.Diagnostics.Debugger.IsAttached)
36
+ // {
37
+ // await Task.Delay(100);
38
+ // }
27
39
28
40
Log . Logger = new LoggerConfiguration ( )
29
- . Enrich . FromLogContext ( )
30
- . WriteTo . File ( "log.txt" , rollingInterval : RollingInterval . Day )
41
+ . Enrich . FromLogContext ( )
42
+ . WriteTo . File ( "log.txt" , rollingInterval : RollingInterval . Day )
31
43
. MinimumLevel . Verbose ( )
32
44
. CreateLogger ( ) ;
33
45
34
46
Log . Logger . Information ( "This only goes file..." ) ;
35
47
48
+ IObserver < WorkDoneProgressReport > workDone = null ;
49
+
36
50
var server = await LanguageServer . From ( options =>
37
51
options
38
52
. WithInput ( Console . OpenStandardInput ( ) )
@@ -47,25 +61,82 @@ static async Task MainAsync(string[] args)
47
61
. WithHandler < MyWorkspaceSymbolsHandler > ( )
48
62
. WithHandler < MyDocumentSymbolHandler > ( )
49
63
. WithServices ( x => x . AddLogging ( b => b . SetMinimumLevel ( LogLevel . Trace ) ) )
50
- . WithServices ( services =>
51
- {
52
- services . AddSingleton < Foo > ( provider =>
53
- {
64
+ . WithServices ( services => {
65
+ services . AddSingleton ( provider => {
54
66
var loggerFactory = provider . GetService < ILoggerFactory > ( ) ;
55
67
var logger = loggerFactory . CreateLogger < Foo > ( ) ;
56
68
57
69
logger . LogInformation ( "Configuring" ) ;
58
70
59
71
return new Foo ( logger ) ;
60
72
} ) ;
61
- } ) . OnInitialize ( ( s , request ) =>
62
- {
63
- var serviceProvider = s . Services ;
64
- var foo = serviceProvider . GetService < Foo > ( ) ;
73
+ services . AddSingleton ( new ConfigurationItem ( ) {
74
+ Section = "typescript" ,
75
+ } ) . AddSingleton ( new ConfigurationItem ( ) {
76
+ Section = "terminal" ,
77
+ } ) ;
78
+ } )
79
+ . OnInitialize ( new InitializeDelegate ( async ( server , request ) => {
80
+ var manager = server . ProgressManager . WorkDone ( request , new WorkDoneProgressBegin ( ) {
81
+ Title = "Server is starting..." ,
82
+ Percentage = 10 ,
83
+ } ) ;
84
+ workDone = manager ;
85
+
86
+ await Task . Delay ( 2000 ) ;
87
+
88
+ manager . OnNext ( new WorkDoneProgressReport ( ) {
89
+ Percentage = 20 ,
90
+ Message = "loading in progress"
91
+ } ) ;
92
+ } ) )
93
+ . OnInitialized ( new InitializedDelegate ( async ( server , request , response ) => {
94
+ workDone . OnNext ( new WorkDoneProgressReport ( ) {
95
+ Percentage = 40 ,
96
+ Message = "loading almost done" ,
97
+ } ) ;
98
+
99
+ await Task . Delay ( 2000 ) ;
100
+
101
+ workDone . OnNext ( new WorkDoneProgressReport ( ) {
102
+ Message = "loading done" ,
103
+ Percentage = 100 ,
104
+ } ) ;
105
+ } ) )
106
+ . OnStarted ( async ( languageServer , result ) => {
107
+ using var manager = await languageServer . ProgressManager . Create ( new WorkDoneProgressBegin ( ) { Title = "Doing some work..." } ) ;
108
+
109
+ manager . OnNext ( new WorkDoneProgressReport ( ) { Message = "doing things..." } ) ;
110
+ await Task . Delay ( 10000 ) ;
111
+ manager . OnNext ( new WorkDoneProgressReport ( ) { Message = "doing things... 1234" } ) ;
112
+ await Task . Delay ( 10000 ) ;
113
+ manager . OnNext ( new WorkDoneProgressReport ( ) { Message = "doing things... 56789" } ) ;
114
+
115
+ var logger = languageServer . Services . GetService < ILogger < Foo > > ( ) ;
116
+ var configuration = await languageServer . Configuration . GetConfiguration (
117
+ new ConfigurationItem ( ) {
118
+ Section = "typescript" ,
119
+ } , new ConfigurationItem ( ) {
120
+ Section = "terminal" ,
121
+ } ) ;
122
+
123
+ var baseConfig = new JObject ( ) ;
124
+ foreach ( var config in languageServer . Configuration . AsEnumerable ( ) )
125
+ {
126
+ baseConfig . Add ( config . Key , config . Value ) ;
127
+ }
128
+
129
+ logger . LogInformation ( "Base Config: {Config}" , baseConfig ) ;
130
+
131
+ var scopedConfig = new JObject ( ) ;
132
+ foreach ( var config in configuration . AsEnumerable ( ) )
133
+ {
134
+ scopedConfig . Add ( config . Key , config . Value ) ;
135
+ }
65
136
66
- return Task . CompletedTask ;
137
+ logger . LogInformation ( "Scoped Config: {Config}" , scopedConfig ) ;
67
138
} )
68
- ) ;
139
+ ) ;
69
140
70
141
await server . WaitForExit ;
71
142
}
0 commit comments