Skip to content

Commit 79cd1c3

Browse files
[2] refactor: remove custom grant parser (#567)
1 parent 01a1456 commit 79cd1c3

File tree

11 files changed

+391
-904
lines changed

11 files changed

+391
-904
lines changed

crates/pgt_completions/src/relevance/filtering.rs

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use pgt_schema_cache::ProcKind;
2-
use pgt_treesitter::context::{NodeUnderCursor, TreesitterContext, WrappingClause, WrappingNode};
2+
use pgt_treesitter::context::{TreesitterContext, WrappingClause, WrappingNode};
33

44
use super::CompletionRelevanceData;
55

@@ -17,7 +17,11 @@ impl<'a> From<CompletionRelevanceData<'a>> for CompletionFilter<'a> {
1717
impl CompletionFilter<'_> {
1818
pub fn is_relevant(&self, ctx: &TreesitterContext) -> Option<()> {
1919
self.completable_context(ctx)?;
20-
self.check_clause(ctx)?;
20+
21+
self.check_node_type(ctx)
22+
// we want to rely on treesitter more, so checking the clause is a fallback
23+
.or_else(|| self.check_clause(ctx))?;
24+
2125
self.check_invocation(ctx)?;
2226
self.check_mentioned_schema_or_alias(ctx)?;
2327

@@ -67,30 +71,42 @@ impl CompletionFilter<'_> {
6771
}
6872

6973
// No autocompletions if there are two identifiers without a separator.
70-
if ctx.node_under_cursor.as_ref().is_some_and(|n| match n {
71-
NodeUnderCursor::TsNode(node) => node.prev_sibling().is_some_and(|p| {
72-
(p.kind() == "identifier" || p.kind() == "object_reference")
73-
&& n.kind() == "identifier"
74-
}),
75-
NodeUnderCursor::CustomNode { .. } => false,
74+
if ctx.node_under_cursor.as_ref().is_some_and(|node| {
75+
node.prev_sibling().is_some_and(|p| {
76+
(p.kind() == "any_identifier" || p.kind() == "object_reference")
77+
&& node.kind() == "any_identifier"
78+
})
7679
}) {
7780
return None;
7881
}
7982

8083
// no completions if we're right after an asterisk:
8184
// `select * {}`
82-
if ctx.node_under_cursor.as_ref().is_some_and(|n| match n {
83-
NodeUnderCursor::TsNode(node) => node
84-
.prev_sibling()
85-
.is_some_and(|p| (p.kind() == "all_fields") && n.kind() == "identifier"),
86-
NodeUnderCursor::CustomNode { .. } => false,
85+
if ctx.node_under_cursor.as_ref().is_some_and(|node| {
86+
node.prev_sibling()
87+
.is_some_and(|p| (p.kind() == "all_fields") && node.kind() == "any_identifier")
8788
}) {
8889
return None;
8990
}
9091

9192
Some(())
9293
}
9394

95+
fn check_node_type(&self, ctx: &TreesitterContext) -> Option<()> {
96+
let kind = ctx.node_under_cursor.as_ref().map(|n| n.kind())?;
97+
98+
let is_allowed = match kind {
99+
"column_identifier" => {
100+
matches!(self.data, CompletionRelevanceData::Column(_))
101+
&& !ctx.matches_ancestor_history(&["insert_values", "field"])
102+
&& !ctx.node_under_cursor_is_within_field_name("binary_expr_right")
103+
}
104+
_ => false,
105+
};
106+
107+
if is_allowed { Some(()) } else { None }
108+
}
109+
94110
fn check_clause(&self, ctx: &TreesitterContext) -> Option<()> {
95111
ctx.wrapping_clause_type
96112
.as_ref()
@@ -99,9 +115,8 @@ impl CompletionFilter<'_> {
99115
CompletionRelevanceData::Table(_) => match clause {
100116
WrappingClause::From | WrappingClause::Update => true,
101117

102-
WrappingClause::RevokeStatement => {
103-
ctx.matches_ancestor_history(&["revoke_on_table", "object_reference"])
104-
}
118+
WrappingClause::RevokeStatement | WrappingClause::GrantStatement => ctx
119+
.matches_ancestor_history(&["grantable_on_table", "object_reference"]),
105120

106121
WrappingClause::Join { on_node: None } => true,
107122
WrappingClause::Join { on_node: Some(on) } => ctx
@@ -206,10 +221,12 @@ impl CompletionFilter<'_> {
206221
| WrappingClause::Update
207222
| WrappingClause::Delete => true,
208223

209-
WrappingClause::RevokeStatement => {
210-
(ctx.matches_ancestor_history(&["revoke_on_table", "object_reference"])
211-
&& ctx.schema_or_alias_name.is_none())
212-
|| ctx.matches_ancestor_history(&["revoke_on_all"])
224+
WrappingClause::RevokeStatement | WrappingClause::GrantStatement => {
225+
(ctx.matches_ancestor_history(&[
226+
"grantable_on_table",
227+
"object_reference",
228+
]) && ctx.schema_or_alias_name.is_none())
229+
|| ctx.matches_ancestor_history(&["grantable_on_all"])
213230
}
214231

215232
WrappingClause::Where => {
@@ -248,18 +265,17 @@ impl CompletionFilter<'_> {
248265
}
249266

250267
CompletionRelevanceData::Role(_) => match clause {
251-
WrappingClause::DropRole
252-
| WrappingClause::AlterRole
253-
| WrappingClause::ToRoleAssignment => true,
268+
WrappingClause::DropRole | WrappingClause::AlterRole => true,
254269

255270
WrappingClause::SetStatement => ctx
256271
.before_cursor_matches_kind(&["keyword_role", "keyword_authorization"]),
257272

258-
WrappingClause::RevokeStatement => {
273+
WrappingClause::RevokeStatement | WrappingClause::GrantStatement => {
259274
ctx.matches_ancestor_history(&["role_specification"])
260275
|| ctx.node_under_cursor.as_ref().is_some_and(|k| {
261-
k.kind() == "identifier"
276+
k.kind() == "any_identifier"
262277
&& ctx.before_cursor_matches_kind(&[
278+
"keyword_grant",
263279
"keyword_revoke",
264280
"keyword_for",
265281
])

crates/pgt_hover/src/hovered_node.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ impl HoveredNode {
3232
let under_cursor = ctx.node_under_cursor.as_ref()?;
3333

3434
match under_cursor.kind() {
35-
"identifier"
35+
"any_identifier"
3636
if ctx.matches_ancestor_history(&["relation", "object_reference"])
37-
|| ctx.matches_ancestor_history(&["revoke_on_table", "object_reference"]) =>
37+
|| ctx
38+
.matches_ancestor_history(&["grantable_on_table", "object_reference"]) =>
3839
{
3940
let num_sibs = ctx.num_siblings();
4041
if ctx.node_under_cursor_is_nth_child(1) && num_sibs > 0 {
@@ -51,7 +52,7 @@ impl HoveredNode {
5152
}
5253
}
5354

54-
"identifier"
55+
"any_identifier"
5556
if ctx.matches_ancestor_history(&["object_reference"])
5657
&& ctx.wrapping_clause_type.as_ref().is_some_and(|clause| {
5758
matches!(
@@ -72,7 +73,7 @@ impl HoveredNode {
7273
}
7374
}
7475

75-
"identifier" if ctx.matches_ancestor_history(&["field"]) => {
76+
"column_identifier" => {
7677
if let Some(table_or_alias) = ctx.schema_or_alias_name.as_ref() {
7778
Some(HoveredNode::Column(NodeIdentification::SchemaAndName((
7879
table_or_alias.clone(),
@@ -83,7 +84,9 @@ impl HoveredNode {
8384
}
8485
}
8586

86-
"identifier" if ctx.matches_ancestor_history(&["invocation", "object_reference"]) => {
87+
"any_identifier"
88+
if ctx.matches_ancestor_history(&["invocation", "object_reference"]) =>
89+
{
8790
if let Some(schema) = ctx.schema_or_alias_name.as_ref() {
8891
Some(HoveredNode::Function(NodeIdentification::SchemaAndName((
8992
schema.clone(),
@@ -96,7 +99,7 @@ impl HoveredNode {
9699
}
97100
}
98101

99-
"identifier"
102+
"any_identifier"
100103
if ctx.matches_one_of_ancestors(&[
101104
"alter_role",
102105
"policy_to_role",
@@ -109,7 +112,7 @@ impl HoveredNode {
109112
Some(HoveredNode::Role(NodeIdentification::Name(node_content)))
110113
}
111114

112-
"identifier"
115+
"any_identifier"
113116
if (
114117
// hover over custom type in `create table` or `returns`
115118
(ctx.matches_ancestor_history(&["type", "object_reference"])

0 commit comments

Comments
 (0)