Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
a6993d64
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,发现更多精彩内容 >>
提交
a6993d64
编写于
7月 30, 2017
作者:
V
Vadim Petrochenkov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
resolve: Fix instability in import suggestions
上级
5c71e4ef
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
55 addition
and
74 deletion
+55
-74
src/librustc_resolve/lib.rs
src/librustc_resolve/lib.rs
+17
-3
src/libsyntax_pos/symbol.rs
src/libsyntax_pos/symbol.rs
+1
-1
src/test/compile-fail/issue-35675.rs
src/test/compile-fail/issue-35675.rs
+0
-67
src/test/ui/issue-35675.rs
src/test/ui/issue-35675.rs
+16
-0
src/test/ui/issue-35675.stderr
src/test/ui/issue-35675.stderr
+21
-3
未找到文件。
src/librustc_resolve/lib.rs
浏览文件 @
a6993d64
...
...
@@ -546,7 +546,7 @@ fn error_code(self, has_unexpected_resolution: bool) -> &'static str {
}
}
#[derive(Copy,
Clone,
PartialEq,
Eq,
Hash,
Debug)]
#[derive(Copy,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Debug)]
pub
enum
Namespace
{
TypeNS
,
ValueNS
,
...
...
@@ -898,6 +898,19 @@ fn for_each_child<F: FnMut(Ident, Namespace, &'a NameBinding<'a>)>(&self, mut f:
}
}
fn
for_each_child_stable
<
F
:
FnMut
(
Ident
,
Namespace
,
&
'a
NameBinding
<
'a
>
)
>
(
&
self
,
mut
f
:
F
)
{
let
resolutions
=
self
.resolutions
.borrow
();
let
mut
resolutions
=
resolutions
.iter
()
.map
(|(
&
(
ident
,
ns
),
&
resolution
)|
{
// Pre-compute keys for sorting
(
ident
.name
.as_str
(),
ns
,
ident
,
resolution
)
})
.collect
::
<
Vec
<
_
>>
();
resolutions
.sort_unstable_by_key
(|
&
(
str
,
ns
,
..
)|
(
str
,
ns
));
for
&
(
_
,
ns
,
ident
,
resolution
)
in
resolutions
.iter
()
{
resolution
.borrow
()
.binding
.map
(|
binding
|
f
(
ident
,
ns
,
binding
));
}
}
fn
def
(
&
self
)
->
Option
<
Def
>
{
match
self
.kind
{
ModuleKind
::
Def
(
def
,
_
)
=>
Some
(
def
),
...
...
@@ -3351,8 +3364,9 @@ fn lookup_import_candidates<FilterFn>(&mut self,
in_module_is_extern
))
=
worklist
.pop
()
{
self
.populate_module_if_necessary
(
in_module
);
in_module
.for_each_child
(|
ident
,
ns
,
name_binding
|
{
// We have to visit module children in deterministic order to avoid
// instabilities in reported imports (#43552).
in_module
.for_each_child_stable
(|
ident
,
ns
,
name_binding
|
{
// avoid imports entirely
if
name_binding
.is_import
()
&&
!
name_binding
.is_extern_crate
()
{
return
;
}
// avoid non-importable candidates as well
...
...
src/libsyntax_pos/symbol.rs
浏览文件 @
a6993d64
...
...
@@ -326,7 +326,7 @@ fn with_interner<T, F: FnOnce(&mut Interner) -> T>(f: F) -> T {
/// destroyed. In particular, they must not access string contents. This can
/// be fixed in the future by just leaking all strings until thread death
/// somehow.
#[derive(Clone,
Hash,
PartialOrd,
Eq,
Ord)]
#[derive(Clone,
Copy,
Hash,
PartialOrd,
Eq,
Ord)]
pub
struct
InternedString
{
string
:
&
'static
str
,
}
...
...
src/test/compile-fail/issue-35675.rs
已删除
100644 → 0
浏览文件 @
5c71e4ef
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// these two HELPs are actually in a new line between this line and the `enum Fruit` line
enum
Fruit
{
//~ HELP possible candidate is found in another module, you can import it into scope
//~^ HELP possible candidate is found in another module, you can import it into scope
Apple
(
i64
),
Orange
(
i64
),
}
fn
should_return_fruit
()
->
Apple
{
//~^ ERROR cannot find type `Apple` in this scope
//~| NOTE not found in this scope
//~| HELP you can try using the variant's enum
Apple
(
5
)
//~^ ERROR cannot find function `Apple` in this scope
//~| NOTE not found in this scope
}
fn
should_return_fruit_too
()
->
Fruit
::
Apple
{
//~^ ERROR expected type, found variant `Fruit::Apple`
//~| HELP you can try using the variant's enum
//~| NOTE not a type
Apple
(
5
)
//~^ ERROR cannot find function `Apple` in this scope
//~| NOTE not found in this scope
}
fn
foo
()
->
Ok
{
//~^ ERROR expected type, found variant `Ok`
//~| NOTE not a type
//~| HELP there is an enum variant
//~| HELP there is an enum variant
Ok
(())
}
fn
bar
()
->
Variant3
{
//~^ ERROR cannot find type `Variant3` in this scope
//~| HELP you can try using the variant's enum
//~| NOTE not found in this scope
}
fn
qux
()
->
Some
{
//~^ ERROR expected type, found variant `Some`
//~| NOTE not a type
//~| HELP there is an enum variant
//~| HELP there is an enum variant
Some
(
1
)
}
fn
main
()
{}
mod
x
{
enum
Enum
{
Variant1
,
Variant2
(),
Variant3
(
usize
),
Variant4
{},
}
}
src/test/ui/issue-35675.rs
浏览文件 @
a6993d64
...
...
@@ -33,11 +33,27 @@ fn should_return_fruit_too() -> Fruit::Apple {
//~| NOTE not found in this scope
}
fn
foo
()
->
Ok
{
//~^ ERROR expected type, found variant `Ok`
//~| NOTE not a type
//~| HELP there is an enum variant
//~| HELP there is an enum variant
Ok
(())
}
fn
bar
()
->
Variant3
{
//~^ ERROR cannot find type `Variant3` in this scope
//~| NOTE not found in this scope
}
fn
qux
()
->
Some
{
//~^ ERROR expected type, found variant `Some`
//~| NOTE not a type
//~| HELP there is an enum variant
//~| HELP there is an enum variant
Some
(
1
)
}
fn
main
()
{}
mod
x
{
...
...
src/test/ui/issue-35675.stderr
浏览文件 @
a6993d64
...
...
@@ -38,14 +38,32 @@ help: possible candidate is found in another module, you can import it into scop
12 | use Fruit::Apple;
|
error[E0
412]: cannot find type `Variant3` in this scope
error[E0
573]: expected type, found variant `Ok`
--> $DIR/issue-35675.rs:36:13
|
36 | fn bar() -> Variant3 {
36 | fn foo() -> Ok {
| ^^ not a type
|
= help: there is an enum variant `std::prelude::v1::Ok`, try using `std::prelude::v1`?
= help: there is an enum variant `std::result::Result::Ok`, try using `std::result::Result`?
error[E0412]: cannot find type `Variant3` in this scope
--> $DIR/issue-35675.rs:44:13
|
44 | fn bar() -> Variant3 {
| ^^^^^^^^
| |
| not found in this scope
| help: you can try using the variant's enum: `x::Enum`
error: aborting due to 5 previous errors
error[E0573]: expected type, found variant `Some`
--> $DIR/issue-35675.rs:49:13
|
49 | fn qux() -> Some {
| ^^^^ not a type
|
= help: there is an enum variant `std::prelude::v1::Option::Some`, try using `std::prelude::v1::Option`?
= help: there is an enum variant `std::prelude::v1::Some`, try using `std::prelude::v1`?
error: aborting due to 7 previous errors
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录