Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove extern mod foo (name="bar") syntax, closes #9543 #10696

Merged
merged 2 commits into from
Jan 2, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah now I remember something I remembered awhile ago, these need to change to link to the proper libstd. Right now this is just linking to an arbitrary libstd but we want it to target a specific version (in this case 0.9-pre). The extern mod statements below should not have None, but rather Some("std#0.9-pre") (or the equivalent thereof)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've pushed another commit, addressing this point.


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