Skip to content

Commit daf8efd

Browse files
sure
1 parent f24ddf6 commit daf8efd

File tree

8 files changed

+62
-12
lines changed

8 files changed

+62
-12
lines changed

crates/pgt_completions/src/complete.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use crate::{
55
context::CompletionContext,
66
item::CompletionItem,
77
providers::{
8-
complete_columns, complete_functions, complete_policies, complete_schemas, complete_tables,
8+
complete_columns, complete_functions, complete_policies, complete_roles, complete_schemas,
9+
complete_tables,
910
},
1011
sanitization::SanitizedCompletionParams,
1112
};
@@ -36,6 +37,7 @@ pub fn complete(params: CompletionParams) -> Vec<CompletionItem> {
3637
complete_columns(&ctx, &mut builder);
3738
complete_schemas(&ctx, &mut builder);
3839
complete_policies(&ctx, &mut builder);
40+
complete_roles(&ctx, &mut builder);
3941

4042
builder.finish()
4143
}

crates/pgt_completions/src/item.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub enum CompletionItemKind {
1212
Column,
1313
Schema,
1414
Policy,
15+
Role,
1516
}
1617

1718
impl Display for CompletionItemKind {
@@ -22,6 +23,7 @@ impl Display for CompletionItemKind {
2223
CompletionItemKind::Column => "Column",
2324
CompletionItemKind::Schema => "Schema",
2425
CompletionItemKind::Policy => "Policy",
26+
CompletionItemKind::Role => "Role",
2527
};
2628

2729
write!(f, "{txt}")

crates/pgt_completions/src/providers/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ mod columns;
22
mod functions;
33
mod helper;
44
mod policies;
5+
mod roles;
56
mod schemas;
67
mod tables;
78

89
pub use columns::*;
910
pub use functions::*;
1011
pub use policies::*;
12+
pub use roles::*;
1113
pub use schemas::*;
1214
pub use tables::*;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use crate::{
2+
CompletionItemKind,
3+
builder::{CompletionBuilder, PossibleCompletionItem},
4+
context::CompletionContext,
5+
relevance::{CompletionRelevanceData, filtering::CompletionFilter, scoring::CompletionScore},
6+
};
7+
8+
pub fn complete_roles<'a>(ctx: &CompletionContext<'a>, builder: &mut CompletionBuilder<'a>) {
9+
let available_roles = &ctx.schema_cache.roles;
10+
11+
for role in available_roles {
12+
let relevance = CompletionRelevanceData::Role(role);
13+
14+
let item = PossibleCompletionItem {
15+
label: role.name.chars().take(35).collect::<String>(),
16+
score: CompletionScore::from(relevance.clone()),
17+
filter: CompletionFilter::from(relevance),
18+
description: role.name.clone(),
19+
kind: CompletionItemKind::Role,
20+
completion_text: None,
21+
detail: None,
22+
};
23+
24+
builder.add_item(item);
25+
}
26+
}

crates/pgt_completions/src/relevance.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ pub(crate) enum CompletionRelevanceData<'a> {
88
Column(&'a pgt_schema_cache::Column),
99
Schema(&'a pgt_schema_cache::Schema),
1010
Policy(&'a pgt_schema_cache::Policy),
11+
Role(&'a pgt_schema_cache::Role),
1112
}

crates/pgt_completions/src/relevance/filtering.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ impl CompletionFilter<'_> {
169169
CompletionRelevanceData::Policy(_) => {
170170
matches!(clause, WrappingClause::PolicyName)
171171
}
172+
173+
CompletionRelevanceData::Role(_) => false,
172174
}
173175
})
174176
.and_then(|is_ok| if is_ok { Some(()) } else { None })
@@ -204,8 +206,8 @@ impl CompletionFilter<'_> {
204206

205207
// we should never allow schema suggestions if there already was one.
206208
CompletionRelevanceData::Schema(_) => false,
207-
// no policy comletion if user typed a schema node first.
208-
CompletionRelevanceData::Policy(_) => false,
209+
// no policy or row completion if user typed a schema node first.
210+
CompletionRelevanceData::Policy(_) | CompletionRelevanceData::Role(_) => false,
209211
};
210212

