Skip to content

Commit 74b4cec

Browse files
ok ok
1 parent 7b5b8c6 commit 74b4cec

File tree

10 files changed

+383350
-404755
lines changed

10 files changed

+383350
-404755
lines changed

crates/pgls_completions/src/relevance/filtering.rs

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,31 +95,62 @@ impl CompletionFilter<'_> {
9595
fn check_specific_node_type(&self, ctx: &TreesitterContext) -> Option<()> {
9696
let kind = ctx.node_under_cursor.as_ref().map(|n| n.kind())?;
9797

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-
105-
"any_identifier" => match self.data {
106-
CompletionRelevanceData::Column(_) => {
107-
matches!(ctx.wrapping_clause_type, Some(WrappingClause::Where))
108-
&& ctx.node_under_cursor_is_within_field_name(&[
98+
let is_allowed =
99+
match kind {
100+
"column_identifier" => matches!(self.data, CompletionRelevanceData::Column(_)),
101+
"role_identifier" => matches!(self.data, CompletionRelevanceData::Role(_)),
102+
"function_identifier" => matches!(self.data, CompletionRelevanceData::Function(_)),
103+
"schema_identifier" => matches!(self.data, CompletionRelevanceData::Schema(_)),
104+
"table_identifier" => matches!(self.data, CompletionRelevanceData::Table(_)),
105+
"policy_identifier" => matches!(self.data, CompletionRelevanceData::Policy(_)),
106+
107+
"any_identifier" => match self.data {
108+
CompletionRelevanceData::Column(_) => ctx
109+
.node_under_cursor_is_within_field_name(&[
109110
"object_reference_1of1",
110111
"object_reference_2of2",
111112
"object_reference_3of3",
112113
"column_reference_1of1",
113114
"column_reference_2of2",
114115
"column_reference_3of3",
115-
])
116-
}
116+
]),
117117

118-
_ => false,
119-
},
118+
CompletionRelevanceData::Schema(_) => ctx
119+
.node_under_cursor_is_within_field_name(&[
120+
"object_reference_1of1",
121+
"object_reference_1of2",
122+
"object_reference_1of3",
123+
"type_reference_1of1",
124+
"table_reference_1of1",
125+
"column_reference_1of1",
126+
"column_reference_1of2",
127+
"function_reference_1of1",
128+
]),
120129

121-
_ => false,
122-
};
130+
CompletionRelevanceData::Function(_) => ctx
131+
.node_under_cursor_is_within_field_name(&[
132+
"object_reference_1of1",
133+
"object_reference_2of2",
134+
"function_reference_1of1",
135+
]),
136+
137+
CompletionRelevanceData::Table(_) => ctx
138+
.node_under_cursor_is_within_field_name(&[
139+
"object_reference_1of1",
140+
"object_reference_1of2",
141+
"object_reference_2of2",
142+
"object_reference_2of3",
143+
"table_reference_1of1",
144+
"column_reference_1of1",
145+
"column_reference_1of2",
146+
"column_reference_2of2",
147+
]),
148+
149+
_ => false,
150+
},
151+
152+
_ => false,
153+
};
123154

124155
if is_allowed { Some(()) } else { None }
125156
}

crates/pgls_hover/src/hovered_node.rs

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
use pgls_treesitter::WrappingClause;
22

3-
#[derive(Debug)]
4-
pub(crate) enum NodeIdentification {
5-
Name(String),
6-
SchemaAndName((String, String)),
7-
#[allow(unused)]
8-
SchemaAndTableAndName((String, String, String)),
9-
}
3+
type NodeIdentification = (Option<String>, String);
104

