Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
531243f5
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,发现更多精彩内容 >>
未验证
提交
531243f5
编写于
5月 10, 2019
作者:
I
Ivan Basov
提交者:
GitHub
5月 10, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Debugger shows property as field (#35433)
上级
cb056d86
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
66 addition
and
4 deletion
+66
-4
src/ExpressionEvaluator/CSharp/Test/ResultProvider/ExpansionTests.cs
...ionEvaluator/CSharp/Test/ResultProvider/ExpansionTests.cs
+34
-0
src/ExpressionEvaluator/Core/Source/ResultProvider/ResultProvider.cs
...ionEvaluator/Core/Source/ResultProvider/ResultProvider.cs
+32
-4
未找到文件。
src/ExpressionEvaluator/CSharp/Test/ResultProvider/ExpansionTests.cs
浏览文件 @
531243f5
...
...
@@ -629,6 +629,40 @@ class C
EvalResult
(
"F"
,
"1"
,
"object {int}"
,
"(new C()).s1.F"
));
}
[
Fact
]
public
void
NullableProperty
()
{
var
source
=
@"
class R
{
public int? A { get; set; }
public int? B { get; set; }
}
class C
{
R r = new R();
public C()
{
r.A = 1;
r.B = null;
}
}"
;
var
assembly
=
GetAssembly
(
source
);
var
type
=
assembly
.
GetType
(
"C"
);
var
value
=
CreateDkmClrValue
(
Activator
.
CreateInstance
(
type
));
var
rootExpr
=
"new C()"
;
var
evalResult
=
FormatResult
(
rootExpr
,
value
);
Verify
(
evalResult
,
EvalResult
(
rootExpr
,
"{C}"
,
"C"
,
rootExpr
,
DkmEvaluationResultFlags
.
Expandable
));
var
children
=
GetChildren
(
evalResult
);
Verify
(
children
,
EvalResult
(
"r"
,
"{R}"
,
"R"
,
"(new C()).r"
,
flags
:
DkmEvaluationResultFlags
.
Expandable
));
Verify
(
GetChildren
(
children
[
0
]),
EvalResult
(
"A"
,
"1"
,
"int?"
,
"(new C()).r.A"
,
category
:
DkmEvaluationResultCategory
.
Property
),
EvalResult
(
"B"
,
"null"
,
"int?"
,
"(new C()).r.B"
,
category
:
DkmEvaluationResultCategory
.
Property
));
}
[
Fact
]
public
void
Pointers
()
{
...
...
src/ExpressionEvaluator/Core/Source/ResultProvider/ResultProvider.cs
浏览文件 @
531243f5
...
...
@@ -459,6 +459,8 @@ private void CreateEvaluationResultAndContinue(EvalResult result, WorkList workL
// which typically appears to be set to the default value ("Other").
var
category
=
(
result
.
Category
!=
DkmEvaluationResultCategory
.
Other
)
?
result
.
Category
:
value
.
Category
;
var
nullableMemberInfo
=
value
.
GetDataItem
<
NullableMemberInfo
>();
// Valid value
return
DkmSuccessEvaluationResult
.
Create
(
InspectionContext
:
inspectionContext
,
...
...
@@ -469,10 +471,10 @@ private void CreateEvaluationResultAndContinue(EvalResult result, WorkList workL
Value
:
display
,
EditableValue
:
result
.
EditableValue
,
Type
:
typeName
,
Category
:
category
,
Access
:
value
.
Access
,
StorageType
:
value
.
StorageType
,
TypeModifierFlags
:
value
.
TypeModifierFlags
,
Category
:
nullableMemberInfo
?.
Category
??
category
,
Access
:
nullableMemberInfo
?.
Access
??
value
.
Access
,
StorageType
:
nullableMemberInfo
?.
StorageType
??
value
.
StorageType
,
TypeModifierFlags
:
nullableMemberInfo
?.
TypeModifierFlags
??
value
.
TypeModifierFlags
,
Address
:
value
.
Address
,
CustomUIVisualizers
:
customUIVisualizers
,
ExternalModules
:
null
,
...
...
@@ -557,6 +559,16 @@ private void CreateEvaluationResultAndContinue(EvalResult result, WorkList workL
}
else
{
// nullableValue is taken from an internal field.
// It may have different category, access, etc comparing the original member.
// For example, the orignal member can be a property not a field.
// Save original member values to restore them later.
if
(
value
!=
nullableValue
)
{
var
nullableMemberInfo
=
new
NullableMemberInfo
(
value
.
Category
,
value
.
Access
,
value
.
StorageType
,
value
.
TypeModifierFlags
);
nullableValue
.
SetDataItem
(
DkmDataCreationDisposition
.
CreateAlways
,
nullableMemberInfo
);
}
value
=
nullableValue
;
Debug
.
Assert
(
lmrNullableTypeArg
.
Equals
(
value
.
Type
.
GetLmrType
()));
// If this is not the case, add a test for includeRuntimeTypeIfNecessary.
// CONSIDER: The DynamicAttribute for the type argument should just be Skip(1) of the original flag array.
...
...
@@ -1058,5 +1070,21 @@ private void Execute()
_state
=
State
.
Executed
;
}
}
private
class
NullableMemberInfo
:
DkmDataItem
{
public
readonly
DkmEvaluationResultCategory
Category
;
public
readonly
DkmEvaluationResultAccessType
Access
;
public
readonly
DkmEvaluationResultStorageType
StorageType
;
public
readonly
DkmEvaluationResultTypeModifierFlags
TypeModifierFlags
;
public
NullableMemberInfo
(
DkmEvaluationResultCategory
category
,
DkmEvaluationResultAccessType
access
,
DkmEvaluationResultStorageType
storageType
,
DkmEvaluationResultTypeModifierFlags
typeModifierFlags
)
{
Category
=
category
;
Access
=
access
;
StorageType
=
storageType
;
TypeModifierFlags
=
typeModifierFlags
;
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录