mirror of
https://github.com/joshuadavidthomas/django-language-server.git
synced 2025-09-08 03:10:34 +00:00
lint clippy and fmt
This commit is contained in:
parent
79a0c4cb4f
commit
db5f3aac65
5 changed files with 49 additions and 56 deletions
|
@ -2,7 +2,6 @@ use std::future::Future;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use tokio::sync::RwLock;
|
use tokio::sync::RwLock;
|
||||||
use serde_json;
|
|
||||||
use tower_lsp_server::jsonrpc::Result as LspResult;
|
use tower_lsp_server::jsonrpc::Result as LspResult;
|
||||||
use tower_lsp_server::lsp_types::CompletionOptions;
|
use tower_lsp_server::lsp_types::CompletionOptions;
|
||||||
use tower_lsp_server::lsp_types::CompletionParams;
|
use tower_lsp_server::lsp_types::CompletionParams;
|
||||||
|
@ -282,31 +281,28 @@ impl LanguageServer for DjangoLanguageServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn execute_command(&self, params: ExecuteCommandParams) -> LspResult<Option<serde_json::Value>> {
|
async fn execute_command(&self, params: ExecuteCommandParams) -> LspResult<Option<serde_json::Value>> {
|
||||||
match params.command.as_str() {
|
if params.command.as_str() == "djls/dumpState" {
|
||||||
"djls/dumpState" => {
|
tracing::info!("Executing djls/dumpState command");
|
||||||
tracing::info!("Executing djls/dumpState command");
|
|
||||||
|
|
||||||
// Check if debug mode is enabled
|
|
||||||
if std::env::var("DJLS_DEBUG").is_err() {
|
|
||||||
tracing::warn!("djls/dumpState command requires DJLS_DEBUG environment variable");
|
|
||||||
return Ok(Some(serde_json::json!({
|
|
||||||
"error": "Debug mode not enabled. Set DJLS_DEBUG environment variable."
|
|
||||||
})));
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = self.with_session(|session| {
|
// Check if debug mode is enabled
|
||||||
session.dump_debug_state()
|
if std::env::var("DJLS_DEBUG").is_err() {
|
||||||
}).await;
|
tracing::warn!("djls/dumpState command requires DJLS_DEBUG environment variable");
|
||||||
|
return Ok(Some(serde_json::json!({
|
||||||
|
"error": "Debug mode not enabled. Set DJLS_DEBUG environment variable."
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(Some(serde_json::json!({
|
let result = self.with_session(|session| {
|
||||||
"success": true,
|
session.dump_debug_state()
|
||||||
"message": result
|
}).await;
|
||||||
})))
|
|
||||||
}
|
Ok(Some(serde_json::json!({
|
||||||
_ => {
|
"success": true,
|
||||||
tracing::warn!("Unknown command: {}", params.command);
|
"message": result
|
||||||
Ok(None)
|
})))
|
||||||
}
|
} else {
|
||||||
|
tracing::warn!("Unknown command: {}", params.command);
|
||||||
|
Ok(None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ use djls_project::DjangoProject;
|
||||||
use salsa::StorageHandle;
|
use salsa::StorageHandle;
|
||||||
use tower_lsp_server::lsp_types::ClientCapabilities;
|
use tower_lsp_server::lsp_types::ClientCapabilities;
|
||||||
use tower_lsp_server::lsp_types::InitializeParams;
|
use tower_lsp_server::lsp_types::InitializeParams;
|
||||||
use serde_json;
|
|
||||||
|
|
||||||
use crate::db::ServerDatabase;
|
use crate::db::ServerDatabase;
|
||||||
use crate::workspace::Store;
|
use crate::workspace::Store;
|
||||||
|
@ -112,7 +111,7 @@ impl Session {
|
||||||
|
|
||||||
let timestamp: DateTime<Utc> = Utc::now();
|
let timestamp: DateTime<Utc> = Utc::now();
|
||||||
let filename = format!("djls-debug-state-{}.json", timestamp.format("%Y%m%d-%H%M%S"));
|
let filename = format!("djls-debug-state-{}.json", timestamp.format("%Y%m%d-%H%M%S"));
|
||||||
|
|
||||||
let debug_info = serde_json::json!({
|
let debug_info = serde_json::json!({
|
||||||
"timestamp": timestamp.to_rfc3339(),
|
"timestamp": timestamp.to_rfc3339(),
|
||||||
"vfs": self.documents.debug_vfs_state(),
|
"vfs": self.documents.debug_vfs_state(),
|
||||||
|
@ -124,13 +123,13 @@ impl Session {
|
||||||
});
|
});
|
||||||
|
|
||||||
match fs::write(&filename, serde_json::to_string_pretty(&debug_info).unwrap_or_else(|_| "{}".to_string())) {
|
match fs::write(&filename, serde_json::to_string_pretty(&debug_info).unwrap_or_else(|_| "{}".to_string())) {
|
||||||
Ok(_) => {
|
Ok(()) => {
|
||||||
tracing::info!("Debug state dumped to: {}", filename);
|
tracing::info!("Debug state dumped to: {}", filename);
|
||||||
format!("Debug state written to: {}", filename)
|
format!("Debug state written to: {filename}")
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
tracing::error!("Failed to write debug state: {}", e);
|
tracing::error!("Failed to write debug state: {}", e);
|
||||||
format!("Failed to write debug state: {}", e)
|
format!("Failed to write debug state: {e}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,4 +117,3 @@ pub struct TemplateTagContext {
|
||||||
pub closing_brace: ClosingBrace,
|
pub closing_brace: ClosingBrace,
|
||||||
pub needs_leading_space: bool,
|
pub needs_leading_space: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -168,9 +168,9 @@ impl FileSystem {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Implementation of the `vfs::FileSystem` trait for VfsPath compatibility.
|
/// Implementation of the `vfs::FileSystem` trait for `VfsPath` compatibility.
|
||||||
///
|
///
|
||||||
/// This trait implementation allows our custom FileSystem to be used with VfsPath
|
/// This trait implementation allows our custom `FileSystem` to be used with `VfsPath`
|
||||||
/// while maintaining the dual-layer architecture. All operations respect the
|
/// while maintaining the dual-layer architecture. All operations respect the
|
||||||
/// memory-over-physical priority, ensuring LSP semantics are preserved even when
|
/// memory-over-physical priority, ensuring LSP semantics are preserved even when
|
||||||
/// accessed through the generic VFS interface.
|
/// accessed through the generic VFS interface.
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use super::fs::FileSystem;
|
use super::fs::FileSystem;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use serde_json;
|
|
||||||
|
|
||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
@ -48,7 +47,7 @@ impl Store {
|
||||||
root_path,
|
root_path,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if a URI represents a file within the workspace
|
/// Check if a URI represents a file within the workspace
|
||||||
fn is_workspace_file(&self, uri: &tower_lsp_server::lsp_types::Uri) -> bool {
|
fn is_workspace_file(&self, uri: &tower_lsp_server::lsp_types::Uri) -> bool {
|
||||||
if let Some(path) = uri_to_pathbuf(uri) {
|
if let Some(path) = uri_to_pathbuf(uri) {
|
||||||
|
@ -65,7 +64,7 @@ impl Store {
|
||||||
// Silently ignore files outside workspace
|
// Silently ignore files outside workspace
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let uri = params.text_document.uri.to_string();
|
let uri = params.text_document.uri.to_string();
|
||||||
let version = params.text_document.version;
|
let version = params.text_document.version;
|
||||||
let content = ¶ms.text_document.text;
|
let content = ¶ms.text_document.text;
|
||||||
|
@ -79,7 +78,7 @@ impl Store {
|
||||||
&relative_path.to_string_lossy(),
|
&relative_path.to_string_lossy(),
|
||||||
content
|
content
|
||||||
) {
|
) {
|
||||||
eprintln!("Warning: Failed to write file to VFS: {}", e);
|
eprintln!("Warning: Failed to write file to VFS: {e}");
|
||||||
// Continue with normal processing despite VFS error
|
// Continue with normal processing despite VFS error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +100,7 @@ impl Store {
|
||||||
// Return Ok to avoid errors for files outside workspace
|
// Return Ok to avoid errors for files outside workspace
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let uri = params.text_document.uri.as_str().to_string();
|
let uri = params.text_document.uri.as_str().to_string();
|
||||||
let version = params.text_document.version;
|
let version = params.text_document.version;
|
||||||
|
|
||||||
|
@ -109,7 +108,7 @@ impl Store {
|
||||||
if let Some(absolute_path) = uri_to_pathbuf(¶ms.text_document.uri) {
|
if let Some(absolute_path) = uri_to_pathbuf(¶ms.text_document.uri) {
|
||||||
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
||||||
let relative_path_str = relative_path.to_string_lossy();
|
let relative_path_str = relative_path.to_string_lossy();
|
||||||
|
|
||||||
// Read current content from VFS (single source of truth)
|
// Read current content from VFS (single source of truth)
|
||||||
let current_content = self.vfs.read_to_string(&relative_path_str)
|
let current_content = self.vfs.read_to_string(&relative_path_str)
|
||||||
.map_err(|e| anyhow!("Failed to read from VFS: {}", e))?;
|
.map_err(|e| anyhow!("Failed to read from VFS: {}", e))?;
|
||||||
|
@ -119,7 +118,7 @@ impl Store {
|
||||||
|
|
||||||
// Write updated content back to VFS
|
// Write updated content back to VFS
|
||||||
if let Err(e) = self.vfs.write_string(&relative_path_str, &updated_content) {
|
if let Err(e) = self.vfs.write_string(&relative_path_str, &updated_content) {
|
||||||
eprintln!("Warning: Failed to write to VFS: {}", e);
|
eprintln!("Warning: Failed to write to VFS: {e}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update document metadata (just version)
|
// Update document metadata (just version)
|
||||||
|
@ -143,10 +142,10 @@ impl Store {
|
||||||
if let Some(absolute_path) = uri_to_pathbuf(¶ms.text_document.uri) {
|
if let Some(absolute_path) = uri_to_pathbuf(¶ms.text_document.uri) {
|
||||||
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
||||||
let relative_path_str = relative_path.to_string_lossy();
|
let relative_path_str = relative_path.to_string_lossy();
|
||||||
|
|
||||||
// Discard any unsaved changes in VFS (clean up memory layer)
|
// Discard any unsaved changes in VFS (clean up memory layer)
|
||||||
if let Err(e) = self.vfs.discard_changes(&relative_path_str) {
|
if let Err(e) = self.vfs.discard_changes(&relative_path_str) {
|
||||||
eprintln!("Warning: Failed to discard VFS changes on close: {}", e);
|
eprintln!("Warning: Failed to discard VFS changes on close: {e}");
|
||||||
// Continue with document removal despite VFS error
|
// Continue with document removal despite VFS error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -168,10 +167,10 @@ impl Store {
|
||||||
if let Some(absolute_path) = uri_to_pathbuf(¶ms.text_document.uri) {
|
if let Some(absolute_path) = uri_to_pathbuf(¶ms.text_document.uri) {
|
||||||
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
||||||
let relative_path_str = relative_path.to_string_lossy();
|
let relative_path_str = relative_path.to_string_lossy();
|
||||||
|
|
||||||
// Discard changes in VFS (clear memory layer so reads return disk content)
|
// Discard changes in VFS (clear memory layer so reads return disk content)
|
||||||
if let Err(e) = self.vfs.discard_changes(&relative_path_str) {
|
if let Err(e) = self.vfs.discard_changes(&relative_path_str) {
|
||||||
eprintln!("Warning: Failed to discard VFS changes on save: {}", e);
|
eprintln!("Warning: Failed to discard VFS changes on save: {e}");
|
||||||
// Continue normally - this is not a critical error
|
// Continue normally - this is not a critical error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -180,7 +179,7 @@ impl Store {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Apply text changes to content (similar to TextDocument::with_changes but for strings)
|
/// Apply text changes to content (similar to `TextDocument::with_changes` but for strings)
|
||||||
fn apply_changes_to_content(
|
fn apply_changes_to_content(
|
||||||
&self,
|
&self,
|
||||||
mut content: String,
|
mut content: String,
|
||||||
|
@ -190,7 +189,7 @@ impl Store {
|
||||||
if let Some(range) = change.range {
|
if let Some(range) = change.range {
|
||||||
// Incremental change with range
|
// Incremental change with range
|
||||||
let index = LineIndex::new(&content);
|
let index = LineIndex::new(&content);
|
||||||
|
|
||||||
if let (Some(start_offset), Some(end_offset)) = (
|
if let (Some(start_offset), Some(end_offset)) = (
|
||||||
index.offset(range.start).map(|o| o as usize),
|
index.offset(range.start).map(|o| o as usize),
|
||||||
index.offset(range.end).map(|o| o as usize),
|
index.offset(range.end).map(|o| o as usize),
|
||||||
|
@ -277,7 +276,7 @@ impl Store {
|
||||||
if let Some(absolute_path) = uri_to_pathbuf(&parsed_uri) {
|
if let Some(absolute_path) = uri_to_pathbuf(&parsed_uri) {
|
||||||
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
||||||
let relative_path_str = relative_path.to_string_lossy();
|
let relative_path_str = relative_path.to_string_lossy();
|
||||||
|
|
||||||
// Try to read from VFS first (includes unsaved changes)
|
// Try to read from VFS first (includes unsaved changes)
|
||||||
match self.vfs.read_to_string(&relative_path_str) {
|
match self.vfs.read_to_string(&relative_path_str) {
|
||||||
Ok(vfs_content) => vfs_content,
|
Ok(vfs_content) => vfs_content,
|
||||||
|
@ -338,19 +337,19 @@ impl Store {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Debug method to expose VFS state (only enabled with DJLS_DEBUG)
|
/// Debug method to expose VFS state (only enabled with `DJLS_DEBUG`)
|
||||||
pub fn debug_vfs_state(&self) -> serde_json::Value {
|
pub fn debug_vfs_state(&self) -> serde_json::Value {
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
// Get memory layer contents by trying to read all known documents
|
// Get memory layer contents by trying to read all known documents
|
||||||
let mut memory_layer = HashMap::new();
|
let mut memory_layer = HashMap::new();
|
||||||
|
|
||||||
for uri_str in self.documents.keys() {
|
for uri_str in self.documents.keys() {
|
||||||
if let Ok(uri) = uri_str.parse::<tower_lsp_server::lsp_types::Uri>() {
|
if let Ok(uri) = uri_str.parse::<tower_lsp_server::lsp_types::Uri>() {
|
||||||
if let Some(absolute_path) = super::utils::uri_to_pathbuf(&uri) {
|
if let Some(absolute_path) = super::utils::uri_to_pathbuf(&uri) {
|
||||||
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
if let Ok(relative_path) = absolute_path.strip_prefix(&self.root_path) {
|
||||||
let relative_path_str = relative_path.to_string_lossy();
|
let relative_path_str = relative_path.to_string_lossy();
|
||||||
|
|
||||||
// Try to read from VFS - this will show us if there's content in memory layer
|
// Try to read from VFS - this will show us if there's content in memory layer
|
||||||
if let Ok(content) = self.vfs.read_to_string(&relative_path_str) {
|
if let Ok(content) = self.vfs.read_to_string(&relative_path_str) {
|
||||||
memory_layer.insert(relative_path_str.to_string(), content);
|
memory_layer.insert(relative_path_str.to_string(), content);
|
||||||
|
@ -359,7 +358,7 @@ impl Store {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
serde_json::json!({
|
serde_json::json!({
|
||||||
"memory_layer_files": memory_layer,
|
"memory_layer_files": memory_layer,
|
||||||
"physical_root": self.root_path.display().to_string()
|
"physical_root": self.root_path.display().to_string()
|
||||||
|
@ -405,19 +404,19 @@ impl Store {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Debug method to expose Store state (only enabled with DJLS_DEBUG)
|
/// Debug method to expose Store state (only enabled with `DJLS_DEBUG`)
|
||||||
pub fn debug_store_state(&self) -> serde_json::Value {
|
pub fn debug_store_state(&self) -> serde_json::Value {
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
let mut documents_info = HashMap::new();
|
let mut documents_info = HashMap::new();
|
||||||
|
|
||||||
for (uri, _doc) in &self.documents {
|
for uri in self.documents.keys() {
|
||||||
documents_info.insert(uri.clone(), serde_json::json!({
|
documents_info.insert(uri.clone(), serde_json::json!({
|
||||||
"version": self.versions.get(uri),
|
"version": self.versions.get(uri),
|
||||||
"tracked": true
|
"tracked": true
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
serde_json::json!({
|
serde_json::json!({
|
||||||
"documents": documents_info,
|
"documents": documents_info,
|
||||||
"document_count": self.documents.len(),
|
"document_count": self.documents.len(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue