Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
a70e42a9
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,发现更多精彩内容 >>
提交
a70e42a9
编写于
4月 24, 2016
作者:
J
Jeffrey Seyfried
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Remove use of `ast_map.expect_item()` and improve diagnostics (fixes #33186)
上级
5a4e0b14
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
49 addition
and
46 deletion
+49
-46
src/librustc_resolve/lib.rs
src/librustc_resolve/lib.rs
+41
-42
src/test/compile-fail/suggest-path-instead-of-mod-dot-item.rs
...test/compile-fail/suggest-path-instead-of-mod-dot-item.rs
+8
-4
未找到文件。
src/librustc_resolve/lib.rs
浏览文件 @
a70e42a9
...
...
@@ -68,7 +68,7 @@
use
rustc
::
hir
;
use
rustc
::
hir
::{
Arm
,
BindByRef
,
BindByValue
,
BindingMode
,
Block
};
use
rustc
::
hir
::
Crate
;
use
rustc
::
hir
::{
Expr
,
ExprAgain
,
ExprBreak
,
Expr
Call
,
Expr
Field
};
use
rustc
::
hir
::{
Expr
,
ExprAgain
,
ExprBreak
,
ExprField
};
use
rustc
::
hir
::{
ExprLoop
,
ExprWhile
,
ExprMethodCall
};
use
rustc
::
hir
::{
ExprPath
,
ExprStruct
,
FnDecl
};
use
rustc
::
hir
::{
ForeignItemFn
,
ForeignItemStatic
,
Generics
};
...
...
@@ -163,7 +163,7 @@ enum ResolutionError<'a> {
/// error E0424: `self` is not available in a static method
SelfNotAvailableInStaticMethod
,
/// error E0425: unresolved name
UnresolvedName
(
&
'a
str
,
&
'a
str
,
UnresolvedNameContext
),
UnresolvedName
(
&
'a
str
,
&
'a
str
,
UnresolvedNameContext
<
'a
>
),
/// error E0426: use of undeclared label
UndeclaredLabel
(
&
'a
str
),
/// error E0427: cannot use `ref` binding mode with ...
...
...
@@ -186,12 +186,12 @@ enum ResolutionError<'a> {
/// Context of where `ResolutionError::UnresolvedName` arose.
#[derive(Clone,
PartialEq,
Eq,
Debug)]
enum
UnresolvedNameContext
{
/// `PathIsMod(
id
)` indicates that a given path, used in
enum
UnresolvedNameContext
<
'a
>
{
/// `PathIsMod(
parent
)` indicates that a given path, used in
/// expression context, actually resolved to a module rather than
/// a value. The
`id` attached to the variant is the node id of
/// the erroneous path expression.
PathIsMod
(
ast
::
NodeId
),
/// a value. The
optional expression attached to the variant is the
/// the
parent of the
erroneous path expression.
PathIsMod
(
Option
<&
'a
Expr
>
),
/// `Other` means we have no extra information about the context
/// of the unresolved name error. (Maybe we could eliminate all
...
...
@@ -419,39 +419,25 @@ fn resolve_struct_error<'b, 'a: 'b, 'tcx: 'a>(resolver: &'b Resolver<'a, 'tcx>,
match
context
{
UnresolvedNameContext
::
Other
=>
{
}
// no help available
UnresolvedNameContext
::
PathIsMod
(
id
)
=>
{
let
mut
help_msg
=
String
::
new
();
let
parent_id
=
resolver
.ast_map
.get_parent_node
(
id
);
if
let
Some
(
hir_map
::
Node
::
NodeExpr
(
e
))
=
resolver
.ast_map
.find
(
parent_id
)
{
match
e
.node
{
ExprField
(
_
,
ident
)
=>
{
help_msg
=
format!
(
"To reference an item from the
\
`{module}` module, use
\
`{module}::{ident}`"
,
module
=
path
,
ident
=
ident
.node
);
}
ExprMethodCall
(
ident
,
_
,
_
)
=>
{
help_msg
=
format!
(
"To call a function from the
\
`{module}` module, use
\
`{module}::{ident}(..)`"
,
module
=
path
,
ident
=
ident
.node
);
}
ExprCall
(
_
,
_
)
=>
{
help_msg
=
format!
(
"No function corresponds to `{module}(..)`"
,
module
=
path
);
}
_
=>
{
}
// no help available
UnresolvedNameContext
::
PathIsMod
(
parent
)
=>
{
err
.fileline_help
(
span
,
&
match
parent
.map
(|
parent
|
&
parent
.node
)
{
Some
(
&
ExprField
(
_
,
ident
))
=>
{
format!
(
"To reference an item from the `{module}` module,
\
use `{module}::{ident}`"
,
module
=
path
,
ident
=
ident
.node
)
}
}
else
{
help_msg
=
format!
(
"Module `{module}` cannot be the value of an expression"
,
module
=
path
);
}
if
!
help_msg
.is_empty
()
{
err
.fileline_help
(
span
,
&
help_msg
);
}
Some
(
&
ExprMethodCall
(
ident
,
_
,
_
))
=>
{
format!
(
"To call a function from the `{module}` module,
\
use `{module}::{ident}(..)`"
,
module
=
path
,
ident
=
ident
.node
)
}
_
=>
{
format!
(
"Module `{module}` cannot be used as an expression"
,
module
=
path
)
}
});
}
}
err
...
...
@@ -553,7 +539,7 @@ fn visit_block(&mut self, block: &Block) {
self
.resolve_block
(
block
);
}
fn
visit_expr
(
&
mut
self
,
expr
:
&
Expr
)
{
self
.resolve_expr
(
expr
);
self
.resolve_expr
(
expr
,
None
);
}
fn
visit_local
(
&
mut
self
,
local
:
&
Local
)
{
self
.resolve_local
(
local
);
...
...
@@ -2850,7 +2836,7 @@ fn find_best_match(&mut self, name: &str) -> SuggestionType {
}
SuggestionType
::
NotFound
}
fn
resolve_expr
(
&
mut
self
,
expr
:
&
Expr
)
{
fn
resolve_expr
(
&
mut
self
,
expr
:
&
Expr
,
parent
:
Option
<&
Expr
>
)
{
// First, record candidate traits for this expression if it could
// result in the invocation of a method call.
...
...
@@ -2995,7 +2981,7 @@ fn resolve_expr(&mut self, expr: &Expr) {
UseLexicalScope
,
expr
.span
)
{
Success
(
_
)
=>
{
context
=
UnresolvedNameContext
::
PathIsMod
(
expr
.id
);
context
=
UnresolvedNameContext
::
PathIsMod
(
parent
);
},
_
=>
{},
};
...
...
@@ -3069,6 +3055,19 @@ fn resolve_expr(&mut self, expr: &Expr) {
}
}
}
ExprField
(
ref
subexpression
,
_
)
=>
{
self
.resolve_expr
(
subexpression
,
Some
(
expr
));
}
ExprMethodCall
(
_
,
ref
types
,
ref
arguments
)
=>
{
let
mut
arguments
=
arguments
.iter
();
self
.resolve_expr
(
arguments
.next
()
.unwrap
(),
Some
(
expr
));
for
argument
in
arguments
{
self
.resolve_expr
(
argument
,
None
);
}
for
ty
in
types
.iter
()
{
self
.visit_ty
(
ty
);
}
}
_
=>
{
intravisit
::
walk_expr
(
self
,
expr
);
...
...
src/test/compile-fail/suggest-path-instead-of-mod-dot-item.rs
浏览文件 @
a70e42a9
...
...
@@ -47,10 +47,14 @@ fn h4() -> i32 {
//~| HELP To reference an item from the `a::b` module, use `a::b::J`
}
fn
h5
()
->
i32
{
a
.b
.f
()
fn
h5
()
{
a
.b
.f
()
;
//~^ ERROR E0425
//~| HELP To reference an item from the `a` module, use `a::b`
let
v
=
Vec
::
new
();
v
.push
(
a
::
b
);
//~^ ERROR E0425
//~| HELP Module `a::b` cannot be used as an expression
}
fn
h6
()
->
i32
{
...
...
@@ -62,11 +66,11 @@ fn h6() -> i32 {
fn
h7
()
{
a
::
b
//~^ ERROR E0425
//~| HELP Module `a::b` cannot be
the value of
an expression
//~| HELP Module `a::b` cannot be
used as
an expression
}
fn
h8
()
->
i32
{
a
::
b
()
//~^ ERROR E0425
//~| HELP
No function corresponds to `a::b(..)`
//~| HELP
Module `a::b` cannot be used as an expression
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录