aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_editor/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_editor/src')
-rw-r--r--crates/ra_editor/src/lib.rs55
1 files changed, 53 insertions, 2 deletions
diff --git a/crates/ra_editor/src/lib.rs b/crates/ra_editor/src/lib.rs
index 36cabed25..48676f2e8 100644
--- a/crates/ra_editor/src/lib.rs
+++ b/crates/ra_editor/src/lib.rs
@@ -31,10 +31,17 @@ pub struct HighlightedRange {
31 pub tag: &'static str, 31 pub tag: &'static str,
32} 32}
33 33
34#[derive(Debug, Copy, Clone)]
35pub enum Severity {
36 Error,
37 Warning
38}
39
34#[derive(Debug)] 40#[derive(Debug)]
35pub struct Diagnostic { 41pub struct Diagnostic {
36 pub range: TextRange, 42 pub range: TextRange,
37 pub msg: String, 43 pub msg: String,
44 pub severity: Severity,
38} 45}
39 46
40#[derive(Debug)] 47#[derive(Debug)]
@@ -97,13 +104,36 @@ pub fn diagnostics(file: &SourceFileNode) -> Vec<Diagnostic> {
97 } 104 }
98 } 105 }
99 106
100 file.errors() 107 let mut errors: Vec<Diagnostic> = file.errors()
101 .into_iter() 108 .into_iter()
102 .map(|err| Diagnostic { 109 .map(|err| Diagnostic {
103 range: location_to_range(err.location()), 110 range: location_to_range(err.location()),
104 msg: format!("Syntax Error: {}", err), 111 msg: format!("Syntax Error: {}", err),
112 severity: Severity::Error,
105 }) 113 })
106 .collect() 114 .collect();
115
116 let warnings = check_unnecessary_braces_in_use_statement(file);
117
118 errors.extend(warnings);
119 errors
120}
121
122fn check_unnecessary_braces_in_use_statement(file: &SourceFileNode) -> Vec<Diagnostic> {
123 let mut diagnostics = Vec::new();
124 for node in file.syntax().descendants() {
125 if let Some(use_tree_list) = ast::UseTreeList::cast(node) {
126 if use_tree_list.use_trees().count() <= 1 {
127 diagnostics.push(Diagnostic {
128 range: use_tree_list.syntax().range(),
129 msg: format!("Unnecessary braces in use statement"),
130 severity: Severity::Warning,
131 })
132 }
133 }
134 }
135
136 diagnostics
107} 137}
108 138
109pub fn syntax_tree(file: &SourceFileNode) -> String { 139pub fn syntax_tree(file: &SourceFileNode) -> String {
@@ -204,4 +234,25 @@ fn test_foo() {}
204 234
205 do_check("struct Foo { a: i32, }<|>", "struct Foo <|>{ a: i32, }"); 235 do_check("struct Foo { a: i32, }<|>", "struct Foo <|>{ a: i32, }");
206 } 236 }
237
238 #[test]
239 fn test_check_unnecessary_braces_in_use_statement() {
240 let file = SourceFileNode::parse(
241 r#"
242use a;
243use {b};
244use a::{c};
245use a::{c, d::e};
246use a::{c, d::{e}};
247fn main() {}
248"#,
249 );
250 let diagnostics = check_unnecessary_braces_in_use_statement(&file);
251 assert_eq_dbg(
252 r#"[Diagnostic { range: [12; 15), msg: "Unnecessary braces in use statement", severity: Warning },
253 Diagnostic { range: [24; 27), msg: "Unnecessary braces in use statement", severity: Warning },
254 Diagnostic { range: [61; 64), msg: "Unnecessary braces in use statement", severity: Warning }]"#,
255 &diagnostics,
256 )
257 }
207} 258}