diff --git a/Cargo.lock b/Cargo.lock index 6e65d5626a2..9da9d1914dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "aho-corasick" version = "0.7.6" @@ -249,42 +251,46 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" dependencies = [ "crossbeam-epoch", - "crossbeam-utils 0.6.5", + "crossbeam-utils 0.7.0", + "maybe-uninit", ] [[package]] name = "crossbeam-epoch" -version = "0.7.2" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "arrayvec 0.4.12", + "autocfg 1.0.1", "cfg-if 0.1.10", - "crossbeam-utils 0.6.5", + "crossbeam-utils 0.7.0", "lazy_static", + "maybe-uninit", "memoffset", "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.1.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" +checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" dependencies = [ - "crossbeam-utils 0.6.5", + "cfg-if 0.1.10", + "crossbeam-utils 0.7.0", + "maybe-uninit", ] [[package]] name = "crossbeam-utils" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" +checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" dependencies = [ "cfg-if 0.1.10", "lazy_static", @@ -583,6 +589,12 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "md-5" version = "0.9.1" @@ -596,11 +608,14 @@ dependencies = [ [[package]] name = "measureme" -version = "9.0.0" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22bf8d885d073610aee20e7fa205c4341ed32a761dbde96da5fd96301a8d3e82" +checksum = "4a98e07fe802486895addb2b5467f33f205e82c426bfaf350f5d8109b137767c" dependencies = [ + "log", + "memmap", "parking_lot", + "perf-event-open-sys", "rustc-hash", "smallvec", ] @@ -611,6 +626,16 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "memoffset" version = "0.5.1" @@ -676,6 +701,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "perf-event-open-sys" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce9bedf5da2c234fdf2391ede2b90fabf585355f33100689bc364a3ea558561a" +dependencies = [ + "libc", +] + [[package]] name = "ppv-lite86" version = "0.2.9" @@ -873,23 +907,24 @@ checksum = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf" dependencies = [ "base64", "blake2b_simd", - "crossbeam-utils 0.6.5", + "crossbeam-utils 0.6.6", ] [[package]] name = "rustc-ap-rustc_arena" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705baf7965088195f2e85d0bc548036d7e6a94973c309819f2ae4540e221ba15" +checksum = "259cca0e975ecb05fd289ace45280c30ff792efc04e856a7f18b7fc86a3cb610" dependencies = [ + "rustc-ap-rustc_data_structures", "smallvec", ] [[package]] name = "rustc-ap-rustc_ast" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5579379dd7e34bb522cbab946df43921f3d6fa587fc9101358db0a26b177b24" +checksum = "bb9be435d50c88e94bbad6ea468c8680b52c5043bb298ab8058d05251717f8f8" dependencies = [ "bitflags", "rustc-ap-rustc_data_structures", @@ -904,9 +939,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_ast_passes" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad87c7440fb916a699cc21a2d0957485a1174cc07a8eb5a7c7ecec9416d4cae3" +checksum = "75246dd1a95a57f7767e53bde3971baa2d948078e180564709f5ea46cf863ddd" dependencies = [ "itertools 0.9.0", "rustc-ap-rustc_ast", @@ -923,9 +958,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_ast_pretty" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fe1dbcfbb58ea768a9a05a9df27093b4a8fe03b715d3d96df84ae1093b3859" +checksum = "79bede0b44bed453fd0034b7ba492840391f6486bf3e17a1af12922f0b98d4cc" dependencies = [ "rustc-ap-rustc_ast", "rustc-ap-rustc_span", @@ -934,9 +969,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_attr" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9429e42aaf0b12e133b93411bb8205388fba4fe3dd819199ae52672ad21b81a0" +checksum = "84a92a4a34b996694ca2dab70361c60d2d48c07adce57e8155b7ec75e069e3ea" dependencies = [ "rustc-ap-rustc_ast", "rustc-ap-rustc_ast_pretty", @@ -952,9 +987,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_data_structures" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bc6c6857800146381494c5247d5b86502e4a25a71fea67d2db58f14f22d6ce" +checksum = "9cbfa7f82517a1b2efe7106c864c3f930b1da8aff07a27fd317af2f36522fd2e" dependencies = [ "arrayvec 0.5.1", "bitflags", @@ -983,9 +1018,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_errors" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "988c7a3ecba53728d383c6bd8268c7a4c957244944c05a3f0e448795747d9db9" +checksum = "58a272a5101843bcb40900cc9ccf80ecfec62830bb1f4a242986da4a34c0da89" dependencies = [ "annotate-snippets 0.8.0", "atty", @@ -1003,9 +1038,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_expand" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc3de9e78a60f4d280d7d9193dc9f679489fac17fc338ac02657a6de6295f2ab" +checksum = "3bc7988f3facf2402fe057405ef0f7fbacc7e7a483da25e35a35ac09491fbbfb" dependencies = [ "rustc-ap-rustc_ast", "rustc-ap-rustc_ast_passes", @@ -1027,9 +1062,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_feature" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10224171d523b2fb814e549b256ab53734abdb4d285f113cd0af887bc73150f3" +checksum = "5e931cd1580ae60c5737d3fa57633034935e885414e794d83b3e52a81021985c" dependencies = [ "rustc-ap-rustc_data_structures", "rustc-ap-rustc_span", @@ -1037,21 +1072,21 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_fs_util" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05d63d5678f4e01bbf61189d86112783357d405a1fb63d52a70be03a8713395" +checksum = "8fe9422e10d5b441d2a78202667bc85d7cf713a087b9ae6cdea0dfc825d79f07" [[package]] name = "rustc-ap-rustc_graphviz" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f13a83a674d50c3a2400138e4aaecd4d712921f3b8925c22691c85ae2bde235" +checksum = "ffffffdef9fd51db69c1d4c045ced8aaab999be5627f2d3a0ce020d74c1f1e50" [[package]] name = "rustc-ap-rustc_index" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469c83791194b83a480b18441da1f04dbd2671d062a9f2a1c6bc5369b2185360" +checksum = "7f6f53afc4f7111c82295cb7ea3878f520bbac6a2c5a12e125b4ca9156498cff" dependencies = [ "arrayvec 0.5.1", "rustc-ap-rustc_macros", @@ -1060,18 +1095,18 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_lexer" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f76b414e6f4a136e04c5b2d79785fbf689b6c975f7f40c9fbe314dd9e4345a5" +checksum = "8056b05346dff7e39164d0434c6ec443a14ab5fbf6221bd1a56e5abbeae5f60c" dependencies = [ "unicode-xid", ] [[package]] name = "rustc-ap-rustc_lint_defs" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10363995e377811d2bd42a4700c7ffe1b8fec88c7f207036fc4b797b01941ea4" +checksum = "364c3fb7b3cbdfe3fbb21d4078ff2cb3c58df63cda27995f8b064d21ee6dede5" dependencies = [ "rustc-ap-rustc_ast", "rustc-ap-rustc_data_structures", @@ -1084,9 +1119,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_macros" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e106ab6d8fcd906b8e0efd48d14bca07cc7a591a938a0a8844badb8d253897" +checksum = "4607d6879cae3bae4d0369ca4b3a7510fd6295ac32eec088ac975208ba96ca45" dependencies = [ "proc-macro2", "quote", @@ -1096,9 +1131,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_parse" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1258eef1563a45a6b319aa91311507402bbe26cf7d8eef4e5d06cc4af9edd9c" +checksum = "78d22889bff7ca2346037c9df7ea55c66ffb714f5b50fb62b41975f8ac7a2d70" dependencies = [ "bitflags", "rustc-ap-rustc_ast", @@ -1116,9 +1151,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_serialize" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5791d0d7b4b8f5ab89c80e0558aaae6cc3784b9cd1db5f239f7fa51e618e73" +checksum = "d33c710120953c0214f47a6caf42064d7e241003b4af36c98a6d6156e70335f1" dependencies = [ "indexmap", "smallvec", @@ -1126,9 +1161,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_session" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0662079826bfb6543f4c261049d497feb5686f71aabdba13befa2f6f41a628" +checksum = "6d35919041429a90713c8f704fa5209ba159cb554ce74d95722cbc18ac4b4c6f" dependencies = [ "bitflags", "getopts", @@ -1148,9 +1183,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_span" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12314b0cb62961245fb6f103095f0584877e54439a62cf66278a4c83d6133e1d" +checksum = "73b12170c69603c0bf4b50e5c25fd348aae13b8c6465aa0ef4389c9eaa568e51" dependencies = [ "cfg-if 0.1.10", "md-5", @@ -1168,9 +1203,9 @@ dependencies = [ [[package]] name = "rustc-ap-rustc_target" -version = "706.0.0" +version = "712.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b33190c2f2cb83aea78d78c90ee5b29404ecc46abb2d9ce7c270a7c0f132e1" +checksum = "0a8329d92e7dc24b974f759e6c6e97e2bbc47b18d0573343028f8135ca367200" dependencies = [ "bitflags", "rustc-ap-rustc_data_structures", @@ -1195,9 +1230,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-rayon" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32767f90d938f1b7199a174ef249ae1924f6e5bbdb9d112fea141e016f25b3a" +checksum = "ed7d6a39f8bfd4421ce720918234d1e672b83824c91345b47c93746839cf1629" dependencies = [ "crossbeam-deque", "either", @@ -1206,13 +1241,13 @@ dependencies = [ [[package]] name = "rustc-rayon-core" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2427831f0053ea3ea73559c8eabd893133a51b251d142bacee53c62a288cb3" +checksum = "e94187d9ea3e8c38fafdbc38acb94eafa7ce155867f6ccb13830466a0d0db8c6" dependencies = [ "crossbeam-deque", "crossbeam-queue", - "crossbeam-utils 0.6.5", + "crossbeam-utils 0.7.0", "lazy_static", "num_cpus", ] @@ -1261,7 +1296,6 @@ dependencies = [ "regex", "rustc-ap-rustc_ast", "rustc-ap-rustc_ast_pretty", - "rustc-ap-rustc_attr", "rustc-ap-rustc_data_structures", "rustc-ap-rustc_errors", "rustc-ap-rustc_expand", @@ -1383,9 +1417,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.4.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "stable_deref_trait" diff --git a/Cargo.toml b/Cargo.toml index 89aa311c52c..858f3f97288 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,36 +66,32 @@ rustc-workspace-hack = "1.0.0" [dependencies.rustc_ast] package = "rustc-ap-rustc_ast" -version = "706.0.0" +version = "712.0.0" [dependencies.rustc_ast_pretty] package = "rustc-ap-rustc_ast_pretty" -version = "706.0.0" - -[dependencies.rustc_attr] -package = "rustc-ap-rustc_attr" -version = "706.0.0" +version = "712.0.0" [dependencies.rustc_data_structures] package = "rustc-ap-rustc_data_structures" -version = "706.0.0" +version = "712.0.0" [dependencies.rustc_errors] package = "rustc-ap-rustc_errors" -version = "706.0.0" +version = "712.0.0" [dependencies.rustc_expand] package = "rustc-ap-rustc_expand" -version = "706.0.0" +version = "712.0.0" [dependencies.rustc_parse] package = "rustc-ap-rustc_parse" -version = "706.0.0" +version = "712.0.0" [dependencies.rustc_session] package = "rustc-ap-rustc_session" -version = "706.0.0" +version = "712.0.0" [dependencies.rustc_span] package = "rustc-ap-rustc_span" -version = "706.0.0" +version = "712.0.0" diff --git a/rust-toolchain b/rust-toolchain index 09ed3829370..0cb2de6a3fb 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2021-02-06 +nightly-2021-03-26 diff --git a/src/attr.rs b/src/attr.rs index 2d25c263277..015e9f9b252 100644 --- a/src/attr.rs +++ b/src/attr.rs @@ -1,7 +1,7 @@ //! Format attributes and meta items. use rustc_ast::ast; -use rustc_ast::attr::HasAttrs; +use rustc_ast::AstLike; use rustc_span::{symbol::sym, Span, Symbol}; use self::doc_comment::DocCommentFormatter; diff --git a/src/expr.rs b/src/expr.rs index 4589b57dacb..d3fd22653b4 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -106,15 +106,10 @@ pub(crate) fn format_expr( }) } ast::ExprKind::Unary(op, ref subexpr) => rewrite_unary_op(context, op, subexpr, shape), - ast::ExprKind::Struct(ref path, ref fields, ref struct_rest) => rewrite_struct_lit( - context, - path, - fields, - struct_rest, - &expr.attrs, - expr.span, - shape, - ), + ast::ExprKind::Struct(ref struct_expr) => { + let ast::StructExpr { fields, path, rest } = &**struct_expr; + rewrite_struct_lit(context, path, fields, rest, &expr.attrs, expr.span, shape) + } ast::ExprKind::Tup(ref items) => { rewrite_tuple(context, items.iter(), expr.span, shape, items.len() == 1) } @@ -1496,14 +1491,14 @@ fn rewrite_index( } } -fn struct_lit_can_be_aligned(fields: &[ast::Field], has_base: bool) -> bool { +fn struct_lit_can_be_aligned(fields: &[ast::ExprField], has_base: bool) -> bool { !has_base && fields.iter().all(|field| !field.is_shorthand) } fn rewrite_struct_lit<'a>( context: &RewriteContext<'_>, path: &ast::Path, - fields: &'a [ast::Field], + fields: &'a [ast::ExprField], struct_rest: &ast::StructRest, attrs: &[ast::Attribute], span: Span, @@ -1512,7 +1507,7 @@ fn rewrite_struct_lit<'a>( debug!("rewrite_struct_lit: shape {:?}", shape); enum StructLitField<'a> { - Regular(&'a ast::Field), + Regular(&'a ast::ExprField), Base(&'a ast::Expr), Rest(&'a Span), } @@ -1668,7 +1663,7 @@ pub(crate) fn struct_lit_field_separator(config: &Config) -> &str { pub(crate) fn rewrite_field( context: &RewriteContext<'_>, - field: &ast::Field, + field: &ast::ExprField, shape: Shape, prefix_max_width: usize, ) -> Option { diff --git a/src/formatting.rs b/src/formatting.rs index e42864a5055..b69ecdc5cb8 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -92,7 +92,7 @@ fn format_project( let mut context = FormatContext::new(&krate, report, parse_session, config, handler); let files = modules::ModResolver::new( &context.parse_session, - directory_ownership.unwrap_or(DirectoryOwnership::UnownedViaMod), + directory_ownership.unwrap_or(DirectoryOwnership::UnownedViaBlock), !input_is_stdin && !config.skip_children(), ) .visit_crate(&krate)?; @@ -145,7 +145,7 @@ impl<'a, T: FormatHandler + 'a> FormatContext<'a, T> { module: &Module<'_>, is_macro_def: bool, ) -> Result<(), ErrorKind> { - let snippet_provider = self.parse_session.snippet_provider(module.as_ref().inner); + let snippet_provider = self.parse_session.snippet_provider(module.span); let mut visitor = FmtVisitor::from_parse_sess( &self.parse_session, &self.config, diff --git a/src/items.rs b/src/items.rs index 6cdbb686ad8..61b49911e76 100644 --- a/src/items.rs +++ b/src/items.rs @@ -158,7 +158,7 @@ impl<'a> Item<'a> { #[derive(Debug)] enum BodyElement<'a> { // Stmt(&'a ast::Stmt), - // Field(&'a ast::Field), + // Field(&'a ast::ExprField), // Variant(&'a ast::Variant), // Item(&'a ast::Item), ForeignItem(&'a ast::ForeignItem), @@ -1274,7 +1274,7 @@ fn format_unit_struct( pub(crate) fn format_struct_struct( context: &RewriteContext<'_>, struct_parts: &StructParts<'_>, - fields: &[ast::StructField], + fields: &[ast::FieldDef], offset: Indent, one_line_width: Option, ) -> Option { @@ -1411,7 +1411,7 @@ fn format_empty_struct_or_tuple( fn format_tuple_struct( context: &RewriteContext<'_>, struct_parts: &StructParts<'_>, - fields: &[ast::StructField], + fields: &[ast::FieldDef], offset: Indent, ) -> Option { let mut result = String::with_capacity(1024); @@ -1631,7 +1631,7 @@ fn type_annotation_spacing(config: &Config) -> (&str, &str) { pub(crate) fn rewrite_struct_field_prefix( context: &RewriteContext<'_>, - field: &ast::StructField, + field: &ast::FieldDef, ) -> Option { let vis = format_visibility(context, &field.vis); let type_annotation_spacing = type_annotation_spacing(context.config); @@ -1646,7 +1646,7 @@ pub(crate) fn rewrite_struct_field_prefix( }) } -impl Rewrite for ast::StructField { +impl Rewrite for ast::FieldDef { fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option { rewrite_struct_field(context, self, shape, 0) } @@ -1654,7 +1654,7 @@ impl Rewrite for ast::StructField { pub(crate) fn rewrite_struct_field( context: &RewriteContext<'_>, - field: &ast::StructField, + field: &ast::FieldDef, shape: Shape, lhs_max_width: usize, ) -> Option { @@ -3271,8 +3271,8 @@ pub(crate) fn rewrite_extern_crate( /// Returns `true` for `mod foo;`, false for `mod foo { .. }`. pub(crate) fn is_mod_decl(item: &ast::Item) -> bool { match item.kind { - ast::ItemKind::Mod(ref m) => m.inner.hi() != item.span.hi(), - _ => false, + ast::ItemKind::Mod(_, ast::ModKind::Loaded(_, ast::Inline::Yes, _)) => false, + _ => true, } } diff --git a/src/macros.rs b/src/macros.rs index 1abb1cd9e13..190f4b599b0 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -132,7 +132,7 @@ fn parse_macro_arg<'a, 'b: 'a>(parser: &'a mut Parser<'b>) -> Option { ); parse_macro_arg!( Pat, - |parser: &mut rustc_parse::parser::Parser<'b>| parser.parse_pat(None), + |parser: &mut rustc_parse::parser::Parser<'b>| parser.parse_pat_no_top_alt(None), |x: ptr::P| Some(x) ); // `parse_item` returns `Option>`. diff --git a/src/matches.rs b/src/matches.rs index a43aed09ef5..f33fedce92d 100644 --- a/src/matches.rs +++ b/src/matches.rs @@ -19,7 +19,7 @@ use crate::source_map::SpanUtils; use crate::spanned::Spanned; use crate::utils::{ contains_skip, extra_offset, first_line_width, inner_attributes, last_line_extendable, mk_sp, - semicolon_for_expr, trimmed_last_line_width, unicode_str_width, + mk_sp_lo_plus_one, semicolon_for_expr, trimmed_last_line_width, unicode_str_width, }; /// A simple wrapper type against `ast::Arm`. Used inside `write_list()`. @@ -163,17 +163,14 @@ fn arm_comma(config: &Config, body: &ast::Expr, is_last: bool) -> &'static str { fn collect_beginning_verts( context: &RewriteContext<'_>, arms: &[ast::Arm], - span: Span, ) -> Vec> { - let mut beginning_verts = Vec::with_capacity(arms.len()); - let mut lo = context.snippet_provider.span_after(span, "{"); - for arm in arms { - let hi = arm.pat.span.lo(); - let missing_span = mk_sp(lo, hi); - beginning_verts.push(context.snippet_provider.opt_span_before(missing_span, "|")); - lo = arm.span().hi(); - } - beginning_verts + arms.iter() + .map(|a| { + context + .snippet_provider + .opt_span_before(mk_sp_lo_plus_one(a.pat.span.lo()), "|") + }) + .collect() } fn rewrite_match_arms( @@ -191,7 +188,7 @@ fn rewrite_match_arms( let is_last_iter = repeat(false) .take(arm_len.saturating_sub(1)) .chain(repeat(true)); - let beginning_verts = collect_beginning_verts(context, arms, span); + let beginning_verts = collect_beginning_verts(context, arms); let items = itemize_list( context.snippet_provider, arms.iter() diff --git a/src/modules.rs b/src/modules.rs index eaa889bcb3f..ed4316974db 100644 --- a/src/modules.rs +++ b/src/modules.rs @@ -3,16 +3,17 @@ use std::collections::BTreeMap; use std::path::{Path, PathBuf}; use rustc_ast::ast; -use rustc_ast::attr::HasAttrs; use rustc_ast::visit::Visitor; +use rustc_ast::AstLike; use rustc_span::symbol::{self, sym, Symbol}; +use rustc_span::Span; use thiserror::Error; use crate::attr::MetaVisitor; use crate::config::FileName; use crate::items::is_mod_decl; use crate::syntux::parser::{ - Directory, DirectoryOwnership, ModulePathSuccess, Parser, ParserError, + Directory, DirectoryOwnership, ModError, ModulePathSuccess, Parser, ParserError, }; use crate::syntux::session::ParseSess; use crate::utils::contains_skip; @@ -24,36 +25,44 @@ type FileModMap<'ast> = BTreeMap>; /// Represents module with its inner attributes. #[derive(Debug, Clone)] pub(crate) struct Module<'a> { - ast_mod: Cow<'a, ast::Mod>, + ast_mod_kind: Option>, + pub(crate) items: Cow<'a, Vec>>, + attrs: Cow<'a, Vec>, inner_attr: Vec, + pub(crate) span: Span, } impl<'a> Module<'a> { - pub(crate) fn new(ast_mod: Cow<'a, ast::Mod>, attrs: &[ast::Attribute]) -> Self { - let inner_attr = attrs + pub(crate) fn new( + mod_span: Span, + ast_mod_kind: Option>, + mod_items: Cow<'a, Vec>>, + mod_attrs: Cow<'a, Vec>, + ) -> Self { + let inner_attr = mod_attrs .iter() .filter(|attr| attr.style == ast::AttrStyle::Inner) .cloned() .collect(); Module { - ast_mod, + items: mod_items, + attrs: mod_attrs, inner_attr, + span: mod_span, + ast_mod_kind, } } } -impl<'a> HasAttrs for Module<'a> { +impl<'a> AstLike for Module<'a> { fn attrs(&self) -> &[ast::Attribute] { &self.inner_attr } fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { f(&mut self.inner_attr) } -} - -impl<'a> AsRef for Module<'a> { - fn as_ref(&self) -> &ast::Mod { - &self.ast_mod + fn tokens_mut(&mut self) -> Option<&mut Option> { + unimplemented!() } } @@ -124,12 +133,17 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { // Skip visiting sub modules when the input is from stdin. if self.recursive { - self.visit_mod_from_ast(&krate.module)?; + self.visit_mod_from_ast(&krate.items)?; } self.file_map.insert( root_filename, - Module::new(Cow::Borrowed(&krate.module), &krate.attrs), + Module::new( + krate.span, + None, + Cow::Borrowed(&krate.items), + Cow::Borrowed(&krate.attrs), + ), ); Ok(self.file_map) } @@ -139,10 +153,15 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { let mut visitor = visitor::CfgIfVisitor::new(self.parse_sess); visitor.visit_item(&item); for module_item in visitor.mods() { - if let ast::ItemKind::Mod(ref sub_mod) = module_item.item.kind { + if let ast::ItemKind::Mod(_, ref sub_mod_kind) = module_item.item.kind { self.visit_sub_mod( &module_item.item, - Module::new(Cow::Owned(sub_mod.clone()), &module_item.item.attrs), + Module::new( + module_item.item.span, + Some(Cow::Owned(sub_mod_kind.clone())), + Cow::Owned(vec![]), + Cow::Owned(vec![]), + ), )?; } } @@ -150,29 +169,53 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { } /// Visit modules defined inside macro calls. - fn visit_mod_outside_ast(&mut self, module: ast::Mod) -> Result<(), ModuleResolutionError> { - for item in module.items { + fn visit_mod_outside_ast( + &mut self, + items: Vec>, + ) -> Result<(), ModuleResolutionError> { + for item in items { if is_cfg_if(&item) { self.visit_cfg_if(Cow::Owned(item.into_inner()))?; continue; } - if let ast::ItemKind::Mod(ref sub_mod) = item.kind { - self.visit_sub_mod(&item, Module::new(Cow::Owned(sub_mod.clone()), &item.attrs))?; + if let ast::ItemKind::Mod(_, ref sub_mod_kind) = item.kind { + let span = item.span; + self.visit_sub_mod( + &item, + Module::new( + span, + Some(Cow::Owned(sub_mod_kind.clone())), + Cow::Owned(vec![]), + Cow::Owned(vec![]), + ), + )?; } } Ok(()) } /// Visit modules from AST. - fn visit_mod_from_ast(&mut self, module: &'ast ast::Mod) -> Result<(), ModuleResolutionError> { - for item in &module.items { + fn visit_mod_from_ast( + &mut self, + items: &'ast Vec>, + ) -> Result<(), ModuleResolutionError> { + for item in items { if is_cfg_if(item) { self.visit_cfg_if(Cow::Borrowed(item))?; } - if let ast::ItemKind::Mod(ref sub_mod) = item.kind { - self.visit_sub_mod(item, Module::new(Cow::Borrowed(sub_mod), &item.attrs))?; + if let ast::ItemKind::Mod(_, ref sub_mod_kind) = item.kind { + let span = item.span; + self.visit_sub_mod( + item, + Module::new( + span, + Some(Cow::Borrowed(sub_mod_kind)), + Cow::Owned(vec![]), + Cow::Borrowed(&item.attrs), + ), + )?; } } Ok(()) @@ -273,9 +316,12 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { if let Some(directory) = directory { self.directory = directory; } - match sub_mod.ast_mod { - Cow::Borrowed(sub_mod) => self.visit_mod_from_ast(sub_mod), - Cow::Owned(sub_mod) => self.visit_mod_outside_ast(sub_mod), + match (sub_mod.ast_mod_kind, sub_mod.items) { + (Some(Cow::Borrowed(ast::ModKind::Loaded(items, ast::Inline::No, _))), _) => { + self.visit_mod_from_ast(&items) + } + (Some(Cow::Owned(..)), Cow::Owned(items)) => self.visit_mod_outside_ast(items), + (_, _) => Ok(()), } } @@ -288,19 +334,23 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { ) -> Result>, ModuleResolutionError> { let relative = match self.directory.ownership { DirectoryOwnership::Owned { relative } => relative, - DirectoryOwnership::UnownedViaBlock | DirectoryOwnership::UnownedViaMod => None, + DirectoryOwnership::UnownedViaBlock => None, }; if let Some(path) = Parser::submod_path_from_attr(attrs, &self.directory.path) { if self.parse_sess.is_file_parsed(&path) { return Ok(None); } - return match Parser::parse_file_as_module(self.parse_sess, &path, sub_mod.ast_mod.inner) - { - Ok((_, ref attrs)) if contains_skip(attrs) => Ok(None), - Ok(m) => Ok(Some(SubModKind::External( + return match Parser::parse_file_as_module(self.parse_sess, &path, sub_mod.span) { + Ok((ref attrs, _, _)) if contains_skip(attrs) => Ok(None), + Ok((attrs, items, span)) => Ok(Some(SubModKind::External( path, DirectoryOwnership::Owned { relative: None }, - Module::new(Cow::Owned(m.0), &m.1), + Module::new( + span, + Some(Cow::Owned(ast::ModKind::Unloaded)), + Cow::Owned(items), + Cow::Owned(attrs), + ), ))), Err(ParserError::ParseError) => Err(ModuleResolutionError { module: mod_name.to_string(), @@ -319,72 +369,84 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { match self .parse_sess .default_submod_path(mod_name, relative, &self.directory.path) - .result { Ok(ModulePathSuccess { - path, ownership, .. + file_path, + dir_ownership, + .. }) => { let outside_mods_empty = mods_outside_ast.is_empty(); let should_insert = !mods_outside_ast .iter() - .any(|(outside_path, _, _)| outside_path == &path); - if self.parse_sess.is_file_parsed(&path) { + .any(|(outside_path, _, _)| outside_path == &file_path); + if self.parse_sess.is_file_parsed(&file_path) { if outside_mods_empty { return Ok(None); } else { if should_insert { - mods_outside_ast.push((path, ownership, sub_mod.clone())); + mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone())); } return Ok(Some(SubModKind::MultiExternal(mods_outside_ast))); } } - match Parser::parse_file_as_module(self.parse_sess, &path, sub_mod.ast_mod.inner) { - Ok((_, ref attrs)) if contains_skip(attrs) => Ok(None), - Ok(m) if outside_mods_empty => Ok(Some(SubModKind::External( - path, - ownership, - Module::new(Cow::Owned(m.0), &m.1), - ))), - Ok(m) => { + match Parser::parse_file_as_module(self.parse_sess, &file_path, sub_mod.span) { + Ok((ref attrs, _, _)) if contains_skip(attrs) => Ok(None), + Ok((attrs, items, span)) if outside_mods_empty => { + Ok(Some(SubModKind::External( + file_path, + dir_ownership, + Module::new( + span, + Some(Cow::Owned(ast::ModKind::Unloaded)), + Cow::Owned(items), + Cow::Owned(attrs), + ), + ))) + } + Ok((attrs, items, span)) => { mods_outside_ast.push(( - path.clone(), - ownership, - Module::new(Cow::Owned(m.0), &m.1), + file_path.clone(), + dir_ownership, + Module::new( + span, + Some(Cow::Owned(ast::ModKind::Unloaded)), + Cow::Owned(items), + Cow::Owned(attrs), + ), )); if should_insert { - mods_outside_ast.push((path, ownership, sub_mod.clone())); + mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone())); } Ok(Some(SubModKind::MultiExternal(mods_outside_ast))) } Err(ParserError::ParseError) => Err(ModuleResolutionError { module: mod_name.to_string(), - kind: ModuleResolutionErrorKind::ParseError { file: path }, + kind: ModuleResolutionErrorKind::ParseError { file: file_path }, }), Err(..) if outside_mods_empty => Err(ModuleResolutionError { module: mod_name.to_string(), - kind: ModuleResolutionErrorKind::NotFound { file: path }, + kind: ModuleResolutionErrorKind::NotFound { file: file_path }, }), Err(..) => { if should_insert { - mods_outside_ast.push((path, ownership, sub_mod.clone())); + mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone())); } Ok(Some(SubModKind::MultiExternal(mods_outside_ast))) } } } - Err(mut e) if !mods_outside_ast.is_empty() => { - e.cancel(); + Err(mod_err) if !mods_outside_ast.is_empty() => { + if let ModError::ParserError(mut e) = mod_err { + e.cancel(); + } Ok(Some(SubModKind::MultiExternal(mods_outside_ast))) } - Err(mut e) => { - e.cancel(); - Err(ModuleResolutionError { - module: mod_name.to_string(), - kind: ModuleResolutionErrorKind::NotFound { - file: self.directory.path.clone(), - }, - }) - } + Err(_) => Err(ModuleResolutionError { + module: mod_name.to_string(), + kind: ModuleResolutionErrorKind::NotFound { + file: self.directory.path.clone(), + }, + }), } } @@ -437,20 +499,22 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { )); continue; } - let m = match Parser::parse_file_as_module( - self.parse_sess, - &actual_path, - sub_mod.ast_mod.inner, - ) { - Ok((_, ref attrs)) if contains_skip(attrs) => continue, - Ok(m) => m, - Err(..) => continue, - }; + let (attrs, items, span) = + match Parser::parse_file_as_module(self.parse_sess, &actual_path, sub_mod.span) { + Ok((ref attrs, _, _)) if contains_skip(attrs) => continue, + Ok(m) => m, + Err(..) => continue, + }; result.push(( actual_path, DirectoryOwnership::Owned { relative: None }, - Module::new(Cow::Owned(m.0), &m.1), + Module::new( + span, + Some(Cow::Owned(ast::ModKind::Unloaded)), + Cow::Owned(items), + Cow::Owned(attrs), + ), )) } result diff --git a/src/overflow.rs b/src/overflow.rs index 566f0e36639..f1b870101e5 100644 --- a/src/overflow.rs +++ b/src/overflow.rs @@ -74,7 +74,7 @@ pub(crate) enum OverflowableItem<'a> { MacroArg(&'a MacroArg), NestedMetaItem(&'a ast::NestedMetaItem), SegmentParam(&'a SegmentParam<'a>), - StructField(&'a ast::StructField), + FieldDef(&'a ast::FieldDef), TuplePatField(&'a TuplePatField<'a>), Ty(&'a ast::Ty), } @@ -96,7 +96,7 @@ impl<'a> OverflowableItem<'a> { match self { OverflowableItem::Expr(ast::Expr { attrs, .. }) | OverflowableItem::GenericParam(ast::GenericParam { attrs, .. }) => !attrs.is_empty(), - OverflowableItem::StructField(ast::StructField { attrs, .. }) => !attrs.is_empty(), + OverflowableItem::FieldDef(ast::FieldDef { attrs, .. }) => !attrs.is_empty(), OverflowableItem::MacroArg(MacroArg::Expr(expr)) => !expr.attrs.is_empty(), OverflowableItem::MacroArg(MacroArg::Item(item)) => !item.attrs.is_empty(), _ => false, @@ -113,7 +113,7 @@ impl<'a> OverflowableItem<'a> { OverflowableItem::MacroArg(macro_arg) => f(*macro_arg), OverflowableItem::NestedMetaItem(nmi) => f(*nmi), OverflowableItem::SegmentParam(sp) => f(*sp), - OverflowableItem::StructField(sf) => f(*sf), + OverflowableItem::FieldDef(sf) => f(*sf), OverflowableItem::TuplePatField(pat) => f(*pat), OverflowableItem::Ty(ty) => f(*ty), } @@ -238,7 +238,7 @@ macro_rules! impl_into_overflowable_item_for_rustfmt_types { } } -impl_into_overflowable_item_for_ast_node!(Expr, GenericParam, NestedMetaItem, StructField, Ty); +impl_into_overflowable_item_for_ast_node!(Expr, GenericParam, NestedMetaItem, FieldDef, Ty); impl_into_overflowable_item_for_rustfmt_types!([MacroArg], [SegmentParam, TuplePatField]); pub(crate) fn into_overflowable_list<'a, T>( diff --git a/src/patterns.rs b/src/patterns.rs index 5847bd08d80..6824fc661ba 100644 --- a/src/patterns.rs +++ b/src/patterns.rs @@ -1,4 +1,4 @@ -use rustc_ast::ast::{self, BindingMode, FieldPat, Pat, PatKind, RangeEnd, RangeSyntax}; +use rustc_ast::ast::{self, BindingMode, Pat, PatField, PatKind, RangeEnd, RangeSyntax}; use rustc_ast::ptr; use rustc_span::{BytePos, Span}; @@ -17,7 +17,7 @@ use crate::shape::Shape; use crate::source_map::SpanUtils; use crate::spanned::Spanned; use crate::types::{rewrite_path, PathContext}; -use crate::utils::{format_mutability, mk_sp, rewrite_ident}; +use crate::utils::{format_mutability, mk_sp, mk_sp_lo_plus_one, rewrite_ident}; /// Returns `true` if the given pattern is "short". /// A short pattern is defined by the following grammar: @@ -259,7 +259,7 @@ impl Rewrite for Pat { fn rewrite_struct_pat( path: &ast::Path, - fields: &[ast::FieldPat], + fields: &[ast::PatField], ellipsis: bool, span: Span, context: &RewriteContext<'_>, @@ -334,7 +334,7 @@ fn rewrite_struct_pat( Some(format!("{} {{{}}}", path_str, fields_str)) } -impl Rewrite for FieldPat { +impl Rewrite for PatField { fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option { let hi_pos = if let Some(last) = self.attrs.last() { last.span.hi() @@ -460,7 +460,7 @@ fn rewrite_tuple_pat( let sp = pat_vec[new_item_count - 1].span(); let snippet = context.snippet(sp); let lo = sp.lo() + BytePos(snippet.find_uncommented("_").unwrap() as u32); - pat_vec[new_item_count - 1] = TuplePatField::Dotdot(mk_sp(lo, lo + BytePos(1))); + pat_vec[new_item_count - 1] = TuplePatField::Dotdot(mk_sp_lo_plus_one(lo)); ( &pat_vec[..new_item_count], mk_sp(span.lo(), lo + BytePos(1)), diff --git a/src/spanned.rs b/src/spanned.rs index 1f6d0023e68..7e3786b7cd9 100644 --- a/src/spanned.rs +++ b/src/spanned.rs @@ -53,7 +53,7 @@ macro_rules! implement_spanned { // Implement `Spanned` for structs with `attrs` field. implement_spanned!(ast::AssocItem); implement_spanned!(ast::Expr); -implement_spanned!(ast::Field); +implement_spanned!(ast::ExprField); implement_spanned!(ast::ForeignItem); implement_spanned!(ast::Item); implement_spanned!(ast::Local); @@ -143,7 +143,7 @@ impl Spanned for ast::GenericParam { } } -impl Spanned for ast::StructField { +impl Spanned for ast::FieldDef { fn span(&self) -> Span { span_with_attrs_lo_hi!(self, self.span.lo(), self.ty.span.hi()) } diff --git a/src/syntux/parser.rs b/src/syntux/parser.rs index 5c555e06a80..0b94749f3c6 100644 --- a/src/syntux/parser.rs +++ b/src/syntux/parser.rs @@ -1,8 +1,8 @@ use std::panic::{catch_unwind, AssertUnwindSafe}; use std::path::{Path, PathBuf}; -use rustc_ast::ast; use rustc_ast::token::{DelimToken, TokenKind}; +use rustc_ast::{ast, ptr}; use rustc_errors::Diagnostic; use rustc_parse::{ new_parser_from_file, @@ -14,8 +14,9 @@ use crate::attr::first_attr_value_str_by_name; use crate::syntux::session::ParseSess; use crate::Input; -pub(crate) type DirectoryOwnership = rustc_expand::module::DirectoryOwnership; +pub(crate) type DirectoryOwnership = rustc_expand::module::DirOwnership; pub(crate) type ModulePathSuccess = rustc_expand::module::ModulePathSuccess; +pub(crate) type ModError<'a> = rustc_expand::module::ModError<'a>; #[derive(Clone)] pub(crate) struct Directory { @@ -109,10 +110,10 @@ impl<'a> Parser<'a> { sess: &'a ParseSess, path: &Path, span: Span, - ) -> Result<(ast::Mod, Vec), ParserError> { + ) -> Result<(Vec, Vec>, Span), ParserError> { let result = catch_unwind(AssertUnwindSafe(|| { let mut parser = new_parser_from_file(sess.inner(), &path, Some(span)); - match parser.parse_mod(&TokenKind::Eof, ast::Unsafe::No) { + match parser.parse_mod(&TokenKind::Eof) { Ok(result) => Some(result), Err(mut e) => { sess.emit_or_cancel_diagnostic(&mut e); diff --git a/src/syntux/session.rs b/src/syntux/session.rs index ef5ad62674e..374d08f7f23 100644 --- a/src/syntux/session.rs +++ b/src/syntux/session.rs @@ -150,14 +150,8 @@ impl ParseSess { id: symbol::Ident, relative: Option, dir_path: &Path, - ) -> rustc_expand::module::ModulePath<'_> { - rustc_expand::module::default_submod_path( - &self.parse_sess, - id, - rustc_span::DUMMY_SP, - relative, - dir_path, - ) + ) -> Result> { + rustc_expand::module::default_submod_path(&self.parse_sess, id, relative, dir_path) } pub(crate) fn is_file_parsed(&self, path: &Path) -> bool { diff --git a/src/utils.rs b/src/utils.rs index a3d0ed050e3..d3c349fb701 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -360,6 +360,10 @@ pub(crate) fn mk_sp(lo: BytePos, hi: BytePos) -> Span { Span::new(lo, hi, SyntaxContext::root()) } +pub(crate) fn mk_sp_lo_plus_one(lo: BytePos) -> Span { + Span::new(lo, lo + BytePos(1), SyntaxContext::root()) +} + // Returns `true` if the given span does not intersect with file lines. macro_rules! out_of_file_lines_range { ($self:ident, $span:expr) => { diff --git a/src/vertical.rs b/src/vertical.rs index 95d1d5c2d7e..c4208848c6c 100644 --- a/src/vertical.rs +++ b/src/vertical.rs @@ -33,7 +33,7 @@ pub(crate) trait AlignedItem { ) -> Option; } -impl AlignedItem for ast::StructField { +impl AlignedItem for ast::FieldDef { fn skip(&self) -> bool { contains_skip(&self.attrs) } @@ -72,7 +72,7 @@ impl AlignedItem for ast::StructField { } } -impl AlignedItem for ast::Field { +impl AlignedItem for ast::ExprField { fn skip(&self) -> bool { contains_skip(&self.attrs) } diff --git a/src/visitor.rs b/src/visitor.rs index 34e8536b7ee..55cc9ec7f58 100644 --- a/src/visitor.rs +++ b/src/visitor.rs @@ -1,7 +1,7 @@ use std::cell::{Cell, RefCell}; use std::rc::Rc; -use rustc_ast::{ast, attr::HasAttrs, token::DelimToken, visit}; +use rustc_ast::{ast, token::DelimToken, visit, AstLike}; use rustc_span::{symbol, BytePos, Pos, Span, DUMMY_SP}; use crate::attr::*; @@ -524,10 +524,9 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { self.visit_enum(item.ident, &item.vis, def, generics, item.span); self.last_pos = source!(self, item.span).hi(); } - ast::ItemKind::Mod(ref module) => { - let is_inline = !is_mod_decl(item); + ast::ItemKind::Mod(unsafety, ref mod_kind) => { self.format_missing_with_indent(source!(self, item.span).lo()); - self.format_mod(module, &item.vis, item.span, item.ident, attrs, is_inline); + self.format_mod(mod_kind, unsafety, &item.vis, item.span, item.ident, attrs); } ast::ItemKind::MacCall(ref mac) => { self.visit_mac(mac, Some(item.ident), MacroPosition::Item); @@ -921,8 +920,8 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { !is_skip_attr(segments) } - fn walk_mod_items(&mut self, m: &ast::Mod) { - self.visit_items_with_reordering(&ptr_vec_to_ref_vec(&m.items)); + fn walk_mod_items(&mut self, items: &Vec>) { + self.visit_items_with_reordering(&ptr_vec_to_ref_vec(&items)); } fn walk_stmts(&mut self, stmts: &[Stmt<'_>], include_current_empty_semi: bool) { @@ -974,22 +973,22 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { fn format_mod( &mut self, - m: &ast::Mod, + mod_kind: &ast::ModKind, + unsafety: ast::Unsafe, vis: &ast::Visibility, s: Span, ident: symbol::Ident, attrs: &[ast::Attribute], - is_internal: bool, ) { let vis_str = utils::format_visibility(&self.get_context(), vis); self.push_str(&*vis_str); - self.push_str(format_unsafety(m.unsafety)); + self.push_str(format_unsafety(unsafety)); self.push_str("mod "); // Calling `to_owned()` to work around borrow checker. let ident_str = rewrite_ident(&self.get_context(), ident).to_owned(); self.push_str(&ident_str); - if is_internal { + if let ast::ModKind::Loaded(ref items, ast::Inline::Yes, inner_span) = mod_kind { match self.config.brace_style() { BraceStyle::AlwaysNextLine => { let indent_str = self.block_indent.to_string_with_newline(self.config); @@ -1001,7 +1000,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { // Hackery to account for the closing }. let mod_lo = self.snippet_provider.span_after(source!(self, s), "{"); let body_snippet = - self.snippet(mk_sp(mod_lo, source!(self, m.inner).hi() - BytePos(1))); + self.snippet(mk_sp(mod_lo, source!(self, inner_span).hi() - BytePos(1))); let body_snippet = body_snippet.trim(); if body_snippet.is_empty() { self.push_str("}"); @@ -1009,11 +1008,11 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { self.last_pos = mod_lo; self.block_indent = self.block_indent.block_indent(self.config); self.visit_attrs(attrs, ast::AttrStyle::Inner); - self.walk_mod_items(m); - let missing_span = self.next_span(m.inner.hi() - BytePos(1)); + self.walk_mod_items(items); + let missing_span = self.next_span(inner_span.hi() - BytePos(1)); self.close_block(missing_span, false); } - self.last_pos = source!(self, m.inner).hi(); + self.last_pos = source!(self, inner_span).hi(); } else { self.push_str(";"); self.last_pos = source!(self, s).hi(); @@ -1023,9 +1022,9 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { pub(crate) fn format_separate_mod(&mut self, m: &Module<'_>, end_pos: BytePos) { self.block_indent = Indent::empty(); if self.visit_attrs(m.attrs(), ast::AttrStyle::Inner) { - self.push_skipped_with_span(m.attrs(), m.as_ref().inner, m.as_ref().inner); + self.push_skipped_with_span(m.attrs(), m.span, m.span); } else { - self.walk_mod_items(m.as_ref()); + self.walk_mod_items(&m.items); self.format_missing_with_indent(end_pos); } }