Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
b3cad86a
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b3cad86a
编写于
7月 23, 2012
作者:
P
Patrick Walton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rustc: Resolve struct names in struct literals
上级
0d581bda
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
9 deletion
+49
-9
src/rustc/middle/resolve3.rs
src/rustc/middle/resolve3.rs
+49
-9
未找到文件。
src/rustc/middle/resolve3.rs
浏览文件 @
b3cad86a
...
...
@@ -14,15 +14,15 @@
import
syntax
::
ast
::{
def_upvar
,
def_use
,
def_variant
,
expr
,
expr_assign_op
};
import
syntax
::
ast
::{
expr_binary
,
expr_cast
,
expr_field
,
expr_fn
};
import
syntax
::
ast
::{
expr_fn_block
,
expr_index
,
expr_new
,
expr_path
};
import
syntax
::
ast
::{
expr_
unary
,
fn_decl
,
foreign_item
,
foreign_item_fn
};
import
syntax
::
ast
::{
ident
,
trait_ref
,
impure_fn
,
instance_var
,
item
};
import
syntax
::
ast
::{
i
tem_class
,
item_const
,
item_enum
,
item_fn
,
item_mac
};
import
syntax
::
ast
::{
item_f
oreign_mod
,
item_trait
,
item_impl
,
item_mod
};
import
syntax
::
ast
::{
item_
ty
,
local
,
local_crate
,
method
,
node_id
,
pat
};
import
syntax
::
ast
::{
pat_enum
,
pat_ident
,
path
,
prim_ty
,
stmt_decl
,
ty
,
pat_box
,
pat_uniq
,
pat_lit
,
pat_range
,
pat_rec
,
pat_tup
,
pat_wild
};
import
syntax
::
ast
::{
ty_bool
,
ty_char
,
ty_f
,
ty_f32
,
ty_f64
};
import
syntax
::
ast
::{
expr_
struct
,
expr_unary
,
fn_decl
,
foreign_item
};
import
syntax
::
ast
::{
foreign_item_fn
,
ident
,
trait_ref
,
impure_fn
};
import
syntax
::
ast
::{
i
nstance_var
,
item
,
item_class
,
item_const
,
item_enum
};
import
syntax
::
ast
::{
item_f
n
,
item_mac
,
item_foreign_mod
,
item_impl
};
import
syntax
::
ast
::{
item_
mod
,
item_trait
,
item_ty
,
local
,
local_crate
};
import
syntax
::
ast
::{
method
,
node_id
,
pat
,
pat_enum
,
pat_ident
};
import
syntax
::
ast
::{
path
,
prim_ty
,
pat_box
,
pat_uniq
,
pat_lit
,
pat_range
};
import
syntax
::
ast
::{
pat_rec
,
pat_tup
,
pat_wild
,
stmt_decl
};
import
syntax
::
ast
::{
ty
,
ty
_bool
,
ty_char
,
ty_f
,
ty_f32
,
ty_f64
};
import
syntax
::
ast
::{
ty_float
,
ty_i
,
ty_i16
,
ty_i32
,
ty_i64
,
ty_i8
,
ty_int
};
import
syntax
::
ast
::{
ty_param
,
ty_path
,
ty_str
,
ty_u
,
ty_u16
,
ty_u32
,
ty_u64
};
import
syntax
::
ast
::{
ty_u8
,
ty_uint
,
variant
,
view_item
,
view_item_export
};
...
...
@@ -604,6 +604,7 @@ fn intern(atom_table: @AtomTable, string: @~str,
let
unused_import_lint_level
:
level
;
let
trait_info
:
hashmap
<
def_id
,
@
hashmap
<
Atom
,()
>>
;
let
structs
:
hashmap
<
def_id
,()
>
;
// The number of imports that are currently unresolved.
let
mut
unresolved_imports
:
uint
;
...
...
@@ -657,6 +658,7 @@ fn intern(atom_table: @AtomTable, string: @~str,
self
.unused_import_lint_level
=
unused_import_lint_level
(
session
);
self
.trait_info
=
new_def_hash
();
self
.structs
=
new_def_hash
();
self
.unresolved_imports
=
0u
;
...
...
@@ -915,6 +917,9 @@ fn build_reduced_graph_for_item(item: @item,
(
*
name_bindings
)
.define_impl
(
impl_info
);
// Record the def ID of this struct.
self
.structs
.insert
(
local_def
(
item
.id
),
());
visit_item
(
item
,
new_parent
,
visitor
);
}
...
...
@@ -4162,6 +4167,41 @@ fn resolve_expr(expr: @expr, visitor: ResolveVisitor) {
visitor
);
}
expr_struct
(
path
,
_
)
{
// Resolve the path to the structure it goes to.
//
// XXX: We might want to support explicit type parameters in
// the path, in which case this gets a little more
// complicated:
//
// 1. Should we go through the ast_path_to_ty() path, which
// handles typedefs and the like?
//
// 2. If so, should programmers be able to write this?
//
// class Foo<A> { ... }
// type Bar<A> = Foo<A>;
// let bar = Bar { ... } // no type parameters
alt
self
.resolve_path
(
path
,
TypeNS
,
false
,
visitor
)
{
some
(
definition
@
def_ty
(
class_id
))
if
self
.structs
.contains_key
(
class_id
)
{
self
.record_def
(
expr
.id
,
def_class
(
class_id
));
}
_
{
self
.session
.span_err
(
path
.span
,
#
fmt
(
"`%s` does not name a
\
structure"
,
connect
(
path
.idents
.map
(|
x
|
*
x
),
~
"::"
)));
}
}
visit_expr
(
expr
,
(),
visitor
);
}
_
{
visit_expr
(
expr
,
(),
visitor
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录