2
2
import syntax:: { ast, ast_util, codemap} ;
3
3
import syntax:: ast:: * ;
4
4
import ast:: { ident, fn_ident, def, def_id, node_id} ;
5
- import syntax:: ast_util:: { local_def, def_id_of_def} ;
5
+ import syntax:: ast_util:: { local_def, def_id_of_def, is_exported } ;
6
6
7
7
import metadata:: { csearch, cstore} ;
8
8
import driver:: session:: session;
@@ -494,7 +494,8 @@ fn resolve_import(e: env, defid: ast::def_id, name: ast::ident,
494
494
impls : [ @ast:: item ] ) {
495
495
let val = lookup ( ns_value) , typ = lookup ( ns_type) ,
496
496
md = lookup ( ns_module) ;
497
- if is_none ( val) && is_none ( typ) && is_none ( md) {
497
+ if is_none ( val) && is_none ( typ) && is_none ( md) &&
498
+ vec:: len ( impls) == 0 u {
498
499
unresolved_err ( e, cx, sp, name, "import" ) ;
499
500
} else {
500
501
e. imports . insert ( id, resolved ( val, typ, md, @impls, name, sp) ) ;
@@ -1112,7 +1113,7 @@ fn lookup_in_local_native_mod(e: env, node_id: node_id, sp: span, id: ident,
1112
1113
fn lookup_in_local_mod ( e : env , node_id : node_id , sp : span , id : ident ,
1113
1114
ns : namespace , dr : dir ) -> option:: t < def > {
1114
1115
let info = e. mod_map . get ( node_id) ;
1115
- if dr == outside && !ast_util :: is_exported ( id, option:: get ( info. m ) ) {
1116
+ if dr == outside && !is_exported ( id, option:: get ( info. m ) ) {
1116
1117
// if we're in a native mod, then dr==inside, so info.m is some _mod
1117
1118
ret none :: < def > ; // name is not visible
1118
1119
}
@@ -1637,12 +1638,22 @@ fn resolve_impls(e: @env, c: @ast::crate) {
1637
1638
}
1638
1639
1639
1640
fn find_impls_in_view_item ( e : env , vi : @ast:: view_item ,
1640
- & impls: [ @ast:: item ] ) {
1641
+ & impls: [ @ast:: item ] , sc : iscopes ) {
1641
1642
alt vi. node {
1642
- ast:: view_item_import ( ident, _, id) {
1643
- // FIXME if single name, simply look in our own iscope
1644
- alt e. imports . get ( id) {
1645
- resolved ( _, _, _, is, _, _) { impls += * is; }
1643
+ ast:: view_item_import ( _, pt, id) {
1644
+ let found = [ ] ;
1645
+ if vec:: len ( * pt) == 1 u {
1646
+ list:: iter ( sc) { |level|
1647
+ if vec:: len ( found) > 0 u { ret; }
1648
+ for imp in * level {
1649
+ if imp. ident == pt[ 0 ] { found += [ imp] ; }
1650
+ }
1651
+ if vec:: len ( found) > 0 u { impls += found; }
1652
+ }
1653
+ } else {
1654
+ alt e. imports . get ( id) {
1655
+ resolved ( _, _, _, is, _, _) { impls += * is; }
1656
+ }
1646
1657
}
1647
1658
}
1648
1659
ast:: view_item_import_from ( base, names, _) {
@@ -1667,26 +1678,28 @@ fn find_impls_in_view_item(e: env, vi: @ast::view_item,
1667
1678
}
1668
1679
1669
1680
fn find_impls_in_item ( i : @ast:: item , & impls: [ @ast:: item ] ,
1670
- name : option:: t < ident > , _dir : dir ) {
1671
- // FIXME check exports
1681
+ name : option:: t < ident > ,
1682
+ ck_exports : option :: t < ast :: _mod > ) {
1672
1683
alt i. node {
1673
1684
ast:: item_impl ( _, _, _) {
1674
- if alt name { some ( n) { n == i. ident } _ { true } } {
1685
+ if alt name { some ( n) { n == i. ident } _ { true } } &&
1686
+ alt ck_exports { some( m) { is_exported ( i. ident , m) } _ { true } } {
1675
1687
impls += [ i] ;
1676
1688
}
1677
1689
}
1678
1690
_ { }
1679
1691
}
1680
1692
}
1681
1693
1694
+ // FIXME[impl] external importing of impls
1682
1695
fn find_impls_in_mod( e : env , m : def , & impls: [ @ast:: item ] ,
1683
1696
name : option:: t < ident > ) {
1684
1697
alt m {
1685
1698
ast : : def_mod ( defid) {
1686
- // FIXME external importing of impls
1687
1699
if defid. crate == ast:: local_crate {
1688
- for i in option:: get ( e. mod_map . get ( defid. node ) . m ) . items {
1689
- find_impls_in_item ( i, impls, name, outside) ;
1700
+ let md = option:: get ( e. mod_map . get ( defid. node ) . m ) ;
1701
+ for i in md. items {
1702
+ find_impls_in_item ( i, impls, name, some ( md) ) ;
1690
1703
}
1691
1704
}
1692
1705
}
@@ -1699,11 +1712,13 @@ type iscopes = list<@[@ast::item]>;
1699
1712
fn visit_block_with_impl_scope ( e : @env , b : ast:: blk , sc : iscopes ,
1700
1713
v : vt < iscopes > ) {
1701
1714
let impls = [ ] ;
1702
- for vi in b. node . view_items { find_impls_in_view_item ( * e, vi, impls) ; }
1715
+ for vi in b. node . view_items {
1716
+ find_impls_in_view_item ( * e, vi, impls, sc) ;
1717
+ }
1703
1718
for st in b. node . stmts {
1704
1719
alt st. node {
1705
1720
ast:: stmt_decl ( @{ node: ast:: decl_item ( i) , _} , _) {
1706
- find_impls_in_item ( i, impls, none, inside ) ;
1721
+ find_impls_in_item ( i, impls, none, none ) ;
1707
1722
}
1708
1723
_ { }
1709
1724
}
@@ -1715,8 +1730,8 @@ fn visit_block_with_impl_scope(e: @env, b: ast::blk, sc: iscopes,
1715
1730
fn visit_mod_with_impl_scope ( e : @env , m : ast:: _mod , s : span , sc : iscopes ,
1716
1731
v : vt < iscopes > ) {
1717
1732
let impls = [ ] ;
1718
- for vi in m. view_items { find_impls_in_view_item ( * e, vi, impls) ; }
1719
- for i in m. items { find_impls_in_item ( i, impls, none, inside ) ; }
1733
+ for vi in m. view_items { find_impls_in_view_item ( * e, vi, impls, sc ) ; }
1734
+ for i in m. items { find_impls_in_item ( i, impls, none, none ) ; }
1720
1735
visit:: visit_mod ( m, s, vec:: len ( impls) > 0 u ? cons ( @impls, @sc) : sc, v) ;
1721
1736
}
1722
1737
0 commit comments