aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-11-11 08:26:57 +0000
committerAleksey Kladov <[email protected]>2019-11-11 08:26:57 +0000
commit1860f9ab43acb77c9fdd7ca646ef65e9b008b932 (patch)
tree50401900e5b97e1bb40ad1d82c902bc175960cfa
parenta09b5b91ae2ce5e59f0fea97d07bf4aa1f550212 (diff)
Forbid visibility qualifiers in traits
-rw-r--r--crates/ra_syntax/src/syntax_error.rs4
-rw-r--r--crates/ra_syntax/src/validation.rs23
-rw-r--r--crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rs6
-rw-r--r--crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.txt99
4 files changed, 131 insertions, 1 deletions
diff --git a/crates/ra_syntax/src/syntax_error.rs b/crates/ra_syntax/src/syntax_error.rs
index d6eca2ad7..1f60a7aab 100644
--- a/crates/ra_syntax/src/syntax_error.rs
+++ b/crates/ra_syntax/src/syntax_error.rs
@@ -82,6 +82,7 @@ pub enum SyntaxErrorKind {
82 InvalidBlockAttr, 82 InvalidBlockAttr,
83 InvalidMatchInnerAttr, 83 InvalidMatchInnerAttr,
84 InvalidTupleIndexFormat, 84 InvalidTupleIndexFormat,
85 VisibilityNotAllowed,
85} 86}
86 87
87impl fmt::Display for SyntaxErrorKind { 88impl fmt::Display for SyntaxErrorKind {
@@ -99,6 +100,9 @@ impl fmt::Display for SyntaxErrorKind {
99 } 100 }
100 ParseError(msg) => write!(f, "{}", msg.0), 101 ParseError(msg) => write!(f, "{}", msg.0),
101 EscapeError(err) => write!(f, "{}", err), 102 EscapeError(err) => write!(f, "{}", err),
103 VisibilityNotAllowed => {
104 write!(f, "unnecessary visibility qualifier")
105 }
102 } 106 }
103 } 107 }
104} 108}
diff --git a/crates/ra_syntax/src/validation.rs b/crates/ra_syntax/src/validation.rs
index ab4f15908..2d596763e 100644
--- a/crates/ra_syntax/src/validation.rs
+++ b/crates/ra_syntax/src/validation.rs
@@ -6,7 +6,7 @@ use rustc_lexer::unescape;
6 6
7use crate::{ 7use crate::{
8 ast, match_ast, AstNode, SyntaxError, SyntaxErrorKind, 8 ast, match_ast, AstNode, SyntaxError, SyntaxErrorKind,
9 SyntaxKind::{BYTE, BYTE_STRING, CHAR, INT_NUMBER, STRING}, 9 SyntaxKind::{BYTE, BYTE_STRING, CHAR, CONST_DEF, FN_DEF, INT_NUMBER, STRING, TYPE_ALIAS_DEF},
10 SyntaxNode, SyntaxToken, TextUnit, T, 10 SyntaxNode, SyntaxToken, TextUnit, T,
11}; 11};
12 12
@@ -102,6 +102,7 @@ pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> {
102 ast::BlockExpr(it) => { block::validate_block_expr(it, &mut errors) }, 102 ast::BlockExpr(it) => { block::validate_block_expr(it, &mut errors) },
103 ast::FieldExpr(it) => { validate_numeric_name(it.name_ref(), &mut errors) }, 103 ast::FieldExpr(it) => { validate_numeric_name(it.name_ref(), &mut errors) },
104 ast::RecordField(it) => { validate_numeric_name(it.name_ref(), &mut errors) }, 104 ast::RecordField(it) => { validate_numeric_name(it.name_ref(), &mut errors) },
105 ast::Visibility(it) => { validate_visibility(it, &mut errors) },
105 _ => (), 106 _ => (),
106 } 107 }
107 } 108 }
@@ -206,3 +207,23 @@ fn validate_numeric_name(name_ref: Option<ast::NameRef>, errors: &mut Vec<Syntax
206 name_ref?.syntax().first_child_or_token()?.into_token().filter(|it| it.kind() == INT_NUMBER) 207 name_ref?.syntax().first_child_or_token()?.into_token().filter(|it| it.kind() == INT_NUMBER)
207 } 208 }
208} 209}
210
211fn validate_visibility(vis: ast::Visibility, errors: &mut Vec<SyntaxError>) {
212 let parent = match vis.syntax().parent() {
213 Some(it) => it,
214 None => return,
215 };
216 match parent.kind() {
217 FN_DEF | CONST_DEF | TYPE_ALIAS_DEF => (),
218 _ => return,
219 }
220 let impl_block = match parent.parent().and_then(|it| it.parent()).and_then(ast::ImplBlock::cast)
221 {
222 Some(it) => it,
223 None => return,
224 };
225 if impl_block.target_trait().is_some() {
226 errors
227 .push(SyntaxError::new(SyntaxErrorKind::VisibilityNotAllowed, vis.syntax.text_range()))
228 }
229}
diff --git a/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rs b/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rs
new file mode 100644
index 000000000..a43e7ef10
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rs
@@ -0,0 +1,6 @@
1impl T for () {
2 fn foo() {}
3 pub fn bar() {}
4 pub(crate) type Baz = ();
5 pub(crate) const C: i32 = 92;
6}
diff --git a/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.txt b/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.txt
new file mode 100644
index 000000000..749c8cddb
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.txt
@@ -0,0 +1,99 @@
1SOURCE_FILE@[0; 118)
2 IMPL_BLOCK@[0; 117)
3 IMPL_KW@[0; 4) "impl"
4 WHITESPACE@[4; 5) " "
5 PATH_TYPE@[5; 6)
6 PATH@[5; 6)
7 PATH_SEGMENT@[5; 6)
8 NAME_REF@[5; 6)
9 IDENT@[5; 6) "T"
10 WHITESPACE@[6; 7) " "
11 FOR_KW@[7; 10) "for"
12 WHITESPACE@[10; 11) " "
13 TUPLE_TYPE@[11; 13)
14 L_PAREN@[11; 12) "("
15 R_PAREN@[12; 13) ")"
16 WHITESPACE@[13; 14) " "
17 ITEM_LIST@[14; 117)
18 L_CURLY@[14; 15) "{"
19 WHITESPACE@[15; 20) "\n "
20 FN_DEF@[20; 31)
21 FN_KW@[20; 22) "fn"
22 WHITESPACE@[22; 23) " "
23 NAME@[23; 26)
24 IDENT@[23; 26) "foo"
25 PARAM_LIST@[26; 28)
26 L_PAREN@[26; 27) "("
27 R_PAREN@[27; 28) ")"
28 WHITESPACE@[28; 29) " "
29 BLOCK_EXPR@[29; 31)
30 BLOCK@[29; 31)
31 L_CURLY@[29; 30) "{"
32 R_CURLY@[30; 31) "}"
33 WHITESPACE@[31; 36) "\n "
34 FN_DEF@[36; 51)
35 VISIBILITY@[36; 39)
36 PUB_KW@[36; 39) "pub"
37 WHITESPACE@[39; 40) " "
38 FN_KW@[40; 42) "fn"
39 WHITESPACE@[42; 43) " "
40 NAME@[43; 46)
41 IDENT@[43; 46) "bar"
42 PARAM_LIST@[46; 48)
43 L_PAREN@[46; 47) "("
44 R_PAREN@[47; 48) ")"
45 WHITESPACE@[48; 49) " "
46 BLOCK_EXPR@[49; 51)
47 BLOCK@[49; 51)
48 L_CURLY@[49; 50) "{"
49 R_CURLY@[50; 51) "}"
50 WHITESPACE@[51; 56) "\n "
51 TYPE_ALIAS_DEF@[56; 81)
52 VISIBILITY@[56; 66)
53 PUB_KW@[56; 59) "pub"
54 L_PAREN@[59; 60) "("
55 CRATE_KW@[60; 65) "crate"
56 R_PAREN@[65; 66) ")"
57 WHITESPACE@[66; 67) " "
58 TYPE_KW@[67; 71) "type"
59 WHITESPACE@[71; 72) " "
60 NAME@[72; 75)
61 IDENT@[72; 75) "Baz"
62 WHITESPACE@[75; 76) " "
63 EQ@[76; 77) "="
64 WHITESPACE@[77; 78) " "
65 TUPLE_TYPE@[78; 80)
66 L_PAREN@[78; 79) "("
67 R_PAREN@[79; 80) ")"
68 SEMI@[80; 81) ";"
69 WHITESPACE@[81; 86) "\n "
70 CONST_DEF@[86; 115)
71 VISIBILITY@[86; 96)
72 PUB_KW@[86; 89) "pub"
73 L_PAREN@[89; 90) "("
74 CRATE_KW@[90; 95) "crate"
75 R_PAREN@[95; 96) ")"
76 WHITESPACE@[96; 97) " "
77 CONST_KW@[97; 102) "const"
78 WHITESPACE@[102; 103) " "
79 NAME@[103; 104)
80 IDENT@[103; 104) "C"
81 COLON@[104; 105) ":"
82 WHITESPACE@[105; 106) " "
83 PATH_TYPE@[106; 109)
84 PATH@[106; 109)
85 PATH_SEGMENT@[106; 109)
86 NAME_REF@[106; 109)
87 IDENT@[106; 109) "i32"
88 WHITESPACE@[109; 110) " "
89 EQ@[110; 111) "="
90 WHITESPACE@[111; 112) " "
91 LITERAL@[112; 114)
92 INT_NUMBER@[112; 114) "92"
93 SEMI@[114; 115) ";"
94 WHITESPACE@[115; 116) "\n"
95 R_CURLY@[116; 117) "}"
96 WHITESPACE@[117; 118) "\n"
97error [36; 39): unnecessary visibility qualifier
98error [56; 66): unnecessary visibility qualifier
99error [86; 96): unnecessary visibility qualifier