From 18bf2e5af5875f036b321bcf9e07e9904c02510e Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 1 Jan 2021 10:07:01 +0100 Subject: Add ConstParams to the ide layer --- crates/assists/src/ast_transform.rs | 3 ++- crates/hir_ty/src/tests/simple.rs | 1 - crates/ide/src/display/navigation_target.rs | 19 +++++++++++++++++++ crates/ide/src/doc_links.rs | 1 + crates/ide/src/hover.rs | 5 ++++- crates/ide/src/references.rs | 16 ++++++++++++++++ crates/ide/src/syntax_highlighting.rs | 1 + crates/ide/src/syntax_highlighting/tags.rs | 1 + .../syntax_highlighting/test_data/highlighting.html | 4 ++++ crates/ide/src/syntax_highlighting/tests.rs | 4 ++++ crates/ide_db/src/defs.rs | 13 +++++++++++-- crates/rust-analyzer/src/semantic_tokens.rs | 1 + crates/rust-analyzer/src/to_proto.rs | 2 ++ 13 files changed, 66 insertions(+), 5 deletions(-) diff --git a/crates/assists/src/ast_transform.rs b/crates/assists/src/ast_transform.rs index da94e9987..4a3ed7783 100644 --- a/crates/assists/src/ast_transform.rs +++ b/crates/assists/src/ast_transform.rs @@ -204,7 +204,8 @@ impl<'a> AstTransform<'a> for QualifyPaths<'a> { } PathResolution::Local(_) | PathResolution::TypeParam(_) - | PathResolution::SelfType(_) => None, + | PathResolution::SelfType(_) + | PathResolution::ConstParam(_) => None, PathResolution::Macro(_) => None, PathResolution::AssocItem(_) => None, } diff --git a/crates/hir_ty/src/tests/simple.rs b/crates/hir_ty/src/tests/simple.rs index bd6beea99..8d431b920 100644 --- a/crates/hir_ty/src/tests/simple.rs +++ b/crates/hir_ty/src/tests/simple.rs @@ -2376,7 +2376,6 @@ fn infer_operator_overload() { ); } - #[test] fn infer_const_params() { check_infer( diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs index 6431e7d6d..bcde2b6f1 100644 --- a/crates/ide/src/display/navigation_target.rs +++ b/crates/ide/src/display/navigation_target.rs @@ -24,6 +24,7 @@ pub enum SymbolKind { Impl, Field, TypeParam, + ConstParam, LifetimeParam, ValueParam, SelfParam, @@ -225,6 +226,7 @@ impl TryToNav for Definition { Definition::TypeParam(it) => Some(it.to_nav(db)), Definition::LifetimeParam(it) => Some(it.to_nav(db)), Definition::Label(it) => Some(it.to_nav(db)), + Definition::ConstParam(it) => Some(it.to_nav(db)), } } } @@ -485,6 +487,23 @@ impl ToNav for hir::LifetimeParam { } } +impl ToNav for hir::ConstParam { + fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { + let src = self.source(db); + let full_range = src.value.syntax().text_range(); + NavigationTarget { + file_id: src.file_id.original_file(db), + name: self.name(db).to_string().into(), + kind: Some(SymbolKind::ConstParam), + full_range, + focus_range: src.value.name().map(|n| n.syntax().text_range()), + container_name: None, + description: None, + docs: None, + } + } +} + /// Get a description of a symbol. /// /// e.g. `struct Name`, `enum Name`, `fn Name` diff --git a/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs index e10516f43..367fac05e 100644 --- a/crates/ide/src/doc_links.rs +++ b/crates/ide/src/doc_links.rs @@ -193,6 +193,7 @@ fn rewrite_intra_doc_link( Definition::SelfType(_) | Definition::Local(_) | Definition::TypeParam(_) + | Definition::ConstParam(_) | Definition::LifetimeParam(_) | Definition::Label(_) => return None, }?; diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 73245fbe7..49eb8caae 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs @@ -370,7 +370,10 @@ fn hover_for_definition(db: &RootDatabase, def: Definition) -> Option { Adt::Enum(it) => from_def_source(db, it, mod_path), }) } - Definition::TypeParam(_) | Definition::LifetimeParam(_) | Definition::Label(_) => { + Definition::TypeParam(_) + | Definition::LifetimeParam(_) + | Definition::ConstParam(_) + | Definition::Label(_) => { // FIXME: Hover for generic param None } diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs index 21b2d7ca1..fa58fc319 100644 --- a/crates/ide/src/references.rs +++ b/crates/ide/src/references.rs @@ -1144,4 +1144,20 @@ fn foo<'a>() -> &'a () { "#]], ); } + + #[test] + fn test_find_const_param() { + check( + r#" +fn foo: usize>() -> usize { + FOO +} +"#, + expect![[r#" + FOO ConstParam FileId(0) 7..23 13..16 Other + + FileId(0) 42..45 Other + "#]], + ); + } } diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index 5ad96581b..ba0085244 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs @@ -819,6 +819,7 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight { }, Definition::SelfType(_) => HighlightTag::Symbol(SymbolKind::Impl), Definition::TypeParam(_) => HighlightTag::Symbol(SymbolKind::TypeParam), + Definition::ConstParam(_) => HighlightTag::Symbol(SymbolKind::ConstParam), Definition::Local(local) => { let tag = if local.is_param(db) { HighlightTag::Symbol(SymbolKind::ValueParam) diff --git a/crates/ide/src/syntax_highlighting/tags.rs b/crates/ide/src/syntax_highlighting/tags.rs index 2a6cc0cab..8b8867079 100644 --- a/crates/ide/src/syntax_highlighting/tags.rs +++ b/crates/ide/src/syntax_highlighting/tags.rs @@ -77,6 +77,7 @@ impl HighlightTag { SymbolKind::Function => "function", SymbolKind::TypeAlias => "type_alias", SymbolKind::TypeParam => "type_param", + SymbolKind::ConstParam => "const_param", SymbolKind::LifetimeParam => "lifetime", SymbolKind::Macro => "macro", SymbolKind::Local => "variable", diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html index 72ff9dd40..02270b077 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html @@ -118,6 +118,10 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd loop {} } +fn const_param<const FOO: usize>() -> usize { + FOO +} + use ops::Fn; fn baz<F: Fn() -> ()>(f: F) { f() diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs index e0df0d2b5..30b5b648e 100644 --- a/crates/ide/src/syntax_highlighting/tests.rs +++ b/crates/ide/src/syntax_highlighting/tests.rs @@ -91,6 +91,10 @@ fn never() -> ! { loop {} } +fn const_param() -> usize { + FOO +} + use ops::Fn; fn baz ()>(f: F) { f() diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index d33a6cb86..cc5078bf0 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -6,8 +6,8 @@ // FIXME: this badly needs rename/rewrite (matklad, 2020-02-06). use hir::{ - db::HirDatabase, Crate, Field, HasVisibility, Impl, Label, LifetimeParam, Local, MacroDef, - Module, ModuleDef, Name, PathResolution, Semantics, TypeParam, Visibility, + db::HirDatabase, ConstParam, Crate, Field, HasVisibility, Impl, Label, LifetimeParam, Local, + MacroDef, Module, ModuleDef, Name, PathResolution, Semantics, TypeParam, Visibility, }; use syntax::{ ast::{self, AstNode}, @@ -26,6 +26,7 @@ pub enum Definition { Local(Local), TypeParam(TypeParam), LifetimeParam(LifetimeParam), + ConstParam(ConstParam), Label(Label), } @@ -39,6 +40,7 @@ impl Definition { Definition::Local(it) => Some(it.module(db)), Definition::TypeParam(it) => Some(it.module(db)), Definition::LifetimeParam(it) => Some(it.module(db)), + Definition::ConstParam(it) => Some(it.module(db)), Definition::Label(it) => Some(it.module(db)), } } @@ -52,6 +54,7 @@ impl Definition { Definition::Local(_) => None, Definition::TypeParam(_) => None, Definition::LifetimeParam(_) => None, + Definition::ConstParam(_) => None, Definition::Label(_) => None, } } @@ -79,6 +82,7 @@ impl Definition { Definition::Local(it) => it.name(db)?, Definition::TypeParam(it) => it.name(db), Definition::LifetimeParam(it) => it.name(db), + Definition::ConstParam(it) => it.name(db), Definition::Label(it) => it.name(db), }; Some(name) @@ -233,6 +237,10 @@ impl NameClass { let def = sema.to_def(&it)?; Some(NameClass::Definition(Definition::TypeParam(def))) }, + ast::ConstParam(it) => { + let def = sema.to_def(&it)?; + Some(NameClass::Definition(Definition::ConstParam(def))) + }, _ => None, } } @@ -417,6 +425,7 @@ impl From for Definition { PathResolution::TypeParam(par) => Definition::TypeParam(par), PathResolution::Macro(def) => Definition::Macro(def), PathResolution::SelfType(impl_def) => Definition::SelfType(impl_def), + PathResolution::ConstParam(par) => Definition::ConstParam(par), } } } diff --git a/crates/rust-analyzer/src/semantic_tokens.rs b/crates/rust-analyzer/src/semantic_tokens.rs index c2f6a655d..5c4366f16 100644 --- a/crates/rust-analyzer/src/semantic_tokens.rs +++ b/crates/rust-analyzer/src/semantic_tokens.rs @@ -44,6 +44,7 @@ define_semantic_token_types![ (ESCAPE_SEQUENCE, "escapeSequence"), (FORMAT_SPECIFIER, "formatSpecifier"), (GENERIC, "generic"), + (CONST_PARAMETER, "constParameter"), (LIFETIME, "lifetime"), (LABEL, "label"), (PUNCTUATION, "punctuation"), diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index 1a38e79f0..999b18351 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs @@ -42,6 +42,7 @@ pub(crate) fn symbol_kind(symbol_kind: SymbolKind) -> lsp_types::SymbolKind { SymbolKind::Field => lsp_types::SymbolKind::Field, SymbolKind::Static => lsp_types::SymbolKind::Constant, SymbolKind::Const => lsp_types::SymbolKind::Constant, + SymbolKind::ConstParam => lsp_types::SymbolKind::Constant, SymbolKind::Impl => lsp_types::SymbolKind::Object, SymbolKind::Local | SymbolKind::SelfParam @@ -378,6 +379,7 @@ fn semantic_token_type_and_modifiers( SymbolKind::Impl => lsp_types::SemanticTokenType::TYPE, SymbolKind::Field => lsp_types::SemanticTokenType::PROPERTY, SymbolKind::TypeParam => lsp_types::SemanticTokenType::TYPE_PARAMETER, + SymbolKind::ConstParam => semantic_tokens::CONST_PARAMETER, SymbolKind::LifetimeParam => semantic_tokens::LIFETIME, SymbolKind::Label => semantic_tokens::LABEL, SymbolKind::ValueParam => lsp_types::SemanticTokenType::PARAMETER, -- cgit v1.2.3