Skip to content

Commit 85c3ad4

Browse files
achore: djust lints, refactor completion_relevance
1 parent 0146ba9 commit 85c3ad4

File tree

6 files changed

+76
-38
lines changed

6 files changed

+76
-38
lines changed

crates/pg_completions/src/builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ impl CompletionBuilder {
2828
.enumerate()
2929
.map(|(idx, mut item)| {
3030
if idx == 0 {
31-
item.preselected = Some(should_preselect_first_item);
31+
item.preselected = should_preselect_first_item;
3232
}
3333
item
3434
})

crates/pg_completions/src/item.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ pub struct CompletionItem {
99
pub label: String,
1010
pub(crate) score: i32,
1111
pub description: String,
12-
pub preselected: Option<bool>,
12+
pub preselected: bool,
1313
pub kind: CompletionItemKind,
1414
}

crates/pg_completions/src/providers/functions.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ pub fn complete_functions(ctx: &CompletionContext, builder: &mut CompletionBuild
1010
let completion_items: Vec<CompletionItem> = available_functions
1111
.iter()
1212
.map(|foo| CompletionItem {
13-
label: foo.name,
13+
label: foo.name.clone(),
1414
score: get_score(ctx, foo),
1515
description: format!("Schema: {}", foo.schema),
16-
preselected: None,
16+
preselected: false,
1717
kind: CompletionItemKind::Function,
1818
})
1919
.collect();
@@ -31,17 +31,23 @@ fn get_score(ctx: &CompletionContext, foo: &Function) -> i32 {
3131
mod tests {
3232
use crate::{
3333
context::CompletionContext,
34-
providers::complete_tables,
34+
providers::complete_functions,
3535
test_helper::{get_test_deps, get_test_params, CURSOR_POS},
36+
CompletionItem,
3637
};
3738

3839
#[tokio::test]
3940
async fn completes_fn() {
4041
let setup = r#"
41-
create or replace function cool() returns trigger
42-
begin;
43-
## Yeahhhh
42+
create or replace function cool()
43+
returns trigger
44+
language plpgsql
45+
security invoker
46+
as $$
47+
begin
48+
raise exception 'dont matter';
4449
end;
50+
$$;
4551
"#;
4652

4753
let query = format!("select coo{}", CURSOR_POS);
@@ -50,6 +56,15 @@ mod tests {
5056
let params = get_test_params(&tree, &cache, &query);
5157
let ctx = CompletionContext::new(&params);
5258

53-
complete_tables(&ctx, &mut builder);
59+
complete_functions(&ctx, &mut builder);
60+
61+
let results = builder.finish();
62+
63+
let CompletionItem { label, .. } = results
64+
.into_iter()
65+
.next()
66+
.expect("Should return at least one completion item");
67+
68+
assert_eq!(label, "cool");
5469
}
5570
}
Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
use pg_schema_cache::Table;
2-
31
use crate::{
42
builder::CompletionBuilder,
53
context::CompletionContext,
64
item::{CompletionItem, CompletionItemKind},
7-
relevance::CompletionRelevance,
5+
relevance::CompletionRelevanceData,
86
};
97

108
pub fn complete_tables(ctx: &CompletionContext, builder: &mut CompletionBuilder) {
@@ -14,9 +12,9 @@ pub fn complete_tables(ctx: &CompletionContext, builder: &mut CompletionBuilder)
1412
.iter()
1513
.map(|table| CompletionItem {
1614
label: table.name.clone(),
17-
score: get_score(ctx, table),
15+
score: CompletionRelevanceData::Table(table).get_score(ctx),
1816
description: format!("Schema: {}", table.schema),
19-
preselected: None,
17+
preselected: false,
2018
kind: CompletionItemKind::Table,
2119
})
2220
.collect();
@@ -25,13 +23,3 @@ pub fn complete_tables(ctx: &CompletionContext, builder: &mut CompletionBuilder)
2523
builder.add_item(item);
2624
}
2725
}
28-
29-
fn get_score(ctx: &CompletionContext, table: &Table) -> i32 {
30-
let mut relevance = CompletionRelevance::default();
31-
32-
relevance.check_matches_query_input(ctx, &table.name);
33-
relevance.check_matches_schema(ctx, &table.schema);
34-
relevance.check_if_catalog(ctx);
35-
36-
relevance.score()
37-
}

crates/pg_completions/src/relevance.rs

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,54 @@
11
use crate::context::CompletionContext;
22

3-
#[derive(Debug, Default)]
4-
pub(crate) struct CompletionRelevance {
3+
#[derive(Debug)]
4+
pub(crate) enum CompletionRelevanceData<'a> {
5+
Table(&'a pg_schema_cache::Table),
6+
Function(&'a pg_schema_cache::Function),
7+
}
8+
9+
impl<'a> CompletionRelevanceData<'a> {
10+
pub fn get_score(self, ctx: &CompletionContext) -> i32 {
11+
CompletionRelevance::from(self).into_score(ctx)
12+
}
13+
}
14+
15+
impl<'a> From<CompletionRelevanceData<'a>> for CompletionRelevance<'a> {
16+
fn from(value: CompletionRelevanceData<'a>) -> Self {
17+
Self {
18+
score: 0,
19+
data: value,
20+
}
21+
}
22+
}
23+
24+
#[derive(Debug)]
25+
pub(crate) struct CompletionRelevance<'a> {
526
score: i32,
27+
data: CompletionRelevanceData<'a>,
628
}
729

8-
impl CompletionRelevance {
9-
pub fn score(&self) -> i32 {
30+
impl<'a> CompletionRelevance<'a> {
31+
pub fn into_score(mut self, ctx: &CompletionContext) -> i32 {
32+
self.check_matches_schema(ctx);
33+
self.check_matches_query_input(ctx);
34+
self.check_if_catalog(ctx);
35+
1036
self.score
1137
}
1238

13-
pub fn check_matches_query_input(&mut self, ctx: &CompletionContext, name: &str) {
39+
fn check_matches_query_input(&mut self, ctx: &CompletionContext) {
1440
let node = ctx.ts_node.unwrap();
1541

1642
let content = match ctx.get_ts_node_content(node) {
1743
Some(c) => c,
1844
None => return,
1945
};
2046

47+
let name = match self.data {
48+
CompletionRelevanceData::Function(f) => f.name.as_str(),
49+
CompletionRelevanceData::Table(t) => t.name.as_str(),
50+
};
51+
2152
if name.starts_with(content) {
2253
let len: i32 = content
2354
.len()
@@ -28,21 +59,25 @@ impl CompletionRelevance {
2859
};
2960
}
3061

31-
pub fn check_matches_schema(&mut self, ctx: &CompletionContext, schema: &str) {
32-
if ctx.schema_name.is_none() {
33-
return;
34-
}
62+
fn check_matches_schema(&mut self, ctx: &CompletionContext) {
63+
let schema_name = match ctx.schema_name.as_ref() {
64+
None => return,
65+
Some(n) => n,
66+
};
3567

36-
let name = ctx.schema_name.as_ref().unwrap();
68+
let data_schema = match self.data {
69+
CompletionRelevanceData::Function(f) => f.schema.as_str(),
70+
CompletionRelevanceData::Table(t) => t.schema.as_str(),
71+
};
3772

38-
if name == schema {
73+
if schema_name == data_schema {
3974
self.score += 25;
4075
} else {
4176
self.score -= 10;
4277
}
4378
}
4479

45-
pub fn check_if_catalog(&mut self, ctx: &CompletionContext) {
80+
fn check_if_catalog(&mut self, ctx: &CompletionContext) {
4681
if ctx.schema_name.as_ref().is_some_and(|n| n == "pg_catalog") {
4782
return;
4883
}

crates/pg_type_resolver/src/functions.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ fn function_matches(
5151
name: &str,
5252
arg_types: Vec<PossibleType>,
5353
) -> bool {
54-
if func.name.as_deref() != Some(name) {
54+
if func.name != name {
5555
return false;
5656
}
5757

58-
if schema.is_some() && func.schema.as_deref() != schema {
58+
if schema.is_some() && Some(func.schema.as_str()) != schema {
5959
return false;
6060
}
6161

0 commit comments

Comments
 (0)