Skip to content

Commit 3535a65

Browse files
adjust server/ide crate api boundaries (#282)
1 parent acaf33e commit 3535a65

File tree

4 files changed

+52
-110
lines changed

4 files changed

+52
-110
lines changed

crates/djls-ide/src/context.rs

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,41 @@
11
use djls_source::File;
22
use djls_source::Offset;
3-
use djls_source::Span;
43
use djls_templates::parse_template;
54
use djls_templates::Node;
65

7-
pub struct OffsetContext {
8-
pub file: File,
9-
pub offset: Offset,
10-
pub span: Span,
11-
pub kind: ContextKind,
12-
}
13-
14-
pub enum ContextKind {
6+
pub(crate) enum OffsetContext {
157
TemplateReference(String),
168
None,
179
}
1810

1911
impl OffsetContext {
20-
pub fn from_offset(db: &dyn djls_semantic::Db, file: File, offset: Offset) -> Self {
12+
pub(crate) fn from_offset(db: &dyn djls_semantic::Db, file: File, offset: Offset) -> Self {
2113
let Some(nodelist) = parse_template(db, file) else {
22-
return Self {
23-
file,
24-
offset,
25-
span: Span::new(offset.get(), 0),
26-
kind: ContextKind::None,
27-
};
14+
return Self::None;
2815
};
2916

3017
for node in nodelist.nodelist(db) {
3118
if !node.full_span().contains(offset) {
3219
continue;
3320
}
3421

35-
let span = node.full_span();
36-
let context = match node {
37-
Node::Tag { name, bits, .. } if Self::is_loader_tag(name) => {
38-
Self::extract_template_name(bits)
39-
.map_or(ContextKind::None, ContextKind::TemplateReference)
22+
return match node {
23+
Node::Tag { name, bits, .. } if matches!(name.as_str(), "extends" | "include") => {
24+
bits.first()
25+
.map(|s| {
26+
s.trim()
27+
.trim_start_matches('"')
28+
.trim_end_matches('"')
29+
.trim_start_matches('\'')
30+
.trim_end_matches('\'')
31+
.to_string()
32+
})
33+
.map_or(Self::None, Self::TemplateReference)
4034
}
41-
_ => ContextKind::None,
42-
};
43-
44-
return Self {
45-
file,
46-
offset,
47-
span,
48-
kind: context,
35+
_ => Self::None,
4936
};
5037
}
5138

52-
Self {
53-
file,
54-
offset,
55-
span: Span::new(offset.get(), 0),
56-
kind: ContextKind::None,
57-
}
58-
}
59-
60-
fn is_loader_tag(tag_name: &str) -> bool {
61-
matches!(tag_name, "extends" | "include")
62-
}
63-
64-
fn extract_template_name(bits: &[String]) -> Option<String> {
65-
bits.first().map(|s| {
66-
s.trim()
67-
.trim_start_matches('"')
68-
.trim_end_matches('"')
69-
.trim_start_matches('\'')
70-
.trim_end_matches('\'')
71-
.to_string()
72-
})
39+
Self::None
7340
}
7441
}

crates/djls-ide/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ mod navigation;
66
mod snippets;
77

88
pub use completions::handle_completion;
9-
pub use context::ContextKind;
10-
pub use context::OffsetContext;
119
pub use diagnostics::collect_diagnostics;
1210
pub use navigation::find_references;
1311
pub use navigation::goto_definition;

crates/djls-ide/src/navigation.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
use djls_semantic::resolve_template;
22
use djls_semantic::ResolveResult;
3+
use djls_source::File;
4+
use djls_source::Offset;
35
use tower_lsp_server::lsp_types;
46

7+
use crate::context::OffsetContext;
58
use crate::ext::SpanExt;
69
use crate::ext::Utf8PathExt;
7-
use crate::ContextKind;
8-
use crate::OffsetContext;
910

1011
pub fn goto_definition(
1112
db: &dyn djls_semantic::Db,
12-
context: &OffsetContext,
13+
file: File,
14+
offset: Offset,
1315
) -> Option<lsp_types::GotoDefinitionResponse> {
14-
match &context.kind {
15-
ContextKind::TemplateReference(template_name) => {
16+
match OffsetContext::from_offset(db, file, offset) {
17+
OffsetContext::TemplateReference(template_name) => {
1618
tracing::debug!("Found template reference: '{}'", template_name);
1719

18-
match resolve_template(db, template_name) {
20+
match resolve_template(db, &template_name) {
1921
ResolveResult::Found(template) => {
2022
let path = template.path_buf(db);
2123
tracing::debug!("Resolved template to: {}", path);
@@ -33,22 +35,23 @@ pub fn goto_definition(
3335
}
3436
}
3537
}
36-
ContextKind::None => None,
38+
OffsetContext::None => None,
3739
}
3840
}
3941

4042
pub fn find_references(
4143
db: &dyn djls_semantic::Db,
42-
context: &OffsetContext,
44+
file: File,
45+
offset: Offset,
4346
) -> Option<Vec<lsp_types::Location>> {
44-
match &context.kind {
45-
ContextKind::TemplateReference(template_name) => {
47+
match OffsetContext::from_offset(db, file, offset) {
48+
OffsetContext::TemplateReference(template_name) => {
4649
tracing::debug!(
4750
"Cursor is inside extends/include tag referencing: '{}'",
4851
template_name
4952
);
5053

51-
let references = djls_semantic::find_references_to_template(db, template_name);
54+
let references = djls_semantic::find_references_to_template(db, &template_name);
5255

5356
let locations: Vec<lsp_types::Location> = references
5457
.iter()
@@ -69,6 +72,6 @@ pub fn find_references(
6972
Some(locations)
7073
}
7174
}
72-
ContextKind::None => None,
75+
OffsetContext::None => None,
7376
}
7477
}

crates/djls-server/src/server.rs

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -334,47 +334,23 @@ impl LanguageServer for DjangoLanguageServer {
334334
params.text_document.uri
335335
);
336336

337-
let Some(url) = params.text_document.uri.to_url() else {
338-
return Ok(lsp_types::DocumentDiagnosticReportResult::Report(
339-
lsp_types::DocumentDiagnosticReport::Full(
340-
lsp_types::RelatedFullDocumentDiagnosticReport {
341-
related_documents: None,
342-
full_document_diagnostic_report: lsp_types::FullDocumentDiagnosticReport {
343-
result_id: None,
344-
items: vec![],
345-
},
346-
},
347-
),
348-
));
349-
};
350-
351-
let path: Utf8PathBuf = url.path().into();
352-
353-
// Only provide diagnostics for template files
354-
if FileKind::from(&path) != FileKind::Template {
355-
return Ok(lsp_types::DocumentDiagnosticReportResult::Report(
356-
lsp_types::DocumentDiagnosticReport::Full(
357-
lsp_types::RelatedFullDocumentDiagnosticReport {
358-
related_documents: None,
359-
full_document_diagnostic_report: lsp_types::FullDocumentDiagnosticReport {
360-
result_id: None,
361-
items: vec![],
362-
},
363-
},
364-
),
365-
));
366-
}
367-
368-
// Get diagnostics from the database
369-
let diagnostics: Vec<lsp_types::Diagnostic> = self
370-
.with_session_mut(|session| {
371-
session.with_db_mut(|db| {
372-
let file = db.get_or_create_file(&path);
373-
let nodelist = djls_templates::parse_template(db, file);
374-
djls_ide::collect_diagnostics(db, file, nodelist)
337+
let diagnostics = match params.text_document.uri.to_url().filter(|url| {
338+
let path: Utf8PathBuf = url.path().into();
339+
FileKind::from(&path) == FileKind::Template
340+
}) {
341+
Some(url) => {
342+
let path: Utf8PathBuf = url.path().into();
343+
self.with_session_mut(move |session| {
344+
session.with_db_mut(|db| {
345+
let file = db.get_or_create_file(&path);
346+
let nodelist = djls_templates::parse_template(db, file);
347+
djls_ide::collect_diagnostics(db, file, nodelist)
348+
})
375349
})
376-
})
377-
.await;
350+
.await
351+
}
352+
None => vec![],
353+
};
378354

379355
Ok(lsp_types::DocumentDiagnosticReportResult::Report(
380356
lsp_types::DocumentDiagnosticReport::Full(
@@ -402,15 +378,14 @@ impl LanguageServer for DjangoLanguageServer {
402378
.text_document_position_params
403379
.text_document
404380
.to_file(db)?;
405-
let line_index = file.line_index(db);
406381
let source = file.source(db);
382+
let line_index = file.line_index(db);
407383
let offset = params.text_document_position_params.position.to_offset(
408384
source.as_str(),
409385
line_index,
410386
encoding,
411387
);
412-
let context = djls_ide::OffsetContext::from_offset(db, file, offset);
413-
djls_ide::goto_definition(db, &context)
388+
djls_ide::goto_definition(db, file, offset)
414389
})
415390
})
416391
.await;
@@ -428,15 +403,14 @@ impl LanguageServer for DjangoLanguageServer {
428403

429404
session.with_db_mut(|db| {
430405
let file = params.text_document_position.text_document.to_file(db)?;
431-
let line_index = file.line_index(db);
432406
let source = file.source(db);
407+
let line_index = file.line_index(db);
433408
let offset = params.text_document_position.position.to_offset(
434409
source.as_str(),
435410
line_index,
436411
encoding,
437412
);
438-
let context = djls_ide::OffsetContext::from_offset(db, file, offset);
439-
djls_ide::find_references(db, &context)
413+
djls_ide::find_references(db, file, offset)
440414
})
441415
})
442416
.await;

0 commit comments

Comments
 (0)