about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock59
-rw-r--r--src/librustc/Cargo.toml1
-rw-r--r--src/librustc/hir/map/definitions.rs2
-rw-r--r--src/librustc/ich/impls_hir.rs2
-rw-r--r--src/librustc/middle/codegen_fn_attrs.rs2
-rw-r--r--src/librustc/middle/stability.rs17
-rw-r--r--src/librustc/mir/mono.rs2
-rw-r--r--src/librustc/traits/on_unimplemented.rs2
-rw-r--r--src/librustc/ty/context.rs29
-rw-r--r--src/librustc/ty/layout.rs2
-rw-r--r--src/librustc/ty/mod.rs7
-rw-r--r--src/librustc/ty/print/pretty.rs2
-rw-r--r--src/librustc/ty/query/job.rs4
-rw-r--r--src/librustc/ty/query/mod.rs2
-rw-r--r--src/librustc/ty/util.rs2
-rw-r--r--src/librustc_ast_lowering/Cargo.toml1
-rw-r--r--src/librustc_ast_lowering/item.rs2
-rw-r--r--src/librustc_ast_lowering/lib.rs10
-rw-r--r--src/librustc_ast_passes/Cargo.toml2
-rw-r--r--src/librustc_ast_passes/ast_validation.rs4
-rw-r--r--src/librustc_ast_passes/feature_gate.rs2
-rw-r--r--src/librustc_ast_passes/lib.rs3
-rw-r--r--src/librustc_ast_passes/node_count.rs (renamed from src/libsyntax/util/node_count.rs)4
-rw-r--r--src/librustc_ast_pretty/Cargo.toml16
-rw-r--r--src/librustc_ast_pretty/helpers.rs (renamed from src/libsyntax/print/helpers.rs)2
-rw-r--r--src/librustc_ast_pretty/lib.rs7
-rw-r--r--src/librustc_ast_pretty/pp.rs (renamed from src/libsyntax/print/pp.rs)0
-rw-r--r--src/librustc_ast_pretty/pprust.rs (renamed from src/libsyntax/print/pprust.rs)48
-rw-r--r--src/librustc_ast_pretty/pprust/tests.rs (renamed from src/libsyntax/print/pprust/tests.rs)4
-rw-r--r--src/librustc_attr/Cargo.toml22
-rw-r--r--src/librustc_attr/builtin.rs (renamed from src/libsyntax/attr/builtin.rs)26
-rw-r--r--src/librustc_attr/lib.rs16
-rw-r--r--src/librustc_builtin_macros/Cargo.toml2
-rw-r--r--src/librustc_builtin_macros/assert.rs2
-rw-r--r--src/librustc_builtin_macros/cfg.rs2
-rw-r--r--src/librustc_builtin_macros/cmdline_attrs.rs2
-rw-r--r--src/librustc_builtin_macros/deriving/generic/mod.rs4
-rw-r--r--src/librustc_builtin_macros/log_syntax.rs4
-rw-r--r--src/librustc_builtin_macros/proc_macro_harness.rs4
-rw-r--r--src/librustc_builtin_macros/source_util.rs2
-rw-r--r--src/librustc_builtin_macros/standard_library_imports.rs2
-rw-r--r--src/librustc_builtin_macros/test.rs2
-rw-r--r--src/librustc_builtin_macros/test_harness.rs2
-rw-r--r--src/librustc_codegen_llvm/Cargo.toml1
-rw-r--r--src/librustc_codegen_llvm/attributes.rs2
-rw-r--r--src/librustc_codegen_ssa/Cargo.toml1
-rw-r--r--src/librustc_codegen_ssa/back/link.rs2
-rw-r--r--src/librustc_codegen_ssa/base.rs2
-rw-r--r--src/librustc_driver/Cargo.toml1
-rw-r--r--src/librustc_driver/pretty.rs21
-rw-r--r--src/librustc_expand/Cargo.toml2
-rw-r--r--src/librustc_expand/base.rs6
-rw-r--r--src/librustc_expand/expand.rs8
-rw-r--r--src/librustc_expand/mbe/macro_parser.rs4
-rw-r--r--src/librustc_expand/mbe/macro_rules.rs6
-rw-r--r--src/librustc_expand/mbe/quoted.rs4
-rw-r--r--src/librustc_expand/mut_visit/tests.rs2
-rw-r--r--src/librustc_expand/parse/lexer/tests.rs2
-rw-r--r--src/librustc_expand/parse/tests.rs4
-rw-r--r--src/librustc_expand/proc_macro_server.rs4
-rw-r--r--src/librustc_expand/tests.rs2
-rw-r--r--src/librustc_hir/Cargo.toml2
-rw-r--r--src/librustc_hir/hir.rs9
-rw-r--r--src/librustc_hir/print.rs13
-rw-r--r--src/librustc_interface/Cargo.toml1
-rw-r--r--src/librustc_interface/interface.rs6
-rw-r--r--src/librustc_interface/passes.rs3
-rw-r--r--src/librustc_interface/util.rs7
-rw-r--r--src/librustc_lint/Cargo.toml2
-rw-r--r--src/librustc_lint/builtin.rs2
-rw-r--r--src/librustc_lint/levels.rs13
-rw-r--r--src/librustc_lint/nonstandard_style.rs2
-rw-r--r--src/librustc_lint/types.rs3
-rw-r--r--src/librustc_lint/unused.rs2
-rw-r--r--src/librustc_metadata/Cargo.toml2
-rw-r--r--src/librustc_metadata/native_libs.rs2
-rw-r--r--src/librustc_metadata/rmeta/decoder.rs2
-rw-r--r--src/librustc_metadata/rmeta/encoder.rs2
-rw-r--r--src/librustc_metadata/rmeta/mod.rs3
-rw-r--r--src/librustc_mir/Cargo.toml2
-rw-r--r--src/librustc_mir/const_eval/fn_queries.rs2
-rw-r--r--src/librustc_mir/dataflow/mod.rs2
-rw-r--r--src/librustc_mir/transform/inline.rs2
-rw-r--r--src/librustc_mir/transform/qualify_min_const_fn.rs3
-rw-r--r--src/librustc_mir_build/Cargo.toml1
-rw-r--r--src/librustc_mir_build/build/matches/simplify.rs2
-rw-r--r--src/librustc_mir_build/build/mod.rs2
-rw-r--r--src/librustc_mir_build/hair/pattern/_match.rs2
-rw-r--r--src/librustc_mir_build/hair/pattern/mod.rs2
-rw-r--r--src/librustc_parse/Cargo.toml2
-rw-r--r--src/librustc_parse/config.rs4
-rw-r--r--src/librustc_parse/lexer/mod.rs2
-rw-r--r--src/librustc_parse/lexer/tokentrees.rs2
-rw-r--r--src/librustc_parse/lib.rs11
-rw-r--r--src/librustc_parse/parser/attr.rs2
-rw-r--r--src/librustc_parse/parser/diagnostics.rs2
-rw-r--r--src/librustc_parse/parser/expr.rs2
-rw-r--r--src/librustc_parse/parser/item.rs2
-rw-r--r--src/librustc_parse/parser/mod.rs4
-rw-r--r--src/librustc_parse/parser/pat.rs2
-rw-r--r--src/librustc_passes/Cargo.toml1
-rw-r--r--src/librustc_passes/stability.rs2
-rw-r--r--src/librustc_privacy/Cargo.toml1
-rw-r--r--src/librustc_privacy/lib.rs2
-rw-r--r--src/librustc_resolve/Cargo.toml2
-rw-r--r--src/librustc_resolve/build_reduced_graph.rs2
-rw-r--r--src/librustc_resolve/check_unused.rs2
-rw-r--r--src/librustc_resolve/diagnostics.rs2
-rw-r--r--src/librustc_resolve/lib.rs4
-rw-r--r--src/librustc_resolve/macros.rs4
-rw-r--r--src/librustc_save_analysis/Cargo.toml1
-rw-r--r--src/librustc_save_analysis/dump_visitor.rs9
-rw-r--r--src/librustc_save_analysis/lib.rs14
-rw-r--r--src/librustc_save_analysis/sig.rs2
-rw-r--r--src/librustc_session/Cargo.toml1
-rw-r--r--src/librustc_session/lib.rs1
-rw-r--r--src/librustc_session/lint.rs2
-rw-r--r--src/librustc_session/parse.rs3
-rw-r--r--src/librustc_typeck/Cargo.toml1
-rw-r--r--src/librustc_typeck/check/mod.rs2
-rw-r--r--src/librustc_typeck/collect.rs2
-rw-r--r--src/librustdoc/clean/cfg.rs2
-rw-r--r--src/librustdoc/clean/mod.rs2
-rw-r--r--src/librustdoc/core.rs2
-rw-r--r--src/librustdoc/html/highlight.rs2
-rw-r--r--src/librustdoc/html/render.rs2
-rw-r--r--src/librustdoc/lib.rs2
-rw-r--r--src/librustdoc/passes/check_code_block_syntax.rs2
-rw-r--r--src/librustdoc/test.rs4
-rw-r--r--src/libsyntax/Cargo.toml3
-rw-r--r--src/libsyntax/ast.rs16
-rw-r--r--src/libsyntax/attr/mod.rs100
-rw-r--r--src/libsyntax/lib.rs44
-rw-r--r--src/libsyntax/node_id.rs (renamed from src/librustc_session/node_id.rs)8
-rw-r--r--src/libsyntax/util/comments.rs9
-rw-r--r--src/libsyntax/util/parser.rs2
-rw-r--r--src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs3
-rw-r--r--src/test/ui-fulldeps/mod_dir_path_canonicalized.rs3
-rw-r--r--src/test/ui-fulldeps/pprust-expr-roundtrip.rs6
139 files changed, 451 insertions, 358 deletions
diff --git a/Cargo.lock b/Cargo.lock
index c081f2fbf20..ec976b69016 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3093,6 +3093,7 @@ dependencies = [
  "rustc-rayon",
  "rustc-rayon-core",
  "rustc_apfloat",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_feature",
@@ -3358,6 +3359,7 @@ version = "0.0.0"
 dependencies = [
  "log",
  "rustc",
+ "rustc_ast_pretty",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_hir",
@@ -3374,6 +3376,8 @@ name = "rustc_ast_passes"
 version = "0.0.0"
 dependencies = [
  "log",
+ "rustc_ast_pretty",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_feature",
@@ -3384,11 +3388,39 @@ dependencies = [
 ]
 
 [[package]]
+name = "rustc_ast_pretty"
+version = "0.0.0"
+dependencies = [
+ "log",
+ "rustc_data_structures",
+ "rustc_span",
+ "syntax",
+]
+
+[[package]]
+name = "rustc_attr"
+version = "0.0.0"
+dependencies = [
+ "rustc_ast_pretty",
+ "rustc_data_structures",
+ "rustc_errors",
+ "rustc_feature",
+ "rustc_macros",
+ "rustc_session",
+ "rustc_span",
+ "serialize",
+ "smallvec 1.0.0",
+ "syntax",
+]
+
+[[package]]
 name = "rustc_builtin_macros"
 version = "0.0.0"
 dependencies = [
  "fmt_macros",
  "log",
+ "rustc_ast_pretty",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_expand",
@@ -3411,6 +3443,7 @@ dependencies = [
  "log",
  "rustc",
  "rustc-demangle",
+ "rustc_attr",
  "rustc_codegen_ssa",
  "rustc_codegen_utils",
  "rustc_data_structures",
@@ -3442,6 +3475,7 @@ dependencies = [
  "num_cpus",
  "rustc",
  "rustc_apfloat",
+ "rustc_attr",
  "rustc_codegen_utils",
  "rustc_data_structures",
  "rustc_errors",
@@ -3506,6 +3540,7 @@ dependencies = [
  "lazy_static 1.4.0",
  "log",
  "rustc",
+ "rustc_ast_pretty",
  "rustc_codegen_utils",
  "rustc_data_structures",
  "rustc_error_codes",
@@ -3552,6 +3587,8 @@ version = "0.0.0"
 dependencies = [
  "log",
  "rustc_ast_passes",
+ "rustc_ast_pretty",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_feature",
@@ -3581,11 +3618,11 @@ version = "0.0.0"
 name = "rustc_hir"
 version = "0.0.0"
 dependencies = [
+ "rustc_ast_pretty",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_index",
  "rustc_macros",
- "rustc_session",
  "rustc_span",
  "rustc_target",
  "serialize",
@@ -3628,6 +3665,7 @@ dependencies = [
  "rustc-rayon",
  "rustc_ast_lowering",
  "rustc_ast_passes",
+ "rustc_attr",
  "rustc_builtin_macros",
  "rustc_codegen_llvm",
  "rustc_codegen_ssa",
@@ -3672,6 +3710,8 @@ version = "0.0.0"
 dependencies = [
  "log",
  "rustc",
+ "rustc_ast_pretty",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_feature",
@@ -3712,6 +3752,8 @@ dependencies = [
  "log",
  "memmap",
  "rustc",
+ "rustc_ast_pretty",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_expand",
@@ -3739,6 +3781,8 @@ dependencies = [
  "polonius-engine",
  "rustc",
  "rustc_apfloat",
+ "rustc_ast_pretty",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_hir",
@@ -3761,6 +3805,7 @@ dependencies = [
  "log",
  "rustc",
  "rustc_apfloat",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_hir",
@@ -3780,6 +3825,8 @@ version = "0.0.0"
 dependencies = [
  "bitflags",
  "log",
+ "rustc_ast_pretty",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_feature",
@@ -3797,6 +3844,7 @@ version = "0.0.0"
 dependencies = [
  "log",
  "rustc",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_feature",
@@ -3827,6 +3875,7 @@ version = "0.0.0"
 dependencies = [
  "log",
  "rustc",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_hir",
@@ -3844,6 +3893,8 @@ dependencies = [
  "log",
  "rustc",
  "rustc_ast_lowering",
+ "rustc_ast_pretty",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_expand",
@@ -3864,6 +3915,7 @@ dependencies = [
  "rls-data",
  "rls-span",
  "rustc",
+ "rustc_ast_pretty",
  "rustc_codegen_utils",
  "rustc_data_structures",
  "rustc_hir",
@@ -3887,6 +3939,7 @@ dependencies = [
  "rustc_span",
  "rustc_target",
  "serialize",
+ "syntax",
 ]
 
 [[package]]
@@ -3961,6 +4014,7 @@ dependencies = [
  "arena",
  "log",
  "rustc",
+ "rustc_attr",
  "rustc_data_structures",
  "rustc_errors",
  "rustc_hir",
@@ -4481,12 +4535,9 @@ version = "0.0.0"
 dependencies = [
  "log",
  "rustc_data_structures",
- "rustc_errors",
- "rustc_feature",
  "rustc_index",
  "rustc_lexer",
  "rustc_macros",
- "rustc_session",
  "rustc_span",
  "scoped-tls",
  "serialize",
diff --git a/src/librustc/Cargo.toml b/src/librustc/Cargo.toml
index b65635be54a..782c6879ac5 100644
--- a/src/librustc/Cargo.toml
+++ b/src/librustc/Cargo.toml
@@ -21,6 +21,7 @@ rustc-rayon = "0.3.0"
 rustc-rayon-core = "0.3.0"
 polonius-engine = "0.11.0"
 rustc_apfloat = { path = "../librustc_apfloat" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_feature = { path = "../librustc_feature" }
 rustc_hir = { path = "../librustc_hir" }
 rustc_target = { path = "../librustc_target" }
diff --git a/src/librustc/hir/map/definitions.rs b/src/librustc/hir/map/definitions.rs
index ac2d7a9a8dc..048c1f026be 100644
--- a/src/librustc/hir/map/definitions.rs
+++ b/src/librustc/hir/map/definitions.rs
@@ -10,12 +10,12 @@ use rustc_data_structures::stable_hasher::StableHasher;
 use rustc_hir as hir;
 use rustc_hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE};
 use rustc_index::vec::IndexVec;
-use rustc_session::node_id::NodeMap;
 use rustc_session::CrateDisambiguator;
 use rustc_span::hygiene::ExpnId;
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::Span;
 use syntax::ast;
+use syntax::node_id::NodeMap;
 
 use std::borrow::Borrow;
 use std::fmt::Write;
diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs
index 8961f7cd4bc..061b82ebb43 100644
--- a/src/librustc/ich/impls_hir.rs
+++ b/src/librustc/ich/impls_hir.rs
@@ -3,12 +3,12 @@
 
 use crate::hir::map::DefPathHash;
 use crate::ich::{Fingerprint, NodeIdHashingMode, StableHashingContext};
+use rustc_attr as attr;
 use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
 use rustc_hir as hir;
 use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX};
 use smallvec::SmallVec;
 use std::mem;
-use syntax::attr;
 
 impl<'ctx> rustc_hir::HashStableContext for StableHashingContext<'ctx> {
     #[inline]
diff --git a/src/librustc/middle/codegen_fn_attrs.rs b/src/librustc/middle/codegen_fn_attrs.rs
index 3b109f2fea6..9f8c2020861 100644
--- a/src/librustc/middle/codegen_fn_attrs.rs
+++ b/src/librustc/middle/codegen_fn_attrs.rs
@@ -1,6 +1,6 @@
 use crate::mir::mono::Linkage;
+use rustc_attr::{InlineAttr, OptimizeAttr};
 use rustc_span::symbol::Symbol;
-use syntax::attr::{InlineAttr, OptimizeAttr};
 
 #[derive(Clone, RustcEncodable, RustcDecodable, HashStable)]
 pub struct CodegenFnAttrs {
diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs
index 1176ffc79d2..7cbe77b9e82 100644
--- a/src/librustc/middle/stability.rs
+++ b/src/librustc/middle/stability.rs
@@ -5,6 +5,7 @@ pub use self::StabilityLevel::*;
 
 use crate::session::{DiagnosticMessageId, Session};
 use crate::ty::{self, TyCtxt};
+use rustc_attr::{self as attr, ConstStability, Deprecation, RustcDeprecation, Stability};
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_errors::{Applicability, DiagnosticBuilder};
 use rustc_feature::GateIssue;
@@ -12,12 +13,12 @@ use rustc_hir as hir;
 use rustc_hir::def::DefKind;
 use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX};
 use rustc_hir::{self, HirId};
-use rustc_session::lint::{self, BuiltinLintDiagnostics, Lint, LintBuffer};
+use rustc_session::lint::builtin::{DEPRECATED, DEPRECATED_IN_FUTURE, SOFT_UNSTABLE};
+use rustc_session::lint::{BuiltinLintDiagnostics, Lint, LintBuffer};
+use rustc_session::parse::feature_err_issue;
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::{MultiSpan, Span};
 use syntax::ast::CRATE_NODE_ID;
-use syntax::attr::{self, ConstStability, Deprecation, RustcDeprecation, Stability};
-use syntax::sess::feature_err_issue;
 
 use std::num::NonZeroU32;
 
@@ -97,7 +98,7 @@ pub fn report_unstable(
     issue: Option<NonZeroU32>,
     is_soft: bool,
     span: Span,
-    soft_handler: impl FnOnce(&'static lint::Lint, Span, &str),
+    soft_handler: impl FnOnce(&'static Lint, Span, &str),
 ) {
     let msg = match reason {
         Some(r) => format!("use of unstable library feature '{}': {}", feature, r),
@@ -119,7 +120,7 @@ pub fn report_unstable(
     let fresh = sess.one_time_diagnostics.borrow_mut().insert(error_id);
     if fresh {
         if is_soft {
-            soft_handler(lint::builtin::SOFT_UNSTABLE, span, &msg)
+            soft_handler(SOFT_UNSTABLE, span, &msg)
         } else {
             feature_err_issue(&sess.parse_sess, feature, span, GateIssue::Library(issue), &msg)
                 .emit();
@@ -175,19 +176,19 @@ fn deprecation_message_common(message: String, reason: Option<Symbol>) -> String
 
 pub fn deprecation_message(depr: &Deprecation, path: &str) -> (String, &'static Lint) {
     let message = format!("use of deprecated item '{}'", path);
-    (deprecation_message_common(message, depr.note), lint::builtin::DEPRECATED)
+    (deprecation_message_common(message, depr.note), DEPRECATED)
 }
 
 pub fn rustc_deprecation_message(depr: &RustcDeprecation, path: &str) -> (String, &'static Lint) {
     let (message, lint) = if deprecation_in_effect(&depr.since.as_str()) {
-        (format!("use of deprecated item '{}'", path), lint::builtin::DEPRECATED)
+        (format!("use of deprecated item '{}'", path), DEPRECATED)
     } else {
         (
             format!(
                 "use of item '{}' that will be deprecated in future version {}",
                 path, depr.since
             ),
-            lint::builtin::DEPRECATED_IN_FUTURE,
+            DEPRECATED_IN_FUTURE,
         )
     };
     (deprecation_message_common(message, Some(depr.reason)), lint)
diff --git a/src/librustc/mir/mono.rs b/src/librustc/mir/mono.rs
index d1973266463..6da7c09c7df 100644
--- a/src/librustc/mir/mono.rs
+++ b/src/librustc/mir/mono.rs
@@ -3,6 +3,7 @@ use crate::ich::{Fingerprint, NodeIdHashingMode, StableHashingContext};
 use crate::session::config::OptLevel;
 use crate::ty::print::obsolete::DefPathBasedNames;
 use crate::ty::{subst::InternalSubsts, Instance, InstanceDef, SymbolName, TyCtxt};
+use rustc_attr::InlineAttr;
 use rustc_data_structures::base_n;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
@@ -12,7 +13,6 @@ use rustc_span::source_map::Span;
 use rustc_span::symbol::Symbol;
 use std::fmt;
 use std::hash::Hash;
-use syntax::attr::InlineAttr;
 
 /// Describes how a monomorphization will be instantiated in object files.
 #[derive(PartialEq)]
diff --git a/src/librustc/traits/on_unimplemented.rs b/src/librustc/traits/on_unimplemented.rs
index 669ec5ccc9b..ca824d40e38 100644
--- a/src/librustc/traits/on_unimplemented.rs
+++ b/src/librustc/traits/on_unimplemented.rs
@@ -3,13 +3,13 @@ use fmt_macros::{Parser, Piece, Position};
 use crate::ty::{self, GenericParamDefKind, TyCtxt};
 use crate::util::common::ErrorReported;
 
+use rustc_attr as attr;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_errors::struct_span_err;
 use rustc_hir::def_id::DefId;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::Span;
 use syntax::ast::{MetaItem, NestedMetaItem};
-use syntax::attr;
 
 #[derive(Clone, Debug)]
 pub struct OnUnimplementedFormatString(Symbol);
diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs
index 355df86046f..f12032943f9 100644
--- a/src/librustc/ty/context.rs
+++ b/src/librustc/ty/context.rs
@@ -41,32 +41,34 @@ use crate::ty::{ExistentialPredicate, InferTy, ParamTy, PolyFnSig, Predicate, Pr
 use crate::ty::{InferConst, ParamConst};
 use crate::ty::{List, TyKind, TyS};
 use crate::util::common::ErrorReported;
-use rustc_data_structures::sync;
-use rustc_hir as hir;
-use rustc_hir::def::{DefKind, Res};
-use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, DefIndex, LOCAL_CRATE};
-use rustc_hir::{HirId, Node, TraitCandidate};
-use rustc_hir::{ItemKind, ItemLocalId, ItemLocalMap, ItemLocalSet};
-use rustc_session::config::CrateType;
-use rustc_session::config::{BorrowckMode, OutputFilenames};
-use rustc_session::Session;
-
+use rustc_attr as attr;
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_data_structures::profiling::SelfProfilerRef;
 use rustc_data_structures::sharded::{IntoPointer, ShardedHashMap};
 use rustc_data_structures::stable_hasher::{
     hash_stable_hashmap, HashStable, StableHasher, StableVec,
 };
-use rustc_data_structures::sync::{Lock, Lrc, WorkerLocal};
+use rustc_data_structures::sync::{self, Lock, Lrc, WorkerLocal};
 use rustc_errors::DiagnosticBuilder;
+use rustc_hir as hir;
+use rustc_hir::def::{DefKind, Res};
+use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, DefIndex, LOCAL_CRATE};
+use rustc_hir::{HirId, Node, TraitCandidate};
+use rustc_hir::{ItemKind, ItemLocalId, ItemLocalMap, ItemLocalSet};
 use rustc_index::vec::{Idx, IndexVec};
 use rustc_macros::HashStable;
+use rustc_session::config::CrateType;
+use rustc_session::config::{BorrowckMode, OutputFilenames};
 use rustc_session::lint::{Level, Lint};
-use rustc_session::node_id::NodeMap;
+use rustc_session::Session;
 use rustc_span::source_map::MultiSpan;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::Span;
 use rustc_target::spec::abi;
+use syntax::ast;
+use syntax::expand::allocator::AllocatorKind;
+use syntax::node_id::NodeMap;
+
 use smallvec::SmallVec;
 use std::any::Any;
 use std::borrow::Borrow;
@@ -78,9 +80,6 @@ use std::iter;
 use std::mem;
 use std::ops::{Bound, Deref};
 use std::sync::Arc;
-use syntax::ast;
-use syntax::attr;
-use syntax::expand::allocator::AllocatorKind;
 
 type InternedSet<'tcx, T> = ShardedHashMap<Interned<'tcx, T>, ()>;
 
diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs
index acaa4eec941..bda42db40b0 100644
--- a/src/librustc/ty/layout.rs
+++ b/src/librustc/ty/layout.rs
@@ -1,9 +1,9 @@
 use crate::session::{self, DataTypeKind};
 use crate::ty::{self, subst::SubstsRef, ReprOptions, Ty, TyCtxt, TypeFoldable};
 
+use rustc_attr as attr;
 use rustc_span::DUMMY_SP;
 use syntax::ast::{self, Ident, IntTy, UintTy};
-use syntax::attr;
 
 use std::cmp;
 use std::fmt;
diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs
index 4889f751f60..f417b907a38 100644
--- a/src/librustc/ty/mod.rs
+++ b/src/librustc/ty/mod.rs
@@ -26,6 +26,7 @@ use crate::ty::layout::VariantIdx;
 use crate::ty::subst::{InternalSubsts, Subst, SubstsRef};
 use crate::ty::util::{Discr, IntTypeExt};
 use crate::ty::walk::TypeWalker;
+use rustc_attr as attr;
 use rustc_data_structures::captures::Captures;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_data_structures::fx::FxIndexMap;
@@ -38,11 +39,13 @@ use rustc_hir::{GlobMap, Node, TraitMap};
 use rustc_index::vec::{Idx, IndexVec};
 use rustc_macros::HashStable;
 use rustc_serialize::{self, Encodable, Encoder};
-use rustc_session::node_id::{NodeMap, NodeSet};
 use rustc_span::hygiene::ExpnId;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::Span;
 use rustc_target::abi::Align;
+use syntax::ast::{self, Constness, Ident, Name};
+use syntax::node_id::{NodeId, NodeMap, NodeSet};
+
 use smallvec;
 use std::cell::RefCell;
 use std::cmp::{self, Ordering};
@@ -52,8 +55,6 @@ use std::ops::Deref;
 use std::ops::Range;
 use std::slice;
 use std::{mem, ptr};
-use syntax::ast::{self, Constness, Ident, Name, NodeId};
-use syntax::attr;
 
 pub use self::sty::BoundRegion::*;
 pub use self::sty::InferTy::*;
diff --git a/src/librustc/ty/print/pretty.rs b/src/librustc/ty/print/pretty.rs
index db539f9195c..f5c14e73db2 100644
--- a/src/librustc/ty/print/pretty.rs
+++ b/src/librustc/ty/print/pretty.rs
@@ -11,10 +11,10 @@ use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX, LOCAL_CRATE};
 
 use rustc_apfloat::ieee::{Double, Single};
 use rustc_apfloat::Float;
+use rustc_attr::{SignedInt, UnsignedInt};
 use rustc_span::symbol::{kw, Symbol};
 use rustc_target::spec::abi::Abi;
 use syntax::ast;
-use syntax::attr::{SignedInt, UnsignedInt};
 
 use std::cell::Cell;
 use std::collections::BTreeMap;
diff --git a/src/librustc/ty/query/job.rs b/src/librustc/ty/query/job.rs
index dd8274dcf22..393125f278c 100644
--- a/src/librustc/ty/query/job.rs
+++ b/src/librustc/ty/query/job.rs
@@ -435,11 +435,11 @@ pub unsafe fn handle_deadlock() {
     let rustc_span_globals =
         rustc_span::GLOBALS.with(|rustc_span_globals| rustc_span_globals as *const _);
     let rustc_span_globals = &*rustc_span_globals;
-    let syntax_globals = syntax::GLOBALS.with(|syntax_globals| syntax_globals as *const _);
+    let syntax_globals = syntax::attr::GLOBALS.with(|syntax_globals| syntax_globals as *const _);
     let syntax_globals = &*syntax_globals;
     thread::spawn(move || {
         tls::GCX_PTR.set(gcx_ptr, || {
-            syntax::GLOBALS.set(syntax_globals, || {
+            syntax::attr::GLOBALS.set(syntax_globals, || {
                 rustc_span::GLOBALS
                     .set(rustc_span_globals, || tls::with_global(|tcx| deadlock(tcx, &registry)))
             });
diff --git a/src/librustc/ty/query/mod.rs b/src/librustc/ty/query/mod.rs
index 0f09a08b199..973cd810146 100644
--- a/src/librustc/ty/query/mod.rs
+++ b/src/librustc/ty/query/mod.rs
@@ -49,6 +49,7 @@ use rustc_hir::{HirIdSet, ItemLocalId, TraitCandidate};
 use rustc_index::vec::IndexVec;
 use rustc_target::spec::PanicStrategy;
 
+use rustc_attr as attr;
 use rustc_span::symbol::Symbol;
 use rustc_span::{Span, DUMMY_SP};
 use std::any::type_name;
@@ -56,7 +57,6 @@ use std::borrow::Cow;
 use std::ops::Deref;
 use std::sync::Arc;
 use syntax::ast;
-use syntax::attr;
 
 #[macro_use]
 mod plumbing;
diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs
index 8d22ac9dbbe..4dfff85d531 100644
--- a/src/librustc/ty/util.rs
+++ b/src/librustc/ty/util.rs
@@ -10,6 +10,7 @@ use crate::ty::TyKind::*;
 use crate::ty::{self, DefIdTree, GenericParamDefKind, Ty, TyCtxt, TypeFoldable};
 use crate::util::common::ErrorReported;
 use rustc_apfloat::Float as _;
+use rustc_attr::{self as attr, SignedInt, UnsignedInt};
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
 use rustc_hir as hir;
@@ -19,7 +20,6 @@ use rustc_macros::HashStable;
 use rustc_span::Span;
 use std::{cmp, fmt};
 use syntax::ast;
-use syntax::attr::{self, SignedInt, UnsignedInt};
 
 #[derive(Copy, Clone, Debug)]
 pub struct Discr<'tcx> {
diff --git a/src/librustc_ast_lowering/Cargo.toml b/src/librustc_ast_lowering/Cargo.toml
index 4b786d6245f..f6ab60e199f 100644
--- a/src/librustc_ast_lowering/Cargo.toml
+++ b/src/librustc_ast_lowering/Cargo.toml
@@ -12,6 +12,7 @@ doctest = false
 [dependencies]
 log = { version = "0.4", features = ["release_max_level_info", "std"] }
 rustc = { path = "../librustc" }
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
 rustc_hir = { path = "../librustc_hir" }
 rustc_target = { path = "../librustc_target" }
 rustc_data_structures = { path = "../librustc_data_structures" }
diff --git a/src/librustc_ast_lowering/item.rs b/src/librustc_ast_lowering/item.rs
index 2025d0c1c8e..e27f2bdb8d2 100644
--- a/src/librustc_ast_lowering/item.rs
+++ b/src/librustc_ast_lowering/item.rs
@@ -7,13 +7,13 @@ use rustc_errors::struct_span_err;
 use rustc_hir as hir;
 use rustc_hir::def::{DefKind, Res};
 use rustc_hir::def_id::DefId;
-use rustc_session::node_id::NodeMap;
 use rustc_span::source_map::{respan, DesugaringKind};
 use rustc_span::symbol::{kw, sym};
 use rustc_span::Span;
 use rustc_target::spec::abi;
 use syntax::ast::*;
 use syntax::attr;
+use syntax::node_id::NodeMap;
 use syntax::visit::{self, Visitor};
 
 use log::debug;
diff --git a/src/librustc_ast_lowering/lib.rs b/src/librustc_ast_lowering/lib.rs
index 284ede3b4fa..c3e96a31e40 100644
--- a/src/librustc_ast_lowering/lib.rs
+++ b/src/librustc_ast_lowering/lib.rs
@@ -38,6 +38,7 @@ use rustc::dep_graph::DepGraph;
 use rustc::hir::map::definitions::{DefKey, DefPathData, Definitions};
 use rustc::hir::map::Map;
 use rustc::{bug, span_bug};
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::captures::Captures;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_data_structures::sync::Lrc;
@@ -49,8 +50,8 @@ use rustc_hir::intravisit;
 use rustc_hir::{ConstArg, GenericArg, ParamName};
 use rustc_index::vec::IndexVec;
 use rustc_session::config::nightly_options;
-use rustc_session::lint::{builtin, BuiltinLintDiagnostics, LintBuffer};
-use rustc_session::node_id::NodeMap;
+use rustc_session::lint::{builtin::BARE_TRAIT_OBJECTS, BuiltinLintDiagnostics, LintBuffer};
+use rustc_session::parse::ParseSess;
 use rustc_session::Session;
 use rustc_span::hygiene::ExpnId;
 use rustc_span::source_map::{respan, DesugaringKind, ExpnData, ExpnKind};
@@ -59,8 +60,7 @@ use rustc_span::Span;
 use syntax::ast;
 use syntax::ast::*;
 use syntax::attr;
-use syntax::print::pprust;
-use syntax::sess::ParseSess;
+use syntax::node_id::NodeMap;
 use syntax::token::{self, Nonterminal, Token};
 use syntax::tokenstream::{TokenStream, TokenTree};
 use syntax::visit::{self, Visitor};
@@ -2621,7 +2621,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
             .unwrap_or(true);
         if !is_macro_callsite {
             self.resolver.lint_buffer().buffer_lint_with_diagnostic(
-                builtin::BARE_TRAIT_OBJECTS,
+                BARE_TRAIT_OBJECTS,
                 id,
                 span,
                 "trait objects without an explicit `dyn` are deprecated",
diff --git a/src/librustc_ast_passes/Cargo.toml b/src/librustc_ast_passes/Cargo.toml
index 25b1acebd2a..01d2ac449b5 100644
--- a/src/librustc_ast_passes/Cargo.toml
+++ b/src/librustc_ast_passes/Cargo.toml
@@ -10,6 +10,8 @@ path = "lib.rs"
 
 [dependencies]
 log = "0.4"
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_feature = { path = "../librustc_feature" }
diff --git a/src/librustc_ast_passes/ast_validation.rs b/src/librustc_ast_passes/ast_validation.rs
index 152086bfce0..4bb55d6acdd 100644
--- a/src/librustc_ast_passes/ast_validation.rs
+++ b/src/librustc_ast_passes/ast_validation.rs
@@ -6,6 +6,7 @@
 // This pass is supposed to perform only simple checks not requiring name resolution
 // or type checking or some other kind of complex analysis.
 
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_errors::{struct_span_err, Applicability, FatalError};
 use rustc_parse::validate_attr;
@@ -19,7 +20,6 @@ use std::mem;
 use syntax::ast::*;
 use syntax::attr;
 use syntax::expand::is_proc_macro_attr;
-use syntax::print::pprust;
 use syntax::visit::{self, Visitor};
 use syntax::walk_list;
 
@@ -331,7 +331,7 @@ impl<'a> AstValidator<'a> {
             .flat_map(|i| i.attrs.as_ref())
             .filter(|attr| {
                 let arr = [sym::allow, sym::cfg, sym::cfg_attr, sym::deny, sym::forbid, sym::warn];
-                !arr.contains(&attr.name_or_empty()) && attr::is_builtin_attr(attr)
+                !arr.contains(&attr.name_or_empty()) && rustc_attr::is_builtin_attr(attr)
             })
             .for_each(|attr| {
                 if attr.is_doc_comment() {
diff --git a/src/librustc_ast_passes/feature_gate.rs b/src/librustc_ast_passes/feature_gate.rs
index 953127429d5..3b13ab354fd 100644
--- a/src/librustc_ast_passes/feature_gate.rs
+++ b/src/librustc_ast_passes/feature_gate.rs
@@ -1,13 +1,13 @@
 use rustc_errors::{struct_span_err, Handler};
 use rustc_feature::{AttributeGate, BUILTIN_ATTRIBUTE_MAP};
 use rustc_feature::{Features, GateIssue, UnstableFeatures};
+use rustc_session::parse::{feature_err, feature_err_issue, ParseSess};
 use rustc_span::source_map::Spanned;
 use rustc_span::symbol::sym;
 use rustc_span::Span;
 use syntax::ast::{self, AssocTyConstraint, AssocTyConstraintKind, NodeId};
 use syntax::ast::{GenericParam, GenericParamKind, PatKind, RangeEnd, VariantData};
 use syntax::attr;
-use syntax::sess::{feature_err, feature_err_issue, ParseSess};
 use syntax::visit::{self, FnKind, Visitor};
 
 use log::debug;
diff --git a/src/librustc_ast_passes/lib.rs b/src/librustc_ast_passes/lib.rs
index 5de45f4e1f3..b4d8ddccb04 100644
--- a/src/librustc_ast_passes/lib.rs
+++ b/src/librustc_ast_passes/lib.rs
@@ -1,9 +1,12 @@
 //! The `rustc_ast_passes` crate contains passes which validate the AST in `syntax`
 //! parsed by `rustc_parse` and then lowered, after the passes in this crate,
 //! by `rustc_ast_lowering`.
+//!
+//! The crate also contains other misc AST visitors, e.g. `node_count` and `show_span`.
 
 #![cfg_attr(bootstrap, feature(slice_patterns))]
 
 pub mod ast_validation;
 pub mod feature_gate;
+pub mod node_count;
 pub mod show_span;
diff --git a/src/libsyntax/util/node_count.rs b/src/librustc_ast_passes/node_count.rs
index 39f978ce98c..9fe7238fcfc 100644
--- a/src/libsyntax/util/node_count.rs
+++ b/src/librustc_ast_passes/node_count.rs
@@ -1,8 +1,8 @@
 // Simply gives a rought count of the number of nodes in an AST.
 
-use crate::ast::*;
-use crate::visit::*;
 use rustc_span::Span;
+use syntax::ast::*;
+use syntax::visit::*;
 
 pub struct NodeCounter {
     pub count: usize,
diff --git a/src/librustc_ast_pretty/Cargo.toml b/src/librustc_ast_pretty/Cargo.toml
new file mode 100644
index 00000000000..2f7f804b628
--- /dev/null
+++ b/src/librustc_ast_pretty/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+authors = ["The Rust Project Developers"]
+name = "rustc_ast_pretty"
+version = "0.0.0"
+edition = "2018"
+
+[lib]
+name = "rustc_ast_pretty"
+path = "lib.rs"
+doctest = false
+
+[dependencies]
+log = "0.4"
+rustc_span = { path = "../librustc_span" }
+rustc_data_structures = { path = "../librustc_data_structures" }
+syntax = { path = "../libsyntax" }
diff --git a/src/libsyntax/print/helpers.rs b/src/librustc_ast_pretty/helpers.rs
index 88942cb7fd6..dce856df9c6 100644
--- a/src/libsyntax/print/helpers.rs
+++ b/src/librustc_ast_pretty/helpers.rs
@@ -1,4 +1,4 @@
-use crate::print::pp::Printer;
+use crate::pp::Printer;
 use std::borrow::Cow;
 
 impl Printer {
diff --git a/src/librustc_ast_pretty/lib.rs b/src/librustc_ast_pretty/lib.rs
new file mode 100644
index 00000000000..bde5f4bb03d
--- /dev/null
+++ b/src/librustc_ast_pretty/lib.rs
@@ -0,0 +1,7 @@
+#![feature(bool_to_option)]
+#![feature(crate_visibility_modifier)]
+#![recursion_limit = "256"]
+
+mod helpers;
+pub mod pp;
+pub mod pprust;
diff --git a/src/libsyntax/print/pp.rs b/src/librustc_ast_pretty/pp.rs
index e6090db3284..e6090db3284 100644
--- a/src/libsyntax/print/pp.rs
+++ b/src/librustc_ast_pretty/pp.rs
diff --git a/src/libsyntax/print/pprust.rs b/src/librustc_ast_pretty/pprust.rs
index d6f18fda8b2..761af72f95d 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/librustc_ast_pretty/pprust.rs
@@ -1,20 +1,19 @@
-use crate::ast::{self, BlockCheckMode, PatKind, RangeEnd, RangeSyntax};
-use crate::ast::{Attribute, GenericArg, MacArgs};
-use crate::ast::{GenericBound, SelfKind, TraitBoundModifier};
-use crate::attr;
-use crate::print::pp::Breaks::{Consistent, Inconsistent};
-use crate::print::pp::{self, Breaks};
-use crate::ptr::P;
-use crate::sess::ParseSess;
-use crate::token::{self, BinOpToken, DelimToken, Nonterminal, Token, TokenKind};
-use crate::tokenstream::{self, TokenStream, TokenTree};
-use crate::util::classify;
-use crate::util::comments;
-use crate::util::parser::{self, AssocOp, Fixity};
+use crate::pp::Breaks::{Consistent, Inconsistent};
+use crate::pp::{self, Breaks};
 
+use rustc_span::edition::Edition;
 use rustc_span::source_map::{dummy_spanned, SourceMap, Spanned};
 use rustc_span::symbol::{kw, sym};
 use rustc_span::{BytePos, FileName, Span};
+use syntax::ast::{self, BlockCheckMode, PatKind, RangeEnd, RangeSyntax};
+use syntax::ast::{Attribute, GenericArg, MacArgs};
+use syntax::ast::{GenericBound, SelfKind, TraitBoundModifier};
+use syntax::attr;
+use syntax::ptr::P;
+use syntax::token::{self, BinOpToken, DelimToken, Nonterminal, Token, TokenKind};
+use syntax::tokenstream::{self, TokenStream, TokenTree};
+use syntax::util::parser::{self, AssocOp, Fixity};
+use syntax::util::{classify, comments};
 
 use std::borrow::Cow;
 
@@ -54,13 +53,8 @@ pub struct Comments<'a> {
 }
 
 impl<'a> Comments<'a> {
-    pub fn new(
-        cm: &'a SourceMap,
-        sess: &ParseSess,
-        filename: FileName,
-        input: String,
-    ) -> Comments<'a> {
-        let comments = comments::gather_comments(sess, filename, input);
+    pub fn new(cm: &'a SourceMap, filename: FileName, input: String) -> Comments<'a> {
+        let comments = comments::gather_comments(cm, filename, input);
         Comments { cm, comments, current: 0 }
     }
 
@@ -102,21 +96,22 @@ crate const INDENT_UNIT: usize = 4;
 /// it can scan the input text for comments to copy forward.
 pub fn print_crate<'a>(
     cm: &'a SourceMap,
-    sess: &ParseSess,
     krate: &ast::Crate,
     filename: FileName,
     input: String,
     ann: &'a dyn PpAnn,
     is_expanded: bool,
+    edition: Edition,
+    has_injected_crate: bool,
 ) -> String {
     let mut s = State {
         s: pp::mk_printer(),
-        comments: Some(Comments::new(cm, sess, filename, input)),
+        comments: Some(Comments::new(cm, filename, input)),
         ann,
         is_expanded,
     };
 
-    if is_expanded && sess.injected_crate_name.try_get().is_some() {
+    if is_expanded && has_injected_crate {
         // We need to print `#![no_std]` (and its feature gate) so that
         // compiling pretty-printed source won't inject libstd again.
         // However, we don't want these attributes in the AST because
@@ -130,7 +125,7 @@ pub fn print_crate<'a>(
 
         // Currently, in Rust 2018 we don't have `extern crate std;` at the crate
         // root, so this is not needed, and actually breaks things.
-        if sess.edition == rustc_span::edition::Edition::Edition2015 {
+        if edition == Edition::Edition2015 {
             // `#![no_std]`
             let no_std_meta = attr::mk_word_item(ast::Ident::with_dummy_span(sym::no_std));
             let fake_attr = attr::mk_attr_inner(no_std_meta);
@@ -144,10 +139,7 @@ pub fn print_crate<'a>(
     s.s.eof()
 }
 
-pub fn to_string<F>(f: F) -> String
-where
-    F: FnOnce(&mut State<'_>),
-{
+pub fn to_string(f: impl FnOnce(&mut State<'_>)) -> String {
     let mut printer =
         State { s: pp::mk_printer(), comments: None, ann: &NoAnn, is_expanded: false };
     f(&mut printer);
diff --git a/src/libsyntax/print/pprust/tests.rs b/src/librustc_ast_pretty/pprust/tests.rs
index 3091e315580..279e6f518a7 100644
--- a/src/libsyntax/print/pprust/tests.rs
+++ b/src/librustc_ast_pretty/pprust/tests.rs
@@ -1,9 +1,9 @@
 use super::*;
 
-use crate::ast;
-use crate::with_default_globals;
 use rustc_span;
 use rustc_span::source_map::{dummy_spanned, respan};
+use syntax::ast;
+use syntax::with_default_globals;
 
 fn fun_to_string(
     decl: &ast::FnDecl,
diff --git a/src/librustc_attr/Cargo.toml b/src/librustc_attr/Cargo.toml
new file mode 100644
index 00000000000..83a5f41989b
--- /dev/null
+++ b/src/librustc_attr/Cargo.toml
@@ -0,0 +1,22 @@
+[package]
+authors = ["The Rust Project Developers"]
+name = "rustc_attr"
+version = "0.0.0"
+edition = "2018"
+
+[lib]
+name = "rustc_attr"
+path = "lib.rs"
+doctest = false
+
+[dependencies]
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
+rustc_serialize = { path = "../libserialize", package = "serialize" }
+rustc_errors = { path = "../librustc_errors" }
+rustc_span = { path = "../librustc_span" }
+rustc_data_structures = { path = "../librustc_data_structures" }
+rustc_feature = { path = "../librustc_feature" }
+rustc_macros = { path = "../librustc_macros" }
+smallvec = { version = "1.0", features = ["union", "may_dangle"] }
+rustc_session = { path = "../librustc_session" }
+syntax = { path = "../libsyntax" }
diff --git a/src/libsyntax/attr/builtin.rs b/src/librustc_attr/builtin.rs
index 1da005d70d4..be7c164395b 100644
--- a/src/libsyntax/attr/builtin.rs
+++ b/src/librustc_attr/builtin.rs
@@ -1,16 +1,16 @@
 //! Parsing and validation of builtin attributes
 
-use super::{mark_used, MetaItemKind};
-use crate::ast::{self, Attribute, MetaItem, NestedMetaItem};
-use crate::print::pprust;
-use crate::sess::{feature_err, ParseSess};
+use super::{find_by_name, mark_used};
 
+use rustc_ast_pretty::pprust;
 use rustc_errors::{struct_span_err, Applicability, Handler};
 use rustc_feature::{find_gated_cfg, is_builtin_attr_name, Features, GatedCfg};
 use rustc_macros::HashStable_Generic;
+use rustc_session::parse::{feature_err, ParseSess};
 use rustc_span::hygiene::Transparency;
 use rustc_span::{symbol::sym, symbol::Symbol, Span};
 use std::num::NonZeroU32;
+use syntax::ast::{self, Attribute, MetaItem, MetaItemKind, NestedMetaItem};
 
 pub fn is_builtin_attr(attr: &Attribute) -> bool {
     attr.is_doc_comment() || attr.ident().filter(|ident| is_builtin_attr_name(ident.name)).is_some()
@@ -1043,3 +1043,21 @@ pub fn find_transparency(
     let fallback = if is_legacy { Transparency::SemiTransparent } else { Transparency::Opaque };
     (transparency.map_or(fallback, |t| t.0), error)
 }
+
+pub fn allow_internal_unstable<'a>(
+    attrs: &[Attribute],
+    diag: &'a rustc_errors::Handler,
+) -> Option<impl Iterator<Item = Symbol> + 'a> {
+    let attr = find_by_name(attrs, sym::allow_internal_unstable)?;
+    let list = attr.meta_item_list().or_else(|| {
+        diag.span_err(attr.span, "allow_internal_unstable expects list of feature names");
+        None
+    })?;
+    Some(list.into_iter().filter_map(move |it| {
+        let name = it.ident().map(|ident| ident.name);
+        if name.is_none() {
+            diag.span_err(it.span(), "`allow_internal_unstable` expects feature names");
+        }
+        name
+    }))
+}
diff --git a/src/librustc_attr/lib.rs b/src/librustc_attr/lib.rs
new file mode 100644
index 00000000000..d2ff167db88
--- /dev/null
+++ b/src/librustc_attr/lib.rs
@@ -0,0 +1,16 @@
+//! Functions and types dealing with attributes and meta items.
+//!
+//! FIXME(Centril): For now being, much of the logic is still in `syntax::attr`.
+//! The goal is to move the definition of `MetaItem` and things that don't need to be in `syntax`
+//! to this crate.
+
+mod builtin;
+
+pub use builtin::*;
+pub use IntType::*;
+pub use ReprAttr::*;
+pub use StabilityLevel::*;
+
+pub use syntax::attr::*;
+
+pub(crate) use syntax::HashStableContext;
diff --git a/src/librustc_builtin_macros/Cargo.toml b/src/librustc_builtin_macros/Cargo.toml
index 3ce7f5d770e..b424ce43214 100644
--- a/src/librustc_builtin_macros/Cargo.toml
+++ b/src/librustc_builtin_macros/Cargo.toml
@@ -12,6 +12,8 @@ doctest = false
 [dependencies]
 fmt_macros = { path = "../libfmt_macros" }
 log = "0.4"
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_feature = { path = "../librustc_feature" }
diff --git a/src/librustc_builtin_macros/assert.rs b/src/librustc_builtin_macros/assert.rs
index a992b6e2662..3fc86a5469c 100644
--- a/src/librustc_builtin_macros/assert.rs
+++ b/src/librustc_builtin_macros/assert.rs
@@ -1,11 +1,11 @@
 use rustc_errors::{Applicability, DiagnosticBuilder};
 
+use rustc_ast_pretty::pprust;
 use rustc_expand::base::*;
 use rustc_parse::parser::Parser;
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::{Span, DUMMY_SP};
 use syntax::ast::{self, *};
-use syntax::print::pprust;
 use syntax::ptr::P;
 use syntax::token::{self, TokenKind};
 use syntax::tokenstream::{DelimSpan, TokenStream, TokenTree};
diff --git a/src/librustc_builtin_macros/cfg.rs b/src/librustc_builtin_macros/cfg.rs
index cee62a54f00..c9a77ee0acd 100644
--- a/src/librustc_builtin_macros/cfg.rs
+++ b/src/librustc_builtin_macros/cfg.rs
@@ -2,11 +2,11 @@
 //! a literal `true` or `false` based on whether the given cfg matches the
 //! current compilation environment.
 
+use rustc_attr as attr;
 use rustc_errors::DiagnosticBuilder;
 use rustc_expand::base::{self, *};
 use rustc_span::Span;
 use syntax::ast;
-use syntax::attr;
 use syntax::token;
 use syntax::tokenstream::TokenStream;
 
diff --git a/src/librustc_builtin_macros/cmdline_attrs.rs b/src/librustc_builtin_macros/cmdline_attrs.rs
index 2f7f7e73ac2..aa373d31e06 100644
--- a/src/librustc_builtin_macros/cmdline_attrs.rs
+++ b/src/librustc_builtin_macros/cmdline_attrs.rs
@@ -1,10 +1,10 @@
 //! Attributes injected into the crate root from command line using `-Z crate-attr`.
 
 use rustc_expand::panictry;
+use rustc_session::parse::ParseSess;
 use rustc_span::FileName;
 use syntax::ast::{self, AttrItem, AttrStyle};
 use syntax::attr::mk_attr;
-use syntax::sess::ParseSess;
 use syntax::token;
 
 pub fn inject(mut krate: ast::Crate, parse_sess: &ParseSess, attrs: &[String]) -> ast::Crate {
diff --git a/src/librustc_builtin_macros/deriving/generic/mod.rs b/src/librustc_builtin_macros/deriving/generic/mod.rs
index 9377f194dcd..364d8ff8e22 100644
--- a/src/librustc_builtin_macros/deriving/generic/mod.rs
+++ b/src/librustc_builtin_macros/deriving/generic/mod.rs
@@ -181,15 +181,15 @@ use std::cell::RefCell;
 use std::iter;
 use std::vec;
 
+use rustc_attr as attr;
 use rustc_expand::base::{Annotatable, ExtCtxt};
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::respan;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::Span;
 use syntax::ast::{self, BinOpKind, EnumDef, Expr, Generics, Ident, PatKind};
 use syntax::ast::{GenericArg, GenericParamKind, VariantData};
-use syntax::attr;
 use syntax::ptr::P;
-use syntax::sess::ParseSess;
 use syntax::util::map_in_place::MapInPlace;
 
 use ty::{LifetimeBounds, Path, Ptr, PtrTy, Self_, Ty};
diff --git a/src/librustc_builtin_macros/log_syntax.rs b/src/librustc_builtin_macros/log_syntax.rs
index 7c7fc286e0a..6d9bfbfd05f 100644
--- a/src/librustc_builtin_macros/log_syntax.rs
+++ b/src/librustc_builtin_macros/log_syntax.rs
@@ -1,6 +1,6 @@
+use rustc_ast_pretty::pprust;
 use rustc_expand::base;
 use rustc_span;
-use syntax::print;
 use syntax::tokenstream::TokenStream;
 
 pub fn expand_log_syntax<'cx>(
@@ -8,7 +8,7 @@ pub fn expand_log_syntax<'cx>(
     sp: rustc_span::Span,
     tts: TokenStream,
 ) -> Box<dyn base::MacResult + 'cx> {
-    println!("{}", print::pprust::tts_to_string(tts));
+    println!("{}", pprust::tts_to_string(tts));
 
     // any so that `log_syntax` can be invoked as an expression and item.
     base::DummyResult::any_valid(sp)
diff --git a/src/librustc_builtin_macros/proc_macro_harness.rs b/src/librustc_builtin_macros/proc_macro_harness.rs
index ae706085051..222456d8fe0 100644
--- a/src/librustc_builtin_macros/proc_macro_harness.rs
+++ b/src/librustc_builtin_macros/proc_macro_harness.rs
@@ -1,7 +1,9 @@
 use std::mem;
 
+use rustc_ast_pretty::pprust;
 use rustc_expand::base::{ExtCtxt, Resolver};
 use rustc_expand::expand::{AstFragment, ExpansionConfig};
+use rustc_session::parse::ParseSess;
 use rustc_span::hygiene::AstPass;
 use rustc_span::symbol::{kw, sym};
 use rustc_span::{Span, DUMMY_SP};
@@ -9,9 +11,7 @@ use smallvec::smallvec;
 use syntax::ast::{self, Ident};
 use syntax::attr;
 use syntax::expand::is_proc_macro_attr;
-use syntax::print::pprust;
 use syntax::ptr::P;
-use syntax::sess::ParseSess;
 use syntax::visit::{self, Visitor};
 
 struct ProcMacroDerive {
diff --git a/src/librustc_builtin_macros/source_util.rs b/src/librustc_builtin_macros/source_util.rs
index dc85a92d272..264223bafbc 100644
--- a/src/librustc_builtin_macros/source_util.rs
+++ b/src/librustc_builtin_macros/source_util.rs
@@ -1,3 +1,4 @@
+use rustc_ast_pretty::pprust;
 use rustc_expand::base::{self, *};
 use rustc_expand::panictry;
 use rustc_parse::{self, new_sub_parser_from_file, parser::Parser, DirectoryOwnership};
@@ -5,7 +6,6 @@ use rustc_session::lint::builtin::INCOMPLETE_INCLUDE;
 use rustc_span::symbol::Symbol;
 use rustc_span::{self, Pos, Span};
 use syntax::ast;
-use syntax::print::pprust;
 use syntax::ptr::P;
 use syntax::token;
 use syntax::tokenstream::TokenStream;
diff --git a/src/librustc_builtin_macros/standard_library_imports.rs b/src/librustc_builtin_macros/standard_library_imports.rs
index 0c982b21eee..6663eecbf5f 100644
--- a/src/librustc_builtin_macros/standard_library_imports.rs
+++ b/src/librustc_builtin_macros/standard_library_imports.rs
@@ -1,11 +1,11 @@
 use rustc_expand::base::{ExtCtxt, Resolver};
 use rustc_expand::expand::ExpansionConfig;
+use rustc_session::parse::ParseSess;
 use rustc_span::edition::Edition;
 use rustc_span::hygiene::AstPass;
 use rustc_span::symbol::{kw, sym, Ident, Symbol};
 use rustc_span::DUMMY_SP;
 use syntax::ptr::P;
-use syntax::sess::ParseSess;
 use syntax::{ast, attr};
 
 pub fn inject(
diff --git a/src/librustc_builtin_macros/test.rs b/src/librustc_builtin_macros/test.rs
index 07715cdbcb5..2d6ff81aea8 100644
--- a/src/librustc_builtin_macros/test.rs
+++ b/src/librustc_builtin_macros/test.rs
@@ -2,13 +2,13 @@
 /// Ideally, this code would be in libtest but for efficiency and error messages it lives here.
 use crate::util::check_builtin_macro_attribute;
 
+use rustc_ast_pretty::pprust;
 use rustc_expand::base::*;
 use rustc_span::source_map::respan;
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::Span;
 use syntax::ast;
 use syntax::attr;
-use syntax::print::pprust;
 
 use std::iter;
 
diff --git a/src/librustc_builtin_macros/test_harness.rs b/src/librustc_builtin_macros/test_harness.rs
index 17d180da6bf..6a73f121c99 100644
--- a/src/librustc_builtin_macros/test_harness.rs
+++ b/src/librustc_builtin_macros/test_harness.rs
@@ -4,6 +4,7 @@ use log::debug;
 use rustc_expand::base::{ExtCtxt, Resolver};
 use rustc_expand::expand::{AstFragment, ExpansionConfig};
 use rustc_feature::Features;
+use rustc_session::parse::ParseSess;
 use rustc_span::hygiene::{AstPass, SyntaxContext, Transparency};
 use rustc_span::source_map::respan;
 use rustc_span::symbol::{sym, Symbol};
@@ -15,7 +16,6 @@ use syntax::attr;
 use syntax::entry::{self, EntryPointType};
 use syntax::mut_visit::{ExpectOne, *};
 use syntax::ptr::P;
-use syntax::sess::ParseSess;
 
 use std::{iter, mem};
 
diff --git a/src/librustc_codegen_llvm/Cargo.toml b/src/librustc_codegen_llvm/Cargo.toml
index dd9eadde098..e7c0ee5ea76 100644
--- a/src/librustc_codegen_llvm/Cargo.toml
+++ b/src/librustc_codegen_llvm/Cargo.toml
@@ -17,6 +17,7 @@ libc = "0.2"
 log = "0.4"
 rustc = { path = "../librustc" }
 rustc-demangle = "0.1"
+rustc_attr = { path = "../librustc_attr" }
 rustc_codegen_ssa = { path = "../librustc_codegen_ssa" }
 rustc_codegen_utils = { path = "../librustc_codegen_utils" }
 rustc_data_structures = { path = "../librustc_data_structures" }
diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
index fc1b365cf90..e3920d99c90 100644
--- a/src/librustc_codegen_llvm/attributes.rs
+++ b/src/librustc_codegen_llvm/attributes.rs
@@ -21,7 +21,7 @@ use crate::attributes;
 use crate::llvm::AttributePlace::Function;
 use crate::llvm::{self, Attribute};
 use crate::llvm_util;
-pub use syntax::attr::{self, InlineAttr, OptimizeAttr};
+pub use rustc_attr::{self as attr, InlineAttr, OptimizeAttr};
 
 use crate::context::CodegenCx;
 use crate::value::Value;
diff --git a/src/librustc_codegen_ssa/Cargo.toml b/src/librustc_codegen_ssa/Cargo.toml
index 9f8b4e72a9c..8d767e5c2a0 100644
--- a/src/librustc_codegen_ssa/Cargo.toml
+++ b/src/librustc_codegen_ssa/Cargo.toml
@@ -24,6 +24,7 @@ syntax = { path = "../libsyntax" }
 rustc_span = { path = "../librustc_span" }
 rustc = { path = "../librustc" }
 rustc_apfloat = { path = "../librustc_apfloat" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_codegen_utils = { path = "../librustc_codegen_utils" }
 rustc_data_structures = { path = "../librustc_data_structures"}
 rustc_errors = { path = "../librustc_errors" }
diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
index bc0322ffe1d..3a14fa5ae31 100644
--- a/src/librustc_codegen_ssa/back/link.rs
+++ b/src/librustc_codegen_ssa/back/link.rs
@@ -1723,7 +1723,7 @@ pub fn add_upstream_native_libraries(
 
 pub fn relevant_lib(sess: &Session, lib: &NativeLibrary) -> bool {
     match lib.cfg {
-        Some(ref cfg) => syntax::attr::cfg_matches(cfg, &sess.parse_sess, None),
+        Some(ref cfg) => rustc_attr::cfg_matches(cfg, &sess.parse_sess, None),
         None => true,
     }
 }
diff --git a/src/librustc_codegen_ssa/base.rs b/src/librustc_codegen_ssa/base.rs
index efd56007120..1f43a4027c5 100644
--- a/src/librustc_codegen_ssa/base.rs
+++ b/src/librustc_codegen_ssa/base.rs
@@ -37,6 +37,7 @@ use rustc::ty::layout::{self, Align, HasTyCtxt, LayoutOf, TyLayout, VariantIdx};
 use rustc::ty::layout::{FAT_PTR_ADDR, FAT_PTR_EXTRA};
 use rustc::ty::query::Providers;
 use rustc::ty::{self, Instance, Ty, TyCtxt};
+use rustc_attr as attr;
 use rustc_codegen_utils::{check_for_rustc_errors_attr, symbol_names_test};
 use rustc_data_structures::fx::FxHashMap;
 use rustc_data_structures::profiling::print_time_passes_entry;
@@ -46,7 +47,6 @@ use rustc_hir::def_id::{DefId, LOCAL_CRATE};
 use rustc_index::vec::Idx;
 use rustc_session::cgu_reuse_tracker::CguReuse;
 use rustc_span::Span;
-use syntax::attr;
 
 use std::cmp;
 use std::ops::{Deref, DerefMut};
diff --git a/src/librustc_driver/Cargo.toml b/src/librustc_driver/Cargo.toml
index b856e5da5a0..7a5966269b3 100644
--- a/src/librustc_driver/Cargo.toml
+++ b/src/librustc_driver/Cargo.toml
@@ -14,6 +14,7 @@ lazy_static = "1.0"
 log = "0.4"
 env_logger = { version = "0.7", default-features = false }
 rustc = { path = "../librustc" }
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
 rustc_target = { path = "../librustc_target" }
 rustc_lint = { path = "../librustc_lint" }
 rustc_data_structures = { path = "../librustc_data_structures" }
diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs
index 6ef6dcf87ed..345b03e6db2 100644
--- a/src/librustc_driver/pretty.rs
+++ b/src/librustc_driver/pretty.rs
@@ -5,14 +5,13 @@ use rustc::session::config::{Input, PpMode, PpSourceMode};
 use rustc::session::Session;
 use rustc::ty::{self, TyCtxt};
 use rustc::util::common::ErrorReported;
+use rustc_ast_pretty::pprust;
 use rustc_hir as hir;
 use rustc_hir::def_id::LOCAL_CRATE;
 use rustc_hir::print as pprust_hir;
 use rustc_mir::util::{write_mir_graphviz, write_mir_pretty};
-
 use rustc_span::FileName;
 use syntax::ast;
-use syntax::print::pprust;
 
 use std::cell::Cell;
 use std::fs::File;
@@ -392,14 +391,16 @@ pub fn print_after_parsing(
         call_with_pp_support(&s, sess, None, move |annotation| {
             debug!("pretty printing source code {:?}", s);
             let sess = annotation.sess();
+            let parse = &sess.parse_sess;
             *out = pprust::print_crate(
                 sess.source_map(),
-                &sess.parse_sess,
                 krate,
                 src_name,
                 src,
                 annotation.pp_ann(),
                 false,
+                parse.edition,
+                parse.injected_crate_name.try_get().is_some(),
             )
         })
     } else {
@@ -432,14 +433,16 @@ pub fn print_after_hir_lowering<'tcx>(
             call_with_pp_support(&s, tcx.sess, Some(tcx), move |annotation| {
                 debug!("pretty printing source code {:?}", s);
                 let sess = annotation.sess();
+                let parse = &sess.parse_sess;
                 *out = pprust::print_crate(
                     sess.source_map(),
-                    &sess.parse_sess,
                     krate,
                     src_name,
                     src,
                     annotation.pp_ann(),
                     true,
+                    parse.edition,
+                    parse.injected_crate_name.try_get().is_some(),
                 )
             })
         }
@@ -449,14 +452,8 @@ pub fn print_after_hir_lowering<'tcx>(
             call_with_pp_support_hir(&s, tcx, move |annotation, krate| {
                 debug!("pretty printing source code {:?}", s);
                 let sess = annotation.sess();
-                *out = pprust_hir::print_crate(
-                    sess.source_map(),
-                    &sess.parse_sess,
-                    krate,
-                    src_name,
-                    src,
-                    annotation.pp_ann(),
-                )
+                let cm = sess.source_map();
+                *out = pprust_hir::print_crate(cm, krate, src_name, src, annotation.pp_ann())
             })
         }
 
diff --git a/src/librustc_expand/Cargo.toml b/src/librustc_expand/Cargo.toml
index d04dd079be7..cb7919d630a 100644
--- a/src/librustc_expand/Cargo.toml
+++ b/src/librustc_expand/Cargo.toml
@@ -14,7 +14,9 @@ doctest = false
 rustc_serialize = { path = "../libserialize", package = "serialize" }
 log = "0.4"
 rustc_span = { path = "../librustc_span" }
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
 rustc_ast_passes = { path = "../librustc_ast_passes" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_feature = { path = "../librustc_feature" }
diff --git a/src/librustc_expand/base.rs b/src/librustc_expand/base.rs
index 9debae19fa5..536259e0547 100644
--- a/src/librustc_expand/base.rs
+++ b/src/librustc_expand/base.rs
@@ -1,9 +1,11 @@
 use crate::expand::{self, AstFragment, Invocation};
 
+use rustc_attr::{self as attr, Deprecation, HasAttrs, Stability};
 use rustc_data_structures::fx::FxHashMap;
 use rustc_data_structures::sync::{self, Lrc};
 use rustc_errors::{DiagnosticBuilder, DiagnosticId};
 use rustc_parse::{self, parser, DirectoryOwnership, MACRO_ARGUMENTS};
+use rustc_session::parse::ParseSess;
 use rustc_span::edition::Edition;
 use rustc_span::hygiene::{AstPass, ExpnData, ExpnId, ExpnKind};
 use rustc_span::source_map::SourceMap;
@@ -11,10 +13,8 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
 use rustc_span::{FileName, MultiSpan, Span, DUMMY_SP};
 use smallvec::{smallvec, SmallVec};
 use syntax::ast::{self, Attribute, Name, NodeId, PatKind};
-use syntax::attr::{self, Deprecation, HasAttrs, Stability};
 use syntax::mut_visit::{self, MutVisitor};
 use syntax::ptr::P;
-use syntax::sess::ParseSess;
 use syntax::token;
 use syntax::tokenstream::{self, TokenStream};
 use syntax::visit::Visitor;
@@ -62,7 +62,7 @@ impl HasAttrs for Annotatable {
         }
     }
 
-    fn visit_attrs<F: FnOnce(&mut Vec<Attribute>)>(&mut self, f: F) {
+    fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
         match self {
             Annotatable::Item(item) => item.visit_attrs(f),
             Annotatable::TraitItem(trait_item) => trait_item.visit_attrs(f),
diff --git a/src/librustc_expand/expand.rs b/src/librustc_expand/expand.rs
index ea459064b09..f08bed57315 100644
--- a/src/librustc_expand/expand.rs
+++ b/src/librustc_expand/expand.rs
@@ -5,6 +5,8 @@ use crate::mbe::macro_rules::annotate_err_with_kind;
 use crate::placeholders::{placeholder, PlaceholderExpander};
 use crate::proc_macro::collect_derives;
 
+use rustc_ast_pretty::pprust;
+use rustc_attr::{self as attr, is_builtin_attr, HasAttrs};
 use rustc_data_structures::sync::Lrc;
 use rustc_errors::{Applicability, FatalError, PResult};
 use rustc_feature::Features;
@@ -12,16 +14,14 @@ use rustc_parse::configure;
 use rustc_parse::parser::Parser;
 use rustc_parse::validate_attr;
 use rustc_parse::DirectoryOwnership;
+use rustc_session::parse::{feature_err, ParseSess};
 use rustc_span::source_map::respan;
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::{FileName, Span, DUMMY_SP};
 use syntax::ast::{self, AttrItem, Block, Ident, LitKind, NodeId, PatKind, Path};
 use syntax::ast::{ItemKind, MacArgs, MacStmtStyle, StmtKind};
-use syntax::attr::{self, is_builtin_attr, HasAttrs};
 use syntax::mut_visit::*;
-use syntax::print::pprust;
 use syntax::ptr::P;
-use syntax::sess::{feature_err, ParseSess};
 use syntax::token;
 use syntax::tokenstream::{TokenStream, TokenTree};
 use syntax::util::map_in_place::MapInPlace;
@@ -1671,7 +1671,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
             }
 
             let meta = attr::mk_list_item(Ident::with_dummy_span(sym::doc), items);
-            *at = attr::Attribute {
+            *at = ast::Attribute {
                 kind: ast::AttrKind::Normal(AttrItem {
                     path: meta.path,
                     args: meta.kind.mac_args(meta.span),
diff --git a/src/librustc_expand/mbe/macro_parser.rs b/src/librustc_expand/mbe/macro_parser.rs
index 6e7a4a556b8..b14725fd731 100644
--- a/src/librustc_expand/mbe/macro_parser.rs
+++ b/src/librustc_expand/mbe/macro_parser.rs
@@ -76,13 +76,13 @@ use TokenTreeOrTokenTreeSlice::*;
 
 use crate::mbe::{self, TokenTree};
 
+use rustc_ast_pretty::pprust;
 use rustc_parse::parser::{FollowedByType, Parser, PathStyle};
 use rustc_parse::Directory;
+use rustc_session::parse::ParseSess;
 use rustc_span::symbol::{kw, sym, Symbol};
 use syntax::ast::{Ident, Name};
-use syntax::print::pprust;
 use syntax::ptr::P;
-use syntax::sess::ParseSess;
 use syntax::token::{self, DocComment, Nonterminal, Token};
 use syntax::tokenstream::TokenStream;
 
diff --git a/src/librustc_expand/mbe/macro_rules.rs b/src/librustc_expand/mbe/macro_rules.rs
index d72317af9eb..29d41543fbf 100644
--- a/src/librustc_expand/mbe/macro_rules.rs
+++ b/src/librustc_expand/mbe/macro_rules.rs
@@ -8,20 +8,20 @@ use crate::mbe::macro_parser::{Error, Failure, Success};
 use crate::mbe::macro_parser::{MatchedNonterminal, MatchedSeq, NamedParseResult};
 use crate::mbe::transcribe::transcribe;
 
+use rustc_ast_pretty::pprust;
+use rustc_attr::{self as attr, TransparencyError};
 use rustc_data_structures::fx::FxHashMap;
 use rustc_data_structures::sync::Lrc;
 use rustc_errors::{Applicability, DiagnosticBuilder, FatalError};
 use rustc_feature::Features;
 use rustc_parse::parser::Parser;
 use rustc_parse::Directory;
+use rustc_session::parse::ParseSess;
 use rustc_span::edition::Edition;
 use rustc_span::hygiene::Transparency;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::Span;
 use syntax::ast;
-use syntax::attr::{self, TransparencyError};
-use syntax::print::pprust;
-use syntax::sess::ParseSess;
 use syntax::token::{self, NtTT, Token, TokenKind::*};
 use syntax::tokenstream::{DelimSpan, TokenStream};
 
diff --git a/src/librustc_expand/mbe/quoted.rs b/src/librustc_expand/mbe/quoted.rs
index 4a33c51d573..9ae8ead1a72 100644
--- a/src/librustc_expand/mbe/quoted.rs
+++ b/src/librustc_expand/mbe/quoted.rs
@@ -1,10 +1,10 @@
 use crate::mbe::macro_parser;
 use crate::mbe::{Delimited, KleeneOp, KleeneToken, SequenceRepetition, TokenTree};
 
+use rustc_ast_pretty::pprust;
+use rustc_session::parse::ParseSess;
 use rustc_span::symbol::kw;
 use syntax::ast;
-use syntax::print::pprust;
-use syntax::sess::ParseSess;
 use syntax::token::{self, Token};
 use syntax::tokenstream;
 
diff --git a/src/librustc_expand/mut_visit/tests.rs b/src/librustc_expand/mut_visit/tests.rs
index 003ce0fcb1f..49b9a1b1025 100644
--- a/src/librustc_expand/mut_visit/tests.rs
+++ b/src/librustc_expand/mut_visit/tests.rs
@@ -1,8 +1,8 @@
 use crate::tests::{matches_codepattern, string_to_crate};
 
+use rustc_ast_pretty::pprust;
 use syntax::ast::{self, Ident};
 use syntax::mut_visit::{self, MutVisitor};
-use syntax::print::pprust;
 use syntax::with_default_globals;
 
 // This version doesn't care about getting comments or doc-strings in.
diff --git a/src/librustc_expand/parse/lexer/tests.rs b/src/librustc_expand/parse/lexer/tests.rs
index 2ef81d80a14..c486839dad5 100644
--- a/src/librustc_expand/parse/lexer/tests.rs
+++ b/src/librustc_expand/parse/lexer/tests.rs
@@ -1,10 +1,10 @@
 use rustc_data_structures::sync::Lrc;
 use rustc_errors::{emitter::EmitterWriter, Handler};
 use rustc_parse::lexer::StringReader;
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::{FilePathMapping, SourceMap};
 use rustc_span::symbol::Symbol;
 use rustc_span::{BytePos, Span};
-use syntax::sess::ParseSess;
 use syntax::token::{self, Token, TokenKind};
 use syntax::util::comments::is_doc_comment;
 use syntax::with_default_globals;
diff --git a/src/librustc_expand/parse/tests.rs b/src/librustc_expand/parse/tests.rs
index b79e2894126..3641f03cb30 100644
--- a/src/librustc_expand/parse/tests.rs
+++ b/src/librustc_expand/parse/tests.rs
@@ -1,14 +1,14 @@
 use crate::tests::{matches_codepattern, string_to_stream, with_error_checking_parse};
 
+use rustc_ast_pretty::pprust::item_to_string;
 use rustc_errors::PResult;
 use rustc_parse::new_parser_from_source_str;
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::FilePathMapping;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::{BytePos, FileName, Pos, Span};
 use syntax::ast::{self, Name, PatKind};
-use syntax::print::pprust::item_to_string;
 use syntax::ptr::P;
-use syntax::sess::ParseSess;
 use syntax::token::{self, Token};
 use syntax::tokenstream::{DelimSpan, TokenStream, TokenTree};
 use syntax::visit;
diff --git a/src/librustc_expand/proc_macro_server.rs b/src/librustc_expand/proc_macro_server.rs
index d441613ac58..a7397e576b1 100644
--- a/src/librustc_expand/proc_macro_server.rs
+++ b/src/librustc_expand/proc_macro_server.rs
@@ -1,14 +1,14 @@
 use crate::base::ExtCtxt;
 
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::sync::Lrc;
 use rustc_errors::Diagnostic;
 use rustc_parse::lexer::nfc_normalize;
 use rustc_parse::{nt_to_tokenstream, parse_stream_from_source_str};
+use rustc_session::parse::ParseSess;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::{BytePos, FileName, MultiSpan, Pos, SourceFile, Span};
 use syntax::ast;
-use syntax::print::pprust;
-use syntax::sess::ParseSess;
 use syntax::token;
 use syntax::tokenstream::{self, DelimSpan, IsJoint::*, TokenStream, TreeAndJoint};
 use syntax::util::comments;
diff --git a/src/librustc_expand/tests.rs b/src/librustc_expand/tests.rs
index 82ab74ac150..4ed60465f24 100644
--- a/src/librustc_expand/tests.rs
+++ b/src/librustc_expand/tests.rs
@@ -1,8 +1,8 @@
 use rustc_parse::{new_parser_from_source_str, parser::Parser, source_file_to_stream};
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::{FilePathMapping, SourceMap};
 use rustc_span::{BytePos, MultiSpan, Span};
 use syntax::ast;
-use syntax::sess::ParseSess;
 use syntax::tokenstream::TokenStream;
 use syntax::with_default_globals;
 
diff --git a/src/librustc_hir/Cargo.toml b/src/librustc_hir/Cargo.toml
index f2e420dbae6..3ae943a4ce0 100644
--- a/src/librustc_hir/Cargo.toml
+++ b/src/librustc_hir/Cargo.toml
@@ -10,6 +10,7 @@ path = "lib.rs"
 doctest = false
 
 [dependencies]
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
 rustc_target = { path = "../librustc_target" }
 rustc_macros = { path = "../librustc_macros" }
 rustc_data_structures = { path = "../librustc_data_structures" }
@@ -17,6 +18,5 @@ rustc_index = { path = "../librustc_index" }
 rustc_span = { path = "../librustc_span" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_serialize = { path = "../libserialize", package = "serialize" }
-rustc_session = { path = "../librustc_session" }
 syntax = { path = "../libsyntax" }
 smallvec = { version = "1.0", features = ["union", "may_dangle"] }
diff --git a/src/librustc_hir/hir.rs b/src/librustc_hir/hir.rs
index b62a7e413e3..0db75454aee 100644
--- a/src/librustc_hir/hir.rs
+++ b/src/librustc_hir/hir.rs
@@ -12,21 +12,22 @@ use rustc_data_structures::fx::FxHashSet;
 use rustc_data_structures::sync::{par_for_each_in, Send, Sync};
 use rustc_errors::FatalError;
 use rustc_macros::HashStable_Generic;
-use rustc_session::node_id::NodeMap;
 use rustc_span::source_map::{SourceMap, Spanned};
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::{MultiSpan, Span, DUMMY_SP};
 use rustc_target::spec::abi::Abi;
-use smallvec::SmallVec;
-use std::collections::{BTreeMap, BTreeSet};
-use std::fmt;
 use syntax::ast::{self, AsmDialect, CrateSugar, Ident, Name, NodeId};
 use syntax::ast::{AttrVec, Attribute, FloatTy, IntTy, Label, LitKind, StrStyle, UintTy};
 pub use syntax::ast::{BorrowKind, ImplPolarity, IsAuto};
 pub use syntax::ast::{CaptureBy, Constness, Movability, Mutability, Unsafety};
+use syntax::node_id::NodeMap;
 use syntax::tokenstream::TokenStream;
 use syntax::util::parser::ExprPrecedence;
 
+use smallvec::SmallVec;
+use std::collections::{BTreeMap, BTreeSet};
+use std::fmt;
+
 #[derive(Copy, Clone, RustcEncodable, RustcDecodable, HashStable_Generic)]
 pub struct Lifetime {
     pub hir_id: HirId,
diff --git a/src/librustc_hir/print.rs b/src/librustc_hir/print.rs
index b9598c93761..b0d2f96c71a 100644
--- a/src/librustc_hir/print.rs
+++ b/src/librustc_hir/print.rs
@@ -1,12 +1,11 @@
+use rustc_ast_pretty::pp::Breaks::{Consistent, Inconsistent};
+use rustc_ast_pretty::pp::{self, Breaks};
+use rustc_ast_pretty::pprust::{self, Comments, PrintState};
 use rustc_span::source_map::{SourceMap, Spanned};
 use rustc_span::symbol::kw;
 use rustc_span::{self, BytePos, FileName};
 use rustc_target::spec::abi::Abi;
 use syntax::ast;
-use syntax::print::pp::Breaks::{Consistent, Inconsistent};
-use syntax::print::pp::{self, Breaks};
-use syntax::print::pprust::{self, Comments, PrintState};
-use syntax::sess::ParseSess;
 use syntax::util::parser::{self, AssocOp, Fixity};
 
 use crate::hir;
@@ -142,13 +141,12 @@ pub const INDENT_UNIT: usize = 4;
 /// it can scan the input text for comments to copy forward.
 pub fn print_crate<'a>(
     cm: &'a SourceMap,
-    sess: &ParseSess,
     krate: &hir::Crate<'_>,
     filename: FileName,
     input: String,
     ann: &'a dyn PpAnn,
 ) -> String {
-    let mut s = State::new_from_input(cm, sess, filename, input, ann);
+    let mut s = State::new_from_input(cm, filename, input, ann);
 
     // When printing the AST, we sometimes need to inject `#[no_std]` here.
     // Since you can't compile the HIR, it's not necessary.
@@ -161,12 +159,11 @@ pub fn print_crate<'a>(
 impl<'a> State<'a> {
     pub fn new_from_input(
         cm: &'a SourceMap,
-        sess: &ParseSess,
         filename: FileName,
         input: String,
         ann: &'a dyn PpAnn,
     ) -> State<'a> {
-        State { s: pp::mk_printer(), comments: Some(Comments::new(cm, sess, filename, input)), ann }
+        State { s: pp::mk_printer(), comments: Some(Comments::new(cm, filename, input)), ann }
     }
 }
 
diff --git a/src/librustc_interface/Cargo.toml b/src/librustc_interface/Cargo.toml
index 1fe5248dbf4..de7a9f4f5af 100644
--- a/src/librustc_interface/Cargo.toml
+++ b/src/librustc_interface/Cargo.toml
@@ -14,6 +14,7 @@ log = "0.4"
 rayon = { version = "0.3.0", package = "rustc-rayon" }
 smallvec = { version = "1.0", features = ["union", "may_dangle"] }
 syntax = { path = "../libsyntax" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_builtin_macros = { path = "../librustc_builtin_macros" }
 rustc_expand = { path = "../librustc_expand" }
 rustc_parse = { path = "../librustc_parse" }
diff --git a/src/librustc_interface/interface.rs b/src/librustc_interface/interface.rs
index 9cd9eb66cf6..2a667541ad3 100644
--- a/src/librustc_interface/interface.rs
+++ b/src/librustc_interface/interface.rs
@@ -14,13 +14,13 @@ use rustc_data_structures::OnDrop;
 use rustc_errors::registry::Registry;
 use rustc_lint::LintStore;
 use rustc_parse::new_parser_from_source_str;
+use rustc_session::parse::{CrateConfig, ParseSess};
 use rustc_span::edition;
 use rustc_span::source_map::{FileLoader, FileName, SourceMap};
 use std::path::PathBuf;
 use std::result;
 use std::sync::{Arc, Mutex};
-use syntax::ast::{self, MetaItemKind};
-use syntax::sess::ParseSess;
+use syntax::ast::MetaItemKind;
 use syntax::token;
 
 pub type Result<T> = result::Result<T, ErrorReported>;
@@ -106,7 +106,7 @@ pub fn parse_cfgspecs(cfgspecs: Vec<String>) -> FxHashSet<(String, Option<String
 
                 error!(r#"expected `key` or `key="value"`"#);
             })
-            .collect::<ast::CrateConfig>();
+            .collect::<CrateConfig>();
         cfg.into_iter().map(|(a, b)| (a.to_string(), b.map(|b| b.to_string()))).collect()
     })
 }
diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs
index d62c7539d5f..c22c00e9154 100644
--- a/src/librustc_interface/passes.rs
+++ b/src/librustc_interface/passes.rs
@@ -40,7 +40,6 @@ use rustc_span::FileName;
 use rustc_traits;
 use rustc_typeck as typeck;
 use syntax::mut_visit::MutVisitor;
-use syntax::util::node_count::NodeCounter;
 use syntax::{self, ast, visit};
 
 use rustc_serialize::json;
@@ -83,7 +82,7 @@ pub fn parse<'a>(sess: &'a Session, input: &Input) -> PResult<'a, ast::Crate> {
 }
 
 fn count_nodes(krate: &ast::Crate) -> usize {
-    let mut counter = NodeCounter::new();
+    let mut counter = rustc_ast_passes::node_count::NodeCounter::new();
     visit::walk_crate(&mut counter, krate);
     counter.count
 }
diff --git a/src/librustc_interface/util.rs b/src/librustc_interface/util.rs
index 00528eca923..3052c9fc26f 100644
--- a/src/librustc_interface/util.rs
+++ b/src/librustc_interface/util.rs
@@ -14,6 +14,7 @@ use rustc_resolve::{self, Resolver};
 use rustc_session as session;
 use rustc_session::config::{ErrorOutputType, Input, OutputFilenames};
 use rustc_session::lint::{BuiltinLintDiagnostics, LintBuffer};
+use rustc_session::parse::CrateConfig;
 use rustc_session::CrateDisambiguator;
 use rustc_session::{config, early_error, filesearch, DiagnosticOutput, Session};
 use rustc_span::edition::Edition;
@@ -32,7 +33,7 @@ use syntax::ast::{AttrVec, BlockCheckMode};
 use syntax::mut_visit::{visit_clobber, MutVisitor, *};
 use syntax::ptr::P;
 use syntax::util::lev_distance::find_best_match_for_name;
-use syntax::{self, ast, attr};
+use syntax::{self, ast};
 
 /// Adds `target_feature = "..."` cfgs for a variety of platform
 /// specific features (SSE, NEON etc.).
@@ -40,7 +41,7 @@ use syntax::{self, ast, attr};
 /// This is performed by checking whether a whitelisted set of
 /// features is available on the target machine, by querying LLVM.
 pub fn add_configuration(
-    cfg: &mut ast::CrateConfig,
+    cfg: &mut CrateConfig,
     sess: &Session,
     codegen_backend: &dyn CodegenBackend,
 ) {
@@ -547,7 +548,7 @@ pub fn build_output_filenames(
                 .opts
                 .crate_name
                 .clone()
-                .or_else(|| attr::find_crate_name(attrs).map(|n| n.to_string()))
+                .or_else(|| rustc_attr::find_crate_name(attrs).map(|n| n.to_string()))
                 .unwrap_or_else(|| input.filestem().to_owned());
 
             OutputFilenames::new(
diff --git a/src/librustc_lint/Cargo.toml b/src/librustc_lint/Cargo.toml
index 7e23e705779..27df0f904e4 100644
--- a/src/librustc_lint/Cargo.toml
+++ b/src/librustc_lint/Cargo.toml
@@ -12,6 +12,8 @@ path = "lib.rs"
 log = "0.4"
 unicode-security = "0.0.2"
 rustc = { path = "../librustc" }
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_hir = { path = "../librustc_hir" }
 rustc_target = { path = "../librustc_target" }
diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs
index c8d3d5f9c83..345665de63c 100644
--- a/src/librustc_lint/builtin.rs
+++ b/src/librustc_lint/builtin.rs
@@ -25,6 +25,7 @@ use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext}
 use rustc::hir::map::Map;
 use rustc::traits::misc::can_type_implement_copy;
 use rustc::ty::{self, layout::VariantIdx, Ty, TyCtxt};
+use rustc_ast_pretty::pprust::{self, expr_to_string};
 use rustc_data_structures::fx::FxHashSet;
 use rustc_errors::{Applicability, DiagnosticBuilder};
 use rustc_feature::Stability;
@@ -41,7 +42,6 @@ use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::{BytePos, Span};
 use syntax::ast::{self, Expr};
 use syntax::attr::{self, HasAttrs};
-use syntax::print::pprust::{self, expr_to_string};
 use syntax::tokenstream::{TokenStream, TokenTree};
 use syntax::visit::FnKind;
 
diff --git a/src/librustc_lint/levels.rs b/src/librustc_lint/levels.rs
index d5bbdc53160..4f30d2b2226 100644
--- a/src/librustc_lint/levels.rs
+++ b/src/librustc_lint/levels.rs
@@ -1,23 +1,22 @@
 use crate::context::{CheckLintNameResult, LintStore};
 use crate::late::unerased_lint_store;
 use rustc::hir::map::Map;
-use rustc::lint::struct_lint_level;
-use rustc::lint::{LintLevelMap, LintLevelSets, LintSet, LintSource};
+use rustc::lint::{struct_lint_level, LintLevelMap, LintLevelSets, LintSet, LintSource};
 use rustc::ty::query::Providers;
 use rustc::ty::TyCtxt;
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder};
 use rustc_hir as hir;
 use rustc_hir::def_id::{CrateNum, LOCAL_CRATE};
-use rustc_hir::hir_id::HirId;
-use rustc_hir::intravisit;
+use rustc_hir::{intravisit, HirId};
 use rustc_session::lint::{builtin, Level, Lint};
+use rustc_session::parse::feature_err;
 use rustc_session::Session;
-use rustc_span::{sym, MultiSpan, Symbol};
+use rustc_span::source_map::MultiSpan;
+use rustc_span::symbol::{sym, Symbol};
 use syntax::ast;
 use syntax::attr;
-use syntax::print::pprust;
-use syntax::sess::feature_err;
 use syntax::unwrap_or;
 
 use std::cmp;
diff --git a/src/librustc_lint/nonstandard_style.rs b/src/librustc_lint/nonstandard_style.rs
index 394da4a5bb0..6fdbfea7f03 100644
--- a/src/librustc_lint/nonstandard_style.rs
+++ b/src/librustc_lint/nonstandard_style.rs
@@ -1,5 +1,6 @@
 use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext};
 use rustc::ty;
+use rustc_attr as attr;
 use rustc_errors::Applicability;
 use rustc_hir as hir;
 use rustc_hir::def::{DefKind, Res};
@@ -9,7 +10,6 @@ use rustc_span::symbol::sym;
 use rustc_span::{symbol::Ident, BytePos, Span};
 use rustc_target::spec::abi::Abi;
 use syntax::ast;
-use syntax::attr;
 
 #[derive(PartialEq)]
 pub enum MethodLateContext {
diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs
index d96ba59d9a3..6bc6f58f3e7 100644
--- a/src/librustc_lint/types.rs
+++ b/src/librustc_lint/types.rs
@@ -5,6 +5,7 @@ use rustc::mir::interpret::{sign_extend, truncate};
 use rustc::ty::layout::{self, IntegerExt, LayoutOf, SizeSkeleton, VariantIdx};
 use rustc::ty::subst::SubstsRef;
 use rustc::ty::{self, AdtKind, ParamEnv, Ty, TyCtxt};
+use rustc_attr as attr;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_errors::Applicability;
 use rustc_hir as hir;
@@ -15,7 +16,7 @@ use rustc_span::source_map;
 use rustc_span::symbol::sym;
 use rustc_span::Span;
 use rustc_target::spec::abi::Abi;
-use syntax::{ast, attr};
+use syntax::ast;
 
 use log::debug;
 use std::cmp;
diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs
index bb2c4fa1aaf..272c4f29203 100644
--- a/src/librustc_lint/unused.rs
+++ b/src/librustc_lint/unused.rs
@@ -1,6 +1,7 @@
 use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext};
 use rustc::ty::adjustment;
 use rustc::ty::{self, Ty};
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_errors::{pluralize, Applicability};
 use rustc_feature::{AttributeType, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
@@ -13,7 +14,6 @@ use rustc_span::symbol::{kw, sym};
 use rustc_span::{BytePos, Span};
 use syntax::ast;
 use syntax::attr;
-use syntax::print::pprust;
 use syntax::util::parser;
 
 use log::debug;
diff --git a/src/librustc_metadata/Cargo.toml b/src/librustc_metadata/Cargo.toml
index 6da584733ae..a4fdcee5e12 100644
--- a/src/librustc_metadata/Cargo.toml
+++ b/src/librustc_metadata/Cargo.toml
@@ -15,6 +15,8 @@ log = "0.4"
 memmap = "0.7"
 smallvec = { version = "1.0", features = ["union", "may_dangle"] }
 rustc = { path = "../librustc" }
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_hir = { path = "../librustc_hir" }
diff --git a/src/librustc_metadata/native_libs.rs b/src/librustc_metadata/native_libs.rs
index bbf6973be51..2fa9cb099dd 100644
--- a/src/librustc_metadata/native_libs.rs
+++ b/src/librustc_metadata/native_libs.rs
@@ -2,6 +2,7 @@ use rustc::middle::cstore::{self, NativeLibrary};
 use rustc::session::parse::feature_err;
 use rustc::session::Session;
 use rustc::ty::TyCtxt;
+use rustc_attr as attr;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_errors::struct_span_err;
 use rustc_hir as hir;
@@ -9,7 +10,6 @@ use rustc_hir::itemlikevisit::ItemLikeVisitor;
 use rustc_span::source_map::Span;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_target::spec::abi::Abi;
-use syntax::attr;
 
 crate fn collect(tcx: TyCtxt<'_>) -> Vec<NativeLibrary> {
     let mut collector = Collector { tcx, libs: Vec::new() };
diff --git a/src/librustc_metadata/rmeta/decoder.rs b/src/librustc_metadata/rmeta/decoder.rs
index 6280121f655..58cf142ab3a 100644
--- a/src/librustc_metadata/rmeta/decoder.rs
+++ b/src/librustc_metadata/rmeta/decoder.rs
@@ -34,6 +34,7 @@ use std::u32;
 
 use log::debug;
 use proc_macro::bridge::client::ProcMacro;
+use rustc_attr as attr;
 use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind};
 use rustc_expand::proc_macro::{AttrProcMacro, BangProcMacro, ProcMacroDerive};
 use rustc_serialize::{opaque, Decodable, Decoder, SpecializedDecoder};
@@ -41,7 +42,6 @@ use rustc_span::source_map::{self, respan, Spanned};
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::{self, hygiene::MacroKind, BytePos, Pos, Span, DUMMY_SP};
 use syntax::ast::{self, Ident};
-use syntax::attr;
 
 pub use cstore_impl::{provide, provide_extern};
 
diff --git a/src/librustc_metadata/rmeta/encoder.rs b/src/librustc_metadata/rmeta/encoder.rs
index 9d2bea28c8c..54fbdb14010 100644
--- a/src/librustc_metadata/rmeta/encoder.rs
+++ b/src/librustc_metadata/rmeta/encoder.rs
@@ -1236,7 +1236,7 @@ impl EncodeContext<'tcx> {
 
     /// Serialize the text of exported macros
     fn encode_info_for_macro_def(&mut self, macro_def: &hir::MacroDef<'_>) {
-        use syntax::print::pprust;
+        use rustc_ast_pretty::pprust;
         let def_id = self.tcx.hir().local_def_id(macro_def.hir_id);
         record!(self.per_def.kind[def_id] <- EntryKind::MacroDef(self.lazy(MacroDef {
             body: pprust::tts_to_string(macro_def.body.clone()),
diff --git a/src/librustc_metadata/rmeta/mod.rs b/src/librustc_metadata/rmeta/mod.rs
index 426ea62b8cd..77ec3eb4555 100644
--- a/src/librustc_metadata/rmeta/mod.rs
+++ b/src/librustc_metadata/rmeta/mod.rs
@@ -10,6 +10,7 @@ use rustc::mir;
 use rustc::session::config::SymbolManglingVersion;
 use rustc::session::CrateDisambiguator;
 use rustc::ty::{self, ReprOptions, Ty};
+use rustc_attr as attr;
 use rustc_data_structures::svh::Svh;
 use rustc_data_structures::sync::MetadataRef;
 use rustc_hir as hir;
@@ -21,7 +22,7 @@ use rustc_span::edition::Edition;
 use rustc_span::symbol::Symbol;
 use rustc_span::{self, Span};
 use rustc_target::spec::{PanicStrategy, TargetTriple};
-use syntax::{ast, attr};
+use syntax::ast;
 
 use std::marker::PhantomData;
 use std::num::NonZeroUsize;
diff --git a/src/librustc_mir/Cargo.toml b/src/librustc_mir/Cargo.toml
index 00881e3ea6f..6b2e2bb919c 100644
--- a/src/librustc_mir/Cargo.toml
+++ b/src/librustc_mir/Cargo.toml
@@ -17,6 +17,8 @@ log = "0.4"
 log_settings = "0.1.1"
 polonius-engine = "0.11.0"
 rustc = { path = "../librustc" }
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_hir = { path = "../librustc_hir" }
diff --git a/src/librustc_mir/const_eval/fn_queries.rs b/src/librustc_mir/const_eval/fn_queries.rs
index 5eeb92f583b..4144bbc41d2 100644
--- a/src/librustc_mir/const_eval/fn_queries.rs
+++ b/src/librustc_mir/const_eval/fn_queries.rs
@@ -1,11 +1,11 @@
 use rustc::hir::map::blocks::FnLikeNode;
 use rustc::ty::query::Providers;
 use rustc::ty::TyCtxt;
+use rustc_attr as attr;
 use rustc_hir as hir;
 use rustc_hir::def_id::DefId;
 use rustc_span::symbol::Symbol;
 use rustc_target::spec::abi::Abi;
-use syntax::attr;
 
 /// Whether the `def_id` counts as const fn in your current crate, considering all active
 /// feature gates
diff --git a/src/librustc_mir/dataflow/mod.rs b/src/librustc_mir/dataflow/mod.rs
index e29730f267c..7cd7fc309b6 100644
--- a/src/librustc_mir/dataflow/mod.rs
+++ b/src/librustc_mir/dataflow/mod.rs
@@ -1,6 +1,6 @@
+use rustc_ast_pretty::pprust;
 use rustc_span::symbol::{sym, Symbol};
 use syntax::ast::{self, MetaItem};
-use syntax::print::pprust;
 
 use rustc_data_structures::work_queue::WorkQueue;
 use rustc_index::bit_set::{BitSet, HybridBitSet};
diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
index 56b6fa68e18..a3cafcb5763 100644
--- a/src/librustc_mir/transform/inline.rs
+++ b/src/librustc_mir/transform/inline.rs
@@ -16,8 +16,8 @@ use crate::transform::{MirPass, MirSource};
 use std::collections::VecDeque;
 use std::iter;
 
+use rustc_attr as attr;
 use rustc_target::spec::abi::Abi;
-use syntax::attr;
 
 const DEFAULT_THRESHOLD: usize = 50;
 const HINT_THRESHOLD: usize = 100;
diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs
index 49921badf33..6a68ccdddff 100644
--- a/src/librustc_mir/transform/qualify_min_const_fn.rs
+++ b/src/librustc_mir/transform/qualify_min_const_fn.rs
@@ -1,11 +1,12 @@
 use rustc::mir::*;
 use rustc::ty::{self, adjustment::PointerCast, Predicate, Ty, TyCtxt};
+use rustc_attr as attr;
 use rustc_hir as hir;
 use rustc_hir::def_id::DefId;
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::Span;
 use std::borrow::Cow;
-use syntax::{ast, attr};
+use syntax::ast;
 
 type McfResult = Result<(), (Span, Cow<'static, str>)>;
 
diff --git a/src/librustc_mir_build/Cargo.toml b/src/librustc_mir_build/Cargo.toml
index a22c4d18d51..9ff3ed1a935 100644
--- a/src/librustc_mir_build/Cargo.toml
+++ b/src/librustc_mir_build/Cargo.toml
@@ -15,6 +15,7 @@ itertools = "0.8"
 log = "0.4"
 rustc = { path = "../librustc" }
 rustc_apfloat = { path = "../librustc_apfloat" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_index = { path = "../librustc_index" }
 rustc_errors = { path = "../librustc_errors" }
diff --git a/src/librustc_mir_build/build/matches/simplify.rs b/src/librustc_mir_build/build/matches/simplify.rs
index fb3babca32b..77bbce2d37a 100644
--- a/src/librustc_mir_build/build/matches/simplify.rs
+++ b/src/librustc_mir_build/build/matches/simplify.rs
@@ -18,8 +18,8 @@ use crate::hair::{self, *};
 use rustc::mir::interpret::truncate;
 use rustc::ty;
 use rustc::ty::layout::{Integer, IntegerExt, Size};
+use rustc_attr::{SignedInt, UnsignedInt};
 use rustc_hir::RangeEnd;
-use syntax::attr::{SignedInt, UnsignedInt};
 
 use std::mem;
 
diff --git a/src/librustc_mir_build/build/mod.rs b/src/librustc_mir_build/build/mod.rs
index fa5f266c76b..1f536b63a39 100644
--- a/src/librustc_mir_build/build/mod.rs
+++ b/src/librustc_mir_build/build/mod.rs
@@ -7,6 +7,7 @@ use rustc::middle::region;
 use rustc::mir::*;
 use rustc::ty::subst::Subst;
 use rustc::ty::{self, Ty, TyCtxt};
+use rustc_attr::{self as attr, UnwindAttr};
 use rustc_hir as hir;
 use rustc_hir::def_id::DefId;
 use rustc_hir::{GeneratorKind, HirIdMap, Node};
@@ -16,7 +17,6 @@ use rustc_span::Span;
 use rustc_target::spec::abi::Abi;
 use rustc_target::spec::PanicStrategy;
 use std::u32;
-use syntax::attr::{self, UnwindAttr};
 
 use super::lints;
 
diff --git a/src/librustc_mir_build/hair/pattern/_match.rs b/src/librustc_mir_build/hair/pattern/_match.rs
index 08ed6b521b5..4f0e5bb4582 100644
--- a/src/librustc_mir_build/hair/pattern/_match.rs
+++ b/src/librustc_mir_build/hair/pattern/_match.rs
@@ -245,8 +245,8 @@ use rustc::mir::interpret::{truncate, AllocId, ConstValue, Pointer, Scalar};
 use rustc::mir::Field;
 use rustc::util::common::ErrorReported;
 
+use rustc_attr::{SignedInt, UnsignedInt};
 use rustc_span::{Span, DUMMY_SP};
-use syntax::attr::{SignedInt, UnsignedInt};
 
 use arena::TypedArena;
 
diff --git a/src/librustc_mir_build/hair/pattern/mod.rs b/src/librustc_mir_build/hair/pattern/mod.rs
index 26570505830..bd8a9877719 100644
--- a/src/librustc_mir_build/hair/pattern/mod.rs
+++ b/src/librustc_mir_build/hair/pattern/mod.rs
@@ -1036,7 +1036,7 @@ crate fn compare_const_vals<'tcx>(
             }
             ty::Int(ity) => {
                 use rustc::ty::layout::{Integer, IntegerExt};
-                use syntax::attr::SignedInt;
+                use rustc_attr::SignedInt;
                 let size = Integer::from_attr(&tcx, SignedInt(ity)).size();
                 let a = sign_extend(a, size);
                 let b = sign_extend(b, size);
diff --git a/src/librustc_parse/Cargo.toml b/src/librustc_parse/Cargo.toml
index 8071bc6312b..176bb58ad27 100644
--- a/src/librustc_parse/Cargo.toml
+++ b/src/librustc_parse/Cargo.toml
@@ -12,6 +12,8 @@ doctest = false
 [dependencies]
 bitflags = "1.0"
 log = "0.4"
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_feature = { path = "../librustc_feature" }
 rustc_lexer = { path = "../librustc_lexer" }
diff --git a/src/librustc_parse/config.rs b/src/librustc_parse/config.rs
index da158e17f25..0edd56680f9 100644
--- a/src/librustc_parse/config.rs
+++ b/src/librustc_parse/config.rs
@@ -9,21 +9,21 @@
 //! [#64197]: https://github.com/rust-lang/rust/issues/64197
 
 use crate::{parse_in, validate_attr};
+use rustc_attr as attr;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_errors::{error_code, struct_span_err, Applicability, Handler};
 use rustc_feature::{Feature, Features, State as FeatureState};
 use rustc_feature::{
     ACCEPTED_FEATURES, ACTIVE_FEATURES, REMOVED_FEATURES, STABLE_REMOVED_FEATURES,
 };
+use rustc_session::parse::{feature_err, ParseSess};
 use rustc_span::edition::{Edition, ALL_EDITIONS};
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::{Span, DUMMY_SP};
 use syntax::ast::{self, AttrItem, Attribute, MetaItem};
-use syntax::attr;
 use syntax::attr::HasAttrs;
 use syntax::mut_visit::*;
 use syntax::ptr::P;
-use syntax::sess::{feature_err, ParseSess};
 use syntax::util::map_in_place::MapInPlace;
 
 use smallvec::SmallVec;
diff --git a/src/librustc_parse/lexer/mod.rs b/src/librustc_parse/lexer/mod.rs
index 02e4808679f..af56e9d344d 100644
--- a/src/librustc_parse/lexer/mod.rs
+++ b/src/librustc_parse/lexer/mod.rs
@@ -2,9 +2,9 @@ use rustc_data_structures::sync::Lrc;
 use rustc_errors::{DiagnosticBuilder, FatalError};
 use rustc_lexer::unescape;
 use rustc_lexer::Base;
+use rustc_session::parse::ParseSess;
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::{BytePos, Pos, Span};
-use syntax::sess::ParseSess;
 use syntax::token::{self, Token, TokenKind};
 use syntax::util::comments;
 
diff --git a/src/librustc_parse/lexer/tokentrees.rs b/src/librustc_parse/lexer/tokentrees.rs
index a28bff3babf..c28b59a7908 100644
--- a/src/librustc_parse/lexer/tokentrees.rs
+++ b/src/librustc_parse/lexer/tokentrees.rs
@@ -1,9 +1,9 @@
 use super::{StringReader, UnmatchedBrace};
 
+use rustc_ast_pretty::pprust::token_to_string;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_errors::PResult;
 use rustc_span::Span;
-use syntax::print::pprust::token_to_string;
 use syntax::token::{self, Token};
 use syntax::tokenstream::{
     DelimSpan,
diff --git a/src/librustc_parse/lib.rs b/src/librustc_parse/lib.rs
index 08f4f210152..bf0f8ff0064 100644
--- a/src/librustc_parse/lib.rs
+++ b/src/librustc_parse/lib.rs
@@ -4,15 +4,14 @@
 #![feature(crate_visibility_modifier)]
 #![cfg_attr(bootstrap, feature(slice_patterns))]
 
-use syntax::ast;
-use syntax::print::pprust;
-use syntax::sess::ParseSess;
-use syntax::token::{self, Nonterminal};
-use syntax::tokenstream::{self, TokenStream, TokenTree};
-
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::sync::Lrc;
 use rustc_errors::{Diagnostic, FatalError, Level, PResult};
+use rustc_session::parse::ParseSess;
 use rustc_span::{FileName, SourceFile, Span};
+use syntax::ast;
+use syntax::token::{self, Nonterminal};
+use syntax::tokenstream::{self, TokenStream, TokenTree};
 
 use std::borrow::Cow;
 use std::path::Path;
diff --git a/src/librustc_parse/parser/attr.rs b/src/librustc_parse/parser/attr.rs
index 1869389dbd9..e58eb9ffc51 100644
--- a/src/librustc_parse/parser/attr.rs
+++ b/src/librustc_parse/parser/attr.rs
@@ -1,9 +1,9 @@
 use super::{Parser, PathStyle, TokenType};
+use rustc_ast_pretty::pprust;
 use rustc_errors::PResult;
 use rustc_span::{Span, Symbol};
 use syntax::ast;
 use syntax::attr;
-use syntax::print::pprust;
 use syntax::token::{self, Nonterminal};
 use syntax::util::comments;
 
diff --git a/src/librustc_parse/parser/diagnostics.rs b/src/librustc_parse/parser/diagnostics.rs
index 80bc5c158a6..e2227f66973 100644
--- a/src/librustc_parse/parser/diagnostics.rs
+++ b/src/librustc_parse/parser/diagnostics.rs
@@ -1,5 +1,6 @@
 use super::{BlockMode, Parser, PathStyle, SemiColonMode, SeqSep, TokenExpectType, TokenType};
 
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_errors::{pluralize, struct_span_err};
 use rustc_errors::{Applicability, DiagnosticBuilder, Handler, PResult};
@@ -10,7 +11,6 @@ use syntax::ast::{
     self, BinOpKind, BindingMode, BlockCheckMode, Expr, ExprKind, Ident, Item, Param,
 };
 use syntax::ast::{AttrVec, ItemKind, Mutability, Pat, PatKind, PathSegment, QSelf, Ty, TyKind};
-use syntax::print::pprust;
 use syntax::ptr::P;
 use syntax::token::{self, token_can_begin_expr, TokenKind};
 use syntax::util::parser::AssocOp;
diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs
index 098c8355ab9..0d12f8cf6c0 100644
--- a/src/librustc_parse/parser/expr.rs
+++ b/src/librustc_parse/parser/expr.rs
@@ -3,6 +3,7 @@ use super::{BlockMode, Parser, PathStyle, PrevTokenKind, Restrictions, TokenType
 use super::{SemiColonMode, SeqSep, TokenExpectType};
 use crate::maybe_recover_from_interpolated_ty_qpath;
 
+use rustc_ast_pretty::pprust;
 use rustc_errors::{Applicability, PResult};
 use rustc_span::source_map::{self, Span, Spanned};
 use rustc_span::symbol::{kw, sym, Symbol};
@@ -12,7 +13,6 @@ use syntax::ast::{
     AnonConst, BinOp, BinOpKind, FnDecl, FunctionRetTy, Mac, Param, Ty, TyKind, UnOp,
 };
 use syntax::ast::{Arm, BlockCheckMode, Expr, ExprKind, IsAsync, Label, Movability, RangeLimits};
-use syntax::print::pprust;
 use syntax::ptr::P;
 use syntax::token::{self, Token, TokenKind};
 use syntax::util::classify;
diff --git a/src/librustc_parse/parser/item.rs b/src/librustc_parse/parser/item.rs
index 66116611323..7f15c403e9a 100644
--- a/src/librustc_parse/parser/item.rs
+++ b/src/librustc_parse/parser/item.rs
@@ -3,6 +3,7 @@ use super::{FollowedByType, Parser, PathStyle};
 
 use crate::maybe_whole;
 
+use rustc_ast_pretty::pprust;
 use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, PResult, StashKey};
 use rustc_span::source_map::{self, respan, Span};
 use rustc_span::symbol::{kw, sym, Symbol};
@@ -13,7 +14,6 @@ use syntax::ast::{BindingMode, Block, FnDecl, FnSig, Mac, MacArgs, MacDelimiter,
 use syntax::ast::{Constness, Defaultness, Extern, IsAsync, IsAuto, PathSegment, StrLit, Unsafety};
 use syntax::ast::{EnumDef, Generics, StructField, TraitRef, Ty, TyKind, Variant, VariantData};
 use syntax::ast::{FnHeader, ForeignItem, ForeignItemKind, Mutability, Visibility, VisibilityKind};
-use syntax::print::pprust;
 use syntax::ptr::P;
 use syntax::token;
 use syntax::tokenstream::{DelimSpan, TokenStream, TokenTree};
diff --git a/src/librustc_parse/parser/mod.rs b/src/librustc_parse/parser/mod.rs
index 4a9016394d2..1e28372c384 100644
--- a/src/librustc_parse/parser/mod.rs
+++ b/src/librustc_parse/parser/mod.rs
@@ -16,15 +16,15 @@ use crate::lexer::UnmatchedBrace;
 use crate::{Directory, DirectoryOwnership};
 
 use log::debug;
+use rustc_ast_pretty::pprust;
 use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, FatalError, PResult};
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::respan;
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::{BytePos, FileName, Span, DUMMY_SP};
 use syntax::ast::{self, AttrStyle, AttrVec, CrateSugar, Extern, Ident, Unsafety, DUMMY_NODE_ID};
 use syntax::ast::{IsAsync, MacArgs, MacDelimiter, Mutability, StrLit, Visibility, VisibilityKind};
-use syntax::print::pprust;
 use syntax::ptr::P;
-use syntax::sess::ParseSess;
 use syntax::token::{self, DelimToken, Token, TokenKind};
 use syntax::tokenstream::{self, DelimSpan, TokenStream, TokenTree, TreeAndJoint};
 use syntax::util::comments::{doc_comment_style, strip_doc_comment_decoration};
diff --git a/src/librustc_parse/parser/pat.rs b/src/librustc_parse/parser/pat.rs
index edb9044df92..e07b0733739 100644
--- a/src/librustc_parse/parser/pat.rs
+++ b/src/librustc_parse/parser/pat.rs
@@ -1,12 +1,12 @@
 use super::{Parser, PathStyle};
 use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole};
+use rustc_ast_pretty::pprust;
 use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, PResult};
 use rustc_span::source_map::{respan, Span, Spanned};
 use rustc_span::symbol::{kw, sym};
 use syntax::ast::{self, AttrVec, Attribute, FieldPat, Mac, Pat, PatKind, RangeEnd, RangeSyntax};
 use syntax::ast::{BindingMode, Expr, ExprKind, Ident, Mutability, Path, QSelf};
 use syntax::mut_visit::{noop_visit_mac, noop_visit_pat, MutVisitor};
-use syntax::print::pprust;
 use syntax::ptr::P;
 use syntax::token;
 
diff --git a/src/librustc_passes/Cargo.toml b/src/librustc_passes/Cargo.toml
index 338808f6d4a..981ef7f8796 100644
--- a/src/librustc_passes/Cargo.toml
+++ b/src/librustc_passes/Cargo.toml
@@ -11,6 +11,7 @@ path = "lib.rs"
 [dependencies]
 log = "0.4"
 rustc = { path = "../librustc" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_feature = { path = "../librustc_feature" }
diff --git a/src/librustc_passes/stability.rs b/src/librustc_passes/stability.rs
index db8109c2859..4009cc6d725 100644
--- a/src/librustc_passes/stability.rs
+++ b/src/librustc_passes/stability.rs
@@ -10,6 +10,7 @@ use rustc::session::Session;
 use rustc::traits::misc::can_type_implement_copy;
 use rustc::ty::query::Providers;
 use rustc::ty::TyCtxt;
+use rustc_attr::{self as attr, Stability};
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_errors::struct_span_err;
 use rustc_hir as hir;
@@ -20,7 +21,6 @@ use rustc_hir::{Generics, HirId, Item, StructField, Variant};
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::Span;
 use syntax::ast::Attribute;
-use syntax::attr::{self, Stability};
 
 use std::cmp::Ordering;
 use std::mem::replace;
diff --git a/src/librustc_privacy/Cargo.toml b/src/librustc_privacy/Cargo.toml
index 4f341b54515..2f7aaf9e5cf 100644
--- a/src/librustc_privacy/Cargo.toml
+++ b/src/librustc_privacy/Cargo.toml
@@ -10,6 +10,7 @@ path = "lib.rs"
 
 [dependencies]
 rustc = { path = "../librustc" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_hir = { path = "../librustc_hir" }
 rustc_typeck = { path = "../librustc_typeck" }
diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs
index 60bf271d2d2..74bb72d6fad 100644
--- a/src/librustc_privacy/lib.rs
+++ b/src/librustc_privacy/lib.rs
@@ -11,6 +11,7 @@ use rustc::ty::fold::TypeVisitor;
 use rustc::ty::query::Providers;
 use rustc::ty::subst::InternalSubsts;
 use rustc::ty::{self, GenericParamDefKind, TraitRef, Ty, TyCtxt, TypeFoldable};
+use rustc_attr as attr;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_errors::struct_span_err;
 use rustc_hir as hir;
@@ -22,7 +23,6 @@ use rustc_span::hygiene::Transparency;
 use rustc_span::symbol::{kw, sym};
 use rustc_span::Span;
 use syntax::ast::Ident;
-use syntax::attr;
 
 use std::marker::PhantomData;
 use std::{cmp, fmt, mem};
diff --git a/src/librustc_resolve/Cargo.toml b/src/librustc_resolve/Cargo.toml
index c4cc6b09c73..f8c96ecaf93 100644
--- a/src/librustc_resolve/Cargo.toml
+++ b/src/librustc_resolve/Cargo.toml
@@ -17,6 +17,8 @@ syntax = { path = "../libsyntax" }
 arena = { path = "../libarena" }
 rustc = { path = "../librustc" }
 rustc_ast_lowering = { path = "../librustc_ast_lowering" }
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_expand = { path = "../librustc_expand" }
diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs
index 7ff076268ab..c77b588d7fb 100644
--- a/src/librustc_resolve/build_reduced_graph.rs
+++ b/src/librustc_resolve/build_reduced_graph.rs
@@ -20,6 +20,7 @@ use rustc::bug;
 use rustc::hir::exports::Export;
 use rustc::middle::cstore::CrateStore;
 use rustc::ty;
+use rustc_attr as attr;
 use rustc_data_structures::sync::Lrc;
 use rustc_errors::{struct_span_err, Applicability};
 use rustc_expand::base::SyntaxExtension;
@@ -34,7 +35,6 @@ use rustc_span::{Span, DUMMY_SP};
 use syntax::ast::{self, Block, ForeignItem, ForeignItemKind, Item, ItemKind, NodeId};
 use syntax::ast::{AssocItem, AssocItemKind, MetaItemKind, StmtKind};
 use syntax::ast::{Ident, Name};
-use syntax::attr;
 use syntax::token::{self, Token};
 use syntax::visit::{self, Visitor};
 
diff --git a/src/librustc_resolve/check_unused.rs b/src/librustc_resolve/check_unused.rs
index 4a6df92d822..e8e3b685794 100644
--- a/src/librustc_resolve/check_unused.rs
+++ b/src/librustc_resolve/check_unused.rs
@@ -30,9 +30,9 @@ use rustc::{lint, ty};
 use rustc_data_structures::fx::FxHashSet;
 use rustc_errors::pluralize;
 use rustc_session::lint::BuiltinLintDiagnostics;
-use rustc_session::node_id::NodeMap;
 use rustc_span::{MultiSpan, Span, DUMMY_SP};
 use syntax::ast;
+use syntax::node_id::NodeMap;
 use syntax::visit::{self, Visitor};
 
 struct UnusedImport<'a> {
diff --git a/src/librustc_resolve/diagnostics.rs b/src/librustc_resolve/diagnostics.rs
index b762e0b08ac..f8e963192c9 100644
--- a/src/librustc_resolve/diagnostics.rs
+++ b/src/librustc_resolve/diagnostics.rs
@@ -4,6 +4,7 @@ use log::debug;
 use rustc::bug;
 use rustc::session::Session;
 use rustc::ty::{self, DefIdTree};
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_errors::{pluralize, struct_span_err, Applicability, DiagnosticBuilder};
 use rustc_feature::BUILTIN_ATTRIBUTES;
@@ -16,7 +17,6 @@ use rustc_span::source_map::SourceMap;
 use rustc_span::symbol::{kw, Symbol};
 use rustc_span::{BytePos, MultiSpan, Span};
 use syntax::ast::{self, Ident, Path};
-use syntax::print::pprust;
 use syntax::util::lev_distance::find_best_match_for_name;
 
 use crate::imports::{ImportDirective, ImportDirectiveSubclass, ImportResolver};
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index 0b1752419b8..402e25fcf48 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -25,6 +25,7 @@ use rustc::middle::cstore::{CrateStore, MetadataLoaderDyn};
 use rustc::span_bug;
 use rustc::ty::query::Providers;
 use rustc::ty::{self, DefIdTree, ResolverOutputs};
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap};
 use rustc_data_structures::ptr_key::PtrKey;
 use rustc_data_structures::sync::Lrc;
@@ -37,7 +38,6 @@ use rustc_hir::PrimTy::{self, Bool, Char, Float, Int, Str, Uint};
 use rustc_hir::{GlobMap, TraitMap};
 use rustc_metadata::creader::{CStore, CrateLoader};
 use rustc_session::lint::{BuiltinLintDiagnostics, LintBuffer};
-use rustc_session::node_id::{NodeMap, NodeSet};
 use rustc_session::Session;
 use rustc_span::hygiene::{ExpnId, ExpnKind, MacroKind, SyntaxContext, Transparency};
 use rustc_span::source_map::Spanned;
@@ -47,7 +47,7 @@ use syntax::ast::{self, FloatTy, Ident, IntTy, Name, NodeId, UintTy};
 use syntax::ast::{Crate, CRATE_NODE_ID};
 use syntax::ast::{ItemKind, Path};
 use syntax::attr;
-use syntax::print::pprust;
+use syntax::node_id::{NodeMap, NodeSet};
 use syntax::unwrap_or;
 use syntax::visit::{self, Visitor};
 
diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs
index 85b5d8ef1cb..11139a3dc94 100644
--- a/src/librustc_resolve/macros.rs
+++ b/src/librustc_resolve/macros.rs
@@ -10,6 +10,8 @@ use rustc::middle::stability;
 use rustc::session::parse::feature_err;
 use rustc::session::Session;
 use rustc::{lint, span_bug, ty};
+use rustc_ast_pretty::pprust;
+use rustc_attr::{self as attr, StabilityLevel};
 use rustc_data_structures::fx::FxHashSet;
 use rustc_expand::base::SyntaxExtension;
 use rustc_expand::base::{self, Indeterminate, InvocationRes};
@@ -23,8 +25,6 @@ use rustc_span::hygiene::{self, ExpnData, ExpnId, ExpnKind};
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::{Span, DUMMY_SP};
 use syntax::ast::{self, Ident, NodeId};
-use syntax::attr::{self, StabilityLevel};
-use syntax::print::pprust;
 
 use rustc_data_structures::sync::Lrc;
 use rustc_span::hygiene::{AstPass, MacroKind};
diff --git a/src/librustc_save_analysis/Cargo.toml b/src/librustc_save_analysis/Cargo.toml
index e7a7eefc509..2cbed75eaf5 100644
--- a/src/librustc_save_analysis/Cargo.toml
+++ b/src/librustc_save_analysis/Cargo.toml
@@ -11,6 +11,7 @@ path = "lib.rs"
 [dependencies]
 log = "0.4"
 rustc = { path = "../librustc" }
+rustc_ast_pretty = { path = "../librustc_ast_pretty" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_codegen_utils = { path = "../librustc_codegen_utils" }
 rustc_hir = { path = "../librustc_hir" }
diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs
index 2e3e06c36f2..09c261cdc23 100644
--- a/src/librustc_save_analysis/dump_visitor.rs
+++ b/src/librustc_save_analysis/dump_visitor.rs
@@ -16,22 +16,21 @@
 use rustc::session::config::Input;
 use rustc::span_bug;
 use rustc::ty::{self, DefIdTree, TyCtxt};
+use rustc_ast_pretty::pprust::{bounds_to_string, generic_params_to_string, ty_to_string};
 use rustc_data_structures::fx::FxHashSet;
 use rustc_hir::def::{DefKind as HirDefKind, Res};
 use rustc_hir::def_id::DefId;
-
-use std::env;
-use std::path::Path;
-
 use rustc_span::source_map::{respan, DUMMY_SP};
 use rustc_span::*;
 use syntax::ast::{self, Attribute, NodeId, PatKind};
-use syntax::print::pprust::{bounds_to_string, generic_params_to_string, ty_to_string};
 use syntax::ptr::P;
 use syntax::token;
 use syntax::visit::{self, Visitor};
 use syntax::walk_list;
 
+use std::env;
+use std::path::Path;
+
 use crate::dumper::{Access, Dumper};
 use crate::sig;
 use crate::span_utils::SpanUtils;
diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs
index f44ce6f4eac..89054441fa3 100644
--- a/src/librustc_save_analysis/lib.rs
+++ b/src/librustc_save_analysis/lib.rs
@@ -13,11 +13,17 @@ use rustc::middle::privacy::AccessLevels;
 use rustc::session::config::{CrateType, Input, OutputType};
 use rustc::ty::{self, DefIdTree, TyCtxt};
 use rustc::{bug, span_bug};
+use rustc_ast_pretty::pprust::{self, param_to_string, ty_to_string};
 use rustc_codegen_utils::link::{filename_for_metadata, out_filename};
 use rustc_hir as hir;
 use rustc_hir::def::{CtorOf, DefKind as HirDefKind, Res};
 use rustc_hir::def_id::{DefId, LOCAL_CRATE};
 use rustc_hir::Node;
+use rustc_span::source_map::Spanned;
+use rustc_span::*;
+use syntax::ast::{self, Attribute, NodeId, PatKind, DUMMY_NODE_ID};
+use syntax::util::comments::strip_doc_comment_decoration;
+use syntax::visit::{self, Visitor};
 
 use std::cell::Cell;
 use std::default::Default;
@@ -26,14 +32,6 @@ use std::fs::File;
 use std::io::BufWriter;
 use std::path::{Path, PathBuf};
 
-use rustc_span::source_map::Spanned;
-use rustc_span::*;
-use syntax::ast::{self, Attribute, NodeId, PatKind, DUMMY_NODE_ID};
-use syntax::print::pprust;
-use syntax::print::pprust::{param_to_string, ty_to_string};
-use syntax::util::comments::strip_doc_comment_decoration;
-use syntax::visit::{self, Visitor};
-
 use dump_visitor::DumpVisitor;
 use span_utils::SpanUtils;
 
diff --git a/src/librustc_save_analysis/sig.rs b/src/librustc_save_analysis/sig.rs
index a9d2bfabb1b..dbf29b6531d 100644
--- a/src/librustc_save_analysis/sig.rs
+++ b/src/librustc_save_analysis/sig.rs
@@ -29,9 +29,9 @@ use crate::{id_from_def_id, id_from_node_id, SaveContext};
 
 use rls_data::{SigElement, Signature};
 
+use rustc_ast_pretty::pprust;
 use rustc_hir::def::{DefKind, Res};
 use syntax::ast::{self, Extern, NodeId};
-use syntax::print::pprust;
 
 pub fn item_signature(item: &ast::Item, scx: &SaveContext<'_, '_>) -> Option<Signature> {
     if !scx.config.signatures {
diff --git a/src/librustc_session/Cargo.toml b/src/librustc_session/Cargo.toml
index 47c23bc4dcf..c74011e26aa 100644
--- a/src/librustc_session/Cargo.toml
+++ b/src/librustc_session/Cargo.toml
@@ -19,3 +19,4 @@ rustc_span = { path = "../librustc_span" }
 rustc_index = { path = "../librustc_index" }
 rustc_fs_util = { path = "../librustc_fs_util" }
 num_cpus = "1.0"
+syntax = { path = "../libsyntax" }
diff --git a/src/librustc_session/lib.rs b/src/librustc_session/lib.rs
index 65d6635adad..4101c32d547 100644
--- a/src/librustc_session/lib.rs
+++ b/src/librustc_session/lib.rs
@@ -10,7 +10,6 @@ pub mod cgu_reuse_tracker;
 pub mod utils;
 #[macro_use]
 pub mod lint;
-pub mod node_id;
 pub mod parse;
 
 mod code_stats;
diff --git a/src/librustc_session/lint.rs b/src/librustc_session/lint.rs
index 2ba3932c7d9..983dfb19919 100644
--- a/src/librustc_session/lint.rs
+++ b/src/librustc_session/lint.rs
@@ -1,8 +1,8 @@
 pub use self::Level::*;
-use crate::node_id::{NodeId, NodeMap};
 use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
 use rustc_span::edition::Edition;
 use rustc_span::{sym, symbol::Ident, MultiSpan, Span, Symbol};
+use syntax::node_id::{NodeId, NodeMap};
 
 pub mod builtin;
 
diff --git a/src/librustc_session/parse.rs b/src/librustc_session/parse.rs
index 72c68fcb244..32642300262 100644
--- a/src/librustc_session/parse.rs
+++ b/src/librustc_session/parse.rs
@@ -2,8 +2,6 @@
 //! It also serves as an input to the parser itself.
 
 use crate::lint::{BufferedEarlyLint, BuiltinLintDiagnostics, Lint, LintId};
-use crate::node_id::NodeId;
-
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_data_structures::sync::{Lock, Lrc, Once};
 use rustc_errors::{emitter::SilentEmitter, ColorConfig, Handler};
@@ -13,6 +11,7 @@ use rustc_span::edition::Edition;
 use rustc_span::hygiene::ExpnId;
 use rustc_span::source_map::{FilePathMapping, SourceMap};
 use rustc_span::{MultiSpan, Span, Symbol};
+use syntax::node_id::NodeId;
 
 use std::path::PathBuf;
 use std::str;
diff --git a/src/librustc_typeck/Cargo.toml b/src/librustc_typeck/Cargo.toml
index 4b27d86dd02..748bfcc7946 100644
--- a/src/librustc_typeck/Cargo.toml
+++ b/src/librustc_typeck/Cargo.toml
@@ -14,6 +14,7 @@ doctest = false
 arena = { path = "../libarena" }
 log = "0.4"
 rustc = { path = "../librustc" }
+rustc_attr = { path = "../librustc_attr" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
 rustc_hir = { path = "../librustc_hir" }
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index 4d1f92d19ce..0a917a1853e 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -115,6 +115,7 @@ use rustc::ty::{
     self, AdtKind, CanonicalUserType, Const, GenericParamDefKind, RegionKind, ToPolyTraitRef,
     ToPredicate, Ty, TyCtxt, UserType, WithConstness,
 };
+use rustc_attr as attr;
 use rustc_data_structures::captures::Captures;
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_errors::{pluralize, struct_span_err, Applicability, DiagnosticBuilder, DiagnosticId};
@@ -131,7 +132,6 @@ use rustc_span::symbol::{kw, sym, Ident};
 use rustc_span::{self, BytePos, MultiSpan, Span};
 use rustc_target::spec::abi::Abi;
 use syntax::ast;
-use syntax::attr;
 use syntax::util::parser::ExprPrecedence;
 
 use std::cell::{Cell, Ref, RefCell, RefMut};
diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs
index 843872d0ff9..4d812d2621c 100644
--- a/src/librustc_typeck/collect.rs
+++ b/src/librustc_typeck/collect.rs
@@ -33,6 +33,7 @@ use rustc::ty::util::Discr;
 use rustc::ty::util::IntTypeExt;
 use rustc::ty::{self, AdtKind, Const, DefIdTree, ToPolyTraitRef, Ty, TyCtxt, WithConstness};
 use rustc::ty::{ReprOptions, ToPredicate};
+use rustc_attr::{list_contains_name, mark_used, InlineAttr, OptimizeAttr};
 use rustc_data_structures::captures::Captures;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_errors::{struct_span_err, Applicability, StashKey};
@@ -46,7 +47,6 @@ use rustc_span::{Span, DUMMY_SP};
 use rustc_target::spec::abi;
 use syntax::ast;
 use syntax::ast::{Ident, MetaItemKind};
-use syntax::attr::{list_contains_name, mark_used, InlineAttr, OptimizeAttr};
 
 struct OnlySelfBounds(bool);
 
diff --git a/src/librustdoc/clean/cfg.rs b/src/librustdoc/clean/cfg.rs
index 84e6ff648a3..da3a277dc2a 100644
--- a/src/librustdoc/clean/cfg.rs
+++ b/src/librustdoc/clean/cfg.rs
@@ -8,9 +8,9 @@ use std::mem;
 use std::ops;
 
 use rustc_feature::Features;
+use rustc_session::parse::ParseSess;
 use rustc_span::symbol::{sym, Symbol};
 use syntax::ast::{LitKind, MetaItem, MetaItemKind, NestedMetaItem};
-use syntax::sess::ParseSess;
 
 use rustc_span::Span;
 
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index 281306cc0c5..2a35ab812a5 100644
--- a/src/librustdoc/clean/mod.rs
+++ b/src/librustdoc/clean/mod.rs
@@ -16,6 +16,7 @@ use rustc::middle::stability;
 use rustc::ty::fold::TypeFolder;
 use rustc::ty::subst::InternalSubsts;
 use rustc::ty::{self, AdtKind, Lift, Ty, TyCtxt};
+use rustc_attr as attr;
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_hir as hir;
 use rustc_hir::def::{CtorKind, DefKind, Res};
@@ -27,7 +28,6 @@ use rustc_span::symbol::{kw, sym};
 use rustc_span::{self, Pos};
 use rustc_typeck::hir_ty_to_ty;
 use syntax::ast::{self, Ident};
-use syntax::attr;
 
 use std::collections::hash_map::Entry;
 use std::default::Default;
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index 1c0e0b3bf41..a8baa89c6f1 100644
--- a/src/librustdoc/core.rs
+++ b/src/librustdoc/core.rs
@@ -15,13 +15,13 @@ use rustc_lint;
 use rustc_resolve as resolve;
 use rustc_session::lint;
 
+use rustc_attr as attr;
 use rustc_errors::emitter::{Emitter, EmitterWriter};
 use rustc_errors::json::JsonEmitter;
 use rustc_span::source_map;
 use rustc_span::symbol::sym;
 use rustc_span::DUMMY_SP;
 use syntax::ast::CRATE_NODE_ID;
-use syntax::attr;
 
 use rustc_data_structures::sync::{self, Lrc};
 use std::cell::RefCell;
diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs
index 2a603d9900f..1ea053605ec 100644
--- a/src/librustdoc/html/highlight.rs
+++ b/src/librustdoc/html/highlight.rs
@@ -12,10 +12,10 @@ use std::io;
 use std::io::prelude::*;
 
 use rustc_parse::lexer;
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::SourceMap;
 use rustc_span::symbol::{kw, sym};
 use rustc_span::{FileName, Span};
-use syntax::sess::ParseSess;
 use syntax::token::{self, Token};
 
 /// Highlights `src`, returning the HTML output.
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index c73960fe33b..c6706413942 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -44,6 +44,7 @@ use std::sync::Arc;
 
 use rustc::middle::privacy::AccessLevels;
 use rustc::middle::stability;
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::flock;
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_feature::UnstableFeatures;
@@ -57,7 +58,6 @@ use rustc_span::symbol::{sym, Symbol};
 use serde::ser::SerializeSeq;
 use serde::{Serialize, Serializer};
 use syntax::ast;
-use syntax::print::pprust;
 
 use crate::clean::{self, AttributesExt, Deprecation, GetDefId, SelfTy};
 use crate::config::RenderOptions;
diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs
index 403c8d0160d..ed3f0f94e0e 100644
--- a/src/librustdoc/lib.rs
+++ b/src/librustdoc/lib.rs
@@ -21,6 +21,8 @@
 extern crate env_logger;
 extern crate getopts;
 extern crate rustc;
+extern crate rustc_ast_pretty;
+extern crate rustc_attr;
 extern crate rustc_data_structures;
 extern crate rustc_driver;
 extern crate rustc_errors;
diff --git a/src/librustdoc/passes/check_code_block_syntax.rs b/src/librustdoc/passes/check_code_block_syntax.rs
index 2903fd9dcd6..3b7c0db05a5 100644
--- a/src/librustdoc/passes/check_code_block_syntax.rs
+++ b/src/librustdoc/passes/check_code_block_syntax.rs
@@ -1,9 +1,9 @@
 use rustc_data_structures::sync::{Lock, Lrc};
 use rustc_errors::{emitter::Emitter, Applicability, Diagnostic, Handler};
 use rustc_parse::lexer::StringReader as Lexer;
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::{FilePathMapping, SourceMap};
 use rustc_span::{FileName, InnerSpan};
-use syntax::sess::ParseSess;
 use syntax::token;
 
 use crate::clean;
diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs
index d89dc2adafe..936f63975a5 100644
--- a/src/librustdoc/test.rs
+++ b/src/librustdoc/test.rs
@@ -141,7 +141,7 @@ pub fn run(options: Options) -> i32 {
 
 // Look for `#![doc(test(no_crate_inject))]`, used by crates in the std facade.
 fn scrape_test_config(krate: &::rustc_hir::Crate) -> TestOptions {
-    use syntax::print::pprust;
+    use rustc_ast_pretty::pprust;
 
     let mut opts =
         TestOptions { no_crate_inject: false, display_warnings: false, attrs: Vec::new() };
@@ -395,8 +395,8 @@ pub fn make_test(
             use rustc_errors::emitter::EmitterWriter;
             use rustc_errors::Handler;
             use rustc_parse::maybe_new_parser_from_source_str;
+            use rustc_session::parse::ParseSess;
             use rustc_span::source_map::FilePathMapping;
-            use syntax::sess::ParseSess;
 
             let filename = FileName::anon_source_code(s);
             let source = crates + &everything_else;
diff --git a/src/libsyntax/Cargo.toml b/src/libsyntax/Cargo.toml
index 2e647d2a1e0..ff03ae3f425 100644
--- a/src/libsyntax/Cargo.toml
+++ b/src/libsyntax/Cargo.toml
@@ -13,12 +13,9 @@ doctest = false
 rustc_serialize = { path = "../libserialize", package = "serialize" }
 log = "0.4"
 scoped-tls = "1.0"
-rustc_errors = { path = "../librustc_errors" }
 rustc_span = { path = "../librustc_span" }
 rustc_data_structures = { path = "../librustc_data_structures" }
-rustc_feature = { path = "../librustc_feature" }
 rustc_index = { path = "../librustc_index" }
 rustc_lexer = { path = "../librustc_lexer" }
 rustc_macros = { path = "../librustc_macros" }
 smallvec = { version = "1.0", features = ["union", "may_dangle"] }
-rustc_session = { path = "../librustc_session" }
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index db4fd53fe16..5a8c9f76ea9 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -256,15 +256,7 @@ impl ParenthesizedArgs {
     }
 }
 
-pub use rustc_session::node_id::NodeId;
-
-/// `NodeId` used to represent the root of the crate.
-pub const CRATE_NODE_ID: NodeId = NodeId::from_u32_const(0);
-
-/// When parsing and doing expansions, we initially give all AST nodes this AST
-/// node value. Then later, in the renumber pass, we renumber them to have
-/// small, positive ids.
-pub const DUMMY_NODE_ID: NodeId = NodeId::MAX;
+pub use crate::node_id::{NodeId, CRATE_NODE_ID, DUMMY_NODE_ID};
 
 /// A modifier on a bound, e.g., `?Sized` or `?const Trait`.
 ///
@@ -432,8 +424,6 @@ pub struct WhereEqPredicate {
     pub rhs_ty: P<Ty>,
 }
 
-pub use rustc_session::parse::CrateConfig;
-
 #[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
 pub struct Crate {
     pub module: Mod,
@@ -1427,7 +1417,7 @@ pub enum MacDelimiter {
 }
 
 impl MacDelimiter {
-    crate fn to_token(self) -> DelimToken {
+    pub fn to_token(self) -> DelimToken {
         match self {
             MacDelimiter::Parenthesis => DelimToken::Paren,
             MacDelimiter::Bracket => DelimToken::Bracket,
@@ -1490,7 +1480,7 @@ pub struct StrLit {
 }
 
 impl StrLit {
-    crate fn as_lit(&self) -> Lit {
+    pub fn as_lit(&self) -> Lit {
         let token_kind = match self.style {
             StrStyle::Cooked => token::Str,
             StrStyle::Raw(n) => token::StrRaw(n),
diff --git a/src/libsyntax/attr/mod.rs b/src/libsyntax/attr/mod.rs
index ec05dab451a..313f5269235 100644
--- a/src/libsyntax/attr/mod.rs
+++ b/src/libsyntax/attr/mod.rs
@@ -1,23 +1,18 @@
 //! Functions dealing with attributes and meta items.
 
-mod builtin;
-
-pub use crate::ast::Attribute;
-pub use builtin::*;
-pub use IntType::*;
-pub use ReprAttr::*;
-pub use StabilityLevel::*;
-
 use crate::ast;
-use crate::ast::{AttrId, AttrItem, AttrKind, AttrStyle, AttrVec, Ident, Name, Path, PathSegment};
+use crate::ast::{AttrId, AttrItem, AttrKind, AttrStyle, AttrVec, Attribute};
 use crate::ast::{Expr, GenericParam, Item, Lit, LitKind, Local, Stmt, StmtKind};
+use crate::ast::{Ident, Name, Path, PathSegment};
 use crate::ast::{MacArgs, MacDelimiter, MetaItem, MetaItemKind, NestedMetaItem};
 use crate::mut_visit::visit_clobber;
 use crate::ptr::P;
 use crate::token::{self, Token};
 use crate::tokenstream::{DelimSpan, TokenStream, TokenTree, TreeAndJoint};
-use crate::GLOBALS;
 
+use rustc_data_structures::sync::Lock;
+use rustc_index::bit_set::GrowableBitSet;
+use rustc_span::edition::{Edition, DEFAULT_EDITION};
 use rustc_span::source_map::{BytePos, Spanned};
 use rustc_span::symbol::{sym, Symbol};
 use rustc_span::Span;
@@ -26,6 +21,35 @@ use log::debug;
 use std::iter;
 use std::ops::DerefMut;
 
+pub struct Globals {
+    used_attrs: Lock<GrowableBitSet<AttrId>>,
+    known_attrs: Lock<GrowableBitSet<AttrId>>,
+    rustc_span_globals: rustc_span::Globals,
+}
+
+impl Globals {
+    fn new(edition: Edition) -> Globals {
+        Globals {
+            // We have no idea how many attributes there will be, so just
+            // initiate the vectors with 0 bits. We'll grow them as necessary.
+            used_attrs: Lock::new(GrowableBitSet::new_empty()),
+            known_attrs: Lock::new(GrowableBitSet::new_empty()),
+            rustc_span_globals: rustc_span::Globals::new(edition),
+        }
+    }
+}
+
+pub fn with_globals<R>(edition: Edition, f: impl FnOnce() -> R) -> R {
+    let globals = Globals::new(edition);
+    GLOBALS.set(&globals, || rustc_span::GLOBALS.set(&globals.rustc_span_globals, f))
+}
+
+pub fn with_default_globals<R>(f: impl FnOnce() -> R) -> R {
+    with_globals(DEFAULT_EDITION, f)
+}
+
+scoped_tls::scoped_thread_local!(pub static GLOBALS: Globals);
+
 pub fn mark_used(attr: &Attribute) {
     debug!("marking {:?} as used", attr);
     GLOBALS.with(|globals| {
@@ -382,30 +406,6 @@ pub fn find_by_name(attrs: &[Attribute], name: Symbol) -> Option<&Attribute> {
     attrs.iter().find(|attr| attr.check_name(name))
 }
 
-pub fn allow_internal_unstable<'a>(
-    attrs: &[Attribute],
-    span_diagnostic: &'a rustc_errors::Handler,
-) -> Option<impl Iterator<Item = Symbol> + 'a> {
-    find_by_name(attrs, sym::allow_internal_unstable).and_then(|attr| {
-        attr.meta_item_list()
-            .or_else(|| {
-                span_diagnostic
-                    .span_err(attr.span, "allow_internal_unstable expects list of feature names");
-                None
-            })
-            .map(|features| {
-                features.into_iter().filter_map(move |it| {
-                    let name = it.ident().map(|ident| ident.name);
-                    if name.is_none() {
-                        span_diagnostic
-                            .span_err(it.span(), "`allow_internal_unstable` expects feature names")
-                    }
-                    name
-                })
-            })
-    })
-}
-
 pub fn filter_by_name(attrs: &[Attribute], name: Symbol) -> impl Iterator<Item = &Attribute> {
     attrs.iter().filter(move |attr| attr.check_name(name))
 }
@@ -626,15 +626,15 @@ impl NestedMetaItem {
 }
 
 pub trait HasAttrs: Sized {
-    fn attrs(&self) -> &[ast::Attribute];
-    fn visit_attrs<F: FnOnce(&mut Vec<ast::Attribute>)>(&mut self, f: F);
+    fn attrs(&self) -> &[Attribute];
+    fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>));
 }
 
 impl<T: HasAttrs> HasAttrs for Spanned<T> {
-    fn attrs(&self) -> &[ast::Attribute] {
+    fn attrs(&self) -> &[Attribute] {
         self.node.attrs()
     }
-    fn visit_attrs<F: FnOnce(&mut Vec<ast::Attribute>)>(&mut self, f: F) {
+    fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
         self.node.visit_attrs(f);
     }
 }
@@ -643,7 +643,7 @@ impl HasAttrs for Vec<Attribute> {
     fn attrs(&self) -> &[Attribute] {
         self
     }
-    fn visit_attrs<F: FnOnce(&mut Vec<Attribute>)>(&mut self, f: F) {
+    fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
         f(self)
     }
 }
@@ -652,7 +652,7 @@ impl HasAttrs for AttrVec {
     fn attrs(&self) -> &[Attribute] {
         self
     }
-    fn visit_attrs<F: FnOnce(&mut Vec<Attribute>)>(&mut self, f: F) {
+    fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
         visit_clobber(self, |this| {
             let mut vec = this.into();
             f(&mut vec);
@@ -665,7 +665,7 @@ impl<T: HasAttrs + 'static> HasAttrs for P<T> {
     fn attrs(&self) -> &[Attribute] {
         (**self).attrs()
     }
-    fn visit_attrs<F: FnOnce(&mut Vec<Attribute>)>(&mut self, f: F) {
+    fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
         (**self).visit_attrs(f);
     }
 }
@@ -683,7 +683,7 @@ impl HasAttrs for StmtKind {
         }
     }
 
-    fn visit_attrs<F: FnOnce(&mut Vec<Attribute>)>(&mut self, f: F) {
+    fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
         match self {
             StmtKind::Local(local) => local.visit_attrs(f),
             StmtKind::Item(..) => {}
@@ -702,21 +702,11 @@ impl HasAttrs for Stmt {
         self.kind.attrs()
     }
 
-    fn visit_attrs<F: FnOnce(&mut Vec<ast::Attribute>)>(&mut self, f: F) {
+    fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
         self.kind.visit_attrs(f);
     }
 }
 
-impl HasAttrs for GenericParam {
-    fn attrs(&self) -> &[ast::Attribute] {
-        &self.attrs
-    }
-
-    fn visit_attrs<F: FnOnce(&mut Vec<Attribute>)>(&mut self, f: F) {
-        self.attrs.visit_attrs(f);
-    }
-}
-
 macro_rules! derive_has_attrs {
     ($($ty:path),*) => { $(
         impl HasAttrs for $ty {
@@ -724,7 +714,7 @@ macro_rules! derive_has_attrs {
                 &self.attrs
             }
 
-            fn visit_attrs<F: FnOnce(&mut Vec<Attribute>)>(&mut self, f: F) {
+            fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
                 self.attrs.visit_attrs(f);
             }
         }
@@ -733,5 +723,5 @@ macro_rules! derive_has_attrs {
 
 derive_has_attrs! {
     Item, Expr, Local, ast::ForeignItem, ast::StructField, ast::AssocItem, ast::Arm,
-    ast::Field, ast::FieldPat, ast::Variant, ast::Param
+    ast::Field, ast::FieldPat, ast::Variant, ast::Param, GenericParam
 }
diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs
index b0c2aa3dbb2..66c747f2c51 100644
--- a/src/libsyntax/lib.rs
+++ b/src/libsyntax/lib.rs
@@ -17,11 +17,6 @@
 #![feature(unicode_internals)]
 #![recursion_limit = "256"]
 
-use ast::AttrId;
-use rustc_data_structures::sync::Lock;
-use rustc_index::bit_set::GrowableBitSet;
-use rustc_span::edition::{Edition, DEFAULT_EDITION};
-
 #[macro_export]
 macro_rules! unwrap_or {
     ($opt:expr, $default:expr) => {
@@ -32,62 +27,27 @@ macro_rules! unwrap_or {
     };
 }
 
-pub struct Globals {
-    used_attrs: Lock<GrowableBitSet<AttrId>>,
-    known_attrs: Lock<GrowableBitSet<AttrId>>,
-    rustc_span_globals: rustc_span::Globals,
-}
-
-impl Globals {
-    fn new(edition: Edition) -> Globals {
-        Globals {
-            // We have no idea how many attributes there will be, so just
-            // initiate the vectors with 0 bits. We'll grow them as necessary.
-            used_attrs: Lock::new(GrowableBitSet::new_empty()),
-            known_attrs: Lock::new(GrowableBitSet::new_empty()),
-            rustc_span_globals: rustc_span::Globals::new(edition),
-        }
-    }
-}
-
-pub fn with_globals<R>(edition: Edition, f: impl FnOnce() -> R) -> R {
-    let globals = Globals::new(edition);
-    GLOBALS.set(&globals, || rustc_span::GLOBALS.set(&globals.rustc_span_globals, f))
-}
-
-pub fn with_default_globals<R>(f: impl FnOnce() -> R) -> R {
-    with_globals(DEFAULT_EDITION, f)
-}
-
-scoped_tls::scoped_thread_local!(pub static GLOBALS: Globals);
-
 pub mod util {
     pub mod classify;
     pub mod comments;
     pub mod lev_distance;
     pub mod literal;
     pub mod map_in_place;
-    pub mod node_count;
     pub mod parser;
 }
 
 pub mod ast;
 pub mod attr;
+pub use attr::{with_default_globals, with_globals, GLOBALS};
 pub mod entry;
 pub mod expand;
 pub mod mut_visit;
+pub mod node_id;
 pub mod ptr;
-pub use rustc_session::parse as sess;
 pub mod token;
 pub mod tokenstream;
 pub mod visit;
 
-pub mod print {
-    mod helpers;
-    pub mod pp;
-    pub mod pprust;
-}
-
 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
 
 /// Requirements for a `StableHashingContext` to be used in this crate.
diff --git a/src/librustc_session/node_id.rs b/src/libsyntax/node_id.rs
index 9fefe908e57..58d2334a7b1 100644
--- a/src/librustc_session/node_id.rs
+++ b/src/libsyntax/node_id.rs
@@ -11,6 +11,14 @@ rustc_index::newtype_index! {
 
 rustc_data_structures::define_id_collections!(NodeMap, NodeSet, NodeId);
 
+/// `NodeId` used to represent the root of the crate.
+pub const CRATE_NODE_ID: NodeId = NodeId::from_u32_const(0);
+
+/// When parsing and doing expansions, we initially give all AST nodes this AST
+/// node value. Then later, in the renumber pass, we renumber them to have
+/// small, positive ids.
+pub const DUMMY_NODE_ID: NodeId = NodeId::MAX;
+
 impl NodeId {
     pub fn placeholder_from_expn_id(expn_id: ExpnId) -> Self {
         NodeId::from_u32(expn_id.as_u32())
diff --git a/src/libsyntax/util/comments.rs b/src/libsyntax/util/comments.rs
index c385b498ced..5a67531624d 100644
--- a/src/libsyntax/util/comments.rs
+++ b/src/libsyntax/util/comments.rs
@@ -1,14 +1,11 @@
 pub use CommentStyle::*;
 
 use crate::ast;
-use crate::sess::ParseSess;
-
 use rustc_span::source_map::SourceMap;
 use rustc_span::{BytePos, CharPos, FileName, Pos};
 
-use std::usize;
-
 use log::debug;
+use std::usize;
 
 #[cfg(test)]
 mod tests;
@@ -191,8 +188,8 @@ fn split_block_comment_into_lines(text: &str, col: CharPos) -> Vec<String> {
 
 // it appears this function is called only from pprust... that's
 // probably not a good thing.
-crate fn gather_comments(sess: &ParseSess, path: FileName, src: String) -> Vec<Comment> {
-    let cm = SourceMap::new(sess.source_map().path_mapping().clone());
+pub fn gather_comments(sm: &SourceMap, path: FileName, src: String) -> Vec<Comment> {
+    let cm = SourceMap::new(sm.path_mapping().clone());
     let source_file = cm.new_source_file(path, src);
     let text = (*source_file.src.as_ref().unwrap()).clone();
 
diff --git a/src/libsyntax/util/parser.rs b/src/libsyntax/util/parser.rs
index a0ed89a9cae..b98cc96b3c6 100644
--- a/src/libsyntax/util/parser.rs
+++ b/src/libsyntax/util/parser.rs
@@ -367,7 +367,7 @@ pub fn prec_let_scrutinee_needs_par() -> usize {
 ///
 /// Conversely, suppose that we have `(let _ = a) OP b` and `order` is that of `OP`.
 /// Can we print this as `let _ = a OP b`?
-crate fn needs_par_as_let_scrutinee(order: i8) -> bool {
+pub fn needs_par_as_let_scrutinee(order: i8) -> bool {
     order <= prec_let_scrutinee_needs_par() as i8
 }
 
diff --git a/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs b/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs
index 725c350fe4e..fbdad29d649 100644
--- a/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs
+++ b/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs
@@ -1,6 +1,7 @@
 #![feature(box_syntax, plugin, plugin_registrar, rustc_private)]
 #![crate_type = "dylib"]
 
+extern crate rustc_ast_pretty;
 extern crate rustc_driver;
 extern crate rustc_hir;
 #[macro_use] extern crate rustc_lint;
@@ -8,13 +9,13 @@ extern crate rustc_hir;
 extern crate rustc_span;
 extern crate syntax;
 
+use rustc_ast_pretty::pprust;
 use rustc_hir::intravisit;
 use rustc_hir as hir;
 use rustc_hir::Node;
 use rustc_lint::{LateContext, LintPass, LintArray, LateLintPass, LintContext};
 use rustc_driver::plugin::Registry;
 use rustc_span::source_map;
-use syntax::print::pprust;
 
 #[plugin_registrar]
 pub fn plugin_registrar(reg: &mut Registry) {
diff --git a/src/test/ui-fulldeps/mod_dir_path_canonicalized.rs b/src/test/ui-fulldeps/mod_dir_path_canonicalized.rs
index 2b4a9fb21e4..be4b49ada02 100644
--- a/src/test/ui-fulldeps/mod_dir_path_canonicalized.rs
+++ b/src/test/ui-fulldeps/mod_dir_path_canonicalized.rs
@@ -6,12 +6,13 @@
 
 extern crate syntax;
 extern crate rustc_parse;
+extern crate rustc_session;
 extern crate rustc_span;
 
 use rustc_parse::new_parser_from_file;
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::FilePathMapping;
 use std::path::Path;
-use syntax::sess::ParseSess;
 
 #[path = "mod_dir_simple/test.rs"]
 mod gravy;
diff --git a/src/test/ui-fulldeps/pprust-expr-roundtrip.rs b/src/test/ui-fulldeps/pprust-expr-roundtrip.rs
index 04d1054e287..0f6a88b2691 100644
--- a/src/test/ui-fulldeps/pprust-expr-roundtrip.rs
+++ b/src/test/ui-fulldeps/pprust-expr-roundtrip.rs
@@ -19,19 +19,21 @@
 
 #![feature(rustc_private)]
 
+extern crate rustc_ast_pretty;
 extern crate rustc_data_structures;
 extern crate syntax;
 extern crate rustc_parse;
+extern crate rustc_session;
 extern crate rustc_span;
 
+use rustc_ast_pretty::pprust;
 use rustc_data_structures::thin_vec::ThinVec;
 use rustc_parse::new_parser_from_source_str;
+use rustc_session::parse::ParseSess;
 use rustc_span::source_map::{Spanned, DUMMY_SP, FileName};
 use rustc_span::source_map::FilePathMapping;
 use syntax::ast::*;
-use syntax::sess::ParseSess;
 use syntax::mut_visit::{self, MutVisitor, visit_clobber};
-use syntax::print::pprust;
 use syntax::ptr::P;
 
 fn parse_expr(ps: &ParseSess, src: &str) -> Option<P<Expr>> {