Skip to content

Commit

Permalink
Merge branch 'master' into tf/check-critical-libs
Browse files Browse the repository at this point in the history
  • Loading branch information
TomAFrench authored Dec 4, 2024
2 parents a0c4a5d + bbe7564 commit f2b9dde
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 4 deletions.
32 changes: 30 additions & 2 deletions compiler/noirc_frontend/src/parser/parser/expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -428,8 +428,8 @@ impl<'a> Parser<'a> {
Some(if self.eat_colon() {
let expression = self.parse_expression_or_error();
(ident, expression)
} else if self.at(Token::Assign) {
// If we find '=' instead of ':', assume the user meant ':`, error and continue
} else if self.at(Token::DoubleColon) || self.at(Token::Assign) {
// If we find '=' or '::' instead of ':', assume the user meant ':`, error and continue
self.expected_token(Token::Colon);
self.bump();
let expression = self.parse_expression_or_error();
Expand Down Expand Up @@ -1369,6 +1369,34 @@ mod tests {
assert_eq!(expr.to_string(), "y");
}

#[test]
fn parses_constructor_recovers_if_double_colon_instead_of_colon() {
let src = "
Foo { x: 1, y:: z }
^^
";
let (src, span) = get_source_with_error_span(src);
let mut parser = Parser::for_str(&src);
let expr = parser.parse_expression_or_error();

let error = get_single_error(&parser.errors, span);
assert_eq!(error.to_string(), "Expected a ':' but found '::'");

let ExpressionKind::Constructor(mut constructor) = expr.kind else {
panic!("Expected constructor");
};
assert_eq!(constructor.typ.to_string(), "Foo");
assert_eq!(constructor.fields.len(), 2);

let (name, expr) = constructor.fields.remove(0);
assert_eq!(name.to_string(), "x");
assert_eq!(expr.to_string(), "1");

let (name, expr) = constructor.fields.remove(0);
assert_eq!(name.to_string(), "y");
assert_eq!(expr.to_string(), "z");
}

#[test]
fn parses_parses_if_true() {
let src = "if true { 1 }";
Expand Down
48 changes: 48 additions & 0 deletions tooling/lsp/src/requests/completion/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1586,6 +1586,54 @@ fn main() {
assert_eq!(changed, expected);
}

#[test]
async fn test_auto_import_inserts_after_last_use_in_nested_module() {
let src = r#"mod foo {
pub mod bar {
pub fn hello_world() {}
}
}
mod baz {
fn qux() {}
}
mod other {
use baz::qux;
fn main() {
hel>|<
}
}"#;

let expected = r#"mod foo {
pub mod bar {
pub fn hello_world() {}
}
}
mod baz {
fn qux() {}
}
mod other {
use baz::qux;
use super::foo::bar::hello_world;
fn main() {
hel
}
}"#;
let mut items = get_completions(src).await;
assert_eq!(items.len(), 1);

let item = items.remove(0);

let changed =
apply_text_edits(&src.replace(">|<", ""), &item.additional_text_edits.unwrap());
assert_eq!(changed, expected);
}

#[test]
async fn test_does_not_auto_import_test_functions() {
let src = r#"
Expand Down
4 changes: 2 additions & 2 deletions tooling/lsp/src/use_segment_positions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ fn new_use_completion_item_additional_text_edits(
request: UseCompletionItemAdditionTextEditsRequest,
) -> Vec<TextEdit> {
let line = request.auto_import_line as u32;
let character = (request.nesting * 4) as u32;
let character = 0;
let indent = " ".repeat(request.nesting * 4);
let mut newlines = "\n";

Expand All @@ -331,6 +331,6 @@ fn new_use_completion_item_additional_text_edits(

vec![TextEdit {
range: Range { start: Position { line, character }, end: Position { line, character } },
new_text: format!("use {};{}{}", request.full_path, newlines, indent),
new_text: format!("{}use {};{}", indent, request.full_path, newlines),
}]
}

0 comments on commit f2b9dde

Please sign in to comment.