1
- import * as pl from '@pivot-lang/pivot-lang' ;
1
+ // import * as pl from '@pivot-lang/pivot-lang';
2
2
import * as monaco from 'monaco-editor' ;
3
3
import * as tp from 'vscode-languageserver-types' ;
4
- import monacotp from 'monaco-editor ' ;
4
+ import wrapper from './workerWrapper ' ;
5
5
6
6
interface Diagnostic {
7
7
code : number ;
@@ -41,12 +41,17 @@ export class PlMonaco {
41
41
suggestOnTriggerCharacters : true ,
42
42
model : this . model ,
43
43
} ) ;
44
- initializeEditor ( this . editor , code , uri ) ;
44
+ this . code = code ;
45
45
this . uri = uri ;
46
46
}
47
47
private uri : string ;
48
48
editor : monaco . editor . IStandaloneCodeEditor ;
49
49
private model : monaco . editor . ITextModel ;
50
+ private code : string ;
51
+
52
+ async initialize ( ) {
53
+ await initializeEditor ( this . editor , this . code , this . uri ) ;
54
+ }
50
55
setContent ( code : string ) {
51
56
this . editor . revealLine ( 0 ) ;
52
57
this . model . applyEdits ( [ {
@@ -59,9 +64,11 @@ export class PlMonaco {
59
64
// 暂不支持同时创建多个Monaco的DOM
60
65
let created = false ;
61
66
let plMonaco : PlMonaco ;
62
- export default function createPlMonaco ( container : HTMLElement , code : string = '' ) {
67
+ export default async function createPlMonaco ( container : HTMLElement , code : string = '' ) {
63
68
if ( ! created ) {
69
+ legend = await wrapper . get_legend ( ) ;
64
70
plMonaco = new PlMonaco ( container , code , `http://www.test.com/main.pi` ) ;
71
+ await plMonaco . initialize ( ) ;
65
72
created = true ;
66
73
}
67
74
return plMonaco ;
@@ -71,35 +78,35 @@ export default function createPlMonaco(container: HTMLElement, code: string = ''
71
78
let first = true ;
72
79
function initializeDocumentSemanticTokensProvider ( ) {
73
80
monaco . languages . registerDocumentSemanticTokensProvider ( 'pivot-lang' , {
74
- provideDocumentSemanticTokens : ( m , id , token ) => {
81
+ provideDocumentSemanticTokens : async ( m , id , token ) => {
75
82
if ( first ) {
76
83
first = false ;
77
- let tokens = pl . get_semantic_tokens_full ( ) ;
84
+ let tokens = await wrapper . get_semantic_tokens_full ( ) ;
78
85
// console.log(tokens);
79
86
let a : any = {
80
87
resultId : null ,
81
- data : JSON . parse ( tokens ) . data ,
88
+ data : tokens . data ,
82
89
} ;
83
90
return a ;
84
91
}
85
- let tokens = pl . get_semantic_tokens ( ) ;
92
+ let tokens = await wrapper . get_semantic_tokens ( ) ;
86
93
// console.error(tokens);
87
94
return {
88
95
resultId : null ,
89
- edits : JSON . parse ( tokens ) . edits ,
96
+ edits : tokens . edits ,
90
97
} ;
91
98
} ,
92
99
getLegend : ( ) => {
93
- let legend = pl . get_legend ( ) ;
94
- // console.error(legend);
95
- return JSON . parse ( legend ) ;
100
+ return legend ;
96
101
} ,
97
- releaseDocumentSemanticTokens : ( ) => { } ,
102
+ releaseDocumentSemanticTokens : ( ) => { } ,
98
103
} ) ;
99
104
}
100
105
101
- function initializeEditor ( editor : monaco . editor . IStandaloneCodeEditor , code : string , uri : string ) {
102
- let resp : Diags = JSON . parse ( pl . set_init_content ( code ) ) ;
106
+ let legend : monaco . languages . SemanticTokensLegend ;
107
+
108
+ async function initializeEditor ( editor : monaco . editor . IStandaloneCodeEditor , code : string , uri : string ) {
109
+ let resp : Diags = await wrapper . set_init_content ( code ) ;
103
110
let markers = resp . diagnostics . map ( ( d , n , a ) => {
104
111
let sev = monaco . MarkerSeverity . Warning ;
105
112
if ( d . severity === 1 ) {
@@ -115,25 +122,24 @@ function initializeEditor(editor: monaco.editor.IStandaloneCodeEditor, code: str
115
122
} ;
116
123
} ) ;
117
124
monaco . editor . setModelMarkers ( editor . getModel ( ) ! , 'pivot-lang' , markers ) ;
118
- editor . getModel ( ) ?. onDidChangeContent ( ( e ) => {
125
+ editor . getModel ( ) ?. onDidChangeContent ( async ( e ) => {
119
126
let re = e . changes . map ( ( change ) => {
120
127
return {
121
128
range : tp . Range . create ( change . range . startLineNumber - 1 , change . range . startColumn - 1 , change . range . endLineNumber - 1 , change . range . endColumn - 1 ) ,
122
129
text : change . text ,
123
130
rangeLength : change . rangeLength ,
124
131
} ;
125
132
} ) ;
126
- let resp : Diags = JSON . parse (
127
- pl . on_change_doc (
133
+ let resp : Diags = await
134
+ wrapper . on_change_doc (
128
135
JSON . stringify ( {
129
136
textDocument : {
130
137
version : 0 ,
131
138
uri,
132
139
} ,
133
140
contentChanges : re ,
134
141
} )
135
- )
136
- ) ;
142
+ ) ;
137
143
// console.log(resp);
138
144
139
145
let markers = resp . diagnostics . map ( ( d , n , a ) => {
@@ -199,19 +205,19 @@ function initializeMonaco() {
199
205
} ) ;
200
206
201
207
enum colorType {
202
- chalky = '#E5C07B' ,
203
- coral = '#e06c75' ,
204
- dark = '#5c6370' ,
205
- error = '#f44747' ,
206
- fountainBlue = '#56b6c2' ,
207
- green = '#98c379' ,
208
- invalid = '#ffffff' ,
209
- lightDark = '#7f848e' ,
210
- lightWhite = '#abb2bf' ,
211
- malibu = '#61afef' ,
212
- purple = '#c678dd' ,
213
- whiskey = '#d19a66' ,
214
- deepRed = '#BE5046' ,
208
+ chalky = '#E5C07B' ,
209
+ coral = '#e06c75' ,
210
+ dark = '#5c6370' ,
211
+ error = '#f44747' ,
212
+ fountainBlue = '#56b6c2' ,
213
+ green = '#98c379' ,
214
+ invalid = '#ffffff' ,
215
+ lightDark = '#7f848e' ,
216
+ lightWhite = '#abb2bf' ,
217
+ malibu = '#61afef' ,
218
+ purple = '#c678dd' ,
219
+ whiskey = '#d19a66' ,
220
+ deepRed = '#BE5046' ,
215
221
}
216
222
// Define a new theme that contains only rules that match this language
217
223
monaco . editor . defineTheme ( 'pltheme' , {
@@ -247,38 +253,48 @@ function initializeMonaco() {
247
253
} ) ;
248
254
249
255
monaco . languages . registerInlayHintsProvider ( 'pivot-lang' , {
250
- provideInlayHints ( model , range , token ) {
251
- // console.log(JSON.parse(pl.get_inlay_hints()))
252
- let hints : tp . InlayHint [ ] = JSON . parse ( pl . get_inlay_hints ( ) ) ;
256
+ provideInlayHints : async ( model , range , token ) => {
257
+ let hints : tp . InlayHint [ ] = await wrapper . get_inlay_hints ( ) ;
253
258
console . error ( hints ) ;
254
259
return {
255
260
hints : hints . map ( ( h ) => {
261
+ let label : string | monaco . languages . InlayHintLabelPart [ ] ;
262
+ if ( typeof h . label === 'string' ) {
263
+ label = h . label ;
264
+ } else {
265
+ label = h . label . map ( ( l ) => {
266
+ return {
267
+ label : l . value ,
268
+ tooltip : l . tooltip ,
269
+ } ;
270
+ } ) ;
271
+ }
256
272
return {
257
273
kind : h . kind ,
258
- label : h . label ,
274
+ label : label ,
259
275
position : {
260
276
lineNumber : h . position . line + 1 ,
261
277
column : h . position . character + 1 ,
262
278
} ,
263
279
} ;
264
280
} ) ,
265
- dispose : ( ) => { } ,
266
- } as any ;
281
+ dispose : ( ) => { } ,
282
+ } as monaco . languages . InlayHintList ;
267
283
} ,
268
284
} ) ;
269
285
270
286
// Register a completion item provider for the new language
271
287
monaco . languages . registerCompletionItemProvider ( 'pivot-lang' , {
272
288
triggerCharacters : [ '.' , ':' ] ,
273
- provideCompletionItems : ( model , position , ctx ) => {
289
+ provideCompletionItems : async ( model , position , ctx ) => {
274
290
var word = model . getWordUntilPosition ( position ) ;
275
291
var range = {
276
292
startLineNumber : position . lineNumber ,
277
293
endLineNumber : position . lineNumber ,
278
294
startColumn : word . startColumn ,
279
295
endColumn : word . endColumn ,
280
296
} ;
281
- let dynamic_suggestions = JSON . parse ( pl . get_completions ( ) ) ;
297
+ let dynamic_suggestions = await wrapper . get_completions ( ) ;
282
298
// console.warn(dynamic_suggestions);
283
299
for ( let sug of dynamic_suggestions ) {
284
300
sug . insertTextRules = 0 ;
@@ -287,7 +303,7 @@ function initializeMonaco() {
287
303
sug . kind = monaco . languages . CompletionItemKind . Keyword ;
288
304
break ;
289
305
case 3 :
290
-
306
+
291
307
sug . kind = monaco . languages . CompletionItemKind . Function ;
292
308
sug . insertTextRules = monaco . languages . CompletionItemInsertTextRule . InsertAsSnippet ;
293
309
break ;
@@ -407,15 +423,15 @@ function initializeMonaco() {
407
423
} ,
408
424
} ) ;
409
425
monaco . languages . registerDefinitionProvider ( 'pivot-lang' , {
410
- provideDefinition : ( model , position , token ) => {
411
- let re : tp . Location | any [ ] = JSON . parse (
412
- pl . go_to_def (
426
+ provideDefinition : async ( model , position , token ) => {
427
+ let re : tp . Location | any [ ] = await
428
+ wrapper . go_to_def (
413
429
JSON . stringify ( {
414
430
line : position . lineNumber - 1 ,
415
431
character : position . column - 1 ,
416
432
} )
417
433
)
418
- ) ;
434
+ ;
419
435
if ( re instanceof Array ) {
420
436
return [ ] ;
421
437
}
@@ -429,15 +445,14 @@ function initializeMonaco() {
429
445
} ,
430
446
} ) ;
431
447
monaco . languages . registerReferenceProvider ( 'pivot-lang' , {
432
- provideReferences : ( model , position , context , token ) => {
433
- let re : tp . Location [ ] = JSON . parse (
434
- pl . get_refs (
435
- JSON . stringify ( {
436
- line : position . lineNumber - 1 ,
437
- character : position . column - 1 ,
438
- } )
439
- )
440
- ) ;
448
+ provideReferences : async ( model , position , context , token ) => {
449
+ let re : tp . Location [ ] = await wrapper . get_refs (
450
+ JSON . stringify ( {
451
+ line : position . lineNumber - 1 ,
452
+ character : position . column - 1 ,
453
+ } )
454
+ )
455
+ ;
441
456
console . log ( re ) ;
442
457
let refs = re . map ( ( r , n , a ) => {
443
458
let uri = monaco . Uri . parse ( r . uri ) ;
0 commit comments