Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
2c3d73be
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,发现更多精彩内容 >>
未验证
提交
2c3d73be
编写于
2月 06, 2019
作者:
F
Fredric Silberberg
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Address PR Feedback.
上级
d2523e59
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
265 addition
and
106 deletion
+265
-106
src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs
...lers/CSharp/Portable/Operations/CSharpOperationFactory.cs
+6
-8
src/Compilers/CSharp/Portable/Operations/CSharpOperationNodes.cs
...pilers/CSharp/Portable/Operations/CSharpOperationNodes.cs
+6
-3
src/Compilers/CSharp/Test/IOperation/IOperation/IOperationTests_IIsPatternExpression.cs
...ration/IOperation/IOperationTests_IIsPatternExpression.cs
+236
-71
src/Compilers/Core/Portable/Operations/ControlFlowGraphBuilder.cs
...ilers/Core/Portable/Operations/ControlFlowGraphBuilder.cs
+5
-12
src/Compilers/Core/Portable/Operations/OperationCloner.cs
src/Compilers/Core/Portable/Operations/OperationCloner.cs
+1
-1
src/Test/Utilities/Portable/Compilation/ControlFlowGraphVerifier.cs
...tilities/Portable/Compilation/ControlFlowGraphVerifier.cs
+10
-8
src/Test/Utilities/Portable/Compilation/TestOperationVisitor.cs
...st/Utilities/Portable/Compilation/TestOperationVisitor.cs
+1
-3
未找到文件。
src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs
浏览文件 @
2c3d73be
...
...
@@ -2009,36 +2009,34 @@ private IOperation CreateUsingLocalDeclarationsOperation(BoundUsingLocalDeclarat
isImplicit
:
false
);
}
internal
IPropertySubpatternOperation
CreatePropertySubpattern
(
BoundSubpattern
subpattern
)
internal
IPropertySubpatternOperation
CreatePropertySubpattern
(
BoundSubpattern
subpattern
,
ITypeSymbol
matchedType
)
{
SyntaxNode
syntax
=
subpattern
.
Syntax
;
return
new
CSharpLazyPropertySubpatternOperation
(
this
,
subpattern
,
syntax
,
_semanticModel
);
return
new
CSharpLazyPropertySubpatternOperation
(
this
,
subpattern
,
matchedType
,
syntax
,
_semanticModel
);
}
internal
IOperation
CreatePropertySubpatternMember
(
Symbol
symbol
,
SyntaxNode
syntax
)
internal
IOperation
CreatePropertySubpatternMember
(
Symbol
symbol
,
ITypeSymbol
matchedType
,
SyntaxNode
syntax
)
{
var
nameSyntax
=
(
syntax
is
SubpatternSyntax
subpatSyntax
?
subpatSyntax
.
NameColon
?.
Name
:
null
)
??
syntax
;
bool
isImplicit
=
nameSyntax
!
=
syntax
;
bool
isImplicit
=
nameSyntax
=
=
syntax
;
switch
(
symbol
)
{
case
FieldSymbol
field
:
{
var
constantValue
=
field
.
ConstantValue
is
null
?
default
(
Optional
<
object
>)
:
new
Optional
<
object
>(
field
.
ConstantValue
);
var
receiver
=
new
InstanceReferenceOperation
(
InstanceReferenceKind
.
PatternInput
,
_semanticModel
,
nameSyntax
,
field
.
Containing
Type
,
constantValue
,
isImplicit
:
true
);
InstanceReferenceKind
.
PatternInput
,
_semanticModel
,
nameSyntax
,
matched
Type
,
constantValue
,
isImplicit
:
true
);
return
new
FieldReferenceOperation
(
field
,
isDeclaration
:
false
,
receiver
,
_semanticModel
,
nameSyntax
,
field
.
Type
.
TypeSymbol
,
constantValue
,
isImplicit
:
isImplicit
);
}
case
PropertySymbol
property
:
{
var
receiver
=
new
InstanceReferenceOperation
(
InstanceReferenceKind
.
PatternInput
,
_semanticModel
,
nameSyntax
,
property
.
Containing
Type
,
constantValue
:
default
,
isImplicit
:
true
);
InstanceReferenceKind
.
PatternInput
,
_semanticModel
,
nameSyntax
,
matched
Type
,
constantValue
:
default
,
isImplicit
:
true
);
return
new
PropertyReferenceOperation
(
property
,
receiver
,
ImmutableArray
<
IArgumentOperation
>.
Empty
,
_semanticModel
,
nameSyntax
,
property
.
Type
.
TypeSymbol
,
constantValue
:
default
,
isImplicit
:
isImplicit
);
}
case
null
:
return
null
;
default
:
// We should expose the symbol in this case somehow:
// https://github.com/dotnet/roslyn/issues/33175
...
...
src/Compilers/CSharp/Portable/Operations/CSharpOperationNodes.cs
浏览文件 @
2c3d73be
...
...
@@ -1516,7 +1516,7 @@ public override ImmutableArray<IPatternOperation> CreateDeconstructionSubpattern
public
override
ImmutableArray
<
IPropertySubpatternOperation
>
CreatePropertySubpatterns
()
{
return
_boundRecursivePattern
.
Properties
.
IsDefault
?
ImmutableArray
<
IPropertySubpatternOperation
>.
Empty
:
_boundRecursivePattern
.
Properties
.
SelectAsArray
((
p
,
fac
)
=>
fac
.
CreatePropertySubpattern
(
p
),
_operationFactory
);
_boundRecursivePattern
.
Properties
.
SelectAsArray
((
p
,
fac
)
=>
fac
.
CreatePropertySubpattern
(
p
,
MatchedType
),
_operationFactory
);
}
}
...
...
@@ -1524,20 +1524,23 @@ internal sealed partial class CSharpLazyPropertySubpatternOperation : LazyProper
{
private
readonly
BoundSubpattern
_subpattern
;
private
readonly
CSharpOperationFactory
_operationFactory
;
private
readonly
ITypeSymbol
_matchedType
;
public
CSharpLazyPropertySubpatternOperation
(
CSharpOperationFactory
operationFactory
,
BoundSubpattern
subpattern
,
ITypeSymbol
matchedType
,
SyntaxNode
syntax
,
SemanticModel
semanticModel
)
:
base
(
semanticModel
,
syntax
,
false
)
:
base
(
semanticModel
,
syntax
,
isImplicit
:
false
)
{
_subpattern
=
subpattern
;
_operationFactory
=
operationFactory
;
_matchedType
=
matchedType
;
}
public
override
IOperation
CreateMember
()
{
return
_operationFactory
.
CreatePropertySubpatternMember
(
_subpattern
.
Symbol
,
Syntax
);
return
_operationFactory
.
CreatePropertySubpatternMember
(
_subpattern
.
Symbol
,
_matchedType
,
Syntax
);
}
public
override
IPatternOperation
CreatePattern
()
...
...
src/Compilers/CSharp/Test/IOperation/IOperation/IOperationTests_IIsPatternExpression.cs
浏览文件 @
2c3d73be
此差异已折叠。
点击以展开。
src/Compilers/Core/Portable/Operations/ControlFlowGraphBuilder.cs
浏览文件 @
2c3d73be
...
...
@@ -5818,7 +5818,7 @@ IArrayInitializerOperation popAndAssembleArrayInitializerValues(IArrayInitialize
public
override
IOperation
VisitInstanceReference
(
IInstanceReferenceOperation
operation
,
int
?
captureIdForResult
)
{
if
(
operation
.
ReferenceKind
==
InstanceReferenceKind
.
ImplicitReceiver
||
operation
.
ReferenceKind
==
InstanceReferenceKind
.
PatternInput
)
if
(
operation
.
ReferenceKind
==
InstanceReferenceKind
.
ImplicitReceiver
)
{
// When we're in an object or collection initializer, we need to replace the instance reference with a reference to the object being initialized
Debug
.
Assert
(
operation
.
IsImplicit
);
...
...
@@ -6419,14 +6419,12 @@ public override IOperation VisitDefaultValue(IDefaultValueOperation operation, i
public
override
IOperation
VisitIsPattern
(
IIsPatternOperation
operation
,
int
?
captureIdForResult
)
{
EvalStackFrame
frame
=
PushStackFrame
();
var
capturedValue
=
VisitAndCapture
(
operation
.
Value
);
var
previousImplicitInstance
=
_currentImplicitInstance
;
_currentImplicitInstance
=
new
ImplicitInstanceInfo
(
capturedValue
);
PushOperand
(
Visit
(
operation
.
Value
));
var
visitedPattern
=
(
IPatternOperation
)
Visit
(
operation
.
Pattern
);
_currentImplicitInstance
=
previousImplicitInstance
;
IOperation
visitedValue
=
PopOperand
()
;
PopStackFrame
(
frame
);
return
new
IsPatternOperation
(
captur
edValue
,
visitedPattern
,
semanticModel
:
null
,
operation
.
Syntax
,
operation
.
Type
,
operation
.
ConstantValue
,
IsImplicit
(
operation
));
return
new
IsPatternOperation
(
visit
edValue
,
visitedPattern
,
semanticModel
:
null
,
operation
.
Syntax
,
operation
.
Type
,
operation
.
ConstantValue
,
IsImplicit
(
operation
));
}
public
override
IOperation
VisitInvalid
(
IInvalidOperation
operation
,
int
?
captureIdForResult
)
...
...
@@ -6630,14 +6628,11 @@ public override IOperation VisitSwitchExpression(ISwitchExpressionOperation oper
RegionBuilder
resultCaptureRegion
=
_currentRegion
;
int
captureOutput
=
captureIdForResult
??
GetNextCaptureId
(
resultCaptureRegion
);
var
capturedInput
=
VisitAndCapture
(
operation
.
Value
);
var
previousImplicitInstance
=
_currentImplicitInstance
;
var
switchImplicitInstance
=
new
ImplicitInstanceInfo
(
capturedInput
);
var
afterSwitch
=
new
BasicBlockBuilder
(
BasicBlockKind
.
Block
);
foreach
(
var
arm
in
operation
.
Arms
)
{
// START scope (arm locals)
_currentImplicitInstance
=
switchImplicitInstance
;
var
armScopeRegion
=
new
RegionBuilder
(
ControlFlowRegionKind
.
LocalLifetime
,
locals
:
arm
.
Locals
);
EnterRegion
(
armScopeRegion
);
var
afterArm
=
new
BasicBlockBuilder
(
BasicBlockKind
.
Block
);
...
...
@@ -6663,8 +6658,6 @@ public override IOperation VisitSwitchExpression(ISwitchExpressionOperation oper
PopStackFrameAndLeaveRegion
(
frame
);
}
_currentImplicitInstance
=
previousImplicitInstance
;
// captureOutput = e
VisitAndCapture
(
arm
.
Value
,
captureOutput
);
...
...
src/Compilers/Core/Portable/Operations/OperationCloner.cs
浏览文件 @
2c3d73be
...
...
@@ -552,7 +552,7 @@ internal override IOperation VisitRecursivePattern(IRecursivePatternOperation op
internal
override
IOperation
VisitPropertySubpattern
(
IPropertySubpatternOperation
operation
,
object
argument
)
{
return
new
PropertySubpatternOperation
(
semanticModel
:
nul
l
,
semanticModel
:
((
Operation
)
operation
).
OwningSemanticMode
l
,
operation
.
Syntax
,
operation
.
IsImplicit
,
Visit
(
operation
.
Member
),
...
...
src/Test/Utilities/Portable/Compilation/ControlFlowGraphVerifier.cs
浏览文件 @
2c3d73be
...
...
@@ -1728,14 +1728,16 @@ private static bool CanBeInControlFlowGraph(IOperation n)
case
OperationKind
.
InstanceReference
:
// Implicit instance receivers, except for anonymous type creations, are expected to have been removed when dealing with creations.
return
((
IInstanceReferenceOperation
)
n
).
ReferenceKind
==
InstanceReferenceKind
.
ContainingTypeInstance
||
((
IInstanceReferenceOperation
)
n
).
ReferenceKind
==
InstanceReferenceKind
.
ImplicitReceiver
&&
n
.
Type
.
IsAnonymousType
&&
n
.
Parent
is
IPropertyReferenceOperation
propertyReference
&&
propertyReference
.
Instance
==
n
&&
propertyReference
.
Parent
is
ISimpleAssignmentOperation
simpleAssignment
&&
simpleAssignment
.
Target
==
propertyReference
&&
simpleAssignment
.
Parent
.
Kind
==
OperationKind
.
AnonymousObjectCreation
;
var
instanceReference
=
(
IInstanceReferenceOperation
)
n
;
return
instanceReference
.
ReferenceKind
==
InstanceReferenceKind
.
ContainingTypeInstance
||
instanceReference
.
ReferenceKind
==
InstanceReferenceKind
.
PatternInput
||
(
instanceReference
.
ReferenceKind
==
InstanceReferenceKind
.
ImplicitReceiver
&&
n
.
Type
.
IsAnonymousType
&&
n
.
Parent
is
IPropertyReferenceOperation
propertyReference
&&
propertyReference
.
Instance
==
n
&&
propertyReference
.
Parent
is
ISimpleAssignmentOperation
simpleAssignment
&&
simpleAssignment
.
Target
==
propertyReference
&&
simpleAssignment
.
Parent
.
Kind
==
OperationKind
.
AnonymousObjectCreation
);
case
OperationKind
.
None
:
return
!(
n
is
IPlaceholderOperation
);
...
...
src/Test/Utilities/Portable/Compilation/TestOperationVisitor.cs
浏览文件 @
2c3d73be
...
...
@@ -1197,12 +1197,10 @@ internal override void VisitRecursivePattern(IRecursivePatternOperation operatio
internal
override
void
VisitPropertySubpattern
(
IPropertySubpatternOperation
operation
)
{
Assert
.
True
(
operation
.
Member
is
IMemberReferenceOperation
);
Assert
.
True
(
operation
.
Member
is
IMemberReferenceOperation
||
operation
.
Member
is
IInvalidOperation
);
var
member
=
(
IMemberReferenceOperation
)
operation
.
Member
;
switch
(
member
.
Member
)
{
case
null
:
// error case
break
;
case
IFieldSymbol
field
:
case
IPropertySymbol
prop
:
case
IErrorTypeSymbol
error
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录