Skip to content

Commit

Permalink
Fix bugs in code completion
Browse files Browse the repository at this point in the history
  • Loading branch information
0x2a-42 committed Dec 30, 2024
1 parent df00a3a commit fded3d8
Showing 1 changed file with 36 additions and 21 deletions.
57 changes: 36 additions & 21 deletions src/ide/completion.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use tower_lsp::lsp_types::*;

use super::lookup::*;
use crate::frontend::ast::{AstNode, File, Named};
use crate::frontend::ast::{AstNode, File, Name, Named};
use crate::{Cst, Node, NodeRef, Rule, SemanticData, Token};

/// Suggests a token name for a given token symbol.
Expand Down Expand Up @@ -180,6 +180,7 @@ fn add_reference_items(
items: &mut Vec<CompletionItem>,
with_rules: bool,
with_tokens: bool,
ignore: Option<&str>,
) {
if with_rules {
for rule in file.rule_decls(cst) {
Expand All @@ -200,14 +201,16 @@ fn add_reference_items(
});
}
for rule_name in sema.undefined_rules.iter() {
items.push(CompletionItem {
label: rule_name.to_string(),
label_details: Some(CompletionItemLabelDetails {
description: Some("Rule".to_string()),
if ignore != Some(rule_name) {
items.push(CompletionItem {
label: rule_name.to_string(),
label_details: Some(CompletionItemLabelDetails {
description: Some("Rule".to_string()),
..Default::default()
}),
..Default::default()
}),
..Default::default()
});
});
}
}
}
if with_tokens {
Expand All @@ -233,15 +236,17 @@ fn add_reference_items(
});
}
}
for token_name_or_symbol in sema.undefined_rules.iter() {
items.push(CompletionItem {
label: token_name_or_symbol.to_string(),
label_details: Some(CompletionItemLabelDetails {
description: Some("Token".to_string()),
for token_name_or_symbol in sema.undefined_tokens.iter() {
if ignore != Some(token_name_or_symbol) {
items.push(CompletionItem {
label: token_name_or_symbol.to_string(),
label_details: Some(CompletionItemLabelDetails {
description: Some("Token".to_string()),
..Default::default()
}),
..Default::default()
}),
..Default::default()
});
});
}
}
}
if with_rules && with_tokens {
Expand Down Expand Up @@ -294,10 +299,20 @@ pub fn completion(cst: &Cst, pos: usize, sema: &SemanticData) -> Option<Completi
| Rule::NodeElision,
_,
) => {
add_reference_items(cst, file, sema, &mut items, true, true);
add_reference_items(
cst,
file,
sema,
&mut items,
true,
true,
Name::cast(cst, node)
.and_then(|name_ref| name_ref.value(cst))
.map(|(name, _)| name),
);
}
Node::Rule(Rule::NodeCreation | Rule::NodeRename, _) => {
add_reference_items(cst, file, sema, &mut items, true, false);
add_reference_items(cst, file, sema, &mut items, true, false, None);
}
Node::Rule(Rule::RuleDecl, _) => {
if inside_decl(cst, node, pos) {
Expand All @@ -306,7 +321,7 @@ pub fn completion(cst: &Cst, pos: usize, sema: &SemanticData) -> Option<Completi
.find_map(|n| cst.get_token(n, Token::Colon))
{
if pos > range.start {
add_reference_items(cst, file, sema, &mut items, true, true);
add_reference_items(cst, file, sema, &mut items, true, true, None);
}
} else {
add_top_level_items(cst, file, sema, &mut items);
Expand All @@ -317,14 +332,14 @@ pub fn completion(cst: &Cst, pos: usize, sema: &SemanticData) -> Option<Completi
}
Node::Rule(Rule::SkipDecl | Rule::RightDecl, _) => {
if inside_decl(cst, node, pos) {
add_reference_items(cst, file, sema, &mut items, false, true);
add_reference_items(cst, file, sema, &mut items, false, true, None);
} else {
add_top_level_items(cst, file, sema, &mut items);
}
}
Node::Rule(Rule::StartDecl, _) => {
if inside_decl(cst, node, pos) {
add_reference_items(cst, file, sema, &mut items, true, false);
add_reference_items(cst, file, sema, &mut items, true, false, None);
} else {
add_top_level_items(cst, file, sema, &mut items);
}
Expand Down

0 comments on commit fded3d8

Please sign in to comment.