Skip to content

Commit 68f3645

Browse files
fixie fixie
1 parent 2cdb6b8 commit 68f3645

File tree

4 files changed

+48
-33
lines changed

4 files changed

+48
-33
lines changed

crates/pgls_completions/src/providers/helper.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub(crate) fn with_schema_or_alias(
4545
item_name: &str,
4646
schema_or_alias_name: Option<&str>,
4747
) -> String {
48-
let is_already_prefixed_with_schema_name = matches!(ctx.identifier_qualifiers, (_, Some(_)));
48+
let is_already_prefixed_with_schema_name = ctx.has_any_qualifier();
4949

5050
let with_quotes = node_text_surrounded_by_quotes(ctx);
5151
let single_leading_quote = only_leading_quote(ctx);

crates/pgls_completions/src/relevance/filtering.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ impl CompletionFilter<'_> {
225225
(ctx.matches_ancestor_history(&[
226226
"grantable_on_table",
227227
"object_reference",
228-
]) && ctx.identifier_qualifiers.1.is_none())
228+
]) && !ctx.has_any_qualifier())
229229
|| ctx.matches_ancestor_history(&["grantable_on_all"])
230230
}
231231

@@ -308,16 +308,10 @@ impl CompletionFilter<'_> {
308308
}
309309

310310
fn check_mentioned_schema_or_alias(&self, ctx: &TreesitterContext) -> Option<()> {
311-
if ctx.identifier_qualifiers.1.is_none() {
312-
return Some(());
313-
}
314-
315-
let second_qualifier = ctx
316-
.identifier_qualifiers
317-
.1
318-
.as_ref()
319-
.unwrap()
320-
.replace('"', "");
311+
let second_qualifier = match ctx.tail_qualifier_sanitized() {
312+
Some(q) => q,
313+
None => return Some(()), // no qualifier = this check passes
314+
};
321315

322316
let matches = match self.data {
323317
CompletionRelevanceData::Table(table) => table.schema == second_qualifier,

crates/pgls_completions/src/relevance/scoring.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ impl CompletionScore<'_> {
7979
};
8080

8181
let has_mentioned_tables = ctx.has_any_mentioned_relations();
82-
let has_qualifier = ctx.identifier_qualifiers.1.is_some();
82+
let has_qualifier = ctx.has_any_qualifier();
8383

8484
self.score += match self.data {
8585
CompletionRelevanceData::Table(_) => match clause_type {
@@ -149,7 +149,7 @@ impl CompletionScore<'_> {
149149
Some(wn) => wn,
150150
};
151151

152-
let has_single_qualifier = matches!(ctx.identifier_qualifiers, (None, Some(_)));
152+
let has_single_qualifier = ctx.has_single_qualifier();
153153
let has_node_text = ctx
154154
.get_node_under_cursor_content()
155155
.is_some_and(|txt| !sanitization::is_sanitized_token(txt.as_str()));
@@ -191,27 +191,20 @@ impl CompletionScore<'_> {
191191
}
192192

193193
fn check_matches_schema(&mut self, ctx: &TreesitterContext) {
194-
if matches!(ctx.identifier_qualifiers, (None, None)) {
195-
return;
196-
}
197-
198-
let schema_from_qualifier = ctx
199-
.identifier_qualifiers
200-
.1
201-
.as_ref()
202-
.map(|n| n.replace('"', ""));
194+
let schema_from_qualifier = match ctx.tail_qualifier_sanitized() {
195+
Some(s) => s,
196+
None => return,
197+
};
203198

204199
let data_schema = match self.get_schema_name() {
205200
Some(s) => s,
206201
None => return,
207202
};
208203

209-
if let Some(schema_name) = schema_from_qualifier {
210-
if schema_name == data_schema {
211-
self.score += 25;
212-
} else {
213-
self.score -= 10;
214-
}
204+
if schema_from_qualifier == data_schema {
205+
self.score += 25;
206+
} else {
207+
self.score -= 10;
215208
}
216209
}
217210

crates/pgls_treesitter/src/context/mod.rs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,14 @@ pub struct TreesitterContext<'a> {
101101
pub text: &'a str,
102102
pub position: usize,
103103

104-
/// Tuple containing up to two qualifiers for identifier-node under the cursor.
104+
/// Tuple containing up to two qualifiers for identifier-node under the cursor: (head, tail)
105105
///
106106
/// The qualifiers represent different "parents" based on the context, for example:
107+
/// - `column` -> (None, None)
107108
/// - `table.column` -> (None, Some("table"))
108109
/// - `alias.column` -> (None, Some("alias"))
109110
/// - `schema.table` -> (None, Some("schema"))
110111
/// - `schema.table.column` -> (Some("schema"), Some("table"))
111-
///
112-
/// Without any qualifiers:
113-
/// - `column` -> (None, None)
114112
/// - `table` -> (None, None)
115113
pub identifier_qualifiers: (Option<String>, Option<String>),
116114

@@ -781,6 +779,36 @@ impl<'a> TreesitterContext<'a> {
781779
pub fn has_mentioned_columns(&self) -> bool {
782780
!self.mentioned_columns.is_empty()
783781
}
782+
783+
/// Returns the head qualifier (leftmost), sanitized (quotes removed)
784+
/// For `schema.table.column`: returns `Some("schema")`
785+
/// For `table.column`: returns `None`
786+
pub fn head_qualifier_sanitized(&self) -> Option<String> {
787+
self.identifier_qualifiers
788+
.0
789+
.as_ref()
790+
.map(|s| s.replace('"', ""))
791+
}
792+
793+
/// Returns the tail qualifier (rightmost), sanitized (quotes removed)
794+
/// For `schema.table.column`: returns `Some("table")`
795+
/// For `table.column`: returns `Some("table")`
796+
pub fn tail_qualifier_sanitized(&self) -> Option<String> {
797+
self.identifier_qualifiers
798+
.1
799+
.as_ref()
800+
.map(|s| s.replace('"', ""))
801+
}
802+
803+
/// Returns true if there is at least one qualifier present
804+
pub fn has_any_qualifier(&self) -> bool {
805+
self.identifier_qualifiers.1.is_some()
806+
}
807+
808+
/// Returns true if there is exactly one qualifier (tail only, no head)
809+
pub fn has_single_qualifier(&self) -> bool {
810+
matches!(self.identifier_qualifiers, (None, Some(_)))
811+
}
784812
}
785813

786814
#[cfg(test)]

0 commit comments

Comments
 (0)