|
|
@@ -3,10 +3,11 @@ |
3 | mod block; |
3 | mod block; |
4 | |
4 | |
5 | use crate::{ |
5 | use crate::{ |
6 | ast, match_ast, AstNode, SyntaxError, |
6 | algo, ast, match_ast, AstNode, SyntaxError, |
7 | SyntaxKind::{BYTE, BYTE_STRING, CHAR, CONST, FN, INT_NUMBER, STRING, TYPE_ALIAS}, |
7 | SyntaxKind::{BYTE, BYTE_STRING, CHAR, CONST, FN, INT_NUMBER, STRING, TYPE_ALIAS}, |
8 | SyntaxNode, SyntaxToken, TextSize, T, |
8 | SyntaxNode, SyntaxToken, TextSize, T, |
9 | }; |
9 | }; |
| |
10 | use rowan::Direction; |
10 | use rustc_lexer::unescape::{ |
11 | use rustc_lexer::unescape::{ |
11 | self, unescape_byte, unescape_byte_literal, unescape_char, unescape_literal, Mode, |
12 | self, unescape_byte, unescape_byte_literal, unescape_char, unescape_literal, Mode, |
12 | }; |
13 | }; |
@@ -95,6 +96,9 @@ pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> { |
95 | ast::Visibility(it) => validate_visibility(it, &mut errors), |
96 | ast::Visibility(it) => validate_visibility(it, &mut errors), |
96 | ast::RangeExpr(it) => validate_range_expr(it, &mut errors), |
97 | ast::RangeExpr(it) => validate_range_expr(it, &mut errors), |
97 | ast::PathSegment(it) => validate_path_keywords(it, &mut errors), |
98 | ast::PathSegment(it) => validate_path_keywords(it, &mut errors), |
| |
99 | ast::RefType(it) => validate_trait_object_ref_ty(it, &mut errors), |
| |
100 | ast::PtrType(it) => validate_trait_object_ptr_ty(it, &mut errors), |
| |
101 | ast::FnPtrType(it) => validate_trait_object_fn_ptr_ret_ty(it, &mut errors), |
98 | _ => (), |
102 | _ => (), |
99 | } |
103 | } |
100 | } |
104 | } |
@@ -301,3 +305,42 @@ fn validate_path_keywords(segment: ast::PathSegment, errors: &mut Vec<SyntaxErro |
301 | return true; |
305 | return true; |
302 | } |
306 | } |
303 | } |
307 | } |
| |
308 | |
| |
309 | fn validate_trait_object_ref_ty(ty: ast::RefType, errors: &mut Vec<SyntaxError>) { |
| |
310 | if let Some(ast::Type::DynTraitType(ty)) = ty.ty() { |
| |
311 | if let Some(err) = validate_trait_object_ty(ty) { |
| |
312 | errors.push(err); |
| |
313 | } |
| |
314 | } |
| |
315 | } |
| |
316 | |
| |
317 | fn validate_trait_object_ptr_ty(ty: ast::PtrType, errors: &mut Vec<SyntaxError>) { |
| |
318 | if let Some(ast::Type::DynTraitType(ty)) = ty.ty() { |
| |
319 | if let Some(err) = validate_trait_object_ty(ty) { |
| |
320 | errors.push(err); |
| |
321 | } |
| |
322 | } |
| |
323 | } |
| |
324 | |
| |
325 | fn validate_trait_object_fn_ptr_ret_ty(ty: ast::FnPtrType, errors: &mut Vec<SyntaxError>) { |
| |
326 | if let Some(ast::Type::DynTraitType(ty)) = ty.ret_type().and_then(|ty| ty.ty()) { |
| |
327 | if let Some(err) = validate_trait_object_ty(ty) { |
| |
328 | errors.push(err); |
| |
329 | } |
| |
330 | } |
| |
331 | } |
| |
332 | |
| |
333 | fn validate_trait_object_ty(ty: ast::DynTraitType) -> Option<SyntaxError> { |
| |
334 | let tbl = ty.type_bound_list()?; |
| |
335 | |
| |
336 | if tbl.bounds().count() > 1 { |
| |
337 | let dyn_token = ty.dyn_token()?; |
| |
338 | let potential_parentheses = |
| |
339 | algo::skip_trivia_token(dyn_token.prev_token()?, Direction::Prev)?; |
| |
340 | let kind = potential_parentheses.kind(); |
| |
341 | if !matches!(kind, T!['('] | T![<] | T![=]) { |
| |
342 | return Some(SyntaxError::new("ambiguous `+` in a type", ty.syntax().text_range())); |
| |
343 | } |
| |
344 | } |
| |
345 | None |
| |
346 | } |
|
|
|
@@ -0,0 +1,192 @@ |
| |
1 | [email protected] |
| |
2 | [email protected] |
| |
3 | [email protected] "type" |
| |
4 | [email protected] " " |
| |
5 | [email protected] |
| |
6 | [email protected] "Foo" |
| |
7 | [email protected] |
| |
8 | [email protected] "<" |
| |
9 | [email protected] |
| |
10 | [email protected] "\'a" |
| |
11 | [email protected] ">" |
| |
12 | [email protected] " " |
| |
13 | [email protected] "=" |
| |
14 | [email protected] " " |
| |
15 | [email protected] |
| |
16 | [email protected] "&" |
| |
17 | [email protected] "\'a" |
| |
18 | [email protected] " " |
| |
19 | [email protected] |
| |
20 | [email protected] "dyn" |
| |
21 | [email protected] " " |
| |
22 | [email protected] |
| |
23 | [email protected] |
| |
24 | [email protected] |
| |
25 | [email protected] |
| |
26 | [email protected] |
| |
27 | [email protected] |
| |
28 | [email protected] "Send" |
| |
29 | [email protected] " " |
| |
30 | [email protected] "+" |
| |
31 | [email protected] " " |
| |
32 | [email protected] |
| |
33 | [email protected] |
| |
34 | [email protected] |
| |
35 | [email protected] |
| |
36 | [email protected] |
| |
37 | [email protected] "Sync" |
| |
38 | [email protected] ";" |
| |
39 | [email protected] "\n" |
| |
40 | [email protected] |
| |
41 | [email protected] "type" |
| |
42 | [email protected] " " |
| |
43 | [email protected] |
| |
44 | [email protected] "Foo" |
| |
45 | [email protected] " " |
| |
46 | [email protected] "=" |
| |
47 | [email protected] " " |
| |
48 | [email protected] |
| |
49 | [email protected] "*" |
| |
50 | [email protected] "const" |
| |
51 | [email protected] " " |
| |
52 | [email protected] |
| |
53 | [email protected] "dyn" |
| |
54 | [email protected] " " |
| |
55 | [email protected] |
| |
56 | [email protected] |
| |
57 | [email protected] |
| |
58 | [email protected] |
| |
59 | [email protected] |
| |
60 | [email protected] |
| |
61 | [email protected] "Send" |
| |
62 | [email protected] " " |
| |
63 | [email protected] "+" |
| |
64 | [email protected] " " |
| |
65 | [email protected] |
| |
66 | [email protected] |
| |
67 | [email protected] |
| |
68 | [email protected] |
| |
69 | [email protected] |
| |
70 | [email protected] "Sync" |
| |
71 | [email protected] ";" |
| |
72 | [email protected] "\n" |
| |
73 | [email protected] |
| |
74 | [email protected] "type" |
| |
75 | [email protected] " " |
| |
76 | [email protected] |
| |
77 | [email protected] "Foo" |
| |
78 | [email protected] " " |
| |
79 | [email protected] "=" |
| |
80 | [email protected] " " |
| |
81 | [email protected] |
| |
82 | [email protected] "fn" |
| |
83 | [email protected] |
| |
84 | [email protected] "(" |
| |
85 | [email protected] ")" |
| |
86 | [email protected] " " |
| |
87 | [email protected] |
| |
88 | [email protected] "->" |
| |
89 | [email protected] " " |
| |
90 | [email protected] |
| |
91 | [email protected] "dyn" |
| |
92 | [email protected] " " |
| |
93 | [email protected] |
| |
94 | [email protected] |
| |
95 | [email protected] |
| |
96 | [email protected] |
| |
97 | [email protected] |
| |
98 | [email protected] |
| |
99 | [email protected] "Send" |
| |
100 | [email protected] " " |
| |
101 | [email protected] "+" |
| |
102 | [email protected] " " |
| |
103 | [email protected] |
| |
104 | [email protected] "\'static" |
| |
105 | [email protected] ";" |
| |
106 | [email protected] "\n" |
| |
107 | [email protected] |
| |
108 | [email protected] "fn" |
| |
109 | [email protected] " " |
| |
110 | [email protected] |
| |
111 | [email protected] "main" |
| |
112 | [email protected] |
| |
113 | [email protected] "(" |
| |
114 | [email protected] ")" |
| |
115 | [email protected] " " |
| |
116 | [email protected] |
| |
117 | [email protected] "{" |
| |
118 | [email protected] "\n " |
| |
119 | [email protected] |
| |
120 | [email protected] "let" |
| |
121 | [email protected] " " |
| |
122 | [email protected] |
| |
123 | [email protected] |
| |
124 | [email protected] "b" |
| |
125 | [email protected] " " |
| |
126 | [email protected] "=" |
| |
127 | [email protected] " " |
| |
128 | [email protected] |
| |
129 | [email protected] |
| |
130 | [email protected] "(" |
| |
131 | [email protected] |
| |
132 | [email protected] "&" |
| |
133 | [email protected] |
| |
134 | [email protected] |
| |
135 | [email protected] |
| |
136 | [email protected] |
| |
137 | [email protected] "a" |
| |
138 | [email protected] ")" |
| |
139 | [email protected] " " |
| |
140 | [email protected] "as" |
| |
141 | [email protected] " " |
| |
142 | [email protected] |
| |
143 | [email protected] "&" |
| |
144 | [email protected] |
| |
145 | [email protected] "dyn" |
| |
146 | [email protected] " " |
| |
147 | [email protected] |
| |
148 | [email protected] |
| |
149 | [email protected] |
| |
150 | [email protected] |
| |
151 | [email protected] |
| |
152 | [email protected] |
| |
153 | [email protected] "Add" |
| |
154 | [email protected] |
| |
155 | [email protected] "<" |
| |
156 | [email protected] |
| |
157 | [email protected] |
| |
158 | [email protected] |
| |
159 | [email protected] |
| |
160 | [email protected] |
| |
161 | [email protected] "Other" |
| |
162 | [email protected] "," |
| |
163 | [email protected] " " |
| |
164 | [email protected] |
| |
165 | [email protected] |
| |
166 | [email protected] "Output" |
| |
167 | [email protected] " " |
| |
168 | [email protected] "=" |
| |
169 | [email protected] " " |
| |
170 | [email protected] |
| |
171 | [email protected] |
| |
172 | [email protected] |
| |
173 | [email protected] |
| |
174 | [email protected] "Addable" |
| |
175 | [email protected] ">" |
| |
176 | [email protected] " " |
| |
177 | [email protected] "+" |
| |
178 | [email protected] " " |
| |
179 | [email protected] |
| |
180 | [email protected] |
| |
181 | [email protected] |
| |
182 | [email protected] |
| |
183 | [email protected] |
| |
184 | [email protected] "Other" |
| |
185 | [email protected] ";" |
| |
186 | [email protected] "\n" |
| |
187 | [email protected] "}" |
| |
188 | [email protected] "\n" |
| |
189 | error 19..34: ambiguous `+` in a type |
| |
190 | error 54..69: ambiguous `+` in a type |
| |
191 | error 90..108: ambiguous `+` in a type |
| |
192 | error 143..183: ambiguous `+` in a type |
|
|
|
@@ -0,0 +1,6 @@ |
| |
1 | type Foo<'a> = &'a dyn Send + Sync;
|
| |
2 | type Foo = *const dyn Send + Sync;
|
| |
3 | type Foo = fn() -> dyn Send + 'static;
|
| |
4 | fn main() {
|
| |
5 | let b = (&a) as &dyn Add<Other, Output = Addable> + Other;
|
| |
6 | }
|
|
|
|
@@ -0,0 +1,200 @@ |
| |
1 | [email protected] |
| |
2 | [email protected] |
| |
3 | [email protected] "type" |
| |
4 | [email protected] " " |
| |
5 | [email protected] |
| |
6 | [email protected] "Foo" |
| |
7 | [email protected] |
| |
8 | [email protected] "<" |
| |
9 | [email protected] |
| |
10 | [email protected] "\'a" |
| |
11 | [email protected] ">" |
| |
12 | [email protected] " " |
| |
13 | [email protected] "=" |
| |
14 | [email protected] " " |
| |
15 | [email protected] |
| |
16 | [email protected] "&" |
| |
17 | [email protected] "\'a" |
| |
18 | [email protected] " " |
| |
19 | [email protected] |
| |
20 | [email protected] "(" |
| |
21 | [email protected] |
| |
22 | [email protected] "dyn" |
| |
23 | [email protected] " " |
| |
24 | [email protected] |
| |
25 | [email protected] |
| |
26 | [email protected] |
| |
27 | [email protected] |
| |
28 | [email protected] |
| |
29 | [email protected] |
| |
30 | [email protected] "Send" |
| |
31 | [email protected] " " |
| |
32 | [email protected] "+" |
| |
33 | [email protected] " " |
| |
34 | [email protected] |
| |
35 | [email protected] |
| |
36 | [email protected] |
| |
37 | [email protected] |
| |
38 | [email protected] |
| |
39 | [email protected] "Sync" |
| |
40 | [email protected] ")" |
| |
41 | [email protected] ";" |
| |
42 | [email protected] "\n" |
| |
43 | [email protected] |
| |
44 | [email protected] "type" |
| |
45 | [email protected] " " |
| |
46 | [email protected] |
| |
47 | [email protected] "Foo" |
| |
48 | [email protected] " " |
| |
49 | [email protected] "=" |
| |
50 | [email protected] " " |
| |
51 | [email protected] |
| |
52 | [email protected] "*" |
| |
53 | [email protected] "const" |
| |
54 | [email protected] " " |
| |
55 | [email protected] |
| |
56 | [email protected] "(" |
| |
57 | [email protected] |
| |
58 | [email protected] "dyn" |
| |
59 | [email protected] " " |
| |
60 | [email protected] |
| |
61 | [email protected] |
| |
62 | [email protected] |
| |
63 | [email protected] |
| |
64 | [email protected] |
| |
65 | [email protected] |
| |
66 | [email protected] "Send" |
| |
67 | [email protected] " " |
| |
68 | [email protected] "+" |
| |
69 | [email protected] " " |
| |
70 | [email protected] |
| |
71 | [email protected] |
| |
72 | [email protected] |
| |
73 | [email protected] |
| |
74 | [email protected] |
| |
75 | [email protected] "Sync" |
| |
76 | [email protected] ")" |
| |
77 | [email protected] ";" |
| |
78 | [email protected] "\n" |
| |
79 | [email protected] |
| |
80 | [email protected] "type" |
| |
81 | [email protected] " " |
| |
82 | [email protected] |
| |
83 | [email protected] "Foo" |
| |
84 | [email protected] " " |
| |
85 | [email protected] "=" |
| |
86 | [email protected] " " |
| |
87 | [email protected] |
| |
88 | [email protected] "fn" |
| |
89 | [email protected] |
| |
90 | [email protected] "(" |
| |
91 | [email protected] ")" |
| |
92 | [email protected] " " |
| |
93 | [email protected] |
| |
94 | [email protected] "->" |
| |
95 | [email protected] " " |
| |
96 | [email protected] |
| |
97 | [email protected] "(" |
| |
98 | [email protected] |
| |
99 | [email protected] "dyn" |
| |
100 | [email protected] " " |
| |
101 | [email protected] |
| |
102 | [email protected] |
| |
103 | [email protected] |
| |
104 | [email protected] |
| |
105 | [email protected] |
| |
106 | [email protected] |
| |
107 | [email protected] "Send" |
| |
108 | [email protected] " " |
| |
109 | [email protected] "+" |
| |
110 | [email protected] " " |
| |
111 | [email protected] |
| |
112 | [email protected] "\'static" |
| |
113 | [email protected] ")" |
| |
114 | [email protected] ";" |
| |
115 | [email protected] "\n" |
| |
116 | [email protected] |
| |
117 | [email protected] "fn" |
| |
118 | [email protected] " " |
| |
119 | [email protected] |
| |
120 | [email protected] "main" |
| |
121 | [email protected] |
| |
122 | [email protected] "(" |
| |
123 | [email protected] ")" |
| |
124 | [email protected] " " |
| |
125 | [email protected] |
| |
126 | [email protected] "{" |
| |
127 | [email protected] "\n " |
| |
128 | [email protected] |
| |
129 | [email protected] "let" |
| |
130 | [email protected] " " |
| |
131 | [email protected] |
| |
132 | [email protected] |
| |
133 | [email protected] "b" |
| |
134 | [email protected] " " |
| |
135 | [email protected] "=" |
| |
136 | [email protected] " " |
| |
137 | [email protected] |
| |
138 | [email protected] |
| |
139 | [email protected] "(" |
| |
140 | [email protected] |
| |
141 | [email protected] "&" |
| |
142 | [email protected] |
| |
143 | [email protected] |
| |
144 | [email protected] |
| |
145 | [email protected] |
| |
146 | [email protected] "a" |
| |
147 | [email protected] ")" |
| |
148 | [email protected] " " |
| |
149 | [email protected] "as" |
| |
150 | [email protected] " " |
| |
151 | [email protected] |
| |
152 | [email protected] "&" |
| |
153 | [email protected] |
| |
154 | [email protected] "(" |
| |
155 | [email protected] |
| |
156 | [email protected] "dyn" |
| |
157 | [email protected] " " |
| |
158 | [email protected] |
| |
159 | [email protected] |
| |
160 | [email protected] |
| |
161 | [email protected] |
| |
162 | [email protected] |
| |
163 | [email protected] |
| |
164 | [email protected] "Add" |
| |
165 | [email protected] |
| |
166 | [email protected] "<" |
| |
167 | [email protected] |
| |
168 | [email protected] |
| |
169 | [email protected] |
| |
170 | [email protected] |
| |
171 | [email protected] |
| |
172 | [email protected] "Other" |
| |
173 | [email protected] "," |
| |
174 | [email protected] " " |
| |
175 | [email protected] |
| |
176 | [email protected] |
| |
177 | [email protected] "Output" |
| |
178 | [email protected] " " |
| |
179 | [email protected] "=" |
| |
180 | [email protected] " " |
| |
181 | [email protected] |
| |
182 | [email protected] |
| |
183 | [email protected] |
| |
184 | [email protected] |
| |
185 | [email protected] "Addable" |
| |
186 | [email protected] ">" |
| |
187 | [email protected] " " |
| |
188 | [email protected] "+" |
| |
189 | [email protected] " " |
| |
190 | [email protected] |
| |
191 | [email protected] |
| |
192 | [email protected] |
| |
193 | [email protected] |
| |
194 | [email protected] |
| |
195 | [email protected] "Other" |
| |
196 | [email protected] ")" |
| |
197 | [email protected] ";" |
| |
198 | [email protected] "\n" |
| |
199 | [email protected] "}" |
| |
200 | [email protected] "\n" |
|
|
|
@@ -0,0 +1,6 @@ |
| |
1 | type Foo<'a> = &'a (dyn Send + Sync); |
| |
2 | type Foo = *const (dyn Send + Sync); |
| |
3 | type Foo = fn() -> (dyn Send + 'static); |
| |
4 | fn main() { |
| |
5 | let b = (&a) as &(dyn Add<Other, Output = Addable> + Other); |
| |
6 | } |
|
|
|
@@ -397,6 +397,23 @@ It is possible to change the foreground/background color of inlay hints. Just ad |
397 | } |
397 | } |
398 | ---- |
398 | ---- |
399 | |
399 | |
| |
400 | ==== Semantic style customizations |
| |
401 | |
| |
402 | You can customize the look of different semantic elements in the source code. For example, mutable bindings are underlined by default and you can override this behavior by adding the following section to your `settings.json`: |
| |
403 | |
| |
404 | [source,jsonc] |
| |
405 | ---- |
| |
406 | { |
| |
407 | "editor.semanticTokenColorCustomizations": { |
| |
408 | "rules": { |
| |
409 | "*.mutable": { |
| |
410 | "fontStyle": "", // underline is the default |
| |
411 | }, |
| |
412 | } |
| |
413 | }, |
| |
414 | } |
| |
415 | ---- |
| |
416 | |
400 | ==== Special `when` clause context for keybindings. |
417 | ==== Special `when` clause context for keybindings. |
401 | You may use `inRustProject` context to configure keybindings for rust projects only. For example: |
418 | You may use `inRustProject` context to configure keybindings for rust projects only. For example: |
402 | [source,json] |
419 | [source,json] |
|