1
1
#![ cfg( target_arch = "wasm32" ) ]
2
2
#![ allow( non_snake_case) ]
3
3
4
- use ra_ide_api:: {
5
- Analysis , CompletionItemKind , FileId , FilePosition , InsertTextFormat , LineCol , Severity ,
6
- } ;
7
- use ra_syntax:: { SyntaxKind , TextRange } ;
4
+ use ra_ide_api:: { Analysis , CompletionItemKind , FileId , FilePosition , InsertTextFormat , Severity } ;
5
+ use ra_syntax:: SyntaxKind ;
8
6
use wasm_bindgen:: prelude:: * ;
9
7
10
8
mod conv;
@@ -39,12 +37,14 @@ impl WorldState {
39
37
self . analysis = analysis;
40
38
self . file_id = file_id;
41
39
40
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
41
+
42
42
let highlights: Vec < _ > = self
43
43
. analysis
44
44
. highlight ( file_id)
45
45
. unwrap ( )
46
46
. into_iter ( )
47
- . map ( |hl| Highlight { tag : Some ( hl. tag ) , range : self . range ( hl. range ) } )
47
+ . map ( |hl| Highlight { tag : Some ( hl. tag ) , range : hl. range . conv_with ( & line_index ) } )
48
48
. collect ( ) ;
49
49
50
50
let diagnostics: Vec < _ > = self
@@ -54,7 +54,7 @@ impl WorldState {
54
54
. into_iter ( )
55
55
. map ( |d| {
56
56
let Range { startLineNumber, startColumn, endLineNumber, endColumn } =
57
- self . range ( d. range ) ;
57
+ d. range . conv_with ( & line_index ) ;
58
58
Diagnostic {
59
59
message : d. message ,
60
60
severity : match d. severity {
@@ -72,31 +72,11 @@ impl WorldState {
72
72
serde_wasm_bindgen:: to_value ( & UpdateResult { diagnostics, highlights } ) . unwrap ( )
73
73
}
74
74
75
- fn file_pos ( & self , line : u32 , col_utf16 : u32 ) -> FilePosition {
76
- // monaco doesn't work zero-based
77
- let line_col = LineCol { line : line - 1 , col_utf16 : col_utf16 - 1 } ;
78
- let offset = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) . offset ( line_col) ;
79
- FilePosition { file_id : self . file_id , offset }
80
- }
81
-
82
- fn range ( & self , text_range : TextRange ) -> Range {
83
- let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
84
- let start = line_index. line_col ( text_range. start ( ) ) ;
85
- let end = line_index. line_col ( text_range. end ( ) ) ;
86
-
87
- Range {
88
- startLineNumber : start. line + 1 ,
89
- startColumn : start. col_utf16 + 1 ,
90
- endLineNumber : end. line + 1 ,
91
- endColumn : end. col_utf16 + 1 ,
92
- }
93
- }
94
-
95
75
pub fn completions ( & self , line_number : u32 , column : u32 ) -> JsValue {
96
76
log:: warn!( "completions" ) ;
97
77
let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
98
- let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
99
78
79
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
100
80
let res = match self . analysis . completions ( pos) . unwrap ( ) {
101
81
Some ( items) => items,
102
82
None => return JsValue :: NULL ,
@@ -109,7 +89,7 @@ impl WorldState {
109
89
. map ( |item| CompletionItem {
110
90
kind : item. kind ( ) . unwrap_or ( CompletionItemKind :: Struct ) . conv ( ) ,
111
91
label : item. label ( ) . to_string ( ) ,
112
- range : self . range ( item. source_range ( ) ) ,
92
+ range : item. source_range ( ) . conv_with ( & line_index ) ,
113
93
detail : item. detail ( ) . map ( |it| it. to_string ( ) ) ,
114
94
insertText : item. text_edit ( ) . as_atoms ( ) [ 0 ] . insert . clone ( ) ,
115
95
insertTextRules : match item. insert_text_format ( ) {
@@ -126,22 +106,27 @@ impl WorldState {
126
106
}
127
107
128
108
pub fn hover ( & self , line_number : u32 , column : u32 ) -> JsValue {
129
- let pos = self . file_pos ( line_number, column) ;
130
109
log:: warn!( "hover" ) ;
110
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
111
+
112
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
131
113
let info = match self . analysis . hover ( pos) . unwrap ( ) {
132
114
Some ( info) => info,
133
115
_ => return JsValue :: NULL ,
134
116
} ;
135
117
136
118
let value = info. info . to_markup ( ) ;
137
- let hover =
138
- Hover { contents : vec ! [ MarkdownString { value } ] , range : self . range ( info. range ) } ;
119
+ let hover = Hover {
120
+ contents : vec ! [ MarkdownString { value } ] ,
121
+ range : info. range . conv_with ( & line_index) ,
122
+ } ;
139
123
140
124
serde_wasm_bindgen:: to_value ( & hover) . unwrap ( )
141
125
}
142
126
143
127
pub fn code_lenses ( & self ) -> JsValue {
144
128
log:: warn!( "code_lenses" ) ;
129
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
145
130
146
131
let results: Vec < _ > = self
147
132
. analysis
@@ -167,11 +152,11 @@ impl WorldState {
167
152
. info
168
153
. iter ( )
169
154
. map ( |target| target. focus_range ( ) . unwrap_or ( target. full_range ( ) ) )
170
- . map ( |range| self . range ( range ) )
155
+ . map ( |range| range. conv_with ( & line_index ) )
171
156
. collect ( ) ;
172
157
173
158
Some ( CodeLensSymbol {
174
- range : self . range ( it. node_range ) ,
159
+ range : it. node_range . conv_with ( & line_index ) ,
175
160
command : Some ( Command {
176
161
id : "editor.action.showReferences" . into ( ) ,
177
162
title,
@@ -185,36 +170,44 @@ impl WorldState {
185
170
}
186
171
187
172
pub fn references ( & self , line_number : u32 , column : u32 ) -> JsValue {
188
- let pos = self . file_pos ( line_number, column) ;
189
173
log:: warn!( "references" ) ;
174
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
175
+
176
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
190
177
let info = match self . analysis . find_all_refs ( pos) . unwrap ( ) {
191
178
Some ( info) => info,
192
179
_ => return JsValue :: NULL ,
193
180
} ;
194
181
195
- let res: Vec < _ > =
196
- info. into_iter ( ) . map ( |r| Highlight { tag : None , range : self . range ( r. range ) } ) . collect ( ) ;
182
+ let res: Vec < _ > = info
183
+ . into_iter ( )
184
+ . map ( |r| Highlight { tag : None , range : r. range . conv_with ( & line_index) } )
185
+ . collect ( ) ;
197
186
serde_wasm_bindgen:: to_value ( & res) . unwrap ( )
198
187
}
199
188
200
189
pub fn prepare_rename ( & self , line_number : u32 , column : u32 ) -> JsValue {
201
- let pos = self . file_pos ( line_number, column) ;
202
190
log:: warn!( "prepare_rename" ) ;
191
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
192
+
193
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
203
194
let refs = match self . analysis . find_all_refs ( pos) . unwrap ( ) {
204
195
None => return JsValue :: NULL ,
205
196
Some ( refs) => refs,
206
197
} ;
207
198
208
199
let declaration = refs. declaration ( ) ;
209
- let range = self . range ( declaration. range ( ) ) ;
200
+ let range = declaration. range ( ) . conv_with ( & line_index ) ;
210
201
let text = declaration. name ( ) . to_string ( ) ;
211
202
212
203
serde_wasm_bindgen:: to_value ( & RenameLocation { range, text } ) . unwrap ( )
213
204
}
214
205
215
206
pub fn rename ( & self , line_number : u32 , column : u32 , new_name : & str ) -> JsValue {
216
- let pos = self . file_pos ( line_number, column) ;
217
207
log:: warn!( "rename" ) ;
208
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
209
+
210
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
218
211
let change = match self . analysis . rename ( pos, new_name) {
219
212
Ok ( Some ( change) ) => change,
220
213
_ => return JsValue :: NULL ,
@@ -225,7 +218,10 @@ impl WorldState {
225
218
. source_file_edits
226
219
. iter ( )
227
220
. flat_map ( |sfe| sfe. edit . as_atoms ( ) )
228
- . map ( |atom| TextEdit { range : self . range ( atom. delete ) , text : atom. insert . clone ( ) } )
221
+ . map ( |atom| TextEdit {
222
+ range : atom. delete . conv_with ( & line_index) ,
223
+ text : atom. insert . clone ( ) ,
224
+ } )
229
225
. collect ( ) ;
230
226
231
227
serde_wasm_bindgen:: to_value ( & result) . unwrap ( )
0 commit comments