Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions crates/squawk_ide/src/completion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -963,7 +963,7 @@ mod tests {
fn completions(sql: &str) -> String {
let (offset, sql) = fixture(sql);
let db = Database::default();
let file = File::new(&db, sql, 0);
let file = File::new(&db, sql.into());
let items = completion(&db, file, offset);
assert!(
!items.is_empty(),
Expand All @@ -975,7 +975,7 @@ mod tests {
fn completions_not_found(sql: &str) {
let (offset, sql) = fixture(sql);
let db = Database::default();
let file = File::new(&db, sql, 0);
let file = File::new(&db, sql.into());
let items = completion(&db, file, offset);
assert_eq!(
items,
Expand Down
4 changes: 2 additions & 2 deletions crates/squawk_ide/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ use ::line_index::LineIndex;
use salsa::Database as Db;
use salsa::Storage;
use squawk_syntax::{Parse, SourceFile};
use std::sync::Arc;

use crate::binder;
use crate::binder::Binder;

#[salsa::input]
pub struct File {
#[returns(ref)]
pub content: String,
pub version: i32,
pub content: Arc<str>,
}

#[salsa::tracked]
Expand Down
4 changes: 2 additions & 2 deletions crates/squawk_ide/src/document_symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -854,7 +854,7 @@ mod tests {

fn symbols_not_found(sql: &str) {
let db = Database::default();
let file = File::new(&db, sql.to_string(), 0);
let file = File::new(&db, sql.to_string().into());
let symbols = document_symbols(&db, file);
if !symbols.is_empty() {
panic!("Symbols found. If this is expected, use `symbols` instead.")
Expand All @@ -863,7 +863,7 @@ mod tests {

fn symbols(sql: &str) -> String {
let db = Database::default();
let file = File::new(&db, sql.to_string(), 0);
let file = File::new(&db, sql.to_string().into());
let symbols = document_symbols(&db, file);
if symbols.is_empty() {
panic!("No symbols found. If this is expected, use `symbols_not_found` instead.")
Expand Down
2 changes: 1 addition & 1 deletion crates/squawk_ide/src/find_references.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ mod test {
let (mut offset, sql) = fixture(sql);
offset = offset.checked_sub(1.into()).unwrap_or_default();
let db = Database::default();
let file = File::new(&db, sql.clone(), 0);
let file = File::new(&db, sql.clone().into());
assert_eq!(crate::db::parse(&db, file).errors(), vec![]);

let references = find_references(&db, file, offset);
Expand Down
2 changes: 1 addition & 1 deletion crates/squawk_ide/src/folding_ranges.rs
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ mod tests {

fn check(sql: &str) -> String {
let db = Database::default();
let file = File::new(&db, sql.to_string(), 0);
let file = File::new(&db, sql.to_string().into());
let folds = folding_ranges(&db, file);

if folds.is_empty() {
Expand Down
2 changes: 1 addition & 1 deletion crates/squawk_ide/src/goto_definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ mod test {
// marker after the item we're trying to go to def on.
offset = offset.checked_sub(1.into()).unwrap_or_default();
let db = Database::default();
let file = File::new(&db, sql.clone(), 0);
let file = File::new(&db, sql.clone().into());
assert_eq!(crate::db::parse(&db, file).errors(), vec![]);
let results = goto_definition(&db, file, offset);
if !results.is_empty() {
Expand Down
2 changes: 1 addition & 1 deletion crates/squawk_ide/src/hover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1687,7 +1687,7 @@ mod test {
let db = Database::default();
let (mut offset, sql) = fixture(sql);
offset = offset.checked_sub(1.into()).unwrap_or_default();
let file = File::new(&db, sql.clone(), 0);
let file = File::new(&db, sql.clone().into());
assert_eq!(crate::db::parse(&db, file).errors(), vec![]);

if let Some(type_info) = hover(&db, file, offset) {
Expand Down
2 changes: 1 addition & 1 deletion crates/squawk_ide/src/inlay_hints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ mod test {
#[track_caller]
fn check_inlay_hints(sql: &str) -> String {
let db = Database::default();
let file = File::new(&db, sql.to_string(), 0);
let file = File::new(&db, sql.to_string().into());

assert_eq!(crate::db::parse(&db, file).errors(), vec![]);

Expand Down
2 changes: 2 additions & 0 deletions crates/squawk_server/src/handlers.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
mod code_action;
mod completion;
mod diagnostic;
mod document_symbol;
mod folding_range;
mod goto_definition;
Expand All @@ -13,6 +14,7 @@ mod tokens;

pub(crate) use code_action::handle_code_action;
pub(crate) use completion::handle_completion;
pub(crate) use diagnostic::handle_document_diagnostic;
pub(crate) use document_symbol::handle_document_symbol;
pub(crate) use folding_range::handle_folding_range;
pub(crate) use goto_definition::handle_goto_definition;
Expand Down
29 changes: 29 additions & 0 deletions crates/squawk_server/src/handlers/diagnostic.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
use anyhow::Result;
use lsp_types::{
DocumentDiagnosticParams, DocumentDiagnosticReport, DocumentDiagnosticReportResult,
FullDocumentDiagnosticReport, RelatedFullDocumentDiagnosticReport,
};

use crate::system::System;

pub(crate) fn handle_document_diagnostic(
system: &dyn System,
params: DocumentDiagnosticParams,
) -> Result<DocumentDiagnosticReportResult> {
let uri = params.text_document.uri;

let diagnostics = system
.file(&uri)
.map(|file| crate::lint::lint(system.db(), file))
.unwrap_or_default();

Ok(DocumentDiagnosticReportResult::Report(
DocumentDiagnosticReport::Full(RelatedFullDocumentDiagnosticReport {
related_documents: None,
full_document_diagnostic_report: FullDocumentDiagnosticReport {
result_id: None,
items: diagnostics,
},
}),
))
}
48 changes: 6 additions & 42 deletions crates/squawk_server/src/handlers/notifications.rs
Original file line number Diff line number Diff line change
@@ -1,64 +1,33 @@
use anyhow::Result;
use lsp_server::{Connection, Message, Notification};
use lsp_types::{
Diagnostic, DidChangeTextDocumentParams, DidCloseTextDocumentParams, DidOpenTextDocumentParams,
PublishDiagnosticsParams, Url,
DidChangeTextDocumentParams, DidCloseTextDocumentParams, DidOpenTextDocumentParams,
PublishDiagnosticsParams,
notification::{Notification as _, PublishDiagnostics},
};

use crate::lsp_utils;
use crate::system::{Document, System};

fn publish_diagnostics(
connection: &Connection,
uri: Url,
version: i32,
diagnostics: Vec<Diagnostic>,
) -> Result<()> {
let publish_params = PublishDiagnosticsParams {
uri,
diagnostics,
version: Some(version),
};

let notification = Notification {
method: PublishDiagnostics::METHOD.to_owned(),
params: serde_json::to_value(publish_params)?,
};

connection
.sender
.send(Message::Notification(notification))?;
Ok(())
}

pub(crate) fn handle_did_open(
connection: &Connection,
_connection: &Connection,
params: DidOpenTextDocumentParams,
system: &mut dyn System,
) -> Result<()> {
let uri = params.text_document.uri;
let content = params.text_document.text;
let version = params.text_document.version;

system.set(uri.clone(), Document { content, version });
let db = system.db();
let file = system.file(&uri).unwrap();
let diagnostics = crate::lint::lint(db, file);

// TODO: we need a better setup for "run func when input changed"
publish_diagnostics(connection, uri, version, diagnostics)?;
system.set(uri, Document { content });

Ok(())
}

pub(crate) fn handle_did_change(
connection: &Connection,
_connection: &Connection,
params: DidChangeTextDocumentParams,
system: &mut dyn System,
) -> Result<()> {
let uri = params.text_document.uri;
let version = params.text_document.version;

let db = system.db();
let file = system.file(&uri).unwrap();
Expand All @@ -67,16 +36,11 @@ pub(crate) fn handle_did_change(
let updated_content = lsp_utils::apply_incremental_changes(content, params.content_changes);

system.set(
uri.clone(),
uri,
Document {
content: updated_content,
version,
},
);
let db = system.db();
let file = system.file(&uri).unwrap();
let diagnostics = crate::lint::lint(db, file);
publish_diagnostics(connection, uri, version, diagnostics)?;

Ok(())
}
Expand Down
2 changes: 1 addition & 1 deletion crates/squawk_server/src/ignore.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ create table c (

fn lint_sql(sql: &str) -> Vec<lsp_types::Diagnostic> {
let db = Database::default();
let file = File::new(&db, sql.to_owned(), 0);
let file = File::new(&db, sql.to_owned().into());
lint(&db, file)
}
}
26 changes: 18 additions & 8 deletions crates/squawk_server/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,23 @@ use log::info;
use lsp_server::{Connection, Message};
use lsp_types::{
CodeActionKind, CodeActionOptions, CodeActionProviderCapability, CompletionOptions,
FoldingRangeProviderCapability, HoverProviderCapability, InitializeParams, OneOf,
SelectionRangeProviderCapability, ServerCapabilities, TextDocumentSyncCapability,
TextDocumentSyncKind, WorkDoneProgressOptions,
DiagnosticOptions, DiagnosticServerCapabilities, FoldingRangeProviderCapability,
HoverProviderCapability, InitializeParams, OneOf, SelectionRangeProviderCapability,
ServerCapabilities, TextDocumentSyncCapability, TextDocumentSyncKind, WorkDoneProgressOptions,
notification::{DidChangeTextDocument, DidCloseTextDocument, DidOpenTextDocument},
request::{
CodeActionRequest, Completion, DocumentSymbolRequest, FoldingRangeRequest, GotoDefinition,
HoverRequest, InlayHintRequest, References, SelectionRangeRequest,
CodeActionRequest, Completion, DocumentDiagnosticRequest, DocumentSymbolRequest,
FoldingRangeRequest, GotoDefinition, HoverRequest, InlayHintRequest, References,
SelectionRangeRequest,
},
};

use crate::dispatch::{NotificationDispatcher, RequestDispatcher};
use crate::handlers::{
SyntaxTreeRequest, TokensRequest, handle_code_action, handle_completion, handle_did_change,
handle_did_close, handle_did_open, handle_document_symbol, handle_folding_range,
handle_goto_definition, handle_hover, handle_inlay_hints, handle_references,
handle_selection_range, handle_syntax_tree, handle_tokens,
handle_did_close, handle_did_open, handle_document_diagnostic, handle_document_symbol,
handle_folding_range, handle_goto_definition, handle_hover, handle_inlay_hints,
handle_references, handle_selection_range, handle_syntax_tree, handle_tokens,
};
use crate::system::GlobalState;

Expand Down Expand Up @@ -46,6 +47,14 @@ pub fn run() -> Result<()> {
definition_provider: Some(OneOf::Left(true)),
hover_provider: Some(HoverProviderCapability::Simple(true)),
inlay_hint_provider: Some(OneOf::Left(true)),
diagnostic_provider: Some(DiagnosticServerCapabilities::Options(DiagnosticOptions {
identifier: None,
inter_file_dependencies: false,
workspace_diagnostics: false,
work_done_progress_options: WorkDoneProgressOptions {
work_done_progress: None,
},
})),
document_symbol_provider: Some(OneOf::Left(true)),
folding_range_provider: Some(FoldingRangeProviderCapability::Simple(true)),
completion_provider: Some(CompletionOptions {
Expand Down Expand Up @@ -102,6 +111,7 @@ fn main_loop(connection: Connection, params: serde_json::Value) -> Result<()> {
.on::<DocumentSymbolRequest>(handle_document_symbol)?
.on::<FoldingRangeRequest>(handle_folding_range)?
.on::<Completion>(handle_completion)?
.on::<DocumentDiagnosticRequest>(handle_document_diagnostic)?
.on::<SyntaxTreeRequest>(handle_syntax_tree)?
.on::<TokensRequest>(handle_tokens)?
.on::<References>(handle_references)?
Expand Down
7 changes: 2 additions & 5 deletions crates/squawk_server/src/system.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ use std::collections::HashMap;

pub(crate) struct Document {
pub(crate) content: String,
#[allow(dead_code)]
pub(crate) version: i32,
}

pub(crate) trait System {
Expand Down Expand Up @@ -41,10 +39,9 @@ impl System for GlobalState {

fn set(&mut self, uri: Url, doc: Document) {
if let Some(file) = self.files.get(&uri).copied() {
file.set_content(&mut self.db).to(doc.content);
file.set_version(&mut self.db).to(doc.version);
file.set_content(&mut self.db).to(doc.content.into());
} else {
let file = File::new(&self.db, doc.content, doc.version);
let file = File::new(&self.db, doc.content.into());
self.files.insert(uri, file);
}
}
Expand Down
7 changes: 3 additions & 4 deletions crates/squawk_wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,13 @@ impl SquawkDatabase {
}

pub fn open_file(&mut self, content: String) {
let file = File::new(&self.db, content, 0);
let file = File::new(&self.db, content.into());
self.file = Some(file);
}

pub fn update_file(&mut self, content: String, version: i32) {
pub fn update_file(&mut self, content: String) {
if let Some(file) = self.file {
file.set_content(&mut self.db).to(content);
file.set_version(&mut self.db).to(version);
file.set_content(&mut self.db).to(content.into());
}
}

Expand Down
Loading