1
1
#![ cfg( target_arch = "wasm32" ) ]
2
2
#![ allow( non_snake_case) ]
3
3
4
- use ra_ide_api:: { Analysis , FileId , FilePosition , LineCol , Severity } ;
5
- use ra_syntax:: { SyntaxKind , TextRange } ;
4
+ use ra_ide_api:: { Analysis , FileId , FilePosition , Severity } ;
5
+ use ra_syntax:: SyntaxKind ;
6
6
use wasm_bindgen:: prelude:: * ;
7
7
8
+ mod conv;
9
+ use conv:: * ;
8
10
mod return_types;
9
11
use return_types:: * ;
10
12
@@ -30,16 +32,19 @@ impl WorldState {
30
32
}
31
33
32
34
pub fn update ( & mut self , code : String ) -> JsValue {
35
+ log:: warn!( "update" ) ;
33
36
let ( analysis, file_id) = Analysis :: from_single_file ( code) ;
34
37
self . analysis = analysis;
35
38
self . file_id = file_id;
36
39
40
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
41
+
37
42
let highlights: Vec < _ > = self
38
43
. analysis
39
44
. highlight ( file_id)
40
45
. unwrap ( )
41
46
. into_iter ( )
42
- . 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 ) } )
43
48
. collect ( ) ;
44
49
45
50
let diagnostics: Vec < _ > = self
@@ -49,7 +54,7 @@ impl WorldState {
49
54
. into_iter ( )
50
55
. map ( |d| {
51
56
let Range { startLineNumber, startColumn, endLineNumber, endColumn } =
52
- self . range ( d. range ) ;
57
+ d. range . conv_with ( & line_index ) ;
53
58
Diagnostic {
54
59
message : d. message ,
55
60
severity : match d. severity {
@@ -67,51 +72,42 @@ impl WorldState {
67
72
serde_wasm_bindgen:: to_value ( & UpdateResult { diagnostics, highlights } ) . unwrap ( )
68
73
}
69
74
70
- fn file_pos ( & self , line : u32 , col_utf16 : u32 ) -> FilePosition {
71
- // monaco doesn't work zero-based
72
- let line_col = LineCol { line : line - 1 , col_utf16 : col_utf16 - 1 } ;
73
- let offset = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) . offset ( line_col) ;
74
- FilePosition { file_id : self . file_id , offset }
75
- }
76
-
77
- fn range ( & self , text_range : TextRange ) -> Range {
75
+ pub fn completions ( & self , line_number : u32 , column : u32 ) -> JsValue {
76
+ log:: warn!( "completions" ) ;
78
77
let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
79
- let start = line_index. line_col ( text_range. start ( ) ) ;
80
- let end = line_index. line_col ( text_range. end ( ) ) ;
81
-
82
- Range {
83
- startLineNumber : start. line + 1 ,
84
- startColumn : start. col_utf16 + 1 ,
85
- endLineNumber : end. line + 1 ,
86
- endColumn : end. col_utf16 + 1 ,
87
- }
88
- }
89
78
90
- pub fn on_dot_typed ( & self , line_number : u32 , column : u32 ) {
91
- let pos = self . file_pos ( line_number, column) ;
92
- log:: warn!( "on_dot_typed" ) ;
93
- let res = self . analysis . on_dot_typed ( pos) . unwrap ( ) ;
79
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
80
+ let res = match self . analysis . completions ( pos) . unwrap ( ) {
81
+ Some ( items) => items,
82
+ None => return JsValue :: NULL ,
83
+ } ;
94
84
95
- log:: debug!( "{:?}" , res) ;
85
+ let items: Vec < _ > = res. into_iter ( ) . map ( |item| item. conv_with ( & line_index) ) . collect ( ) ;
86
+ serde_wasm_bindgen:: to_value ( & items) . unwrap ( )
96
87
}
97
88
98
89
pub fn hover ( & self , line_number : u32 , column : u32 ) -> JsValue {
99
- let pos = self . file_pos ( line_number, column) ;
100
90
log:: warn!( "hover" ) ;
91
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
92
+
93
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
101
94
let info = match self . analysis . hover ( pos) . unwrap ( ) {
102
95
Some ( info) => info,
103
96
_ => return JsValue :: NULL ,
104
97
} ;
105
98
106
99
let value = info. info . to_markup ( ) ;
107
- let hover =
108
- Hover { contents : vec ! [ MarkdownString { value } ] , range : self . range ( info. range ) } ;
100
+ let hover = Hover {
101
+ contents : vec ! [ MarkdownString { value } ] ,
102
+ range : info. range . conv_with ( & line_index) ,
103
+ } ;
109
104
110
105
serde_wasm_bindgen:: to_value ( & hover) . unwrap ( )
111
106
}
112
107
113
108
pub fn code_lenses ( & self ) -> JsValue {
114
109
log:: warn!( "code_lenses" ) ;
110
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
115
111
116
112
let results: Vec < _ > = self
117
113
. analysis
@@ -137,11 +133,11 @@ impl WorldState {
137
133
. info
138
134
. iter ( )
139
135
. map ( |target| target. focus_range ( ) . unwrap_or ( target. full_range ( ) ) )
140
- . map ( |range| self . range ( range ) )
136
+ . map ( |range| range. conv_with ( & line_index ) )
141
137
. collect ( ) ;
142
138
143
139
Some ( CodeLensSymbol {
144
- range : self . range ( it. node_range ) ,
140
+ range : it. node_range . conv_with ( & line_index ) ,
145
141
command : Some ( Command {
146
142
id : "editor.action.showReferences" . into ( ) ,
147
143
title,
@@ -155,36 +151,44 @@ impl WorldState {
155
151
}
156
152
157
153
pub fn references ( & self , line_number : u32 , column : u32 ) -> JsValue {
158
- let pos = self . file_pos ( line_number, column) ;
159
154
log:: warn!( "references" ) ;
155
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
156
+
157
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
160
158
let info = match self . analysis . find_all_refs ( pos) . unwrap ( ) {
161
159
Some ( info) => info,
162
160
_ => return JsValue :: NULL ,
163
161
} ;
164
162
165
- let res: Vec < _ > =
166
- info. into_iter ( ) . map ( |r| Highlight { tag : None , range : self . range ( r. range ) } ) . collect ( ) ;
163
+ let res: Vec < _ > = info
164
+ . into_iter ( )
165
+ . map ( |r| Highlight { tag : None , range : r. range . conv_with ( & line_index) } )
166
+ . collect ( ) ;
167
167
serde_wasm_bindgen:: to_value ( & res) . unwrap ( )
168
168
}
169
169
170
170
pub fn prepare_rename ( & self , line_number : u32 , column : u32 ) -> JsValue {
171
- let pos = self . file_pos ( line_number, column) ;
172
171
log:: warn!( "prepare_rename" ) ;
172
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
173
+
174
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
173
175
let refs = match self . analysis . find_all_refs ( pos) . unwrap ( ) {
174
176
None => return JsValue :: NULL ,
175
177
Some ( refs) => refs,
176
178
} ;
177
179
178
180
let declaration = refs. declaration ( ) ;
179
- let range = self . range ( declaration. range ( ) ) ;
181
+ let range = declaration. range ( ) . conv_with ( & line_index ) ;
180
182
let text = declaration. name ( ) . to_string ( ) ;
181
183
182
184
serde_wasm_bindgen:: to_value ( & RenameLocation { range, text } ) . unwrap ( )
183
185
}
184
186
185
187
pub fn rename ( & self , line_number : u32 , column : u32 , new_name : & str ) -> JsValue {
186
- let pos = self . file_pos ( line_number, column) ;
187
188
log:: warn!( "rename" ) ;
189
+ let line_index = self . analysis . file_line_index ( self . file_id ) . unwrap ( ) ;
190
+
191
+ let pos = Position { line_number, column } . conv_with ( ( & line_index, self . file_id ) ) ;
188
192
let change = match self . analysis . rename ( pos, new_name) {
189
193
Ok ( Some ( change) ) => change,
190
194
_ => return JsValue :: NULL ,
@@ -195,7 +199,10 @@ impl WorldState {
195
199
. source_file_edits
196
200
. iter ( )
197
201
. flat_map ( |sfe| sfe. edit . as_atoms ( ) )
198
- . map ( |atom| TextEdit { range : self . range ( atom. delete ) , text : atom. insert . clone ( ) } )
202
+ . map ( |atom| TextEdit {
203
+ range : atom. delete . conv_with ( & line_index) ,
204
+ text : atom. insert . clone ( ) ,
205
+ } )
199
206
. collect ( ) ;
200
207
201
208
serde_wasm_bindgen:: to_value ( & result) . unwrap ( )
0 commit comments