about summary refs log tree commit diff
path: root/compiler/rustc_expand/src/placeholders.rs
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2021-10-17 19:32:34 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2021-11-28 15:48:55 +0800
commit141c6cc78ece04fb8330b2c28a42c025500d2d0e (patch)
treee018a0cf0be39dee3946397bef2ea965210a72f8 /compiler/rustc_expand/src/placeholders.rs
parent4919988fe1765e51232558647f2260fff3544658 (diff)
downloadrust-141c6cc78ece04fb8330b2c28a42c025500d2d0e.tar.gz
rust-141c6cc78ece04fb8330b2c28a42c025500d2d0e.zip
expand: Turn `ast::Crate` into a first class expansion target
And stop creating a fake `mod` item for the crate root when expanding a crate.
Diffstat (limited to 'compiler/rustc_expand/src/placeholders.rs')
-rw-r--r--compiler/rustc_expand/src/placeholders.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/compiler/rustc_expand/src/placeholders.rs b/compiler/rustc_expand/src/placeholders.rs
index 12b6bc7bbe7..25b3a5820e6 100644
--- a/compiler/rustc_expand/src/placeholders.rs
+++ b/compiler/rustc_expand/src/placeholders.rs
@@ -46,6 +46,12 @@ pub fn placeholder(
         || P(ast::Pat { id, kind: ast::PatKind::MacCall(mac_placeholder()), span, tokens: None });
 
     match kind {
+        AstFragmentKind::Crate => AstFragment::Crate(ast::Crate {
+            attrs: Default::default(),
+            items: Default::default(),
+            span,
+            is_placeholder: Some(id),
+        }),
         AstFragmentKind::Expr => AstFragment::Expr(expr_placeholder()),
         AstFragmentKind::OptExpr => AstFragment::OptExpr(Some(expr_placeholder())),
         AstFragmentKind::Items => AstFragment::Items(smallvec![P(ast::Item {
@@ -354,4 +360,12 @@ impl MutVisitor for PlaceholderExpander {
             _ => noop_visit_ty(ty, self),
         }
     }
+
+    fn visit_crate(&mut self, krate: &mut ast::Crate) {
+        if let Some(id) = krate.is_placeholder {
+            *krate = self.remove(id).make_crate();
+        } else {
+            noop_visit_crate(krate, self)
+        }
+    }
 }