Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
2f108499
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,发现更多精彩内容 >>
提交
2f108499
编写于
2月 24, 2016
作者:
J
Julien Couvreur
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix for 7845: add DynamicAttribute to event with dynamic type
上级
fff2eb09
变更
5
展开全部
隐藏空白更改
内联
并排
Showing
5 changed file
with
592 addition
and
4 deletion
+592
-4
src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PEEventSymbol.cs
...lers/CSharp/Portable/Symbols/Metadata/PE/PEEventSymbol.cs
+6
-2
src/Compilers/CSharp/Portable/Symbols/Source/SourceEventSymbol.cs
...ilers/CSharp/Portable/Symbols/Source/SourceEventSymbol.cs
+11
-0
src/Compilers/CSharp/Portable/Syntax/SyntaxExtensions.cs
src/Compilers/CSharp/Portable/Syntax/SyntaxExtensions.cs
+1
-0
src/Compilers/CSharp/Test/Symbol/Symbols/CustomModifiersTests.cs
...pilers/CSharp/Test/Symbol/Symbols/CustomModifiersTests.cs
+91
-0
src/Compilers/CSharp/Test/Symbol/Symbols/Source/EventTests.cs
...Compilers/CSharp/Test/Symbol/Symbols/Source/EventTests.cs
+483
-2
未找到文件。
src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PEEventSymbol.cs
浏览文件 @
2f108499
...
...
@@ -86,17 +86,21 @@ private enum Flags : byte
}
}
TypeSymbol
originalEventType
=
_eventType
;
if
((
object
)
_eventType
==
null
)
{
var
metadataDecoder
=
new
MetadataDecoder
(
moduleSymbol
,
containingType
);
_eventType
=
metadataDecoder
.
GetTypeOfToken
(
eventType
);
originalEventType
=
metadataDecoder
.
GetTypeOfToken
(
eventType
);
const
int
targetSymbolCustomModifierCount
=
0
;
_eventType
=
DynamicTypeDecoder
.
TransformType
(
originalEventType
,
targetSymbolCustomModifierCount
,
handle
,
moduleSymbol
);
}
// IsWindowsRuntimeEvent checks the signatures, so we just have to check the accessors.
bool
isWindowsRuntimeEvent
=
IsWindowsRuntimeEvent
;
bool
callMethodsDirectly
=
isWindowsRuntimeEvent
?
!
DoModifiersMatch
(
_addMethod
,
_removeMethod
)
:
!
DoSignaturesMatch
(
moduleSymbol
,
_e
ventType
,
_addMethod
,
_removeMethod
);
:
!
DoSignaturesMatch
(
moduleSymbol
,
originalE
ventType
,
_addMethod
,
_removeMethod
);
if
(
callMethodsDirectly
)
{
...
...
src/Compilers/CSharp/Portable/Symbols/Source/SourceEventSymbol.cs
浏览文件 @
2f108499
...
...
@@ -287,6 +287,17 @@ internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttrib
}
}
internal
override
void
AddSynthesizedAttributes
(
ModuleCompilationState
compilationState
,
ref
ArrayBuilder
<
SynthesizedAttributeData
>
attributes
)
{
base
.
AddSynthesizedAttributes
(
compilationState
,
ref
attributes
);
if
(
this
.
Type
.
ContainsDynamic
())
{
var
compilation
=
this
.
DeclaringCompilation
;
AddSynthesizedAttribute
(
ref
attributes
,
compilation
.
SynthesizeDynamicAttribute
(
this
.
Type
,
customModifiersCount
:
0
));
}
}
internal
sealed
override
bool
HasSpecialName
{
get
...
...
src/Compilers/CSharp/Portable/Syntax/SyntaxExtensions.cs
浏览文件 @
2f108499
...
...
@@ -211,6 +211,7 @@ private static bool IsInContextWhichNeedsDynamicAttribute(CSharpSyntaxNode node)
case
SyntaxKind
.
PropertyDeclaration
:
case
SyntaxKind
.
DelegateDeclaration
:
case
SyntaxKind
.
EventDeclaration
:
case
SyntaxKind
.
EventFieldDeclaration
:
case
SyntaxKind
.
BaseList
:
case
SyntaxKind
.
SimpleBaseType
:
return
true
;
...
...
src/Compilers/CSharp/Test/Symbol/Symbols/CustomModifiersTests.cs
浏览文件 @
2f108499
...
...
@@ -1916,5 +1916,96 @@ Remove Overridden2
Add Overridden3
Remove Overridden3"
);
}
[
Fact
,
WorkItem
(
7845
,
"https://github.com/dotnet/roslyn/issues/7845"
)]
public
void
EventFieldWithDynamic
()
{
var
ilSource
=
@"
.class public auto ansi beforefieldinit CL1
extends [mscorlib] System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void[mscorlib] System.Object::.ctor()
IL_0006: ret
} // end of method CL1`1::.ctor
.event class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]> Test
{
.addon instance void CL1::add_Test(class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]>)
.removeon instance void CL1::remove_Test(class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]>)
} // end of event CL1::Test
.method public hidebysig newslot specialname virtual
instance void add_Test(class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]> 'value') cil managed
{
// Code size 2 (0x2)
.maxstack 1
IL_0000: ldarg.0
IL_0001: throw
} // end of method CL1::get_Test
.method public hidebysig newslot specialname virtual
instance void remove_Test(class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]> 'value') cil managed
{
// Code size 3 (0x3)
.maxstack 1
IL_0000: ldarg.0
IL_0001: throw
IL_0002: ret
} // end of method CL1::set_Test
} // end of class CL1
"
;
var
source
=
@"
using System;
class Module1
{
static void Main()
{
CL2 cl2 = new CL2();
CL1 cl1 = cl2;
cl1.Test += (d) => Console.WriteLine(d[0] + "" and "" + d[1]);
cl2.Raise();
CL3 cl3 = new CL3();
cl1 = cl3;
cl1.Test += (d) => Console.WriteLine(""Charlie"");
cl3.Raise();
}
}
class CL2 : CL1
{
public override event Action<dynamic[]> Test;
public void Raise() => Test(new string[] { ""Alice"", ""Bob"" });
}
class CL3 : CL1
{
public override event Action<object[]> Test;
public void Raise() => Test(null);
}
"
;
var
compilation
=
CreateCompilationWithCustomILSource
(
source
,
ilSource
,
new
[]
{
CSharpRef
,
SystemCoreRef
},
options
:
TestOptions
.
ReleaseExe
);
var
cl2
=
compilation
.
GetTypeByMetadataName
(
"CL2"
);
var
test2
=
cl2
.
GetMember
<
EventSymbol
>(
"Test"
);
Assert
.
Equal
(
"event System.Action<dynamic modopt(System.Runtime.CompilerServices.IsConst) []> CL2.Test"
,
test2
.
ToTestDisplayString
());
var
cl3
=
compilation
.
GetTypeByMetadataName
(
"CL3"
);
var
test3
=
cl3
.
GetMember
<
EventSymbol
>(
"Test"
);
Assert
.
Equal
(
"event System.Action<System.Object modopt(System.Runtime.CompilerServices.IsConst) []> CL3.Test"
,
test3
.
ToTestDisplayString
());
CompileAndVerify
(
compilation
,
expectedOutput
:
@"Alice and Bob
Charlie"
);
}
}
}
\ No newline at end of file
src/Compilers/CSharp/Test/Symbol/Symbols/Source/EventTests.cs
浏览文件 @
2f108499
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录