Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
38281970
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,发现更多精彩内容 >>
提交
38281970
编写于
11月 18, 2015
作者:
N
Neal Gafter
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #6731 from gafter/fix6726
Enforce the precedence of a query expression
上级
765477e7
15349292
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
35 addition
and
6 deletion
+35
-6
src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.cs
...CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.cs
+1
-1
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
+12
-5
src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenOperators.cs
src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenOperators.cs
+12
-0
src/Compilers/CSharp/Test/Syntax/Parsing/ExpressionParsingTests.cs
...lers/CSharp/Test/Syntax/Parsing/ExpressionParsingTests.cs
+10
-0
未找到文件。
src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.cs
浏览文件 @
38281970
...
...
@@ -198,7 +198,7 @@ protected override bool NeedsProxy(Symbol localOrParameter)
// No closures or lambda methods are generated.
// E.g.
// int y = 0;
// var b = false &&
from z in new X(y) select f(z + y
)
// var b = false &&
(from z in new X(y) select f(z + y)
)
return
loweredBody
;
}
...
...
src/Compilers/CSharp/Portable/Parser/LanguageParser.cs
浏览文件 @
38281970
...
...
@@ -6500,7 +6500,7 @@ private StatementSyntax ParseStatementNoDeclaration(bool allowAnyExpression)
}
else
if
(
this
.
IsQueryExpression
(
mayBeVariableDeclaration
:
true
,
mayBeMemberDeclaration
:
allowAnyExpression
))
{
return
this
.
ParseExpressionStatement
(
this
.
ParseQueryExpression
());
return
this
.
ParseExpressionStatement
(
this
.
ParseQueryExpression
(
0
));
}
else
{
...
...
@@ -8330,7 +8330,7 @@ private ExpressionSyntax ParseSubExpressionCore(uint precedence)
}
else
if
(
this
.
IsQueryExpression
(
mayBeVariableDeclaration
:
false
,
mayBeMemberDeclaration
:
false
))
{
leftOperand
=
this
.
ParseQueryExpression
();
leftOperand
=
this
.
ParseQueryExpression
(
precedence
);
}
else
if
(
this
.
CurrentToken
.
ContextualKind
==
SyntaxKind
.
FromKeyword
&&
IsInQuery
)
{
...
...
@@ -8448,10 +8448,10 @@ private ExpressionSyntax ParseSubExpressionCore(uint precedence)
{
var
questionToken
=
this
.
EatToken
();
var
colonLeft
=
this
.
Parse
SubExpression
(
nullCoalescingPrecedence
-
1
);
var
colonLeft
=
this
.
Parse
ExpressionCore
(
);
var
colon
=
this
.
EatToken
(
SyntaxKind
.
ColonToken
);
var
colonRight
=
this
.
Parse
SubExpression
(
nullCoalescingPrecedence
-
1
);
var
colonRight
=
this
.
Parse
ExpressionCore
(
);
leftOperand
=
_syntaxFactory
.
ConditionalExpression
(
leftOperand
,
questionToken
,
colonLeft
,
colon
,
colonRight
);
}
...
...
@@ -10193,11 +10193,16 @@ private bool IsQueryExpressionAfterFrom(bool mayBeVariableDeclaration, bool mayB
return
false
;
}
private
QueryExpressionSyntax
ParseQueryExpression
()
private
QueryExpressionSyntax
ParseQueryExpression
(
uint
precedence
)
{
this
.
EnterQuery
();
var
fc
=
this
.
ParseFromClause
();
fc
=
CheckFeatureAvailability
(
fc
,
MessageID
.
IDS_FeatureQueryExpression
);
if
(
precedence
>
1
&&
IsStrict
)
{
fc
=
this
.
AddError
(
fc
,
ErrorCode
.
ERR_InvalidExprTerm
,
SyntaxFacts
.
GetText
(
SyntaxKind
.
FromKeyword
));
}
var
body
=
this
.
ParseQueryBody
();
this
.
LeaveQuery
();
return
_syntaxFactory
.
QueryExpression
(
fc
,
body
);
...
...
@@ -10440,6 +10445,8 @@ private QueryContinuationSyntax ParseQueryContinuation()
return
_syntaxFactory
.
QueryContinuation
(
@into
,
name
,
body
);
}
private
bool
IsStrict
=>
this
.
Options
.
Features
.
ContainsKey
(
"strict"
);
[
Obsolete
(
"Use IsIncrementalAndFactoryContextMatches"
)]
private
new
bool
IsIncremental
{
...
...
src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenOperators.cs
浏览文件 @
38281970
...
...
@@ -1797,6 +1797,18 @@ static int Main()
return (errCount > 0) ? 1 : 0;
}
}"
;
// the grammar does not allow a query on the right-hand-side of &&, but we allow it except in strict mode.
CreateCompilationWithMscorlibAndSystemCore
(
source
,
parseOptions
:
TestOptions
.
Regular
.
WithFeature
(
"strict"
,
"true"
)).
VerifyDiagnostics
(
// (23,26): error CS1525: Invalid expression term 'from'
// var b = false && from x in src select x; // WRN CS0429
Diagnostic
(
ErrorCode
.
ERR_InvalidExprTerm
,
"from x in src"
).
WithArguments
(
"from"
).
WithLocation
(
23
,
26
),
// (4,1): hidden CS8019: Unnecessary using directive.
// using System.Collections.Generic;
Diagnostic
(
ErrorCode
.
HDN_UnusedUsingDirective
,
"using System.Collections.Generic;"
).
WithLocation
(
4
,
1
),
// (3,1): hidden CS8019: Unnecessary using directive.
// using System.Linq;
Diagnostic
(
ErrorCode
.
HDN_UnusedUsingDirective
,
"using System.Linq;"
).
WithLocation
(
3
,
1
)
);
CompileAndVerify
(
source
,
additionalRefs
:
new
[]
{
LinqAssemblyRef
},
expectedOutput
:
"0"
);
}
...
...
src/Compilers/CSharp/Test/Syntax/Parsing/ExpressionParsingTests.cs
浏览文件 @
38281970
...
...
@@ -508,6 +508,16 @@ public void TestConditional()
Assert
.
Equal
(
"c"
,
ts
.
WhenFalse
.
ToString
());
}
[
Fact
]
public
void
TestConditional02
()
{
// ensure that ?: has lower precedence than assignment.
var
text
=
"a ? b=c : d=e"
;
var
expr
=
this
.
ParseExpression
(
text
);
Assert
.
Equal
(
SyntaxKind
.
ConditionalExpression
,
expr
.
Kind
());
Assert
.
False
(
expr
.
HasErrors
);
}
[
Fact
]
public
void
TestCast
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录