Skip to content

Commit

Permalink
feat: changed diagnostics to onpush
Browse files Browse the repository at this point in the history
This is supported in all IDEs.
  • Loading branch information
alesbrelih committed May 4, 2024
1 parent 65bdbe9 commit 0339b17
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 82 deletions.
75 changes: 36 additions & 39 deletions src/gitlab_ci_ls_parser/handlers.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
use std::{collections::HashMap, path::PathBuf, sync::Mutex, time::Instant};

use anyhow::anyhow;
use log::{debug, error, info, warn};
use log::{error, info, warn};
use lsp_server::{Notification, Request};
use lsp_types::{
request::GotoTypeDefinitionParams, CompletionParams, Diagnostic, DidChangeTextDocumentParams,
DidOpenTextDocumentParams, DidSaveTextDocumentParams, DocumentDiagnosticParams, HoverParams,
Position, Url,
DidOpenTextDocumentParams, DidSaveTextDocumentParams, HoverParams, Position, Url,
};

use crate::gitlab_ci_ls_parser::DiagnosticsNotification;

use super::{
fs_utils, parser, parser_utils, treesitter, CompletionResult, Component, DefinitionResult,
DiagnosticsResult, GitlabElement, HoverResult, IncludeInformation, LSPCompletion, LSPConfig,
LSPLocation, LSPPosition, LSPResult, Range, ReferencesResult, RuleReference,
GitlabElement, HoverResult, IncludeInformation, LSPCompletion, LSPConfig, LSPLocation,
LSPPosition, LSPResult, Range, ReferencesResult, RuleReference,
};

#[allow(clippy::module_name_repetitions)]
Expand Down Expand Up @@ -233,9 +234,15 @@ impl LSPHandlers {
}
}

debug!("finished searching");
info!("finished searching");

None
// releasing lock because generate diagnostics grabs it
// and is used in two places
drop(store);
drop(all_nodes);
drop(all_stages);

self.generate_diagnostics(params.text_document.uri)
}

#[allow(clippy::too_many_lines)]
Expand Down Expand Up @@ -915,37 +922,22 @@ impl LSPHandlers {
Ok(())
}

#[allow(clippy::unused_self)]
pub fn on_save(&self, notification: Notification) -> Option<LSPResult> {
let _params =
serde_json::from_value::<DidSaveTextDocumentParams>(notification.params).ok()?;

// PUBLISH DIAGNOSTICS

None
}

