internal: deduplicate

This commit is contained in:
Aleksey Kladov 2021-09-04 12:56:34 +03:00
parent 33199b7e43
commit 2d2c4e7c22
5 changed files with 55 additions and 33 deletions

View file

@ -10,7 +10,9 @@ use crate::{
from_json, from_json,
global_state::GlobalStateSnapshot, global_state::GlobalStateSnapshot,
line_index::{LineIndex, OffsetEncoding}, line_index::{LineIndex, OffsetEncoding},
lsp_ext, LspError, Result, lsp_ext,
lsp_utils::invalid_params_error,
Result,
}; };
pub(crate) fn abs_path(url: &lsp_types::Url) -> Result<AbsPathBuf> { pub(crate) fn abs_path(url: &lsp_types::Url) -> Result<AbsPathBuf> {
@ -85,10 +87,8 @@ pub(crate) fn annotation(
snap: &GlobalStateSnapshot, snap: &GlobalStateSnapshot,
code_lens: lsp_types::CodeLens, code_lens: lsp_types::CodeLens,
) -> Result<Annotation> { ) -> Result<Annotation> {
let data = code_lens.data.ok_or_else(|| LspError { let data =
code: lsp_server::ErrorCode::InvalidParams as i32, code_lens.data.ok_or_else(|| invalid_params_error("code lens without data".to_string()))?;
message: "code lens without data".to_string(),
});
let resolve = from_json::<lsp_ext::CodeLensResolveData>("CodeLensResolveData", data)?; let resolve = from_json::<lsp_ext::CodeLensResolveData>("CodeLensResolveData", data)?;
match resolve { match resolve {

View file

@ -40,7 +40,7 @@ use crate::{
self, InlayHint, InlayHintsParams, PositionOrRange, ViewCrateGraphParams, self, InlayHint, InlayHintsParams, PositionOrRange, ViewCrateGraphParams,
WorkspaceSymbolParams, WorkspaceSymbolParams,
}, },
lsp_utils::all_edits_are_disjoint, lsp_utils::{all_edits_are_disjoint, invalid_params_error},
to_proto, LspError, Result, to_proto, LspError, Result,
}; };
@ -767,9 +767,8 @@ pub(crate) fn handle_completion_resolve(
let _p = profile::span("handle_completion_resolve"); let _p = profile::span("handle_completion_resolve");
if !all_edits_are_disjoint(&original_completion, &[]) { if !all_edits_are_disjoint(&original_completion, &[]) {
return Err(LspError::new( return Err(invalid_params_error(
ErrorCode::InvalidParams as i32, "Received a completion with overlapping edits, this is not LSP-compliant".to_string(),
"Received a completion with overlapping edits, this is not LSP-compliant".into(),
) )
.into()); .into());
} }
@ -1038,10 +1037,7 @@ pub(crate) fn handle_code_action_resolve(
let _p = profile::span("handle_code_action_resolve"); let _p = profile::span("handle_code_action_resolve");
let params = match code_action.data.take() { let params = match code_action.data.take() {
Some(it) => it, Some(it) => it,
None => Err(LspError { None => return Err(invalid_params_error(format!("code action without data")).into()),
code: lsp_server::ErrorCode::InvalidParams as i32,
message: format!("code action without data"),
})?,
}; };
let file_id = from_proto::file_id(&snap, &params.code_action_params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.code_action_params.text_document.uri)?;
@ -1059,10 +1055,10 @@ pub(crate) fn handle_code_action_resolve(
let (assist_index, assist_resolve) = match parse_action_id(&params.id) { let (assist_index, assist_resolve) = match parse_action_id(&params.id) {
Ok(parsed_data) => parsed_data, Ok(parsed_data) => parsed_data,
Err(e) => { Err(e) => {
return Err(LspError::new( return Err(invalid_params_error(format!(
ErrorCode::InvalidParams as i32, "Failed to parse action id string '{}': {}",
format!("Failed to parse action id string '{}': {}", params.id, e), params.id, e
) ))
.into()) .into())
} }
}; };
@ -1079,23 +1075,17 @@ pub(crate) fn handle_code_action_resolve(
let assist = match assists.get(assist_index) { let assist = match assists.get(assist_index) {
Some(assist) => assist, Some(assist) => assist,
None => return Err(LspError::new( None => return Err(invalid_params_error(format!(
ErrorCode::InvalidParams as i32,
format!(
"Failed to find the assist for index {} provided by the resolve request. Resolve request assist id: {}", "Failed to find the assist for index {} provided by the resolve request. Resolve request assist id: {}",
assist_index, params.id, assist_index, params.id,
), ))
)
.into()) .into())
}; };
if assist.id.0 != expected_assist_id || assist.id.1 != expected_kind { if assist.id.0 != expected_assist_id || assist.id.1 != expected_kind {
return Err(LspError::new( return Err(invalid_params_error(format!(
ErrorCode::InvalidParams as i32,
format!(
"Mismatching assist at index {} for the resolve parameters given. Resolve request assist id: {}, actual id: {:?}.", "Mismatching assist at index {} for the resolve parameters given. Resolve request assist id: {}, actual id: {:?}.",
assist_index, params.id, assist.id assist_index, params.id, assist.id
), ))
)
.into()); .into());
} }
let edit = to_proto::code_action(&snap, assist.clone(), None)?.edit; let edit = to_proto::code_action(&snap, assist.clone(), None)?.edit;

View file

@ -8,8 +8,13 @@ use crate::{
from_proto, from_proto,
global_state::GlobalState, global_state::GlobalState,
line_index::{LineEndings, LineIndex, OffsetEncoding}, line_index::{LineEndings, LineIndex, OffsetEncoding},
LspError,
}; };
pub(crate) fn invalid_params_error(message: String) -> LspError {
LspError { code: lsp_server::ErrorCode::InvalidParams as i32, message }
}
pub(crate) fn is_cancelled(e: &(dyn Error + 'static)) -> bool { pub(crate) fn is_cancelled(e: &(dyn Error + 'static)) -> bool {
e.downcast_ref::<Cancelled>().is_some() e.downcast_ref::<Cancelled>().is_some()
} }

View file

@ -21,7 +21,9 @@ use crate::{
config::Config, config::Config,
global_state::GlobalStateSnapshot, global_state::GlobalStateSnapshot,
line_index::{LineEndings, LineIndex, OffsetEncoding}, line_index::{LineEndings, LineIndex, OffsetEncoding},
lsp_ext, semantic_tokens, Result, lsp_ext,
lsp_utils::invalid_params_error,
semantic_tokens, Result,
}; };
pub(crate) fn position(line_index: &LineIndex, offset: TextSize) -> lsp_types::Position { pub(crate) fn position(line_index: &LineIndex, offset: TextSize) -> lsp_types::Position {
@ -1198,7 +1200,9 @@ pub(crate) fn markup_content(markup: Markup) -> lsp_types::MarkupContent {
} }
pub(crate) fn rename_error(err: RenameError) -> crate::LspError { pub(crate) fn rename_error(err: RenameError) -> crate::LspError {
crate::LspError { code: lsp_server::ErrorCode::InvalidParams as i32, message: err.to_string() } // This is wrong, but we don't have a better alternative I suppose?
// https://github.com/microsoft/language-server-protocol/issues/1341
invalid_params_error(err.to_string())
} }
#[cfg(test)] #[cfg(test)]

View file

@ -895,6 +895,29 @@ fn foo() -> Option<Bar> {
**Rationale:** reduce cognitive stack usage. **Rationale:** reduce cognitive stack usage.
Use `return Err(err)` to throw an error:
```rust
// GOOD
fn f() -> Result<(), ()> {
if condition {
return Err(());
}
Ok(())
}
// BAD
fn f() -> Result<(), ()> {
if condition {
Err(())?;
}
Ok(())
}
```
**Rationale:** `return` has type `!`, which allows the compiler to flag dead
code (`Err(...)?` is of unconstrained generic type `T`).
## Comparisons ## Comparisons
When doing multiple comparisons use `<`/`<=`, avoid `>`/`>=`. When doing multiple comparisons use `<`/`<=`, avoid `>`/`>=`.