Skip to content

Commit

Permalink
add --edition option
Browse files Browse the repository at this point in the history
  • Loading branch information
klnusbaum committed Apr 19, 2018
1 parent 8830a03 commit 51f5110
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 32 deletions.
71 changes: 47 additions & 24 deletions src/librustc/session/config.rs
Expand Up @@ -16,6 +16,8 @@ pub use self::CrateType::*;
pub use self::Passes::*;
pub use self::DebugInfoLevel::*;

use std::str::FromStr;

use session::{early_error, early_warn, Session};
use session::search_paths::SearchPaths;

Expand All @@ -28,7 +30,7 @@ use middle::cstore;

use syntax::ast::{self, IntTy, UintTy};
use syntax::codemap::{FileName, FilePathMapping};
use syntax::edition::Edition;
use syntax::edition::{Edition, ALL_EDITIONS, DEFAULT_EDITION};
use syntax::parse::token;
use syntax::parse;
use syntax::symbol::Symbol;
Expand Down Expand Up @@ -410,6 +412,7 @@ top_level_options!(

// Remap source path prefixes in all output (messages, object files, debug, etc)
remap_path_prefix: Vec<(PathBuf, PathBuf)> [UNTRACKED],
edition: Edition [UNTRACKED],
}
);

Expand Down Expand Up @@ -589,6 +592,7 @@ pub fn basic_options() -> Options {
cli_forced_codegen_units: None,
cli_forced_thinlto_off: false,
remap_path_prefix: Vec::new(),
edition: DEFAULT_EDITION,
}
}

Expand Down Expand Up @@ -773,16 +777,13 @@ macro_rules! options {
Some("`string` or `string=string`");
pub const parse_lto: Option<&'static str> =
Some("one of `thin`, `fat`, or omitted");
pub const parse_edition: Option<&'static str> =
Some("one of: `2015`, `2018`");
}

#[allow(dead_code)]
mod $mod_set {
use super::{$struct_name, Passes, SomePasses, AllPasses, Sanitizer, Lto};
use rustc_back::{LinkerFlavor, PanicStrategy, RelroLevel};
use std::path::PathBuf;
use syntax::edition::Edition;

$(
pub fn $opt(cg: &mut $struct_name, v: Option<&str>) -> bool {
Expand Down Expand Up @@ -985,20 +986,6 @@ macro_rules! options {
true
}

fn parse_edition(slot: &mut Edition, v: Option<&str>) -> bool {
match v {
Some(s) => {
let edition = s.parse();
if let Ok(parsed) = edition {
*slot = parsed;
true
} else {
false
}
}
_ => false,
}
}
}
) }