#[allow(clippy::too_many_lines)]
pub fn on_diagnostic(&self, request: Request) -> Option<LSPResult> {
fn generate_diagnostics(&self, document_uri: lsp_types::Url) -> Option<LSPResult> {
let start = Instant::now();
let params = serde_json::from_value::<DocumentDiagnosticParams>(request.params).ok()?;
let store = self.store.lock().unwrap();
let all_nodes = self.nodes.lock().unwrap();

let content: String = store
.get(&params.text_document.uri.to_string())?
.to_string();
let content: String = store.get(&document_uri.to_string())?.to_string();

let extends = self.parser.get_all_extends(
params.text_document.uri.to_string(),
content.as_str(),
None,
);
let extends = self
.parser
.get_all_extends(document_uri.to_string(), content.as_str(), None);

let mut diagnostics: Vec<Diagnostic> = vec![];

'extend: for extend in extends {
if extend.uri == params.text_document.uri.to_string() {
if extend.uri == document_uri.to_string() {
for (_, root_nodes) in all_nodes.iter() {
if root_nodes.get(&extend.key).is_some() {
continue 'extend;
Expand All @@ -968,9 +960,9 @@ impl LSPHandlers {
}
}

let stages =
self.parser
.get_all_stages(params.text_document.uri.as_str(), content.as_str(), None);
let stages = self
.parser
.get_all_stages(document_uri.as_ref(), content.as_str(), None);

let all_stages = self.stages.lock().unwrap();
for stage in stages {
Expand All @@ -991,11 +983,9 @@ impl LSPHandlers {
}
}

let needs = self.parser.get_all_job_needs(
params.text_document.uri.to_string(),
content.as_str(),
None,
);
let needs = self
.parser
.get_all_job_needs(document_uri.to_string(), content.as_str(), None);

'needs: for need in needs {
for (_, node) in all_nodes.iter() {
Expand All @@ -1020,7 +1010,7 @@ impl LSPHandlers {

let components = self
.parser
.get_all_components(params.text_document.uri.as_str(), content.as_str());
.get_all_components(document_uri.as_ref(), content.as_str());

let all_components = self.components.lock().unwrap();
for component in components {
Expand Down Expand Up @@ -1048,12 +1038,19 @@ impl LSPHandlers {
}

info!("DIAGNOSTICS ELAPSED: {:?}", start.elapsed());
Some(LSPResult::Diagnostics(DiagnosticsResult {
id: request.id,
Some(LSPResult::Diagnostics(DiagnosticsNotification {
uri: document_uri,
diagnostics,
}))
}

pub fn on_save(&self, notification: Notification) -> Option<LSPResult> {
let params =
serde_json::from_value::<DidSaveTextDocumentParams>(notification.params).ok()?;

self.generate_diagnostics(params.text_document.uri)
}

pub fn on_references(&self, request: Request) -> Option<LSPResult> {
let start = Instant::now();

Expand Down
26 changes: 12 additions & 14 deletions src/gitlab_ci_ls_parser/messages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,16 @@ use std::process::exit;
use log::{error, info, warn};
use lsp_server::{Connection, Message, Response};
use lsp_types::{
CompletionItem, CompletionItemKind, CompletionList, CompletionTextEdit,
FullDocumentDiagnosticReport, Hover, HoverContents, LocationLink, MarkedString, MarkupContent,
Position, TextEdit,
CompletionItem, CompletionItemKind, CompletionList, CompletionTextEdit, Hover, HoverContents,
LocationLink, MarkedString, MarkupContent, Position, TextEdit,
};
use reqwest::Url;

use crate::gitlab_ci_ls_parser::LSPResult;

use super::{
handlers::LSPHandlers, CompletionResult, DefinitionResult, DiagnosticsResult, HoverResult,
ReferencesResult,
handlers::LSPHandlers, CompletionResult, DefinitionResult, DiagnosticsNotification,
HoverResult, ReferencesResult,
};

pub struct Messages {
Expand Down Expand Up @@ -53,7 +52,6 @@ impl Messages {
"textDocument/definition" => self.events.on_definition(request),
"textDocument/references" => self.events.on_references(request),
"textDocument/completion" => self.events.on_completion(request),
"textDocument/diagnostic" => self.events.on_diagnostic(request),
"shutdown" => {
error!("SHUTDOWN!!");
exit(0);
Expand Down Expand Up @@ -254,14 +252,14 @@ fn references(result: ReferencesResult) -> Message {
})
}

fn diagnostics(result: DiagnosticsResult) -> Message {
Message::Response(Response {
id: result.id,
result: serde_json::to_value(FullDocumentDiagnosticReport {
items: result.diagnostics,
..Default::default()
fn diagnostics(notification: DiagnosticsNotification) -> Message {
Message::Notification(lsp_server::Notification {
method: "textDocument/publishDiagnostics".to_string(),
params: serde_json::to_value(lsp_types::PublishDiagnosticsParams {
uri: notification.uri,
diagnostics: notification.diagnostics,
version: None,
})
.ok(),
error: None,
.unwrap(),
})
}
8 changes: 4 additions & 4 deletions src/gitlab_ci_ls_parser/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::collections::HashMap;

use lsp_server::RequestId;
use lsp_types::Diagnostic;
use lsp_types::{Diagnostic, Url};

pub mod fs_utils;
pub mod git;
Expand Down Expand Up @@ -62,8 +62,8 @@ pub struct HoverResult {
}

#[derive(Debug)]
pub struct DiagnosticsResult {
pub id: RequestId,
pub struct DiagnosticsNotification {
pub uri: Url,
pub diagnostics: Vec<Diagnostic>,
}

Expand All @@ -72,7 +72,7 @@ pub enum LSPResult {
Hover(HoverResult),
Completion(CompletionResult),
Definition(DefinitionResult),
Diagnostics(DiagnosticsResult),
Diagnostics(DiagnosticsNotification),
References(ReferencesResult),
Error(anyhow::Error),
}
Expand Down
26 changes: 1 addition & 25 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ use regex::Regex;
use serde::{Deserialize, Serialize};

use lsp_server::Connection;
use lsp_types::{
DiagnosticServerCapabilities, DocumentFilter, ServerCapabilities, TextDocumentSyncKind,
WorkDoneProgressOptions,
};
use lsp_types::{ServerCapabilities, TextDocumentSyncKind, WorkDoneProgressOptions};

use std::collections::HashMap;
use std::error::Error;
Expand Down Expand Up @@ -87,27 +84,6 @@ fn main() -> Result<(), Box<dyn Error + Sync + Send>> {
all_commit_characters: None,
completion_item: None,
}),
diagnostic_provider: Some(DiagnosticServerCapabilities::RegistrationOptions(
lsp_types::DiagnosticRegistrationOptions {
diagnostic_options: lsp_types::DiagnosticOptions {
work_done_progress_options: WorkDoneProgressOptions {
work_done_progress: None,
},
identifier: None,
workspace_diagnostics: false,
inter_file_dependencies: true,
},
static_registration_options: lsp_types::StaticRegistrationOptions { id: None },
text_document_registration_options: lsp_types::TextDocumentRegistrationOptions {
document_selector: Some(vec![DocumentFilter {
pattern: Some(String::from("*gitlab-ci*")),
scheme: Some("file".into()),
language: Some("yaml".into()),
}]),
},
},
)),

..Default::default()
})?;

Expand Down

0 comments on commit 0339b17

Please sign in to comment.