Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.

Commit 0360883

Browse files
committed
warn unused config: rev0.3
1 parent 3feb1d8 commit 0360883

File tree

3 files changed

+134
-33
lines changed

3 files changed

+134
-33
lines changed

src/actions/notifications.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,12 @@ impl BlockingNotificationAction for DidChangeConfiguration {
154154
out: O,
155155
) -> Result<(), ()> {
156156
trace!("config change: {:?}", params.settings);
157-
let mut dups = std::collections::HashMap::<String, Vec<String>>::new();
158-
let mut unknowns = Vec::<String>::new();
157+
use std::collections::HashMap;
158+
let mut dups = HashMap::new();
159+
let mut unknowns = vec![];
159160
let settings = ChangeConfigSettings::try_deserialize(&params.settings, &mut dups, &mut unknowns);
161+
crate::server::maybe_notify_unknown_configs(&out, &unknowns);
162+
crate::server::maybe_notify_duplicated_configs(&out, &dups);
160163

161164
let new_config = match settings {
162165
Ok(mut value) => {

src/server/mod.rs

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,40 @@ impl BlockingRequestAction for ShutdownRequest {
8585
}
8686
}
8787

88+
pub(crate) fn maybe_notify_unknown_configs<O: Output>(out: &O, unknowns: &Vec<(String)>) {
89+
use std::fmt::Write;
90+
if unknowns.is_empty() {
91+
return;
92+
}
93+
let mut msg = String::new();
94+
for key in unknowns {
95+
write!(msg, "unknown RLS configuration: {}; ", key.clone()).ok();
96+
}
97+
out.notify(Notification::<ShowMessage>::new(ShowMessageParams {
98+
typ: MessageType::Warning,
99+
message: msg,
100+
}));
101+
}
102+
103+
pub(crate) fn maybe_notify_duplicated_configs<O: Output>(out: &O, dups: &std::collections::HashMap<String, Vec<String>>) {
104+
use std::fmt::Write;
105+
if dups.is_empty() {
106+
return;
107+
}
108+
let mut msg = String::new();
109+
for kv in dups {
110+
write!(msg, "{}: ", kv.0).ok();
111+
for v in kv.1 {
112+
write!(msg, "{}, ", v).ok();
113+
}
114+
msg += "; ";
115+
}
116+
out.notify(Notification::<ShowMessage>::new(ShowMessageParams {
117+
typ: MessageType::Warning,
118+
message: format!("duplicated RLS configuration: {}", msg.clone()),
119+
}));
120+
}
121+
88122
impl BlockingRequestAction for InitializeRequest {
89123
type Response = NoResponse;
90124

@@ -108,31 +142,8 @@ impl BlockingRequestAction for InitializeRequest {
108142
));
109143
}
110144

111-
if !dups.is_empty() {
112-
let mut msg = String::new();
113-
for kv in &dups {
114-
msg += &format!("{}: ", kv.0);
115-
for v in kv.1 {
116-
msg += &format!("{}, ", v);
117-
}
118-
msg += "; ";
119-
}
120-
out.notify(Notification::<ShowMessage>::new(ShowMessageParams {
121-
typ: MessageType::Warning,
122-
message: format!("duplicated option: {}", msg.clone()),
123-
}));
124-
}
125-
126-
if !unknowns.is_empty() {
127-
let mut msg = String::new();
128-
for key in &unknowns {
129-
msg += &format!("unknown option: {}; ", key.clone());
130-
}
131-
out.notify(Notification::<ShowMessage>::new(ShowMessageParams {
132-
typ: MessageType::Warning,
133-
message: format!("unknown option: {}", msg),
134-
}));
135-
}
145+
maybe_notify_unknown_configs(&out, &unknowns);
146+
maybe_notify_duplicated_configs(&out, &dups);
136147

137148
let result = InitializeResult {
138149
capabilities: server_caps(ctx),

tests/client.rs

Lines changed: 93 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,8 +1280,26 @@ fn client_deglob() {
12801280
rls.shutdown();
12811281
}
12821282

1283+
fn is_notification_for_unknown_config(msg:&serde_json::Value) -> bool {
1284+
eprintln!("unk msg: {}", msg);
1285+
msg["method"] == ShowMessage::METHOD
1286+
&& msg["params"]["message"]
1287+
.as_str()
1288+
.unwrap()
1289+
.contains("unknown")
1290+
}
1291+
1292+
fn is_notification_for_duplicated_config(msg:&serde_json::Value) -> bool {
1293+
eprintln!("dup msg: {}", msg);
1294+
msg["method"] == ShowMessage::METHOD
1295+
&& msg["params"]["message"]
1296+
.as_str()
1297+
.unwrap()
1298+
.contains("duplicate")
1299+
}
1300+
12831301
#[test]
1284-
fn client_duplicated_and_unknown_settings() {
1302+
fn client_init_duplicated_and_unknown_settings() {
12851303
let p = project("simple_workspace")
12861304
.file("Cargo.toml", &basic_bin_manifest("foo"))
12871305
.file(
@@ -1328,11 +1346,80 @@ fn client_duplicated_and_unknown_settings() {
13281346
workspace_folders: None,
13291347
});
13301348

1331-
for m in rls.messages().iter() {
1332-
eprintln!("msg: {}", m);
1333-
}
1349+
assert!(rls
1350+
.messages()
1351+
.iter()
1352+
.any(is_notification_for_unknown_config));
1353+
assert!(rls
1354+
.messages()
1355+
.iter()
1356+
.any(is_notification_for_duplicated_config));
1357+
rls.shutdown();
1358+
}
13341359

1335-
assert!(rls.messages().iter().filter(|msg| msg["method"] == ShowMessage::METHOD && msg["params"]["message"].as_str().and_then(|val| if val.contains("duplicate") {Some(true)} else {None}).unwrap_or(false)).count() != 0);
1336-
assert!(rls.messages().iter().filter(|msg| msg["method"] == ShowMessage::METHOD && msg["params"]["message"].as_str().and_then(|val| if val.contains("unknown") {Some(true)} else {None}).unwrap_or(false)).count() != 0);
1360+
#[test]
1361+
fn client_did_change_configuration_duplicated_and_unknown_settings() {
1362+
let p = project("simple_workspace")
1363+
.file("Cargo.toml", &basic_bin_manifest("foo"))
1364+
.file(
1365+
"src/main.rs",
1366+
r#"
1367+
struct UnusedBin;
1368+
fn main() {
1369+
println!("Hello world!");
1370+
}
1371+
"#,
1372+
)
1373+
.build();
1374+
let root_path = p.root();
1375+
let mut rls = p.spawn_rls_async();
1376+
1377+
rls.request::<Initialize>(0,
1378+
lsp_types::InitializeParams {
1379+
process_id: None,
1380+
root_uri: None,
1381+
root_path: Some(root_path.display().to_string()),
1382+
initialization_options: None,
1383+
capabilities: lsp_types::ClientCapabilities {
1384+
workspace: None,
1385+
text_document: None,
1386+
experimental: None,
1387+
},
1388+
trace: None,
1389+
workspace_folders: None,
1390+
});
1391+
1392+
assert!(!rls
1393+
.messages()
1394+
.iter()
1395+
.any(is_notification_for_unknown_config));
1396+
assert!(!rls
1397+
.messages()
1398+
.iter()
1399+
.any(is_notification_for_duplicated_config));
1400+
let settings = json!({
1401+
"rust": {
1402+
"features": ["some_feature"],
1403+
"all_targets": false,
1404+
"unknown1": 1,
1405+
"unknown2": false,
1406+
"dup_val": 1,
1407+
"dup_val": false,
1408+
"dup_licated": "dup_lacated",
1409+
"DupLicated": "DupLicated",
1410+
"dup-licated": "dup-licated"
1411+
}
1412+
});
1413+
rls.notify::<DidChangeConfiguration>(
1414+
DidChangeConfigurationParams {
1415+
settings:settings.clone(),
1416+
});
1417+
rls.wait_for_message(is_notification_for_unknown_config);
1418+
// FIXME: have to resend the notification, or we will miss the second message
1419+
rls.notify::<DidChangeConfiguration>(
1420+
DidChangeConfigurationParams {
1421+
settings:settings.clone(),
1422+
});
1423+
rls.wait_for_message(is_notification_for_duplicated_config);
13371424
rls.shutdown();
13381425
}

0 commit comments

Comments
 (0)