Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
2881c1c5
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,发现更多精彩内容 >>
提交
2881c1c5
编写于
2月 13, 2020
作者:
C
Cyrus Najmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
PR feedback
上级
7101aebc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
31 addition
and
28 deletion
+31
-28
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
+31
-28
未找到文件。
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
浏览文件 @
2881c1c5
...
...
@@ -7152,43 +7152,46 @@ private bool IsEndOfFixedStatement()
||
this
.
CurrentToken
.
Kind
==
SyntaxKind
.
SemicolonToken
;
}
// ParseEmbeddedStatement is called through many recursive statement parsing cases. We want
// to ensure it is inlined into the callers as the overhead of this single method can have a
// deep impact on the number of recursive calls we can make (more than a hundred during
// empirical testing).
[
MethodImpl
(
MethodImplOptions
.
AggressiveInlining
)]
private
StatementSyntax
ParseEmbeddedStatement
()
{
//
The consumers of embedded statements are expecting to receive a non-null statement
//
yet there are several error conditions that can lead ParseStatementCore to return
//
null. When that occurs create an error empty Statement and return it to the caller.
return
CheckEmbeddedStatement
(
this
.
ParseStatementCore
()
??
ParseEmptyStatement
());
}
//
ParseEmbeddedStatement is called through many recursive statement parsing cases. We
//
keep the body exceptionally simple, and we optimize for the common case, to ensure it
//
is inlined into the callers. Otherwise the overhead of this single method can have a
// deep impact on the number of recursive calls we can make (more than a hundred during
// empirical testing).
private
EmptyStatementSyntax
ParseEmptyStatement
()
=>
SyntaxFactory
.
EmptyStatement
(
EatToken
(
SyntaxKind
.
SemicolonToken
));
return
parseEmbeddedStatementRest
(
this
.
ParseStatementCore
());
private
StatementSyntax
CheckEmbeddedStatement
(
StatementSyntax
statement
)
{
// In scripts, stand-alone expression statements may not be followed by semicolons.
// ParseExpressionStatement hides the error.
// However, embedded expression statements are required to be followed by semicolon.
if
(
statement
.
Kind
==
SyntaxKind
.
ExpressionStatement
&&
IsScript
)
StatementSyntax
parseEmbeddedStatementRest
(
StatementSyntax
statement
)
{
var
expressionStatementSyntax
=
(
ExpressionStatementSyntax
)
statement
;
var
semicolonToken
=
expressionStatementSyntax
.
SemicolonToken
;
if
(
statement
==
null
)
{
// The consumers of embedded statements are expecting to receive a non-null statement
// yet there are several error conditions that can lead ParseStatementCore to return
// null. When that occurs create an error empty Statement and return it to the caller.
return
SyntaxFactory
.
EmptyStatement
(
EatToken
(
SyntaxKind
.
SemicolonToken
));
}
// Do not add a new error if the same error was already added.
if
(
semicolonToken
.
IsMissing
&&
!
semicolonToken
.
GetDiagnostics
().
Contains
(
diagnosticInfo
=>
(
ErrorCode
)
diagnosticInfo
.
Code
==
ErrorCode
.
ERR_SemicolonExpected
))
// In scripts, stand-alone expression statements may not be followed by semicolons.
// ParseExpressionStatement hides the error.
// However, embedded expression statements are required to be followed by semicolon.
if
(
statement
.
Kind
==
SyntaxKind
.
ExpressionStatement
&&
IsScript
)
{
semicolonToken
=
this
.
AddError
(
semicolonToken
,
ErrorCode
.
ERR_SemicolonExpected
);
statement
=
expressionStatementSyntax
.
Update
(
expressionStatementSyntax
.
Expression
,
semicolonToken
);
var
expressionStatementSyntax
=
(
ExpressionStatementSyntax
)
statement
;
var
semicolonToken
=
expressionStatementSyntax
.
SemicolonToken
;
// Do not add a new error if the same error was already added.
if
(
semicolonToken
.
IsMissing
&&
!
semicolonToken
.
GetDiagnostics
().
Contains
(
diagnosticInfo
=>
(
ErrorCode
)
diagnosticInfo
.
Code
==
ErrorCode
.
ERR_SemicolonExpected
))
{
semicolonToken
=
this
.
AddError
(
semicolonToken
,
ErrorCode
.
ERR_SemicolonExpected
);
return
expressionStatementSyntax
.
Update
(
expressionStatementSyntax
.
Expression
,
semicolonToken
);
}
}
}
return
statement
;
return
statement
;
}
}
private
BreakStatementSyntax
ParseBreakStatement
()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录