Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
e2cbbeec
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,发现更多精彩内容 >>
提交
e2cbbeec
编写于
6月 27, 2018
作者:
M
Manish Vasani
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Address feedback
上级
2c942ec4
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
41 addition
and
18 deletion
+41
-18
src/Compilers/CSharp/Portable/Binder/Binder_Query.cs
src/Compilers/CSharp/Portable/Binder/Binder_Query.cs
+4
-3
src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs
...lers/CSharp/Portable/Operations/CSharpOperationFactory.cs
+12
-0
src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory_Methods.cs
...arp/Portable/Operations/CSharpOperationFactory_Methods.cs
+25
-15
未找到文件。
src/Compilers/CSharp/Portable/Binder/Binder_Query.cs
浏览文件 @
e2cbbeec
...
...
@@ -785,10 +785,11 @@ protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression r
protected
BoundExpression
MakeConstruction
(
CSharpSyntaxNode
node
,
NamedTypeSymbol
toCreate
,
ImmutableArray
<
BoundExpression
>
args
,
DiagnosticBag
diagnostics
)
{
Debug
.
Assert
(
toCreate
.
IsAnonymousType
);
var
result
=
new
BoundAnonymousObjectCreationExpression
(
node
,
toCreate
.
InstanceConstructors
[
0
],
args
,
ImmutableArray
<
BoundAnonymousPropertyDeclaration
>.
Empty
,
toCreate
);
AnalyzedArguments
analyzedArguments
=
AnalyzedArguments
.
GetInstance
(
);
analyzedArguments
.
Arguments
.
AddRange
(
args
);
var
result
=
BindClassCreationExpression
(
node
,
toCreate
.
Name
,
node
,
toCreate
,
analyzedArguments
,
diagnostics
);
result
.
WasCompilerGenerated
=
true
;
analyzedArguments
.
Free
();
return
result
;
}
}
...
...
src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs
浏览文件 @
e2cbbeec
...
...
@@ -530,6 +530,18 @@ private IOperation CreateBoundObjectCreationExpressionOperation(BoundObjectCreat
{
return
CreateInvalidExpressionForHasArgumentsExpression
(
null
,
boundObjectCreationExpression
.
Arguments
,
boundObjectCreationExpression
.
InitializerExpressionOpt
,
syntax
,
type
,
constantValue
,
isImplicit
);
}
else
if
(
boundObjectCreationExpression
.
Type
.
IsAnonymousType
)
{
// Workaround for https://github.com/dotnet/roslyn/issues/28157
Debug
.
Assert
(
isImplicit
);
var
memberInitializers
=
new
Lazy
<
ImmutableArray
<
IOperation
>>(()
=>
GetAnonymousObjectCreationInitializers
(
boundObjectCreationExpression
.
Arguments
,
declarations
:
ImmutableArray
<
BoundAnonymousPropertyDeclaration
>.
Empty
,
syntax
,
type
,
isImplicit
));
return
new
LazyAnonymousObjectCreationExpression
(
memberInitializers
,
_semanticModel
,
syntax
,
type
,
constantValue
,
isImplicit
);
}
Lazy
<
IObjectOrCollectionInitializerOperation
>
initializer
=
new
Lazy
<
IObjectOrCollectionInitializerOperation
>(()
=>
(
IObjectOrCollectionInitializerOperation
)
Create
(
boundObjectCreationExpression
.
InitializerExpressionOpt
));
Lazy
<
ImmutableArray
<
IArgumentOperation
>>
arguments
=
new
Lazy
<
ImmutableArray
<
IArgumentOperation
>>(()
=>
...
...
src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory_Methods.cs
浏览文件 @
e2cbbeec
...
...
@@ -205,15 +205,25 @@ private IInvalidOperation CreateInvalidExpressionForHasArgumentsExpression(Bound
}
private
ImmutableArray
<
IOperation
>
GetAnonymousObjectCreationInitializers
(
BoundAnonymousObjectCreationExpression
expression
)
{
return
GetAnonymousObjectCreationInitializers
(
expression
.
Arguments
,
expression
.
Declarations
,
expression
.
Syntax
,
expression
.
Type
,
expression
.
WasCompilerGenerated
);
}
private
ImmutableArray
<
IOperation
>
GetAnonymousObjectCreationInitializers
(
ImmutableArray
<
BoundExpression
>
arguments
,
ImmutableArray
<
BoundAnonymousPropertyDeclaration
>
declarations
,
SyntaxNode
syntax
,
ITypeSymbol
type
,
bool
isImplicit
)
{
// For error cases and non-assignment initializers, the binder generates only the argument.
Debug
.
Assert
(
expression
.
Arguments
.
Length
>=
expression
.
D
eclarations
.
Length
);
Debug
.
Assert
(
arguments
.
Length
>=
d
eclarations
.
Length
);
var
builder
=
ArrayBuilder
<
IOperation
>.
GetInstance
(
expression
.
A
rguments
.
Length
);
var
builder
=
ArrayBuilder
<
IOperation
>.
GetInstance
(
a
rguments
.
Length
);
var
currentDeclarationIndex
=
0
;
for
(
int
i
=
0
;
i
<
expression
.
A
rguments
.
Length
;
i
++)
for
(
int
i
=
0
;
i
<
a
rguments
.
Length
;
i
++)
{
IOperation
value
=
Create
(
expression
.
A
rguments
[
i
]);
IOperation
value
=
Create
(
a
rguments
[
i
]);
IOperation
target
;
bool
isImplicitAssignment
;
...
...
@@ -222,15 +232,15 @@ private ImmutableArray<IOperation> GetAnonymousObjectCreationInitializers(BoundA
var
instance
=
new
InstanceReferenceExpression
(
referenceKind
:
InstanceReferenceKind
.
ImplicitReceiver
,
semanticModel
:
_semanticModel
,
syntax
:
expression
.
S
yntax
,
type
:
expression
.
T
ype
,
syntax
:
s
yntax
,
type
:
t
ype
,
constantValue
:
default
,
isImplicit
:
true
);
// Find matching declaration for the current argument.
IPropertySymbol
property
=
AnonymousTypeManager
.
GetAnonymousTypeProperty
((
NamedTypeSymbol
)
expression
.
T
ype
,
i
);
if
(
currentDeclarationIndex
>=
expression
.
D
eclarations
.
Length
||
(
object
)
property
!=
expression
.
D
eclarations
[
currentDeclarationIndex
].
Property
)
IPropertySymbol
property
=
AnonymousTypeManager
.
GetAnonymousTypeProperty
((
NamedTypeSymbol
)
t
ype
,
i
);
if
(
currentDeclarationIndex
>=
d
eclarations
.
Length
||
(
object
)
property
!=
d
eclarations
[
currentDeclarationIndex
].
Property
)
{
// No matching declaration, synthesize a property reference to be assigned.
target
=
new
PropertyReferenceExpression
(
...
...
@@ -246,19 +256,19 @@ private ImmutableArray<IOperation> GetAnonymousObjectCreationInitializers(BoundA
}
else
{
target
=
CreateBoundAnonymousPropertyDeclarationOperation
(
expression
.
D
eclarations
[
currentDeclarationIndex
++],
instance
);
isImplicitAssignment
=
expression
.
WasCompilerGenerated
;
target
=
CreateBoundAnonymousPropertyDeclarationOperation
(
d
eclarations
[
currentDeclarationIndex
++],
instance
);
isImplicitAssignment
=
isImplicit
;
}
SyntaxNode
syntax
=
value
.
Syntax
?.
Parent
??
expression
.
S
yntax
;
ITypeSymbol
t
ype
=
target
.
Type
;
var
assignmentSyntax
=
value
.
Syntax
?.
Parent
??
s
yntax
;
ITypeSymbol
assignmentT
ype
=
target
.
Type
;
Optional
<
object
>
constantValue
=
value
.
ConstantValue
;
bool
isRef
=
false
;
var
assignment
=
new
SimpleAssignmentExpression
(
target
,
isRef
,
value
,
_semanticModel
,
syntax
,
t
ype
,
constantValue
,
isImplicitAssignment
);
var
assignment
=
new
SimpleAssignmentExpression
(
target
,
isRef
,
value
,
_semanticModel
,
assignmentSyntax
,
assignmentT
ype
,
constantValue
,
isImplicitAssignment
);
builder
.
Add
(
assignment
);
}
Debug
.
Assert
(
currentDeclarationIndex
==
expression
.
D
eclarations
.
Length
);
Debug
.
Assert
(
currentDeclarationIndex
==
d
eclarations
.
Length
);
return
builder
.
ToImmutableAndFree
();
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录