Skip to content

Commit

Permalink
auto merge of #10696 : fhahn/rust/issue9543-remove-extern-mod-foo, r=…
Browse files Browse the repository at this point in the history
…pcwalton

This patch for  #9543 throws an `obsolete syntax` error for `extern mod foo (name="bar")` . 
I was wondering if [this](https://github.com/fhahn/rust/compare/mozilla:master...fhahn:issue9543-remove-extern-mod-foo?expand=1#diff-da9d34ca1d0f6beee2838cf02e07345cR4444) is the correct place to do this?

I think the wording of the error message could probably be improved as well.

If this approach is OK, I'm going to run the whole test suite tomorrow and update the old syntax to the new one.
  • Loading branch information
bors committed Jan 2, 2014
2 parents c29b1be + 4cb13ed commit 0df9b85
Show file tree
Hide file tree
Showing 18 changed files with 62 additions and 37 deletions.
16 changes: 7 additions & 9 deletions src/librustc/front/std_inject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use syntax::fold;
use syntax::opt_vec;
use syntax::util::small_vector::SmallVector;

static STD_VERSION: &'static str = "0.9-pre";
pub static VERSION: &'static str = "0.9-pre";

pub fn maybe_inject_libstd_ref(sess: Session, crate: ast::Crate)
-> ast::Crate {
Expand Down Expand Up @@ -57,12 +57,10 @@ struct StandardLibraryInjector {

impl fold::ast_fold for StandardLibraryInjector {
fn fold_crate(&mut self, crate: ast::Crate) -> ast::Crate {
let version = STD_VERSION.to_managed();
let vers_item = attr::mk_name_value_item_str(@"vers", version);
let mut vis = ~[ast::view_item {
node: ast::view_item_extern_mod(self.sess.ident_of("std"),
None,
~[vers_item.clone()],
Some((format!("std\\#{}", VERSION).to_managed(),
ast::CookedStr)),
ast::DUMMY_NODE_ID),
attrs: ~[],
vis: ast::private,
Expand All @@ -72,17 +70,17 @@ impl fold::ast_fold for StandardLibraryInjector {
if use_uv(&crate) && !self.sess.building_library.get() {
vis.push(ast::view_item {
node: ast::view_item_extern_mod(self.sess.ident_of("green"),
None,
~[vers_item],
Some((format!("green\\#{}", VERSION).to_managed(),
ast::CookedStr)),
ast::DUMMY_NODE_ID),
attrs: ~[],
vis: ast::private,
span: DUMMY_SP
});
vis.push(ast::view_item {
node: ast::view_item_extern_mod(self.sess.ident_of("rustuv"),
None,
~[vers_item],
Some((format!("rustuv\\#{}", VERSION).to_managed(),
ast::CookedStr)),
ast::DUMMY_NODE_ID),
attrs: ~[],
vis: ast::private,
Expand Down
7 changes: 5 additions & 2 deletions src/librustc/front/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use driver::session;
use front::config;
use front::std_inject::VERSION;

use std::cell::RefCell;
use std::vec;
Expand Down Expand Up @@ -291,8 +292,10 @@ fn mk_std(cx: &TestCtxt) -> ast::view_item {
path_node(~[id_extra]),
ast::DUMMY_NODE_ID))])
} else {
let mi = attr::mk_name_value_item_str(@"vers", @"0.9-pre");
ast::view_item_extern_mod(id_extra, None, ~[mi], ast::DUMMY_NODE_ID)
ast::view_item_extern_mod(id_extra,
Some((format!("extra\\#{}", VERSION).to_managed(),
ast::CookedStr)),
ast::DUMMY_NODE_ID)
};
ast::view_item {
node: vi,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/metadata/creader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ fn visit_crate(e: &Env, c: &ast::Crate) {

fn visit_view_item(e: &mut Env, i: &ast::view_item) {
match i.node {
ast::view_item_extern_mod(ident, path_opt, _, id) => {
ast::view_item_extern_mod(ident, path_opt, id) => {
let ident = token::ident_to_str(&ident);
debug!("resolving extern mod stmt. ident: {:?} path_opt: {:?}",
ident, path_opt);
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/resolve.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1507,7 +1507,7 @@ impl Resolver {
}
}

view_item_extern_mod(name, _, _, node_id) => {
view_item_extern_mod(name, _, node_id) => {
// n.b. we don't need to look at the path option here, because cstore already did
match self.session.cstore.find_extern_mod_stmt_cnum(node_id) {
Some(crate_id) => {
Expand Down
6 changes: 3 additions & 3 deletions src/librustdoc/clean.rs
Original file line number Diff line number Diff line change
Expand Up @@ -994,15 +994,15 @@ impl Clean<Item> for ast::view_item {

#[deriving(Clone, Encodable, Decodable)]
pub enum ViewItemInner {
ExternMod(~str, Option<~str>, ~[Attribute], ast::NodeId),
ExternMod(~str, Option<~str>, ast::NodeId),
Import(~[ViewPath])
}

impl Clean<ViewItemInner> for ast::view_item_ {
fn clean(&self) -> ViewItemInner {
match self {
&ast::view_item_extern_mod(ref i, ref p, ref mi, ref id) =>
ExternMod(i.clean(), p.map(|(ref x, _)| x.to_owned()), mi.clean(), *id),
&ast::view_item_extern_mod(ref i, ref p, ref id) =>
ExternMod(i.clean(), p.map(|(ref x, _)| x.to_owned()), *id),
&ast::view_item_use(ref vp) => Import(vp.clean())
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/html/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -995,7 +995,7 @@ fn item_module(w: &mut Writer, cx: &Context,

clean::ViewItemItem(ref item) => {
match item.inner {
clean::ExternMod(ref name, ref src, _, _) => {
clean::ExternMod(ref name, ref src, _) => {
write!(w, "<tr><td><code>extern mod {}",
name.as_slice());
match *src {
Expand Down
25 changes: 22 additions & 3 deletions src/librustpkg/path_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

pub use crate_id::CrateId;
pub use target::{OutputType, Main, Lib, Test, Bench, Target, Build, Install};
pub use version::{Version, NoVersion, split_version_general, try_parsing_version};
pub use version::{Version, ExactRevision, NoVersion, split_version, split_version_general,
try_parsing_version};
pub use rustc::metadata::filesearch::rust_path;
use rustc::metadata::filesearch::libdir;
use rustc::driver::driver::host_triple;
Expand Down Expand Up @@ -213,8 +214,9 @@ pub fn library_in_workspace(path: &Path, short_name: &str, where: Target,
}

// rustc doesn't use target-specific subdirectories
pub fn system_library(sysroot: &Path, lib_name: &str) -> Option<Path> {
library_in(lib_name, &NoVersion, &sysroot.join(libdir()))
pub fn system_library(sysroot: &Path, crate_id: &str) -> Option<Path> {
let (lib_name, version) = split_crate_id(crate_id);
library_in(lib_name, &version, &sysroot.join(libdir()))
}

fn library_in(short_name: &str, version: &Version, dir_to_search: &Path) -> Option<Path> {
Expand Down Expand Up @@ -268,6 +270,7 @@ fn library_in(short_name: &str, version: &Version, dir_to_search: &Path) -> Opti
}
None => break
}

}
_ => { f_name = f_name.slice(0, i); }
}
Expand All @@ -293,6 +296,22 @@ fn library_in(short_name: &str, version: &Version, dir_to_search: &Path) -> Opti
abs_path
}

fn split_crate_id<'a>(crate_id: &'a str) -> (&'a str, Version) {
match split_version(crate_id) {
Some((name, vers)) =>
match vers {
ExactRevision(ref v) => match v.find('-') {
Some(pos) => (name, ExactRevision(v.slice(0, pos).to_owned())),
None => (name, ExactRevision(v.to_owned()))
},
_ => (name, vers)
},
None => (crate_id, NoVersion)
}
}



/// Returns the executable that would be installed for <crateid>
/// in <workspace>
/// As a side effect, creates the bin-dir if it doesn't exist
Expand Down
2 changes: 1 addition & 1 deletion src/librustpkg/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ impl<'a> Visitor<()> for ViewItemVisitor<'a> {

match vi.node {
// ignore metadata, I guess
ast::view_item_extern_mod(lib_ident, path_opt, _, _) => {
ast::view_item_extern_mod(lib_ident, path_opt, _) => {
let lib_name = match path_opt {
Some((p, _)) => p,
None => self.sess.str_of(lib_ident)
Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1057,7 +1057,7 @@ pub enum view_item_ {
// optional @str: if present, this is a location (containing
// arbitrary characters) from which to fetch the crate sources
// For example, extern mod whatever = "github.com/mozilla/rust"
view_item_extern_mod(Ident, Option<(@str, StrStyle)>, ~[@MetaItem], NodeId),
view_item_extern_mod(Ident, Option<(@str, StrStyle)>, NodeId),
view_item_use(~[@view_path]),
}

Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax/ast_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ impl<'a, O: IdVisitingOperation> Visitor<()> for IdVisitor<'a, O> {

fn visit_view_item(&mut self, view_item: &view_item, env: ()) {
match view_item.node {
view_item_extern_mod(_, _, _, node_id) => {
view_item_extern_mod(_, _, node_id) => {
self.operation.visit_id(node_id)
}
view_item_use(ref view_paths) => {
Expand Down
2 changes: 0 additions & 2 deletions src/libsyntax/fold.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,9 @@ pub trait ast_fold {
let inner_view_item = match vi.node {
view_item_extern_mod(ref ident,
string,
ref meta_items,
node_id) => {
view_item_extern_mod(ident.clone(),
string,
self.fold_meta_items(*meta_items),
self.new_id(node_id))
}
view_item_use(ref view_paths) => {
Expand Down
6 changes: 6 additions & 0 deletions src/libsyntax/parse/obsolete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ pub enum ObsoleteSyntax {
ObsoleteBoxedClosure,
ObsoleteClosureType,
ObsoleteMultipleImport,
ObsoleteExternModAttributesInParens
}

impl to_bytes::IterBytes for ObsoleteSyntax {
Expand Down Expand Up @@ -145,6 +146,11 @@ impl ParserObsoleteMethods for Parser {
"multiple imports",
"only one import is allowed per `use` statement"
),
ObsoleteExternModAttributesInParens => (
"`extern mod` with linkage attribute list",
"use `extern mod foo = \"bar\";` instead of \
`extern mod foo (name = \"bar\")`"
)
};

self.report(sp, kind, kind_str, desc);
Expand Down
11 changes: 9 additions & 2 deletions src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4446,11 +4446,18 @@ impl Parser {
self.span_err(*self.span, "an ABI may not be specified here");
}


if *self.token == token::LPAREN {
// `extern mod foo (name = "bar"[,vers = "version"]) is obsolete,
// `extern mod foo = "bar#[version]";` should be used.
// Parse obsolete options to avoid wired parser errors
self.parse_optional_meta();
self.obsolete(*self.span, ObsoleteExternModAttributesInParens);
}
// extern mod foo;
let metadata = self.parse_optional_meta();
self.expect(&token::SEMI);
iovi_view_item(ast::view_item {
node: view_item_extern_mod(ident, maybe_path, metadata, ast::DUMMY_NODE_ID),
node: view_item_extern_mod(ident, maybe_path, ast::DUMMY_NODE_ID),
attrs: attrs,
vis: visibility,
span: mk_sp(lo, self.last_span.hi)
Expand Down
7 changes: 1 addition & 6 deletions src/libsyntax/print/pprust.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1952,7 +1952,7 @@ pub fn print_view_item(s: @ps, item: &ast::view_item) {
print_outer_attributes(s, item.attrs);
print_visibility(s, item.vis);
match item.node {
ast::view_item_extern_mod(id, ref optional_path, ref mta, _) => {
ast::view_item_extern_mod(id, ref optional_path, _) => {
head(s, "extern mod");
print_ident(s, id);
for &(ref p, style) in optional_path.iter() {
Expand All @@ -1961,11 +1961,6 @@ pub fn print_view_item(s: @ps, item: &ast::view_item) {
space(s.s);
print_string(s, *p, style);
}
if !mta.is_empty() {
popen(s);
commasep(s, consistent, *mta, |p, &i| print_meta_item(p, i));
pclose(s);
}
}

ast::view_item_use(ref vps) => {
Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax/visit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ pub fn walk_mod<E:Clone, V:Visitor<E>>(visitor: &mut V, module: &_mod, env: E) {

pub fn walk_view_item<E:Clone, V:Visitor<E>>(visitor: &mut V, vi: &view_item, env: E) {
match vi.node {
view_item_extern_mod(name, _, _, _) => {
view_item_extern_mod(name, _, _) => {
visitor.visit_ident(vi.span, name, env)
}
view_item_use(ref paths) => {
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/crateresolve8.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

#[crate_id="crateresolve8#0.1"];

extern mod crateresolve8(vers = "0.1", package_id="crateresolve8#0.1");
extern mod crateresolve8 = "crateresolve8#0.1";
//extern mod crateresolve8(vers = "0.1");

pub fn main() {
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/extern-crosscrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
// xfail-fast
//aux-build:extern-crosscrate-source.rs

extern mod externcallback(vers = "0.1");
extern mod externcallback = "externcallback#0.1";

fn fact(n: uint) -> uint {
unsafe {
Expand Down
1 change: 0 additions & 1 deletion src/test/run-pass/issue-6919.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
// xfail-fast

#[crate_id="issue-6919"];

extern mod issue6919_3;

pub fn main() {
Expand Down

0 comments on commit 0df9b85

Please sign in to comment.