Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
d005cd50
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,体验更适合开发者的 AI 搜索 >>
提交
d005cd50
编写于
3月 24, 2020
作者:
S
Sam Harwell
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support default, checked, and unchecked expressions
上级
ada49f46
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
123 addition
and
2 deletion
+123
-2
src/EditorFeatures/CSharp/CompleteStatement/CompleteStatementCommandHandler.cs
...harp/CompleteStatement/CompleteStatementCommandHandler.cs
+16
-2
src/EditorFeatures/CSharpTest/CompleteStatement/CSharpCompleteStatementCommandHandlerTests.cs
...teStatement/CSharpCompleteStatementCommandHandlerTests.cs
+96
-0
src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/SyntaxNodeExtensions.cs
...nsions/Compiler/CSharp/Extensions/SyntaxNodeExtensions.cs
+11
-0
未找到文件。
src/EditorFeatures/CSharp/CompleteStatement/CompleteStatementCommandHandler.cs
浏览文件 @
d005cd50
...
...
@@ -112,11 +112,13 @@ private static void BeforeExecuteCommand(TypeCharCommandArgs args, CommandExecut
startingNode
=
token
.
Parent
;
// If the caret is
right before an opening delimiter or right
after a closing delimeter,
// If the caret is
before an opening delimiter or
after a closing delimeter,
// start analysis with node outside of delimiters.
//
// Examples,
// `obj.ToString$()` where `token` references `(` but the caret isn't actually inside the argument list.
// `obj.ToString()$` or `obj.method()$ .method()` where `token` references `)` but the caret isn't inside the argument list.
// `defa$$ult(object)` where `token` references `default` but the caret isn't inside the parentheses.
var
(
openingDelimeter
,
closingDelimiter
)
=
GetDelimiters
(
startingNode
);
if
(!
openingDelimeter
.
IsKind
(
SyntaxKind
.
None
)
&&
openingDelimeter
.
Span
.
Start
>=
caretPosition
||
!
closingDelimiter
.
IsKind
(
SyntaxKind
.
None
)
&&
closingDelimiter
.
Span
.
End
<=
caretPosition
)
...
...
@@ -149,7 +151,10 @@ private static void BeforeExecuteCommand(TypeCharCommandArgs args, CommandExecut
SyntaxKind
.
ArrayRankSpecifier
,
SyntaxKind
.
BracketedArgumentList
,
SyntaxKind
.
ParenthesizedExpression
,
SyntaxKind
.
ParameterList
))
SyntaxKind
.
ParameterList
,
SyntaxKind
.
DefaultExpression
,
SyntaxKind
.
CheckedExpression
,
SyntaxKind
.
UncheckedExpression
))
{
// make sure the closing delimiter exists
if
(
RequiredDelimiterIsMissing
(
currentNode
))
...
...
@@ -472,6 +477,15 @@ private static (SyntaxToken openingDelimeter, SyntaxToken closingDelimiter) GetD
var
parameterList
=
(
ParameterListSyntax
)
currentNode
;
return
(
parameterList
.
OpenParenToken
,
parameterList
.
CloseParenToken
);
case
SyntaxKind
.
DefaultExpression
:
var
defaultExpressionSyntax
=
(
DefaultExpressionSyntax
)
currentNode
;
return
(
defaultExpressionSyntax
.
OpenParenToken
,
defaultExpressionSyntax
.
CloseParenToken
);
case
SyntaxKind
.
CheckedExpression
:
case
SyntaxKind
.
UncheckedExpression
:
var
checkedExpressionSyntax
=
(
CheckedExpressionSyntax
)
currentNode
;
return
(
checkedExpressionSyntax
.
OpenParenToken
,
checkedExpressionSyntax
.
CloseParenToken
);
default
:
// Type of node does not have delimiters used by this feature
return
default
;
...
...
src/EditorFeatures/CSharpTest/CompleteStatement/CSharpCompleteStatementCommandHandlerTests.cs
浏览文件 @
d005cd50
...
...
@@ -2316,6 +2316,102 @@ static void Main()
#
endregion
[
WpfTheory
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CompleteStatement
)]
[
InlineData
(
"default(object$$)"
,
"default(object)"
)]
[
InlineData
(
"default($$object)"
,
"default(object)"
)]
public
void
DefaultExpression_Handled
(
string
expression
,
string
expectedExpression
)
{
var
code
=
$@"
public class Class1
{{
void
M
()
{{
int
i
=
{
expression
}
}}
}}
"
;
var
expected
=
$@"
public class Class1
{{
void
M
()
{{
int
i
=
{
expectedExpression
};
$$
}}
}}
"
;
VerifyTypingSemicolon
(
code
,
expected
);
}
[
WpfTheory
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CompleteStatement
)]
[
InlineData
(
"default$$(object)"
)]
[
InlineData
(
"def$$ault(object)"
)]
[
InlineData
(
"default(object$$"
)]
[
InlineData
(
"default($$object"
)]
public
void
DefaultExpression_NotHandled
(
string
expression
)
{
var
code
=
$@"
public class Class1
{{
void
M
()
{{
int
i
=
{
expression
}
}}
}}
"
;
VerifyNoSpecialSemicolonHandling
(
code
);
}
[
WpfTheory
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CompleteStatement
)]
[
InlineData
(
"checked(3 + 3$$)"
,
"checked(3 + 3)"
)]
[
InlineData
(
"checked($$3 + 3)"
,
"checked(3 + 3)"
)]
[
InlineData
(
"unchecked(3 + 3$$)"
,
"unchecked(3 + 3)"
)]
[
InlineData
(
"unchecked($$3 + 3)"
,
"unchecked(3 + 3)"
)]
public
void
CheckedExpression_Handled
(
string
expression
,
string
expectedExpression
)
{
var
code
=
$@"
public class Class1
{{
void
M
()
{{
int
i
=
{
expression
}
}}
}}
"
;
var
expected
=
$@"
public class Class1
{{
void
M
()
{{
int
i
=
{
expectedExpression
};
$$
}}
}}
"
;
VerifyTypingSemicolon
(
code
,
expected
);
}
[
WpfTheory
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CompleteStatement
)]
[
InlineData
(
"checked$$(3 + 3)"
)]
[
InlineData
(
"che$$cked(3 + 3)"
)]
[
InlineData
(
"checked(3 + 3$$"
)]
[
InlineData
(
"checked($$3 + 3"
)]
[
InlineData
(
"unchecked$$(3 + 3)"
)]
[
InlineData
(
"unche$$cked(3 + 3)"
)]
[
InlineData
(
"unchecked(3 + 3$$"
)]
[
InlineData
(
"unchecked($$3 + 3"
)]
public
void
CheckedExpression_NotHandled
(
string
expression
)
{
var
code
=
$@"
public class Class1
{{
void
M
()
{{
int
i
=
{
expression
}
}}
}}
"
;
VerifyNoSpecialSemicolonHandling
(
code
);
}
[
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CompleteStatement
)]
public
void
ThrowStatement_MissingBoth
()
{
...
...
src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/SyntaxNodeExtensions.cs
浏览文件 @
d005cd50
...
...
@@ -131,6 +131,17 @@ public static bool IsKind([NotNullWhen(returnValue: true)] this SyntaxNode? node
return
csharpKind
==
kind1
||
csharpKind
==
kind2
||
csharpKind
==
kind3
||
csharpKind
==
kind4
||
csharpKind
==
kind5
||
csharpKind
==
kind6
||
csharpKind
==
kind7
;
}
public
static
bool
IsKind
([
NotNullWhen
(
returnValue
:
true
)]
this
SyntaxNode
?
node
,
SyntaxKind
kind1
,
SyntaxKind
kind2
,
SyntaxKind
kind3
,
SyntaxKind
kind4
,
SyntaxKind
kind5
,
SyntaxKind
kind6
,
SyntaxKind
kind7
,
SyntaxKind
kind8
)
{
if
(
node
==
null
)
{
return
false
;
}
var
csharpKind
=
node
.
Kind
();
return
csharpKind
==
kind1
||
csharpKind
==
kind2
||
csharpKind
==
kind3
||
csharpKind
==
kind4
||
csharpKind
==
kind5
||
csharpKind
==
kind6
||
csharpKind
==
kind7
||
csharpKind
==
kind8
;
}
public
static
bool
IsKind
([
NotNullWhen
(
returnValue
:
true
)]
this
SyntaxNode
?
node
,
SyntaxKind
kind1
,
SyntaxKind
kind2
,
SyntaxKind
kind3
,
SyntaxKind
kind4
,
SyntaxKind
kind5
,
SyntaxKind
kind6
,
SyntaxKind
kind7
,
SyntaxKind
kind8
,
SyntaxKind
kind9
,
SyntaxKind
kind10
,
SyntaxKind
kind11
)
{
if
(
node
==
null
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录