115
#[allow(unused)]
126
#[derive(Debug)]
@@ -39,16 +33,13 @@ impl HoveredNode {
3933
{
4034
let num_sibs = ctx.num_siblings();
4135
if ctx.node_under_cursor_is_nth_child(1) && num_sibs > 0 {
42-
return Some(HoveredNode::Schema(NodeIdentification::Name(node_content)));
36+
return Some(HoveredNode::Schema((None, node_content)));
4337
}
4438

4539
if let Some(schema) = ctx.schema_or_alias_name.as_ref() {
46-
Some(HoveredNode::Table(NodeIdentification::SchemaAndName((
47-
schema.clone(),
48-
node_content,
49-
))))
40+
Some(HoveredNode::Table((Some(schema.clone()), node_content)))
5041
} else {
51-
Some(HoveredNode::Table(NodeIdentification::Name(node_content)))
42+
Some(HoveredNode::Table((None, node_content)))
5243
}
5344
}
5445

@@ -77,38 +68,33 @@ impl HoveredNode {
7768
if ctx.matches_ancestor_history(&["binary_expression", "object_reference"]) =>
7869
{
7970
if let Some(table_or_alias) = ctx.schema_or_alias_name.as_ref() {
80-
Some(HoveredNode::Column(NodeIdentification::SchemaAndName((
81-
table_or_alias.clone(),
71+
Some(HoveredNode::Column((
72+
Some(table_or_alias.clone()),
8273
node_content,
83-
))))
74+
)))
8475
} else {
85-
Some(HoveredNode::Column(NodeIdentification::Name(node_content)))
76+
Some(HoveredNode::Column((None, node_content)))
8677
}
8778
}
8879

8980
"column_identifier" => {
9081
if let Some(table_or_alias) = ctx.schema_or_alias_name.as_ref() {
91-
Some(HoveredNode::Column(NodeIdentification::SchemaAndName((
92-
table_or_alias.clone(),
82+
Some(HoveredNode::Column((
83+
Some(table_or_alias.clone()),
9384
node_content,
94-
))))
85+
)))
9586
} else {
96-
Some(HoveredNode::Column(NodeIdentification::Name(node_content)))
87+
Some(HoveredNode::Column((None, node_content)))
9788
}
9889
}
9990

10091
"any_identifier"
10192
if ctx.matches_ancestor_history(&["invocation", "object_reference"]) =>
10293
{
10394
if let Some(schema) = ctx.schema_or_alias_name.as_ref() {
104-
Some(HoveredNode::Function(NodeIdentification::SchemaAndName((
105-
schema.clone(),
106-
node_content,
107-
))))
95+
Some(HoveredNode::Function((Some(schema.clone()), node_content)))
10896
} else {
109-
Some(HoveredNode::Function(NodeIdentification::Name(
110-
node_content,
111-
)))
97+
Some(HoveredNode::Function((None, node_content)))
11298
}
11399
}
114100

@@ -119,11 +105,9 @@ impl HoveredNode {
119105
"role_specification",
120106
]) || ctx.before_cursor_matches_kind(&["keyword_revoke"]) =>
121107
{
122-
Some(HoveredNode::Role(NodeIdentification::Name(node_content)))
123-
}
124-
"grant_role" | "policy_role" => {
125-
Some(HoveredNode::Role(NodeIdentification::Name(node_content)))
108+
Some(HoveredNode::Role((None, node_content)))
126109
}
110+
"grant_role" | "policy_role" => Some(HoveredNode::Role((None, node_content))),
127111

128112
"any_identifier"
129113
if (
@@ -145,29 +129,22 @@ impl HoveredNode {
145129
{
146130
let sanitized = node_content.replace(['(', ')'], "");
147131
if let Some(schema) = ctx.schema_or_alias_name.as_ref() {
148-
Some(HoveredNode::PostgresType(
149-
NodeIdentification::SchemaAndName((schema.clone(), sanitized)),
150-
))
132+
Some(HoveredNode::PostgresType((Some(schema.clone()), sanitized)))
151133
} else {
152-
Some(HoveredNode::PostgresType(NodeIdentification::Name(
153-
sanitized,
154-
)))
134+
Some(HoveredNode::PostgresType((None, sanitized)))
155135
}
156136
}
157137

158138
// quoted columns
159139
"literal" if ctx.matches_ancestor_history(&["select_expression", "term"]) => {
160-
Some(HoveredNode::Column(NodeIdentification::Name(node_content)))
140+
Some(HoveredNode::Column((None, node_content)))
161141
}
162142

163143
"grant_table" => {
164144
if let Some(schema) = ctx.schema_or_alias_name.as_ref() {
165-
Some(HoveredNode::Table(NodeIdentification::SchemaAndName((
166-
schema.clone(),
167-
node_content,
168-
))))
145+
Some(HoveredNode::Table((Some(schema.clone()), node_content)))
169146
} else {
170-
Some(HoveredNode::Table(NodeIdentification::Name(node_content)))
147+
Some(HoveredNode::Table((None, node_content)))
171148
}
172149
}
173150

crates/pgls_hover/src/lib.rs

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ pub fn on_hover(params: OnHoverParams) -> Vec<String> {
3434
if let Some(hovered_node) = HoveredNode::get(&ctx) {
3535
let items: Vec<Hoverable> = match hovered_node {
3636
HoveredNode::Table(node_identification) => match node_identification {
37-
hovered_node::NodeIdentification::Name(n) => params
37+
(None, n) => params
3838
.schema_cache
3939
.find_tables(n.as_str(), None)
4040
.into_iter()
4141
.map(Hoverable::from)
4242
.collect(),
4343

44-
hovered_node::NodeIdentification::SchemaAndName((s, n)) => params
44+
(Some(s), n) => params
4545
.schema_cache
4646
.find_tables(n.as_str(), Some(&s))
4747
.into_iter()
@@ -52,14 +52,14 @@ pub fn on_hover(params: OnHoverParams) -> Vec<String> {
5252
},
5353

5454
HoveredNode::Column(node_identification) => match node_identification {
55-
hovered_node::NodeIdentification::Name(column_name) => params
55+
(None, column_name) => params
5656
.schema_cache
5757
.find_cols(&column_name, None, None)
5858
.into_iter()
5959
.map(Hoverable::from)
6060
.collect(),
6161

62-
hovered_node::NodeIdentification::SchemaAndName((table_or_alias, column_name)) => {
62+
(Some(table_or_alias), column_name) => {
6363
// resolve alias to actual table name if needed
6464
let actual_table = ctx
6565
.get_mentioned_table_for_alias(table_or_alias.as_str())
@@ -73,30 +73,26 @@ pub fn on_hover(params: OnHoverParams) -> Vec<String> {
7373
.map(Hoverable::from)
7474
.collect()
7575
}
76-
77-
_ => vec![],
7876
},
7977

8078
HoveredNode::Function(node_identification) => match node_identification {
81-
hovered_node::NodeIdentification::Name(function_name) => params
79+
(None, function_name) => params
8280
.schema_cache
8381
.find_functions(&function_name, None)
8482
.into_iter()
8583
.map(Hoverable::from)
8684
.collect(),
8785

88-
hovered_node::NodeIdentification::SchemaAndName((schema, function_name)) => params
86+
(Some(schema), function_name) => params
8987
.schema_cache
9088
.find_functions(&function_name, Some(&schema))
9189
.into_iter()
9290
.map(Hoverable::from)
9391
.collect(),
94-
95-
_ => vec![],
9692
},
9793

9894
HoveredNode::Role(node_identification) => match node_identification {
99-
hovered_node::NodeIdentification::Name(role_name) => params
95+
(None, role_name) => params
10096
.schema_cache
10197
.find_roles(&role_name)
10298
.into_iter()
@@ -107,7 +103,7 @@ pub fn on_hover(params: OnHoverParams) -> Vec<String> {
107103
},
108104

109105
HoveredNode::Schema(node_identification) => match node_identification {
110-
hovered_node::NodeIdentification::Name(schema_name) => params
106+
(None, schema_name) => params
111107
.schema_cache
112108
.find_schema(&schema_name)
113109
.map(Hoverable::from)
@@ -118,21 +114,19 @@ pub fn on_hover(params: OnHoverParams) -> Vec<String> {
118114
},
119115

120116
HoveredNode::PostgresType(node_identification) => match node_identification {
121-
hovered_node::NodeIdentification::Name(type_name) => params
117+
(None, type_name) => params
122118
.schema_cache
123119
.find_type(&type_name, None)
124120
.map(Hoverable::from)
125121
.map(|s| vec![s])
126122
.unwrap_or_default(),
127123

128-
hovered_node::NodeIdentification::SchemaAndName((schema, type_name)) => params
124+
(Some(schema), type_name) => params
129125
.schema_cache
130126
.find_type(&type_name, Some(schema.as_str()))
131127
.map(Hoverable::from)
132128
.map(|s| vec![s])
133129
.unwrap_or_default(),
134-
135-
_ => vec![],
136130
},
137131

138132
_ => todo!(),

crates/pgls_treesitter_grammar/Cargo.toml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/pgls_treesitter_grammar/grammar.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ module.exports = grammar({
10371037

10381038
alter_policy: ($) =>
10391039
seq(
1040-
seq($.keyword_alter, $.keyword_policy, $.any_identifier),
1040+
seq($.keyword_alter, $.keyword_policy, $.policy_identifier),
10411041
optional(
10421042
seq(
10431043
$.keyword_on,
@@ -1059,7 +1059,7 @@ module.exports = grammar({
10591059
$.keyword_drop,
10601060
$.keyword_policy,
10611061
optional($._if_exists),
1062-
$.any_identifier
1062+
$.policy_identifier
10631063
),
10641064
optional(
10651065
seq(
@@ -3422,7 +3422,7 @@ module.exports = grammar({
34223422
field("column_reference_2of2", $.any_identifier)
34233423
),
34243424

3425-
field("column_reference_1of1", $.column_identifier)
3425+
field("column_reference_1of1", $.any_identifier)
34263426
),
34273427

34283428
function_reference: ($) =>
@@ -3442,6 +3442,7 @@ module.exports = grammar({
34423442
function_identifier: ($) => $._any_identifier,
34433443
type_identifier: ($) => $._any_identifier,
34443444
role_identifier: ($) => $._any_identifier,
3445+
policy_identifier: ($) => $._any_identifier,
34453446

34463447
_any_identifier: ($) =>
34473448
choice(

crates/pgls_treesitter_grammar/package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)