Skip to content

refactor: move workspace features to own mod #276

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 30, 2025
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
11 changes: 4 additions & 7 deletions crates/pgt_completions/src/builder.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{CompletionResult, item::CompletionItem};
use crate::item::CompletionItem;

pub(crate) struct CompletionBuilder {
items: Vec<CompletionItem>,
Expand All @@ -13,7 +13,7 @@ impl CompletionBuilder {
self.items.push(item);
}

pub fn finish(mut self) -> CompletionResult {
pub fn finish(mut self) -> Vec<CompletionItem> {
self.items
.sort_by(|a, b| b.score.cmp(&a.score).then_with(|| a.label.cmp(&b.label)));

Expand All @@ -22,8 +22,7 @@ impl CompletionBuilder {

let should_preselect_first_item = self.should_preselect_first_item();

let items: Vec<CompletionItem> = self
.items
self.items
.into_iter()
.enumerate()
.map(|(idx, mut item)| {
Expand All @@ -32,9 +31,7 @@ impl CompletionBuilder {
}
item
})
.collect();

CompletionResult { items }
.collect()
}

fn should_preselect_first_item(&mut self) -> bool {
Expand Down
17 changes: 1 addition & 16 deletions crates/pgt_completions/src/complete.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use pgt_text_size::TextSize;
use serde::{Deserialize, Serialize};

use crate::{
builder::CompletionBuilder,
Expand All @@ -18,21 +17,7 @@ pub struct CompletionParams<'a> {
pub tree: Option<&'a tree_sitter::Tree>,
}

#[derive(Debug, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct CompletionResult {
pub(crate) items: Vec<CompletionItem>,
}

impl IntoIterator for CompletionResult {
type Item = CompletionItem;
type IntoIter = <Vec<CompletionItem> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.items.into_iter()
}
}

pub fn complete(params: CompletionParams) -> CompletionResult {
pub fn complete(params: CompletionParams) -> Vec<CompletionItem> {
let ctx = CompletionContext::new(&params);

let mut builder = CompletionBuilder::new();
Expand Down
8 changes: 4 additions & 4 deletions crates/pgt_completions/src/providers/columns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,13 +141,13 @@ mod tests {

let (tree, cache) = get_test_deps(setup, case.get_input_query()).await;
let params = get_test_params(&tree, &cache, case.get_input_query());
let mut results = complete(params);
let mut items = complete(params);

let _ = results.items.split_off(3);
let _ = items.split_off(3);

results.items.sort_by(|a, b| a.label.cmp(&b.label));
items.sort_by(|a, b| a.label.cmp(&b.label));

let labels: Vec<String> = results.items.into_iter().map(|c| c.label).collect();
let labels: Vec<String> = items.into_iter().map(|c| c.label).collect();

assert_eq!(labels, vec!["name", "narrator", "narrator_id"]);
}
Expand Down
22 changes: 11 additions & 11 deletions crates/pgt_completions/src/providers/tables.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ mod tests {

let (tree, cache) = get_test_deps(setup, query.as_str().into()).await;
let params = get_test_params(&tree, &cache, query.as_str().into());
let results = complete(params);
let items = complete(params);

assert!(!results.items.is_empty());
assert!(!items.is_empty());

let best_match = &results.items[0];
let best_match = &items[0];

assert_eq!(
best_match.label, "users",
Expand Down Expand Up @@ -81,11 +81,11 @@ mod tests {
for (query, expected_label) in test_cases {
let (tree, cache) = get_test_deps(setup, query.as_str().into()).await;
let params = get_test_params(&tree, &cache, query.as_str().into());
let results = complete(params);
let items = complete(params);

assert!(!results.items.is_empty());
assert!(!items.is_empty());

let best_match = &results.items[0];
let best_match = &items[0];

assert_eq!(
best_match.label, expected_label,
Expand Down Expand Up @@ -126,11 +126,11 @@ mod tests {
for (query, expected_label) in test_cases {
let (tree, cache) = get_test_deps(setup, query.as_str().into()).await;
let params = get_test_params(&tree, &cache, query.as_str().into());
let results = complete(params);
let items = complete(params);

assert!(!results.items.is_empty());
assert!(!items.is_empty());

let best_match = &results.items[0];
let best_match = &items[0];

assert_eq!(
best_match.label, expected_label,
Expand Down Expand Up @@ -163,9 +163,9 @@ mod tests {

let (tree, cache) = get_test_deps(setup, query.as_str().into()).await;
let params = get_test_params(&tree, &cache, query.as_str().into());
let results = complete(params);
let items = complete(params);

let CompletionItem { label, kind, .. } = results
let CompletionItem { label, kind, .. } = items
.into_iter()
.next()
.expect("Should return at least one completion item");
Expand Down
4 changes: 2 additions & 2 deletions crates/pgt_lsp/src/capabilities.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::adapters::{PositionEncoding, WideEncoding, negotiated_encoding};
use pgt_workspace::code_actions::{CommandActionCategory, CommandActionCategoryIter};
use strum::{EnumIter, IntoEnumIterator};
use pgt_workspace::features::code_actions::CommandActionCategory;
use strum::IntoEnumIterator;
use tower_lsp::lsp_types::{
ClientCapabilities, CompletionOptions, ExecuteCommandOptions, PositionEncodingKind,
SaveOptions, ServerCapabilities, TextDocumentSyncCapability, TextDocumentSyncKind,
Expand Down
2 changes: 1 addition & 1 deletion crates/pgt_lsp/src/handlers/code_actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use tower_lsp::lsp_types::{
MessageType,
};

use pgt_workspace::code_actions::{
use pgt_workspace::features::code_actions::{
CodeActionKind, CodeActionsParams, CommandActionCategory, ExecuteStatementParams,
};

Expand Down
41 changes: 19 additions & 22 deletions crates/pgt_lsp/src/handlers/completions.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::session::Session;
use anyhow::Result;
use pgt_workspace::{WorkspaceError, workspace};
use pgt_workspace::{WorkspaceError, features::completions::GetCompletionsParams};
use tower_lsp::lsp_types::{self, CompletionItem, CompletionItemLabelDetails};

use super::helper;
Expand All @@ -13,27 +13,24 @@ pub fn get_completions(
let url = params.text_document_position.text_document.uri;
let path = session.file_path(&url)?;

let completion_result =
match session
.workspace
.get_completions(workspace::GetCompletionsParams {
path,
position: helper::get_cursor_position(
session,
&url,
params.text_document_position.position,
)?,
}) {
Ok(result) => result,
Err(e) => match e {
WorkspaceError::DatabaseConnectionError(_) => {
return Ok(lsp_types::CompletionResponse::Array(vec![]));
}
_ => {
return Err(e.into());
}
},
};
let completion_result = match session.workspace.get_completions(GetCompletionsParams {
path,
position: helper::get_cursor_position(
session,
&url,
params.text_document_position.position,
)?,
}) {
Ok(result) => result,
Err(e) => match e {
WorkspaceError::DatabaseConnectionError(_) => {
return Ok(lsp_types::CompletionResponse::Array(vec![]));
}
_ => {
return Err(e.into());
}
},
};

let items: Vec<CompletionItem> = completion_result
.into_iter()
Expand Down
19 changes: 11 additions & 8 deletions crates/pgt_lsp/src/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ use pgt_diagnostics::{DiagnosticExt, Error};
use pgt_fs::{FileSystem, PgTPath};
use pgt_workspace::Workspace;
use pgt_workspace::configuration::{LoadedConfiguration, load_configuration};
use pgt_workspace::features;
use pgt_workspace::settings::PartialConfigurationExt;
use pgt_workspace::workspace::{PullDiagnosticsParams, UpdateSettingsParams};
use pgt_workspace::workspace::UpdateSettingsParams;
use pgt_workspace::{DynRef, WorkspaceError};
use rustc_hash::FxHashMap;
use serde_json::Value;
Expand Down Expand Up @@ -265,13 +266,15 @@ impl Session {
let categories = RuleCategoriesBuilder::default().all();

let diagnostics: Vec<lsp_types::Diagnostic> = {
let result = self.workspace.pull_diagnostics(PullDiagnosticsParams {
path: pgt_path.clone(),
max_diagnostics: u64::MAX,
categories: categories.build(),
only: Vec::new(),
skip: Vec::new(),
})?;
let result =
self.workspace
.pull_diagnostics(features::diagnostics::PullDiagnosticsParams {
path: pgt_path.clone(),
max_diagnostics: u64::MAX,
categories: categories.build(),
only: Vec::new(),
skip: Vec::new(),
})?;

result
.diagnostics
Expand Down
26 changes: 26 additions & 0 deletions crates/pgt_workspace/src/features/completions.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use pgt_completions::CompletionItem;
use pgt_fs::PgTPath;
use pgt_text_size::TextSize;

#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct GetCompletionsParams {
/// The File for which a completion is requested.
pub path: PgTPath,
/// The Cursor position in the file for which a completion is requested.
pub position: TextSize,
}

#[derive(Debug, serde::Serialize, serde::Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct CompletionsResult {
pub(crate) items: Vec<CompletionItem>,
}

impl IntoIterator for CompletionsResult {
type Item = CompletionItem;
type IntoIter = <Vec<CompletionItem> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.items.into_iter()
}
}
21 changes: 21 additions & 0 deletions crates/pgt_workspace/src/features/diagnostics.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use pgt_analyse::RuleCategories;
use pgt_configuration::RuleSelector;
use pgt_fs::PgTPath;

#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct PullDiagnosticsParams {
pub path: PgTPath,
pub categories: RuleCategories,
pub max_diagnostics: u64,
pub only: Vec<RuleSelector>,
pub skip: Vec<RuleSelector>,
}

#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct PullDiagnosticsResult {
pub diagnostics: Vec<pgt_diagnostics::serde::Diagnostic>,
pub errors: usize,
pub skipped_diagnostics: u64,
}
3 changes: 3 additions & 0 deletions crates/pgt_workspace/src/features/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pub mod code_actions;
pub mod completions;
pub mod diagnostics;
2 changes: 1 addition & 1 deletion crates/pgt_workspace/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ use std::ops::{Deref, DerefMut};
use pgt_console::Console;
use pgt_fs::{FileSystem, OsFileSystem};

pub mod code_actions;
pub mod configuration;
pub mod diagnostics;
pub mod dome;
pub mod features;
pub mod matcher;
pub mod settings;
pub mod workspace;
Expand Down
39 changes: 8 additions & 31 deletions crates/pgt_workspace/src/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ pub use self::client::{TransportRequest, WorkspaceClient, WorkspaceTransport};
use pgt_analyse::RuleCategories;
use pgt_configuration::{PartialConfiguration, RuleSelector};
use pgt_fs::PgTPath;
use pgt_text_size::{TextRange, TextSize};
use pgt_text_size::TextRange;
use serde::{Deserialize, Serialize};

use crate::{
WorkspaceError,
code_actions::{
CodeActionsParams, CodeActionsResult, ExecuteStatementParams, ExecuteStatementResult,
features::{
code_actions::{
CodeActionsParams, CodeActionsResult, ExecuteStatementParams, ExecuteStatementResult,
},
completions::{CompletionsResult, GetCompletionsParams},
diagnostics::{PullDiagnosticsParams, PullDiagnosticsResult},
},
};

Expand Down Expand Up @@ -41,33 +45,6 @@ pub struct ChangeFileParams {
pub changes: Vec<ChangeParams>,
}

#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct PullDiagnosticsParams {
pub path: PgTPath,
pub categories: RuleCategories,
pub max_diagnostics: u64,
pub only: Vec<RuleSelector>,
pub skip: Vec<RuleSelector>,
}

#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct GetCompletionsParams {
/// The File for which a completion is requested.
pub path: PgTPath,
/// The Cursor position in the file for which a completion is requested.
pub position: TextSize,
}

#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct PullDiagnosticsResult {
pub diagnostics: Vec<pgt_diagnostics::serde::Diagnostic>,
pub errors: usize,
pub skipped_diagnostics: u64,
}

#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ChangeParams {
Expand Down Expand Up @@ -131,7 +108,7 @@ pub trait Workspace: Send + Sync + RefUnwindSafe {
fn get_completions(
&self,
params: GetCompletionsParams,
) -> Result<pgt_completions::CompletionResult, WorkspaceError>;
) -> Result<CompletionsResult, WorkspaceError>;

/// Update the global settings for this workspace
fn update_settings(&self, params: UpdateSettingsParams) -> Result<(), WorkspaceError>;
Expand Down
Loading