diff --git a/crates/ra_assists/src/ast_transform.rs b/crates/ra_assists/src/ast_transform.rs index 3079a02a2d..00fa95b6c3 100644 --- a/crates/ra_assists/src/ast_transform.rs +++ b/crates/ra_assists/src/ast_transform.rs @@ -106,6 +106,7 @@ impl<'a> SubstituteTypeParams<'a> { _ => return None, }; // FIXME: use `hir::Path::from_src` instead. + #[allow(deprecated)] let path = hir::Path::from_ast(path)?; let resolution = self.source_scope.resolve_hir_path(&path)?; match resolution { @@ -150,6 +151,7 @@ impl<'a> QualifyPaths<'a> { return None; } // FIXME: use `hir::Path::from_src` instead. + #[allow(deprecated)] let hir_path = hir::Path::from_ast(p.clone()); let resolution = self.source_scope.resolve_hir_path(&hir_path?)?; match resolution { diff --git a/crates/ra_hir_def/src/path.rs b/crates/ra_hir_def/src/path.rs index ba16442bd5..190d6d98d4 100644 --- a/crates/ra_hir_def/src/path.rs +++ b/crates/ra_hir_def/src/path.rs @@ -154,7 +154,7 @@ pub enum GenericArg { impl Path { /// Converts an `ast::Path` to `Path`. Works with use trees. - /// DEPRECATED: It does not handle `$crate` from macro call. + #[deprecated = "Doesn't handle hygiene, don't add new calls, remove old ones"] pub fn from_ast(path: ast::Path) -> Option { lower::lower_path(path, &Hygiene::new_unhygienic()) } diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs index 9f4c582d08..560fb19e6a 100644 --- a/crates/ra_ide/src/completion/completion_context.rs +++ b/crates/ra_ide/src/completion/completion_context.rs @@ -381,6 +381,7 @@ impl<'a> CompletionContext<'a> { self.is_path_type = path.syntax().parent().and_then(ast::PathType::cast).is_some(); self.has_type_args = segment.type_arg_list().is_some(); + #[allow(deprecated)] if let Some(path) = hir::Path::from_ast(path.clone()) { if let Some(path_prefix) = path.qualifier() { self.path_prefix = Some(path_prefix); diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index d6e8df32a1..6e72eea664 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs @@ -50,10 +50,8 @@ fn expr_no_struct(p: &mut Parser) { } fn is_expr_stmt_attr_allowed(kind: SyntaxKind) -> bool { - match kind { - BIN_EXPR | RANGE_EXPR | IF_EXPR => false, - _ => true, - } + let forbid = matches!(kind, BIN_EXPR | RANGE_EXPR); + !forbid } pub(super) fn stmt(p: &mut Parser, with_semi: StmtWithSemi) { diff --git a/crates/ra_syntax/test_data/parser/inline/err/0009_attr_on_expr_not_allowed.rast b/crates/ra_syntax/test_data/parser/inline/err/0009_attr_on_expr_not_allowed.rast index 0656fdf739..4e3fa704e6 100644 --- a/crates/ra_syntax/test_data/parser/inline/err/0009_attr_on_expr_not_allowed.rast +++ b/crates/ra_syntax/test_data/parser/inline/err/0009_attr_on_expr_not_allowed.rast @@ -56,4 +56,3 @@ SOURCE_FILE@0..48 R_CURLY@46..47 "}" WHITESPACE@47..48 "\n" error 24..24: attributes are not allowed on BIN_EXPR -error 44..44: attributes are not allowed on IF_EXPR diff --git a/crates/test_utils/src/lib.rs b/crates/test_utils/src/lib.rs index 2141bfc202..981565cd74 100644 --- a/crates/test_utils/src/lib.rs +++ b/crates/test_utils/src/lib.rs @@ -10,17 +10,17 @@ pub mod mark; use std::{ - fs, + env, fs, path::{Path, PathBuf}, }; -pub use ra_cfg::CfgOptions; +use serde_json::Value; use stdx::split1; +use text_size::{TextRange, TextSize}; +pub use ra_cfg::CfgOptions; pub use relative_path::{RelativePath, RelativePathBuf}; pub use rustc_hash::FxHashMap; -use serde_json::Value; -use text_size::{TextRange, TextSize}; pub use difference::Changeset as __Changeset; @@ -625,8 +625,6 @@ pub fn skip_slow_tests() -> bool { should_skip } -const REWRITE: bool = false; - /// Asserts that `expected` and `actual` strings are equal. If they differ only /// in trailing or leading whitespace the test won't fail and /// the contents of `actual` will be written to the file located at `path`. @@ -642,7 +640,7 @@ fn assert_equal_text(expected: &str, actual: &str, path: &Path) { fs::write(path, actual).unwrap(); return; } - if REWRITE { + if env::var("UPDATE_EXPECTATIONS").is_ok() { println!("rewriting {}", pretty_path.display()); fs::write(path, actual).unwrap(); return; diff --git a/docs/dev/README.md b/docs/dev/README.md index 2e4a459988..4cb5dfaa05 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md @@ -342,6 +342,12 @@ There are two kinds of tests: The purpose of inline tests is not to achieve full coverage by test cases, but to explain to the reader of the code what each particular `if` and `match` is responsible for. If you are tempted to add a large inline test, it might be a good idea to leave only the simplest example in place, and move the test to a manual `parser/ok` test. +To update test data, run with `UPDATE_EXPECTATIONS` variable: + +```bash +env UPDATE_EXPECTATIONS=1 cargo qt +``` + # Logging Logging is done by both rust-analyzer and VS Code, so it might be tricky to