211213
if !matches {

crates/pgt_completions/src/relevance/scoring.rs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ impl CompletionScore<'_> {
4747
CompletionRelevanceData::Column(c) => c.name.as_str().to_ascii_lowercase(),
4848
CompletionRelevanceData::Schema(s) => s.name.as_str().to_ascii_lowercase(),
4949
CompletionRelevanceData::Policy(p) => p.name.as_str().to_ascii_lowercase(),
50+
CompletionRelevanceData::Role(r) => r.name.as_str().to_ascii_lowercase(),
5051
};
5152

5253
let fz_matcher = SkimMatcherV2::default();
@@ -126,6 +127,8 @@ impl CompletionScore<'_> {
126127
WrappingClause::PolicyName => 25,
127128
_ => -50,
128129
},
130+
131+
CompletionRelevanceData::Role(_) => 0,
129132
}
130133
}
131134

@@ -160,6 +163,7 @@ impl CompletionScore<'_> {
160163
_ => -50,
161164
},
162165
CompletionRelevanceData::Policy(_) => 0,
166+
CompletionRelevanceData::Role(_) => 0,
163167
}
164168
}
165169

@@ -178,7 +182,10 @@ impl CompletionScore<'_> {
178182
Some(n) => n,
179183
};
180184

181-
let data_schema = self.get_schema_name();
185+
let data_schema = match self.get_schema_name() {
186+
Some(s) => s,
187+
None => return,
188+
};
182189

183190
if schema_name == data_schema {
184191
self.score += 25;
@@ -187,13 +194,14 @@ impl CompletionScore<'_> {
187194
}
188195
}
189196

190-
fn get_schema_name(&self) -> &str {
197+
fn get_schema_name(&self) -> Option<&str> {
191198
match self.data {
192-
CompletionRelevanceData::Function(f) => f.schema.as_str(),
193-
CompletionRelevanceData::Table(t) => t.schema.as_str(),
194-
CompletionRelevanceData::Column(c) => c.schema_name.as_str(),
195-
CompletionRelevanceData::Schema(s) => s.name.as_str(),
196-
CompletionRelevanceData::Policy(p) => p.schema_name.as_str(),
199+
CompletionRelevanceData::Function(f) => Some(f.schema.as_str()),
200+
CompletionRelevanceData::Table(t) => Some(t.schema.as_str()),
201+
CompletionRelevanceData::Column(c) => Some(c.schema_name.as_str()),
202+
CompletionRelevanceData::Schema(s) => Some(s.name.as_str()),
203+
CompletionRelevanceData::Policy(p) => Some(p.schema_name.as_str()),
204+
CompletionRelevanceData::Role(p) => None,
197205
}
198206
}
199207

@@ -212,7 +220,10 @@ impl CompletionScore<'_> {
212220
_ => {}
213221
}
214222

215-
let schema = self.get_schema_name().to_string();
223+
let schema = match self.get_schema_name() {
224+
Some(s) => s.to_string(),
225+
None => return,
226+
};
216227
let table_name = match self.get_table_name() {
217228
Some(t) => t,
218229
None => return,
@@ -234,7 +245,10 @@ impl CompletionScore<'_> {
234245
}
235246

236247
fn check_is_user_defined(&mut self) {
237-
let schema = self.get_schema_name().to_string();
248+
let schema = match self.get_schema_name() {
249+
Some(s) => s.to_string(),
250+
None => return,
251+
};
238252

239253
let system_schemas = ["pg_catalog", "information_schema", "pg_toast"];
240254

crates/pgt_lsp/src/handlers/completions.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,6 @@ fn to_lsp_types_completion_item_kind(
7676
pgt_completions::CompletionItemKind::Column => lsp_types::CompletionItemKind::FIELD,
7777
pgt_completions::CompletionItemKind::Schema => lsp_types::CompletionItemKind::CLASS,
7878
pgt_completions::CompletionItemKind::Policy => lsp_types::CompletionItemKind::CONSTANT,
79+
pgt_completions::CompletionItemKind::Role => lsp_types::CompletionItemKind::CONSTANT,
7980
}
8081
}

0 commit comments

Comments
 (0)