@@ -29,6 +29,7 @@ var HashHandler = require("ace/keyboard/hash_handler").HashHandler;
29
29
30
30
var Renderer = require ( "ace/virtual_renderer" ) . VirtualRenderer ;
31
31
var Editor = require ( "ace/editor" ) . Editor ;
32
+ var Range = require ( "ace/range" ) . Range ;
32
33
33
34
var whitespace = require ( "ace/ext/whitespace" ) ;
34
35
@@ -44,7 +45,6 @@ var ElasticTabstopsLite = require("ace/ext/elastic_tabstops_lite").ElasticTabsto
44
45
45
46
var IncrementalSearch = require ( "ace/incremental_search" ) . IncrementalSearch ;
46
47
47
-
48
48
var TokenTooltip = require ( "./token_tooltip" ) . TokenTooltip ;
49
49
require ( "ace/config" ) . defineOptions ( Editor . prototype , "editor" , {
50
50
showTokenInfo : {
@@ -61,7 +61,7 @@ require("ace/config").defineOptions(Editor.prototype, "editor", {
61
61
return ! ! this . tokenTooltip ;
62
62
} ,
63
63
handlesSet : true
64
- } ,
64
+ }
65
65
} ) ;
66
66
67
67
require ( "ace/config" ) . defineOptions ( Editor . prototype , "editor" , {
@@ -80,30 +80,110 @@ require("ace/config").defineOptions(Editor.prototype, "editor", {
80
80
} ) ;
81
81
82
82
var { HoverTooltip} = require ( "ace/tooltip" ) ;
83
+ var MarkerGroup = require ( "ace/marker_group" ) . MarkerGroup ;
83
84
var docTooltip = new HoverTooltip ( ) ;
84
85
function loadLanguageProvider ( editor ) {
85
86
require ( [
86
87
"https://www.unpkg.com/ace-linters/build/ace-linters.js"
87
- ] , ( m ) => {
88
- window . languageProvider = m . LanguageProvider . fromCdn ( "https://www.unpkg.com/ace-linters/build" ) ;
89
- window . languageProvider . registerEditor ( editor ) ;
88
+ ] , function ( m ) {
89
+ var languageProvider = m . LanguageProvider . fromCdn ( "https://www.unpkg.com/ace-linters/build" , {
90
+ functionality : {
91
+ hover : true ,
92
+ completion : {
93
+ overwriteCompleters : true
94
+ } ,
95
+ completionResolve : true ,
96
+ format : true ,
97
+ documentHighlights : true ,
98
+ signatureHelp : false
99
+ }
100
+ } ) ;
101
+ window . languageProvider = languageProvider ;
102
+ languageProvider . registerEditor ( editor ) ;
103
+ // hack to replace tooltip implementation from ace-linters with hover tooltip
104
+ // can be removed when ace-linters is updated to use MarkerGroup and HoverTooltip
90
105
if ( languageProvider . $descriptionTooltip )
91
106
editor . off ( "mousemove" , languageProvider . $descriptionTooltip . onMouseMove ) ;
92
-
107
+ languageProvider . $messageController . $worker . addEventListener ( "message" , function ( e ) {
108
+ var id = e . data . sessionId . split ( "." ) [ 0 ] ;
109
+ var session = languageProvider . $getSessionLanguageProvider ( { id : id } ) ?. session ;
110
+ if ( e . data . type == 6 ) {
111
+ // annotation message
112
+ e . stopPropagation ( ) ;
113
+ if ( session ) {
114
+ showAnnotations ( session , e . data . value ) ;
115
+ }
116
+ } else if ( e . data . type == 13 ) {
117
+ // highlights message
118
+ if ( session ) showOccurrenceMarkers ( session , e . data . value ) ;
119
+ }
120
+ } , true ) ;
121
+ function showOccurrenceMarkers ( session , positions ) {
122
+ if ( ! session . state . occurrenceMarkers ) {
123
+ session . state . occurrenceMarkers = new MarkerGroup ( session ) ;
124
+ }
125
+ session . state . occurrenceMarkers . setMarkers ( positions . map ( function ( el ) {
126
+ var r = el . range ;
127
+ return {
128
+ range : new Range ( r . start . line , r . start . character , r . end . line , r . end . character ) ,
129
+ // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#documentHighlightKind
130
+ className : el . kind == 2
131
+ ? "language_highlight_read"
132
+ : el . kind == 3
133
+ ? "language_highlight_write"
134
+ : "language_highlight_text"
135
+ } ;
136
+ } ) ) ;
137
+ }
138
+ function showAnnotations ( session , diagnostics ) {
139
+ session . clearAnnotations ( ) ;
140
+ let annotations = diagnostics . map ( ( el ) => {
141
+ console . log ( el . severity , el )
142
+ return {
143
+ row : el . range . start . line ,
144
+ column : el . range . start . character ,
145
+ text : el . message ,
146
+ type : el . severity === 1 ? "error" : el . severity === 2 ? "warning" : "info"
147
+ } ;
148
+ } ) ;
149
+ if ( annotations && annotations . length > 0 ) {
150
+ session . setAnnotations ( annotations ) ;
151
+ }
152
+
153
+ if ( ! session . state ) session . state = { }
154
+ if ( ! session . state . diagnosticMarkers ) {
155
+ session . state . diagnosticMarkers = new MarkerGroup ( session ) ;
156
+ }
157
+ session . state . diagnosticMarkers . setMarkers ( diagnostics . map ( function ( el ) {
158
+ var r = el . range ;
159
+ return {
160
+ range : new Range ( r . start . line , r . start . character , r . end . line , r . end . character ) ,
161
+ tooltipText : el . message ,
162
+ className : "language_highlight_error"
163
+ } ;
164
+ } ) ) ;
165
+ } ;
93
166
94
167
docTooltip . setDataProvider ( function ( e , editor ) {
95
- var renderer = editor . renderer ;
96
-
97
168
let session = editor . session ;
98
- let docPos = e . getDocumentPosition ( ) ;
169
+ let docPos = e . getDocumentPosition ( ) ;
99
170
100
171
languageProvider . doHover ( session , docPos , function ( hover ) {
101
- if ( ! hover ) {
102
- return ;
103
- }
104
- // todo should ace itself handle markdown?
105
- var domNode = dom . buildDom ( [ "p" , { } , hover . content . text ] ) ;
106
- docTooltip . showForRange ( editor , hover . range , domNode , e ) ;
172
+ var errorMarker = session . state ?. diagnosticMarkers . getMarkerAtPosition ( docPos ) ;
173
+ var range = hover ?. range || errorMarker ?. range ;
174
+ if ( ! range ) return ;
175
+ var hoverNode = hover && dom . buildDom ( [ "div" , { } ] )
176
+ if ( hoverNode ) {
177
+ hover . content . text = hover . content . text . replace ( / (? ! ^ ) ` { 3 } / gm, "\n$&" ) ;
178
+ // todo render markdown using ace markdown mode
179
+ hoverNode . innerHTML = languageProvider . getTooltipText ( hover ) ;
180
+ } ;
181
+
182
+ var domNode = dom . buildDom ( [ "div" , { } ,
183
+ errorMarker && [ "div" , { } , errorMarker . tooltipText . trim ( ) ] ,
184
+ hoverNode
185
+ ] ) ;
186
+ docTooltip . showForRange ( editor , range , domNode , e ) ;
107
187
} ) ;
108
188
} ) ;
109
189
0 commit comments