Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
5d4ea622
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,发现更多精彩内容 >>
提交
5d4ea622
编写于
8月 19, 2016
作者:
A
AlekseyTs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Adjust scope of declarations within a Local Function Statement according to the latest design.
Related to #12597.
上级
28758406
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
59 addition
and
3 deletion
+59
-3
src/Compilers/CSharp/Portable/Binder/Binder.cs
src/Compilers/CSharp/Portable/Binder/Binder.cs
+17
-0
src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs
src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs
+9
-2
src/Compilers/CSharp/Test/Semantic/Semantics/LocalFunctionTests.cs
...lers/CSharp/Test/Semantic/Semantics/LocalFunctionTests.cs
+33
-1
未找到文件。
src/Compilers/CSharp/Portable/Binder/Binder.cs
浏览文件 @
5d4ea622
...
...
@@ -760,5 +760,22 @@ internal BoundStatement WrapWithVariablesIfAny(CSharpSyntaxNode scopeDesignator,
ImmutableArray
.
Create
(
statement
))
{
WasCompilerGenerated
=
true
};
}
/// <summary>
/// Should only be used with scopes that could declare local functions.
/// </summary>
internal
BoundStatement
WrapWithVariablesAndLocalFunctionsIfAny
(
CSharpSyntaxNode
scopeDesignator
,
BoundStatement
statement
)
{
var
locals
=
this
.
GetDeclaredLocalsForScope
(
scopeDesignator
);
var
localFunctions
=
this
.
GetDeclaredLocalFunctionsForScope
(
scopeDesignator
);
if
(
locals
.
IsEmpty
&&
localFunctions
.
IsEmpty
)
{
return
statement
;
}
return
new
BoundBlock
(
statement
.
Syntax
,
locals
,
localFunctions
,
ImmutableArray
.
Create
(
statement
))
{
WasCompilerGenerated
=
true
};
}
}
}
src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs
浏览文件 @
5d4ea622
...
...
@@ -272,6 +272,8 @@ internal virtual BoundStatement BindUsingStatementParts(DiagnosticBag diagnostic
internal
BoundStatement
BindPossibleEmbeddedStatement
(
StatementSyntax
node
,
DiagnosticBag
diagnostics
)
{
Binder
binder
;
switch
(
node
.
Kind
())
{
case
SyntaxKind
.
ExpressionStatement
:
...
...
@@ -281,11 +283,16 @@ internal BoundStatement BindPossibleEmbeddedStatement(StatementSyntax node, Diag
case
SyntaxKind
.
IfStatement
:
case
SyntaxKind
.
YieldReturnStatement
:
case
SyntaxKind
.
LocalDeclarationStatement
:
case
SyntaxKind
.
LabeledStatement
:
Binder
binder
=
this
.
GetBinder
(
node
);
binder
=
this
.
GetBinder
(
node
);
Debug
.
Assert
(
binder
!=
null
);
return
binder
.
WrapWithVariablesIfAny
(
node
,
binder
.
BindStatement
(
node
,
diagnostics
));
case
SyntaxKind
.
LabeledStatement
:
case
SyntaxKind
.
LocalFunctionStatement
:
binder
=
this
.
GetBinder
(
node
);
Debug
.
Assert
(
binder
!=
null
);
return
binder
.
WrapWithVariablesAndLocalFunctionsIfAny
(
node
,
binder
.
BindStatement
(
node
,
diagnostics
));
case
SyntaxKind
.
SwitchStatement
:
var
switchStatement
=
(
SwitchStatementSyntax
)
node
;
binder
=
this
.
GetBinder
(
switchStatement
.
Expression
);
...
...
src/Compilers/CSharp/Test/Semantic/Semantics/LocalFunctionTests.cs
浏览文件 @
5d4ea622
...
...
@@ -3785,7 +3785,39 @@ static void Main(string[] args)
Diagnostic
(
ErrorCode
.
ERR_InvalidExprTerm
,
")"
).
WithArguments
(
")"
).
WithLocation
(
6
,
13
),
// (7,9): error CS1023: Embedded statement cannot be a declaration or labeled statement
// int Add(int x, int y) => x + y;
Diagnostic
(
ErrorCode
.
ERR_BadEmbeddedStmt
,
"int Add(int x, int y) => x + y;"
).
WithLocation
(
7
,
9
)
Diagnostic
(
ErrorCode
.
ERR_BadEmbeddedStmt
,
"int Add(int x, int y) => x + y;"
).
WithLocation
(
7
,
9
),
// (7,13): warning CS0168: The variable 'Add' is declared but never used
// int Add(int x, int y) => x + y;
Diagnostic
(
ErrorCode
.
WRN_UnreferencedVar
,
"Add"
).
WithArguments
(
"Add"
).
WithLocation
(
7
,
13
)
);
}
[
Fact
,
WorkItem
(
10521
,
"https://github.com/dotnet/roslyn/issues/10521"
)]
public
void
LabeledLocalFunctionInIf
()
{
var
source
=
@"
class Program
{
static void Main(string[] args)
{
if () // typing at this point
a: int Add(int x, int y) => x + y;
}
}
"
;
VerifyDiagnostics
(
source
,
// (6,13): error CS1525: Invalid expression term ')'
// if () // typing at this point
Diagnostic
(
ErrorCode
.
ERR_InvalidExprTerm
,
")"
).
WithArguments
(
")"
).
WithLocation
(
6
,
13
),
// (7,1): error CS1023: Embedded statement cannot be a declaration or labeled statement
// a: int Add(int x, int y) => x + y;
Diagnostic
(
ErrorCode
.
ERR_BadEmbeddedStmt
,
"a: int Add(int x, int y) => x + y;"
).
WithLocation
(
7
,
1
),
// (7,1): warning CS0164: This label has not been referenced
// a: int Add(int x, int y) => x + y;
Diagnostic
(
ErrorCode
.
WRN_UnreferencedLabel
,
"a"
).
WithLocation
(
7
,
1
),
// (7,13): warning CS0168: The variable 'Add' is declared but never used
// a: int Add(int x, int y) => x + y;
Diagnostic
(
ErrorCode
.
WRN_UnreferencedVar
,
"Add"
).
WithArguments
(
"Add"
).
WithLocation
(
7
,
13
)
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录