diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-09-09 17:42:23 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-09 17:42:23 +0200 |
| commit | 457a23fabe4caecb5b18c0d6a801f1393a4dac80 (patch) | |
| tree | 33e29f45bf31895d123021669313521067b60822 /src/librustc | |
| parent | 824383d4ab66abd32abc6e19b68d78ecfddcb7d4 (diff) | |
| parent | 63a5f399aef46f94a24e0d0a3b03eb7f66a33800 (diff) | |
| download | rust-457a23fabe4caecb5b18c0d6a801f1393a4dac80.tar.gz rust-457a23fabe4caecb5b18c0d6a801f1393a4dac80.zip | |
Rollup merge of #63468 - c410-f3r:attrs, r=petrochenkov
Resolve attributes in several places Resolve attributes for Arm, Field, FieldPat, GenericParam, Param, StructField and Variant. This PR is based on @petrochenkov work located at https://github.com/petrochenkov/rust/commit/83fdb8d598c1a871d40b21faed64ee698b74f814.
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/hir/map/def_collector.rs | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/librustc/hir/map/def_collector.rs b/src/librustc/hir/map/def_collector.rs index 17bcb1d0859..bffb4df836e 100644 --- a/src/librustc/hir/map/def_collector.rs +++ b/src/librustc/hir/map/def_collector.rs @@ -155,6 +155,9 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> { } fn visit_variant(&mut self, v: &'a Variant) { + if v.is_placeholder { + return self.visit_macro_invoc(v.id); + } let def = self.create_def(v.id, DefPathData::TypeNs(v.ident.as_interned_str()), v.span); @@ -168,16 +171,24 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> { fn visit_variant_data(&mut self, data: &'a VariantData) { for (index, field) in data.fields().iter().enumerate() { + if field.is_placeholder { + self.visit_macro_invoc(field.id); + continue; + } let name = field.ident.map(|ident| ident.name) .unwrap_or_else(|| sym::integer(index)); let def = self.create_def(field.id, DefPathData::ValueNs(name.as_interned_str()), field.span); - self.with_parent(def, |this| this.visit_struct_field(field)); + self.with_parent(def, |this| visit::walk_struct_field(this, field)); } } fn visit_generic_param(&mut self, param: &'a GenericParam) { + if param.is_placeholder { + self.visit_macro_invoc(param.id); + return; + } let name = param.ident.as_interned_str(); let def_path_data = match param.kind { GenericParamKind::Lifetime { .. } => DefPathData::LifetimeNs(name), @@ -294,4 +305,49 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> { } } } + + fn visit_arm(&mut self, arm: &'a Arm) { + if arm.is_placeholder { + self.visit_macro_invoc(arm.id) + } else { + visit::walk_arm(self, arm) + } + } + + fn visit_field(&mut self, f: &'a Field) { + if f.is_placeholder { + self.visit_macro_invoc(f.id) + } else { + visit::walk_field(self, f) + } + } + + fn visit_field_pattern(&mut self, fp: &'a FieldPat) { + if fp.is_placeholder { + self.visit_macro_invoc(fp.id) + } else { + visit::walk_field_pattern(self, fp) + } + } + + fn visit_param(&mut self, p: &'a Param) { + if p.is_placeholder { + self.visit_macro_invoc(p.id) + } else { + visit::walk_param(self, p) + } + } + + fn visit_struct_field(&mut self, sf: &'a StructField) { + if sf.is_placeholder { + self.visit_macro_invoc(sf.id) + } else { + let name = sf.ident.map(|ident| ident.name) + .unwrap_or_else(|| panic!("don't know the field number in this context")); + let def = self.create_def(sf.id, + DefPathData::ValueNs(name.as_interned_str()), + sf.span); + self.with_parent(def, |this| visit::walk_struct_field(this, sf)); + } + } } |