Expand Down Expand Up @@ -1292,10 +1279,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
`everybody_loops` (all function bodies replaced with `loop {}`),
`hir` (the HIR), `hir,identified`, or
`hir,typed` (HIR with types for each node)."),
edition: Edition = (Edition::Edition2015, parse_edition, [TRACKED],
"The edition to build Rust with. Newer editions may include features
that require breaking changes. The default edition is 2015 (the first
edition). Crates compiled with different editions can be linked together."),
run_dsymutil: Option<bool> = (None, parse_opt_bool, [TRACKED],
"run `dsymutil` and delete intermediate object files"),
ui_testing: bool = (false, parse_bool, [UNTRACKED],
Expand Down Expand Up @@ -1656,6 +1639,12 @@ pub fn rustc_optgroups() -> Vec<RustcOptGroup> {
`expanded,identified` (fully parenthesized, AST nodes with IDs).",
"TYPE",
),
opt::opt_s(
"",
"edition",
"Specify which edition of the compiler to use when compiling code.",
&edition_name_list(),
),
opt::multi_s(
"",
"remap-path-prefix",
Expand Down Expand Up @@ -1715,6 +1704,22 @@ pub fn build_session_options_and_crate_config(
),
};

let edition = match matches.opt_str("edition") {
Some(arg) => match Edition::from_str(&arg){
Ok(edition) => edition,
Err(_) => early_error(
ErrorOutputType::default(),
&format!(
"argument for --edition must be one of: \
{}. (instead was `{}`)",
edition_name_list(),
arg
),
),
}
None => DEFAULT_EDITION,
};

// We need the opts_present check because the driver will send us Matches
// with only stable options if no unstable options are used. Since error-format
// is unstable, it will not be present. We have to use opts_present not
Expand Down Expand Up @@ -2171,6 +2176,7 @@ pub fn build_session_options_and_crate_config(
cli_forced_codegen_units: codegen_units,
cli_forced_thinlto_off: disable_thinlto,
remap_path_prefix,
edition,
},
cfg,
)
Expand Down Expand Up @@ -2300,7 +2306,7 @@ mod dep_tracking {
use std::hash::Hash;
use std::path::PathBuf;
use std::collections::hash_map::DefaultHasher;
use super::{CrateType, DebugInfoLevel, Edition, ErrorOutputType, Lto, OptLevel, OutputTypes,
use super::{CrateType, DebugInfoLevel, ErrorOutputType, Lto, OptLevel, OutputTypes,
Passes, Sanitizer};
use syntax::feature_gate::UnstableFeatures;
use rustc_back::{PanicStrategy, RelroLevel};
Expand Down Expand Up @@ -2363,7 +2369,6 @@ mod dep_tracking {
impl_dep_tracking_hash_via_hash!(cstore::NativeLibraryKind);
impl_dep_tracking_hash_via_hash!(Sanitizer);
impl_dep_tracking_hash_via_hash!(Option<Sanitizer>);
impl_dep_tracking_hash_via_hash!(Edition);
impl_dep_tracking_hash_via_hash!(TargetTriple);

impl_dep_tracking_hash_for_sortable_vec_of!(String);
Expand Down Expand Up @@ -2422,6 +2427,11 @@ mod dep_tracking {
}
}

pub fn edition_name_list() -> String {
let names: Vec<String> = ALL_EDITIONS.iter().map(|e| format!("{}", e)).collect();
names.join("|")
}

#[cfg(test)]
mod tests {
use errors;
Expand Down Expand Up @@ -3081,4 +3091,17 @@ mod tests {
opts.debugging_opts.relro_level = Some(RelroLevel::Full);
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
}

#[test]
fn test_edition_parsing() {
// test default edition
let options = super::basic_options();
assert!(options.edition == Edition::DEFAULT_EDITION);

let matches = optgroups()
.parse(&["--edition=2018".to_string()])
.unwrap();
let (sessopts, _) = build_session_options_and_crate_config(&matches);
assert!(sessopts.edition == Edition::Edition2018)
}
}
4 changes: 2 additions & 2 deletions src/librustc/session/mod.rs
Expand Up @@ -934,11 +934,11 @@ impl Session {

/// Are we allowed to use features from the Rust 2018 edition?
pub fn rust_2018(&self) -> bool {
self.opts.debugging_opts.edition >= Edition::Edition2018
self.opts.edition >= Edition::Edition2018
}

pub fn edition(&self) -> Edition {
self.opts.debugging_opts.edition
self.opts.edition
}
}

Expand Down
8 changes: 2 additions & 6 deletions src/libsyntax/edition.rs
Expand Up @@ -27,17 +27,13 @@ pub enum Edition {
// - the list in the `parse_edition` static in librustc::session::config
// - add a `rust_####()` function to the session
// - update the enum in Cargo's sources as well
//
// When -Zedition becomes --edition, there will
// also be a check for the edition being nightly-only
// somewhere. That will need to be updated
// whenever we're stabilizing/introducing a new edition
// as well as changing the default Cargo template.
}

// must be in order from oldest to newest
pub const ALL_EDITIONS: &[Edition] = &[Edition::Edition2015, Edition::Edition2018];

pub const DEFAULT_EDITION: Edition = Edition::Edition2015;

impl fmt::Display for Edition {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let s = match *self {
Expand Down

0 comments on commit 51f5110

Please sign in to comment.