Skip to content

Commit

Permalink
Merge pull request #9 from Vulpesx/code-action
Browse files Browse the repository at this point in the history
Code action to update version
  • Loading branch information
MathiasPius authored Jun 6, 2024
2 parents 183a887 + 0885695 commit 15a78ed
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 40 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

126 changes: 97 additions & 29 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ mod crates;
mod parse;
mod settings;

mod diagnostic_codes {
pub const UP_TO_DATE: i32 = 0;
pub const NEEDS_UPDATE: i32 = 1;
pub const UNKNOWN_DEP: i32 = 2;
}

#[derive(Debug, Clone)]
struct Backend {
client: Client,
Expand Down Expand Up @@ -69,15 +75,21 @@ impl Backend {
match &dependency.version {
DependencyVersion::Complete { range, version } => {
if !version.matches(newest_version) {
Diagnostic::new(
*range,
Some(nu_sev),
None,
None,
format!("{}: {newest_version}", &dependency.name),
None,
None,
)
Diagnostic {
range: *range,
severity: Some(nu_sev),
code: Some(NumberOrString::Number(
diagnostic_codes::NEEDS_UPDATE,
)),
code_description: None,
source: None,
message: format!("{}: {newest_version}", &dependency.name),
related_information: None,
tags: None,
data: Some(serde_json::json!({
"newest_version": newest_version,
})),
}
} else {
let range = Range {
start: Position::new(range.start.line, 0),
Expand All @@ -86,34 +98,40 @@ impl Backend {
Diagnostic::new(
range,
Some(utd_sev),
None,
Some(NumberOrString::Number(diagnostic_codes::UP_TO_DATE)),
None,
"✓".to_string(),
None,
None,
)
}
}
DependencyVersion::Partial { range, .. } => Diagnostic::new(
*range,
Some(nu_sev),
None,
None,
format!("{}: {newest_version}", &dependency.name),
None,
None,
),
DependencyVersion::Partial { range, .. } => Diagnostic {
range: *range,
severity: Some(nu_sev),
code: Some(NumberOrString::Number(diagnostic_codes::NEEDS_UPDATE)),
code_description: None,
source: None,
message: format!("{}: {newest_version}", &dependency.name),
related_information: None,
tags: None,
data: Some(serde_json::json!({
"newest_version": newest_version,
})),
},
}
} else {
Diagnostic::new(
dependency.version.range(),
Some(ud_sev),
None,
None,
format!("{}: Unknown crate", &dependency.name),
None,
None,
)
Diagnostic {
range: dependency.version.range(),
severity: Some(ud_sev),
code: Some(NumberOrString::Number(diagnostic_codes::UNKNOWN_DEP)),
code_description: None,
source: None,
message: format!("{}: Unknown crate", &dependency.name),
related_information: None,
tags: None,
data: None,
}
}
})
.collect();
Expand Down Expand Up @@ -146,6 +164,7 @@ impl LanguageServer for Backend {
all_commit_characters: None,
..Default::default()
}),
code_action_provider: Some(CodeActionProviderCapability::Simple(true)),
execute_command_provider: Some(ExecuteCommandOptions {
commands: vec!["dummy.do_something".to_string()],
work_done_progress_options: Default::default(),
Expand Down Expand Up @@ -257,7 +276,6 @@ impl LanguageServer for Backend {

if let Some(Some(newest_version)) = packages.get(&dependency.name) {
let specified_version = dependency.version.to_string();
let specified_version = &specified_version[0..specified_version.len() - 1];

let newest_version = newest_version.to_string();

Expand Down Expand Up @@ -285,6 +303,56 @@ impl LanguageServer for Backend {
}
}
}

async fn code_action(&self, params: CodeActionParams) -> Result<Option<CodeActionResponse>> {
let mut response = CodeActionResponse::new();
for d in params
.context
.diagnostics
.into_iter()
.filter(|d| d.range.start <= params.range.start && d.range.end >= params.range.end)
{
let Some(NumberOrString::Number(diagnostic_codes::NEEDS_UPDATE)) = d.code else {
continue;
};

let Some(serde_json::Value::Object(ref data)) = d.data else {
continue;
};

let Some(serde_json::Value::String(newest_version)) = data.get("newest_version") else {
continue;
};

let range = d.range;
let newest_version = newest_version.clone();

response.push(CodeActionOrCommand::CodeAction(CodeAction {
title: format!("Update Version to: {newest_version}"),
kind: Some(CodeActionKind::QUICKFIX),
diagnostics: Some(vec![d]),
edit: Some(WorkspaceEdit {
changes: Some(
[(
params.text_document.uri.clone(),
vec![TextEdit {
range,
new_text: newest_version,
}],
)]
.into(),
),
document_changes: None,
change_annotations: None,
}),
command: None,
is_preferred: None,
disabled: None,
data: None,
}))
}
Ok(Some(response))
}
}

#[tokio::main(flavor = "current_thread")]
Expand Down
20 changes: 10 additions & 10 deletions src/parse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ impl<'a> Line<'a> {
},
'"' => VersionSelector {
name,
start: i,
start: i + 1,
first: true,
},
_ => Name { name },
Expand All @@ -176,7 +176,7 @@ impl<'a> Line<'a> {
if c == '"' {
VersionSelector {
name,
start: i,
start: i + 1,
first: true,
}
} else {
Expand Down Expand Up @@ -213,7 +213,7 @@ impl<'a> Line<'a> {
}
}
}
'0'..='9' | '.' | '_' | '<' | '>' | '=' | ',' => VersionSelector {
'0'..='9' | '.' | '*' | '_' | '-' | '<' | '>' | '=' | ',' => VersionSelector {
name,
start,
first: false,
Expand All @@ -239,7 +239,7 @@ impl<'a> Line<'a> {
start,
end,
} => {
let version = version[1..].trim();
let version = version.trim();
let version = if let Ok(version) = VersionReq::parse(version) {
DependencyVersion::Complete {
version,
Expand Down Expand Up @@ -268,7 +268,7 @@ impl<'a> Line<'a> {
start,
} => {
let version = DependencyVersion::Partial {
version: version[1..].trim().trim_matches(',').to_string(),
version: version.trim().trim_matches(',').to_string(),
range: Range::new(
Position::new(0, start as u32),
Position::new(0, line.len() as u32),
Expand All @@ -286,7 +286,7 @@ impl<'a> Line<'a> {
Some(Dependency::WithVersion(DependencyWithVersion {
name: name.to_string(),
version: DependencyVersion::Partial {
version: line[start + 1..].trim().to_string(),
version: line[start..].trim().to_string(),
range: Range::new(
Position::new(0, start as u32),
Position::new(0, line.len() as u32),
Expand Down Expand Up @@ -393,7 +393,7 @@ impl ManifestTracker {
// named "version" because of the Line::parse logic assuming this is
// a regular dependencies section.
if let Some(x) = dependency.name_mut() {
*x = name.clone()
x.clone_from(name)
}
}
// Line::parse assumes line 0, modify so we have to fix this manually.
Expand Down Expand Up @@ -559,7 +559,7 @@ mod tests {
name: "log".to_string(),
version: DependencyVersion::Complete {
range: Range {
start: Position::new(1, 6),
start: Position::new(1, 7),
end: Position::new(1, 8)
},
version: VersionReq::parse("1").unwrap()
Expand All @@ -569,7 +569,7 @@ mod tests {
name: "serde".to_string(),
version: DependencyVersion::Complete {
range: Range {
start: Position::new(4, 10),
start: Position::new(4, 11),
end: Position::new(4, 12)
},
version: VersionReq::parse("1").unwrap()
Expand All @@ -579,7 +579,7 @@ mod tests {
name: "tokio".to_string(),
version: DependencyVersion::Complete {
range: Range {
start: Position::new(7, 10),
start: Position::new(7, 11),
end: Position::new(7, 12)
},
version: VersionReq::parse("1").unwrap()
Expand Down

0 comments on commit 15a78ed

Please sign in to comment.