Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
05a38481
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
05a38481
编写于
9月 18, 2019
作者:
A
AlekseyTs
提交者:
GitHub
9月 18, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add cycle detection for more scenarios involving looking in base interfaces. (#38738)
Fixes #38735.
上级
d44d0912
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
47 addition
and
7 deletion
+47
-7
src/Compilers/CSharp/Portable/Binder/Binder_Lookup.cs
src/Compilers/CSharp/Portable/Binder/Binder_Lookup.cs
+16
-7
src/Compilers/CSharp/Test/Symbol/Symbols/DefaultInterfaceImplementationTests.cs
...est/Symbol/Symbols/DefaultInterfaceImplementationTests.cs
+31
-0
未找到文件。
src/Compilers/CSharp/Portable/Binder/Binder_Lookup.cs
浏览文件 @
05a38481
...
...
@@ -951,6 +951,8 @@ private static ImmutableArray<NamedTypeSymbol> GetBaseInterfaces(NamedTypeSymbol
return
ImmutableArray
<
NamedTypeSymbol
>.
Empty
;
}
var
cycleGuard
=
ConsList
<
NamedTypeSymbol
>.
Empty
.
Prepend
(
type
.
OriginalDefinition
);
// Consumers of the result depend on the sorting performed by AllInterfacesWithDefinitionUseSiteDiagnostics.
// Let's use similar sort algorithm.
var
result
=
ArrayBuilder
<
NamedTypeSymbol
>.
GetInstance
();
...
...
@@ -958,7 +960,7 @@ private static ImmutableArray<NamedTypeSymbol> GetBaseInterfaces(NamedTypeSymbol
for
(
int
i
=
interfaces
.
Length
-
1
;
i
>=
0
;
i
--)
{
addAllInterfaces
(
interfaces
[
i
],
visited
,
result
,
basesBeingResolved
);
addAllInterfaces
(
interfaces
[
i
],
visited
,
result
,
basesBeingResolved
,
cycleGuard
);
}
result
.
ReverseContents
();
...
...
@@ -970,17 +972,24 @@ private static ImmutableArray<NamedTypeSymbol> GetBaseInterfaces(NamedTypeSymbol
return
result
.
ToImmutableAndFree
();
static
void
addAllInterfaces
(
NamedTypeSymbol
@interface
,
HashSet
<
NamedTypeSymbol
>
visited
,
ArrayBuilder
<
NamedTypeSymbol
>
result
,
ConsList
<
TypeSymbol
>
basesBeingResolved
)
static
void
addAllInterfaces
(
NamedTypeSymbol
@interface
,
HashSet
<
NamedTypeSymbol
>
visited
,
ArrayBuilder
<
NamedTypeSymbol
>
result
,
ConsList
<
TypeSymbol
>
basesBeingResolved
,
ConsList
<
NamedTypeSymbol
>
cycleGuard
)
{
if
(
@interface
.
IsInterface
&&
visited
.
Add
(
@interface
))
NamedTypeSymbol
originalDefinition
;
if
(
@interface
.
IsInterface
&&
!
cycleGuard
.
ContainsReference
(
originalDefinition
=
@interface
.
OriginalDefinition
)
&&
visited
.
Add
(
@interface
))
{
if
(!
basesBeingResolved
.
ContainsReference
(
@interface
.
O
riginalDefinition
))
if
(!
basesBeingResolved
.
ContainsReference
(
o
riginalDefinition
))
{
ImmutableArray
<
NamedTypeSymbol
>
baseInterfaces
=
@interface
.
GetDeclaredInterfaces
(
basesBeingResolved
);
for
(
int
i
=
baseInterfaces
.
Length
-
1
;
i
>=
0
;
i
--)
if
(!
baseInterfaces
.
IsEmpty
)
{
var
baseInterface
=
baseInterfaces
[
i
];
addAllInterfaces
(
baseInterface
,
visited
,
result
,
basesBeingResolved
);
cycleGuard
=
cycleGuard
.
Prepend
(
originalDefinition
);
for
(
int
i
=
baseInterfaces
.
Length
-
1
;
i
>=
0
;
i
--)
{
var
baseInterface
=
baseInterfaces
[
i
];
addAllInterfaces
(
baseInterface
,
visited
,
result
,
basesBeingResolved
,
cycleGuard
);
}
}
}
...
...
src/Compilers/CSharp/Test/Symbol/Symbols/DefaultInterfaceImplementationTests.cs
浏览文件 @
05a38481
...
...
@@ -29512,6 +29512,37 @@ public interface I14 : I11.I13
);
}
[Fact]
[WorkItem(38735, "https://github.com/dotnet/roslyn/issues/38735")]
public void NestedTypes_52()
{
var source1 =
@"
interface I1 : IA<int>.NF { }
interface IQ<T> { }
interface IA<T> : IB<IQ<T>> { }
interface IB<T> : IA<IQ<T>> { }
";
var compilation1 = CreateCompilation(source1, options: TestOptions.DebugDll,
parseOptions: TestOptions.Regular);
compilation1.VerifyDiagnostics(
// (2,24): error CS0426: The type name 'NF' does not exist in the type 'IA<int>'
// interface I1 : IA<int>.NF { }
Diagnostic(ErrorCode.ERR_DottedTypeNameNotFoundInAgg, "NF").WithArguments("NF", "IA<int>").WithLocation(2, 24),
// (6,11): error CS0529: Inherited interface 'IB<IQ<T>>' causes a cycle in the interface hierarchy of 'IA<T>'
// interface IA<T> : IB<IQ<T>> { }
Diagnostic(ErrorCode.ERR_CycleInInterfaceInheritance, "IA").WithArguments("IA<T>", "IB<IQ<T>>").WithLocation(6, 11),
// (8,11): error CS0529: Inherited interface 'IA<IQ<T>>' causes a cycle in the interface hierarchy of 'IB<T>'
// interface IB<T> : IA<IQ<T>> { }
Diagnostic(ErrorCode.ERR_CycleInInterfaceInheritance, "IB").WithArguments("IB<T>", "IA<IQ<T>>").WithLocation(8, 11)
);
}
[Fact]
[WorkItem(32540, "https://github.com/dotnet/roslyn/issues/32540")]
public void MethodImplementationInDerived_01()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录