Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
cd9382e2
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,发现更多精彩内容 >>
提交
cd9382e2
编写于
1月 03, 2018
作者:
C
Cyrus Najmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add range checks for character classes.
上级
0853fa4d
变更
17
展开全部
隐藏空白更改
内联
并排
Showing
17 changed file
with
1962 addition
and
1 deletion
+1962
-1
src/Workspaces/CSharpTest/RegularExpressions/CSharpRegexParserTests.cs
...s/CSharpTest/RegularExpressions/CSharpRegexParserTests.cs
+1751
-1
src/Workspaces/Core/Portable/RegularExpressions/RegexParser.cs
...orkspaces/Core/Portable/RegularExpressions/RegexParser.cs
+134
-0
src/Workspaces/Core/Portable/WorkspacesResources.Designer.cs
src/Workspaces/Core/Portable/WorkspacesResources.Designer.cs
+9
-0
src/Workspaces/Core/Portable/WorkspacesResources.resx
src/Workspaces/Core/Portable/WorkspacesResources.resx
+3
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.cs.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.cs.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.de.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.de.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.es.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.es.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.fr.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.fr.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.it.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.it.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ja.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ja.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ko.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ko.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.pl.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.pl.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.pt-BR.xlf
...orkspaces/Core/Portable/xlf/WorkspacesResources.pt-BR.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ru.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ru.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.tr.xlf
src/Workspaces/Core/Portable/xlf/WorkspacesResources.tr.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hans.xlf
...kspaces/Core/Portable/xlf/WorkspacesResources.zh-Hans.xlf
+5
-0
src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hant.xlf
...kspaces/Core/Portable/xlf/WorkspacesResources.zh-Hant.xlf
+5
-0
未找到文件。
src/Workspaces/CSharpTest/RegularExpressions/CSharpRegexParserTests.cs
浏览文件 @
cd9382e2
此差异已折叠。
点击以展开。
src/Workspaces/Core/Portable/RegularExpressions/RegexParser.cs
浏览文件 @
cd9382e2
...
...
@@ -1046,6 +1046,15 @@ private void ParseCharacterClassComponents(ArrayBuilder<RegexExpressionNode> com
{
var
right
=
ParseCharacterClassComponentPiece
(
isFirst
:
false
,
afterRangeMinus
:
true
);
if
(
TryGetRangeComponentValue
(
left
,
out
var
leftCh
)
&&
TryGetRangeComponentValue
(
right
,
out
var
rightCh
)
&&
leftCh
>
rightCh
)
{
minusToken
=
minusToken
.
AddDiagnosticIfNone
(
new
RegexDiagnostic
(
WorkspacesResources
.
x_y_range_in_reverse_order
,
GetSpan
(
minusToken
)));
}
components
.
Add
(
new
RegexCharacterClassRangeNode
(
left
,
minusToken
,
right
));
}
}
...
...
@@ -1055,6 +1064,131 @@ private void ParseCharacterClassComponents(ArrayBuilder<RegexExpressionNode> com
}
}
private
bool
TryGetRangeComponentValue
(
RegexPrimaryExpressionNode
component
,
out
char
ch
)
{
// Don't bother examining the component if it has any errors already. This also means
// we don't have to worry about running into invalid escape sequences and the like.
if
(!
HasProblem
(
component
))
{
return
TryGetRangeComponentValueWorker
(
component
,
out
ch
);
}
ch
=
default
;
return
false
;
}
private
bool
TryGetRangeComponentValueWorker
(
RegexPrimaryExpressionNode
component
,
out
char
ch
)
{
switch
(
component
.
Kind
)
{
case
RegexKind
.
SimpleEscape
:
ch
=
((
RegexSimpleEscapeNode
)
component
).
TypeToken
.
VirtualChars
[
0
];
return
true
;
case
RegexKind
.
ControlEscape
:
var
controlEscape
=
(
RegexControlEscapeNode
)
component
;
var
controlCh
=
controlEscape
.
TypeToken
.
VirtualChars
[
0
].
Char
;
ch
=
(
char
)(
controlCh
-
'@'
);
return
true
;
case
RegexKind
.
OctalEscape
:
ch
=
GetCharValue
(((
RegexOctalEscapeNode
)
component
).
OctalText
,
withBase
:
8
);
return
true
;
case
RegexKind
.
HexEscape
:
ch
=
GetCharValue
(((
RegexHexEscapeNode
)
component
).
HexText
,
withBase
:
16
);
return
true
;
case
RegexKind
.
UnicodeEscape
:
ch
=
GetCharValue
(((
RegexUnicodeEscapeNode
)
component
).
HexText
,
withBase
:
16
);
return
true
;
case
RegexKind
.
PosixProperty
:
// When the native parser sees [:...:] it treats this as if it just saw '[' and skipped the
// rest.
ch
=
'['
;
return
true
;
case
RegexKind
.
Text
:
ch
=
((
RegexTextNode
)
component
).
TextToken
.
VirtualChars
[
0
];
return
true
;
}
ch
=
default
;
return
false
;
}
private
char
GetCharValue
(
RegexToken
hexText
,
int
withBase
)
{
var
total
=
0
;
foreach
(
var
vc
in
hexText
.
VirtualChars
)
{
total
*=
withBase
;
total
+=
HexValue
(
vc
.
Char
);
}
return
(
char
)
total
;
}
private
int
HexValue
(
char
ch
)
{
unchecked
{
var
temp
=
(
uint
)(
ch
-
'0'
);
if
(
temp
<=
9
)
{
return
(
int
)
temp
;
}
temp
=
(
uint
)(
ch
-
'a'
);
if
(
temp
<=
5
)
{
return
(
int
)(
temp
+
10
);
}
temp
=
(
uint
)(
ch
-
'A'
);
if
(
temp
<=
5
)
{
return
(
int
)(
temp
+
10
);
}
}
throw
new
InvalidOperationException
();
}
private
bool
HasProblem
(
RegexNodeOrToken
component
)
{
if
(
component
.
IsNode
)
{
foreach
(
var
child
in
component
.
Node
)
{
if
(
HasProblem
(
child
))
{
return
true
;
}
}
}
else
{
var
token
=
component
.
Token
;
if
(
token
.
IsMissing
||
token
.
Diagnostics
.
Length
>
0
)
{
return
true
;
}
foreach
(
var
trivia
in
token
.
LeadingTrivia
)
{
if
(
trivia
.
Diagnostics
.
Length
>
0
)
{
return
true
;
}
}
}
return
false
;
}
private
RegexPrimaryExpressionNode
ParseCharacterClassComponentPiece
(
bool
isFirst
,
bool
afterRangeMinus
)
{
if
(
_currentToken
.
Kind
==
RegexKind
.
BackslashToken
&&
_lexer
.
Position
<
_lexer
.
Text
.
Length
)
...
...
src/Workspaces/Core/Portable/WorkspacesResources.Designer.cs
浏览文件 @
cd9382e2
...
...
@@ -1763,5 +1763,14 @@ internal class WorkspacesResources {
return
ResourceManager
.
GetString
(
"Workspace_is_not_empty"
,
resourceCulture
);
}
}
/// <summary>
/// Looks up a localized string similar to [x-y] range in reverse order.
/// </summary>
internal
static
string
x_y_range_in_reverse_order
{
get
{
return
ResourceManager
.
GetString
(
"x_y_range_in_reverse_order"
,
resourceCulture
);
}
}
}
}
src/Workspaces/Core/Portable/WorkspacesResources.resx
浏览文件 @
cd9382e2
...
...
@@ -703,4 +703,7 @@
<data
name=
"Unterminated_regex_comment"
xml:space=
"preserve"
>
<value>
Unterminated (?#...) comment
</value>
</data>
<data
name=
"x_y_range_in_reverse_order"
xml:space=
"preserve"
>
<value>
[x-y] range in reverse order
</value>
</data>
</root>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.cs.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.de.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.es.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.fr.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.it.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ja.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ko.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.pl.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.pt-BR.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.ru.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.tr.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hans.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hant.xlf
浏览文件 @
cd9382e2
...
...
@@ -947,6 +947,11 @@
<target
state=
"new"
>
Unterminated (?#...) comment
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"x_y_range_in_reverse_order"
>
<source>
[x-y] range in reverse order
</source>
<target
state=
"new"
>
[x-y] range in reverse order
</target>
<note
/>
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录