aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock4
-rw-r--r--crates/hir_def/src/item_tree.rs10
-rw-r--r--crates/hir_def/src/path.rs2
-rw-r--r--crates/hir_def/src/type_ref.rs2
-rw-r--r--crates/ide/src/references.rs20
-rw-r--r--crates/parser/src/syntax_kind/generated.rs1
-rw-r--r--crates/syntax/src/ast/generated/nodes.rs33
-rw-r--r--xtask/src/ast_src.rs1
8 files changed, 59 insertions, 14 deletions
diff --git a/Cargo.lock b/Cargo.lock
index ee015eaa3..aac473191 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1839,9 +1839,9 @@ checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
1839 1839
1840[[package]] 1840[[package]]
1841name = "ungrammar" 1841name = "ungrammar"
1842version = "1.9.0" 1842version = "1.9.2"
1843source = "registry+https://github.com/rust-lang/crates.io-index" 1843source = "registry+https://github.com/rust-lang/crates.io-index"
1844checksum = "b137a875a3b942539dd04bd37d193649f5d67e11407186f5b9d63ae0332b1a93" 1844checksum = "58a02e2041a872d56354e843e8e86e6b946fc8e7dc32982fcdc335e29eb4cc8b"
1845 1845
1846[[package]] 1846[[package]]
1847name = "unicase" 1847name = "unicase"
diff --git a/crates/hir_def/src/item_tree.rs b/crates/hir_def/src/item_tree.rs
index 9a433b61c..ff62928df 100644
--- a/crates/hir_def/src/item_tree.rs
+++ b/crates/hir_def/src/item_tree.rs
@@ -145,7 +145,6 @@ impl ItemTree {
145 macro_calls, 145 macro_calls,
146 macro_rules, 146 macro_rules,
147 macro_defs, 147 macro_defs,
148 exprs,
149 vis, 148 vis,
150 generics, 149 generics,
151 } = &mut **data; 150 } = &mut **data;
@@ -167,7 +166,6 @@ impl ItemTree {
167 macro_calls.shrink_to_fit(); 166 macro_calls.shrink_to_fit();
168 macro_rules.shrink_to_fit(); 167 macro_rules.shrink_to_fit();
169 macro_defs.shrink_to_fit(); 168 macro_defs.shrink_to_fit();
170 exprs.shrink_to_fit();
171 169
172 vis.arena.shrink_to_fit(); 170 vis.arena.shrink_to_fit();
173 generics.arena.shrink_to_fit(); 171 generics.arena.shrink_to_fit();
@@ -296,7 +294,6 @@ struct ItemTreeData {
296 macro_calls: Arena<MacroCall>, 294 macro_calls: Arena<MacroCall>,
297 macro_rules: Arena<MacroRules>, 295 macro_rules: Arena<MacroRules>,
298 macro_defs: Arena<MacroDef>, 296 macro_defs: Arena<MacroDef>,
299 exprs: Arena<Expr>,
300 297
301 vis: ItemVisibilities, 298 vis: ItemVisibilities,
302 generics: GenericParamsStorage, 299 generics: GenericParamsStorage,
@@ -461,7 +458,7 @@ macro_rules! impl_index {
461 }; 458 };
462} 459}
463 460
464impl_index!(fields: Field, variants: Variant, exprs: Expr); 461impl_index!(fields: Field, variants: Variant);
465 462
466impl Index<RawVisibilityId> for ItemTree { 463impl Index<RawVisibilityId> for ItemTree {
467 type Output = RawVisibility; 464 type Output = RawVisibility;
@@ -664,11 +661,6 @@ pub struct MacroDef {
664 pub ast_id: FileAstId<ast::MacroDef>, 661 pub ast_id: FileAstId<ast::MacroDef>,
665} 662}
666 663
667// NB: There's no `FileAstId` for `Expr`. The only case where this would be useful is for array
668// lengths, but we don't do much with them yet.
669#[derive(Debug, Clone, Eq, PartialEq)]
670pub struct Expr;
671
672macro_rules! impl_froms { 664macro_rules! impl_froms {
673 ($e:ident { $($v:ident ($t:ty)),* $(,)? }) => { 665 ($e:ident { $($v:ident ($t:ty)),* $(,)? }) => {
674 $( 666 $(
diff --git a/crates/hir_def/src/path.rs b/crates/hir_def/src/path.rs
index 3dd7c3cbb..e34cd7f2f 100644
--- a/crates/hir_def/src/path.rs
+++ b/crates/hir_def/src/path.rs
@@ -87,7 +87,7 @@ impl ModPath {
87 87
88 /// If this path is a single identifier, like `foo`, return its name. 88 /// If this path is a single identifier, like `foo`, return its name.
89 pub fn as_ident(&self) -> Option<&Name> { 89 pub fn as_ident(&self) -> Option<&Name> {
90 if self.kind != PathKind::Plain || self.segments.len() > 1 { 90 if !self.is_ident() {
91 return None; 91 return None;
92 } 92 }
93 self.segments.first() 93 self.segments.first()
diff --git a/crates/hir_def/src/type_ref.rs b/crates/hir_def/src/type_ref.rs
index ae93d0d10..049b2e462 100644
--- a/crates/hir_def/src/type_ref.rs
+++ b/crates/hir_def/src/type_ref.rs
@@ -159,6 +159,8 @@ impl TypeRef {
159 ast::Type::DynTraitType(inner) => { 159 ast::Type::DynTraitType(inner) => {
160 TypeRef::DynTrait(type_bounds_from_ast(ctx, inner.type_bound_list())) 160 TypeRef::DynTrait(type_bounds_from_ast(ctx, inner.type_bound_list()))
161 } 161 }
162 // FIXME: Macros in type position are not yet supported.
163 ast::Type::MacroType(_) => TypeRef::Error,
162 } 164 }
163 } 165 }
164 166
diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs
index 51a2f4327..df9c31aef 100644
--- a/crates/ide/src/references.rs
+++ b/crates/ide/src/references.rs
@@ -930,6 +930,26 @@ impl Foo {
930 ); 930 );
931 } 931 }
932 932
933 #[test]
934 fn test_find_self_refs_decl() {
935 check(
936 r#"
937struct Foo { bar: i32 }
938
939impl Foo {
940 fn foo(self$0) {
941 self;
942 }
943}
944"#,
945 expect![[r#"
946 self SelfParam FileId(0) 47..51 47..51 SelfParam
947
948 FileId(0) 63..67 Other Read
949 "#]],
950 );
951 }
952
933 fn check(ra_fixture: &str, expect: Expect) { 953 fn check(ra_fixture: &str, expect: Expect) {
934 check_with_scope(ra_fixture, None, expect) 954 check_with_scope(ra_fixture, None, expect)
935 } 955 }
diff --git a/crates/parser/src/syntax_kind/generated.rs b/crates/parser/src/syntax_kind/generated.rs
index 7d53cc4cd..bcefd183a 100644
--- a/crates/parser/src/syntax_kind/generated.rs
+++ b/crates/parser/src/syntax_kind/generated.rs
@@ -143,6 +143,7 @@ pub enum SyntaxKind {
143 MACRO_DEF, 143 MACRO_DEF,
144 PAREN_TYPE, 144 PAREN_TYPE,
145 TUPLE_TYPE, 145 TUPLE_TYPE,
146 MACRO_TYPE,
146 NEVER_TYPE, 147 NEVER_TYPE,
147 PATH_TYPE, 148 PATH_TYPE,
148 PTR_TYPE, 149 PTR_TYPE,
diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs
index 6407d7c85..5baa54a3f 100644
--- a/crates/syntax/src/ast/generated/nodes.rs
+++ b/crates/syntax/src/ast/generated/nodes.rs
@@ -1072,6 +1072,13 @@ impl InferType {
1072 pub fn underscore_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![_]) } 1072 pub fn underscore_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![_]) }
1073} 1073}
1074#[derive(Debug, Clone, PartialEq, Eq, Hash)] 1074#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1075pub struct MacroType {
1076 pub(crate) syntax: SyntaxNode,
1077}
1078impl MacroType {
1079 pub fn macro_call(&self) -> Option<MacroCall> { support::child(&self.syntax) }
1080}
1081#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1075pub struct NeverType { 1082pub struct NeverType {
1076 pub(crate) syntax: SyntaxNode, 1083 pub(crate) syntax: SyntaxNode,
1077} 1084}
@@ -1300,6 +1307,7 @@ pub enum Type {
1300 ForType(ForType), 1307 ForType(ForType),
1301 ImplTraitType(ImplTraitType), 1308 ImplTraitType(ImplTraitType),
1302 InferType(InferType), 1309 InferType(InferType),
1310 MacroType(MacroType),
1303 NeverType(NeverType), 1311 NeverType(NeverType),
1304 ParenType(ParenType), 1312 ParenType(ParenType),
1305 PathType(PathType), 1313 PathType(PathType),
@@ -2558,6 +2566,17 @@ impl AstNode for InferType {
2558 } 2566 }
2559 fn syntax(&self) -> &SyntaxNode { &self.syntax } 2567 fn syntax(&self) -> &SyntaxNode { &self.syntax }
2560} 2568}
2569impl AstNode for MacroType {
2570 fn can_cast(kind: SyntaxKind) -> bool { kind == MACRO_TYPE }
2571 fn cast(syntax: SyntaxNode) -> Option<Self> {
2572 if Self::can_cast(syntax.kind()) {
2573 Some(Self { syntax })
2574 } else {
2575 None
2576 }
2577 }
2578 fn syntax(&self) -> &SyntaxNode { &self.syntax }
2579}
2561impl AstNode for NeverType { 2580impl AstNode for NeverType {
2562 fn can_cast(kind: SyntaxKind) -> bool { kind == NEVER_TYPE } 2581 fn can_cast(kind: SyntaxKind) -> bool { kind == NEVER_TYPE }
2563 fn cast(syntax: SyntaxNode) -> Option<Self> { 2582 fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -2889,6 +2908,9 @@ impl From<ImplTraitType> for Type {
2889impl From<InferType> for Type { 2908impl From<InferType> for Type {
2890 fn from(node: InferType) -> Type { Type::InferType(node) } 2909 fn from(node: InferType) -> Type { Type::InferType(node) }
2891} 2910}
2911impl From<MacroType> for Type {
2912 fn from(node: MacroType) -> Type { Type::MacroType(node) }
2913}
2892impl From<NeverType> for Type { 2914impl From<NeverType> for Type {
2893 fn from(node: NeverType) -> Type { Type::NeverType(node) } 2915 fn from(node: NeverType) -> Type { Type::NeverType(node) }
2894} 2916}
@@ -2914,8 +2936,8 @@ impl AstNode for Type {
2914 fn can_cast(kind: SyntaxKind) -> bool { 2936 fn can_cast(kind: SyntaxKind) -> bool {
2915 match kind { 2937 match kind {
2916 ARRAY_TYPE | DYN_TRAIT_TYPE | FN_PTR_TYPE | FOR_TYPE | IMPL_TRAIT_TYPE | INFER_TYPE 2938 ARRAY_TYPE | DYN_TRAIT_TYPE | FN_PTR_TYPE | FOR_TYPE | IMPL_TRAIT_TYPE | INFER_TYPE
2917 | NEVER_TYPE | PAREN_TYPE | PATH_TYPE | PTR_TYPE | REF_TYPE | SLICE_TYPE 2939 | MACRO_TYPE | NEVER_TYPE | PAREN_TYPE | PATH_TYPE | PTR_TYPE | REF_TYPE
2918 | TUPLE_TYPE => true, 2940 | SLICE_TYPE | TUPLE_TYPE => true,
2919 _ => false, 2941 _ => false,
2920 } 2942 }
2921 } 2943 }
@@ -2927,6 +2949,7 @@ impl AstNode for Type {
2927 FOR_TYPE => Type::ForType(ForType { syntax }), 2949 FOR_TYPE => Type::ForType(ForType { syntax }),
2928 IMPL_TRAIT_TYPE => Type::ImplTraitType(ImplTraitType { syntax }), 2950 IMPL_TRAIT_TYPE => Type::ImplTraitType(ImplTraitType { syntax }),
2929 INFER_TYPE => Type::InferType(InferType { syntax }), 2951 INFER_TYPE => Type::InferType(InferType { syntax }),
2952 MACRO_TYPE => Type::MacroType(MacroType { syntax }),
2930 NEVER_TYPE => Type::NeverType(NeverType { syntax }), 2953 NEVER_TYPE => Type::NeverType(NeverType { syntax }),
2931 PAREN_TYPE => Type::ParenType(ParenType { syntax }), 2954 PAREN_TYPE => Type::ParenType(ParenType { syntax }),
2932 PATH_TYPE => Type::PathType(PathType { syntax }), 2955 PATH_TYPE => Type::PathType(PathType { syntax }),
@@ -2946,6 +2969,7 @@ impl AstNode for Type {
2946 Type::ForType(it) => &it.syntax, 2969 Type::ForType(it) => &it.syntax,
2947 Type::ImplTraitType(it) => &it.syntax, 2970 Type::ImplTraitType(it) => &it.syntax,
2948 Type::InferType(it) => &it.syntax, 2971 Type::InferType(it) => &it.syntax,
2972 Type::MacroType(it) => &it.syntax,
2949 Type::NeverType(it) => &it.syntax, 2973 Type::NeverType(it) => &it.syntax,
2950 Type::ParenType(it) => &it.syntax, 2974 Type::ParenType(it) => &it.syntax,
2951 Type::PathType(it) => &it.syntax, 2975 Type::PathType(it) => &it.syntax,
@@ -4082,6 +4106,11 @@ impl std::fmt::Display for InferType {
4082 std::fmt::Display::fmt(self.syntax(), f) 4106 std::fmt::Display::fmt(self.syntax(), f)
4083 } 4107 }
4084} 4108}
4109impl std::fmt::Display for MacroType {
4110 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4111 std::fmt::Display::fmt(self.syntax(), f)
4112 }
4113}
4085impl std::fmt::Display for NeverType { 4114impl std::fmt::Display for NeverType {
4086 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 4115 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4087 std::fmt::Display::fmt(self.syntax(), f) 4116 std::fmt::Display::fmt(self.syntax(), f)
diff --git a/xtask/src/ast_src.rs b/xtask/src/ast_src.rs
index 046d68f52..0fd1d13e6 100644
--- a/xtask/src/ast_src.rs
+++ b/xtask/src/ast_src.rs
@@ -104,6 +104,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
104 "MACRO_DEF", 104 "MACRO_DEF",
105 "PAREN_TYPE", 105 "PAREN_TYPE",
106 "TUPLE_TYPE", 106 "TUPLE_TYPE",
107 "MACRO_TYPE",
107 "NEVER_TYPE", 108 "NEVER_TYPE",
108 "PATH_TYPE", 109 "PATH_TYPE",
109 "PTR_TYPE", 110 "PTR_TYPE",