@@ -14,83 +14,86 @@ pub(crate) mod tree {
14
14
pub ( crate ) async fn change ( session : Arc < Session > , uri : Url ) -> Fallible < ( ) > {
15
15
if let Some ( document) = session. get_document ( & uri) . await ? {
16
16
let tree = document. tree . lock ( ) . await . clone ( ) ;
17
- let node = tree. root_node ( ) ;
18
- let mut diagnostics = vec ! [ ] ;
19
- if node. has_error ( ) {
20
- // prepare a query to match tree-sitter ERROR nodes
21
- let language = tree. language ( ) ;
22
- let source = "((ERROR) @error)" ; // query the tree for ERROR nodes
23
- let query = tree_sitter:: Query :: new ( language, source) . map_err ( Error :: TreeSitterQueryError ) ?;
17
+ let diagnostics = {
18
+ let mut diagnostics = vec ! [ ] ;
19
+ let node = tree. root_node ( ) ;
20
+ if node. has_error ( ) {
21
+ // prepare a query to match tree-sitter ERROR nodes
22
+ let language = tree. language ( ) ;
23
+ let source = "((ERROR) @error)" ; // query the tree for ERROR nodes
24
+ let query = tree_sitter:: Query :: new ( language, source) . map_err ( Error :: TreeSitterQueryError ) ?;
24
25
25
- // prepare a query cursor
26
- let mut query_cursor = tree_sitter:: QueryCursor :: new ( ) ;
27
- let text_callback = |node : tree_sitter:: Node | & document. text [ node. byte_range ( ) ] ;
28
- let matches = query_cursor. matches ( & query, node, text_callback) ;
26
+ // prepare a query cursor
27
+ let mut query_cursor = tree_sitter:: QueryCursor :: new ( ) ;
28
+ let text_callback = |node : tree_sitter:: Node | & document. text [ node. byte_range ( ) ] ;
29
+ let matches = query_cursor. matches ( & query, node, text_callback) ;
29
30
30
- // iterate the query cursor and construct appropriate lsp diagnostics
31
- for tree_sitter:: QueryMatch { captures, .. } in matches {
32
- ' captures: for tree_sitter:: QueryCapture { node, .. } in captures {
33
- // create a cursor node starting from the capture node
34
- let mut cursor = * node;
31
+ // iterate the query cursor and construct appropriate lsp diagnostics
32
+ for tree_sitter:: QueryMatch { captures, .. } in matches {
33
+ ' captures: for tree_sitter:: QueryCapture { node, .. } in captures {
34
+ // create a cursor node starting from the capture node
35
+ let mut cursor = * node;
35
36
36
- // traverse upward through the parent nodes
37
- ' cursor: while let Some ( parent) = cursor. parent ( ) {
38
- cursor = parent;
39
- // ignore further processing if the first non-ERROR
40
- // parent node is a comment node; we do this in
41
- // order to avoid syntax errors due to encoding
42
- // issues (see "comments.wast" and issue #42)
43
- if !cursor. is_error ( ) {
44
- match document. language {
45
- Language :: Wast
46
- if [
47
- * wast:: kind:: COMMENT_BLOCK_ANNOT ,
48
- * wast:: kind:: COMMENT_BLOCK ,
49
- * wast:: kind:: COMMENT_LINE_ANNOT ,
50
- * wast:: kind:: COMMENT_LINE ,
51
- ]
52
- . contains ( & parent. kind_id ( ) ) =>
53
- {
54
- break ' captures;
37
+ // traverse upward through the parent nodes
38
+ ' cursor: while let Some ( parent) = cursor. parent ( ) {
39
+ cursor = parent;
40
+ // ignore further processing if the first non-ERROR
41
+ // parent node is a comment node; we do this in
42
+ // order to avoid syntax errors due to encoding
43
+ // issues (see "comments.wast" and issue #42)
44
+ if !cursor. is_error ( ) {
45
+ match document. language {
46
+ Language :: Wast
47
+ if [
48
+ * wast:: kind:: COMMENT_BLOCK_ANNOT ,
49
+ * wast:: kind:: COMMENT_BLOCK ,
50
+ * wast:: kind:: COMMENT_LINE_ANNOT ,
51
+ * wast:: kind:: COMMENT_LINE ,
52
+ ]
53
+ . contains ( & parent. kind_id ( ) ) =>
54
+ {
55
+ break ' captures;
56
+ }
57
+ Language :: Wat
58
+ if [
59
+ * wat:: kind:: COMMENT_BLOCK_ANNOT ,
60
+ * wat:: kind:: COMMENT_BLOCK ,
61
+ * wat:: kind:: COMMENT_LINE_ANNOT ,
62
+ * wat:: kind:: COMMENT_LINE ,
63
+ ]
64
+ . contains ( & parent. kind_id ( ) ) =>
65
+ {
66
+ break ' captures;
67
+ }
68
+ _ => {
69
+ break ' cursor;
70
+ } ,
55
71
}
56
- Language :: Wat
57
- if [
58
- * wat:: kind:: COMMENT_BLOCK_ANNOT ,
59
- * wat:: kind:: COMMENT_BLOCK ,
60
- * wat:: kind:: COMMENT_LINE_ANNOT ,
61
- * wat:: kind:: COMMENT_LINE ,
62
- ]
63
- . contains ( & parent. kind_id ( ) ) =>
64
- {
65
- break ' captures;
66
- }
67
- _ => {
68
- break ' cursor;
69
- } ,
70
72
}
71
73
}
72
- }
73
74
74
- let start = node. start_position ( ) ;
75
- let end = node. end_position ( ) ;
76
- diagnostics. push ( {
77
- let range = {
78
- let start = Position :: new ( start. row as u64 , start. column as u64 ) ;
79
- let end = Position :: new ( end. row as u64 , end. column as u64 ) ;
80
- Range :: new ( start, end)
81
- } ;
82
- let severity = Some ( DiagnosticSeverity :: Error ) ;
83
- let code = None ;
84
- let source = Some ( String :: from ( "wasm-lsp" ) ) ;
85
- let message = String :: from ( "syntax error" ) ;
86
- let related_information = None ;
87
- let tags = None ;
88
- Diagnostic :: new ( range, severity, code, source, message, related_information, tags)
89
- } ) ;
75
+ let start = node. start_position ( ) ;
76
+ let end = node. end_position ( ) ;
77
+ diagnostics. push ( {
78
+ let range = {
79
+ let start = Position :: new ( start. row as u64 , start. column as u64 ) ;
80
+ let end = Position :: new ( end. row as u64 , end. column as u64 ) ;
81
+ Range :: new ( start, end)
82
+ } ;
83
+ let severity = Some ( DiagnosticSeverity :: Error ) ;
84
+ let code = None ;
85
+ let source = Some ( String :: from ( "wasm-lsp" ) ) ;
86
+ let message = String :: from ( "syntax error" ) ;
87
+ let related_information = None ;
88
+ let tags = None ;
89
+ Diagnostic :: new ( range, severity, code, source, message, related_information, tags)
90
+ } ) ;
91
+ }
90
92
}
91
93
}
92
- }
93
- // NOTE: else let elaborator handle
94
+ // NOTE: else let elaborator handle
95
+ diagnostics
96
+ } ;
94
97
let version = None ;
95
98
session. client . publish_diagnostics ( uri, diagnostics, version) . await ;
96
99
}
0 commit comments