Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
babf816c
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,发现更多精彩内容 >>
提交
babf816c
编写于
10月 19, 2016
作者:
C
CyrusNajmabadi
提交者:
GitHub
10月 19, 2016
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #14601 from CyrusNajmabadi/portFix3
Only format an open curly if it the first token on a line.
上级
7228f393
24b9028e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
130 addition
and
15 deletion
+130
-15
src/EditorFeatures/CSharp/Formatting/CSharpEditorFormattingService.cs
...atures/CSharp/Formatting/CSharpEditorFormattingService.cs
+33
-8
src/EditorFeatures/CSharp/Formatting/Indentation/SmartTokenFormatter.cs
...ures/CSharp/Formatting/Indentation/SmartTokenFormatter.cs
+13
-5
src/EditorFeatures/CSharpTest/Formatting/FormattingEngineTests.cs
...orFeatures/CSharpTest/Formatting/FormattingEngineTests.cs
+84
-2
未找到文件。
src/EditorFeatures/CSharp/Formatting/CSharpEditorFormattingService.cs
浏览文件 @
babf816c
...
...
@@ -138,10 +138,37 @@ private static bool TokenShouldNotFormatOnReturn(SyntaxToken token)
return
!
token
.
IsKind
(
SyntaxKind
.
CloseParenToken
)
||
!
token
.
Parent
.
IsKind
(
SyntaxKind
.
UsingStatement
);
}
private
static
bool
TokenShouldNotFormatOnTypeChar
(
SyntaxToken
token
)
private
static
async
Task
<
bool
>
TokenShouldNotFormatOnTypeCharAsync
(
SyntaxToken
token
,
CancellationToken
cancellationToken
)
{
return
(
token
.
IsKind
(
SyntaxKind
.
CloseParenToken
)
&&
!
token
.
Parent
.
IsKind
(
SyntaxKind
.
UsingStatement
))
||
(
token
.
IsKind
(
SyntaxKind
.
ColonToken
)
&&
!(
token
.
Parent
.
IsKind
(
SyntaxKind
.
LabeledStatement
)
||
token
.
Parent
is
SwitchLabelSyntax
));
// If the token is a ) we only want to format if it's the close paren
// of a using statement. That way if we have nested usings, the inner
// using will align with the outer one when the user types the close paren.
if
(
token
.
IsKind
(
SyntaxKind
.
CloseParenToken
)
&&
!
token
.
Parent
.
IsKind
(
SyntaxKind
.
UsingStatement
))
{
return
true
;
}
// If the token is a : we only want to format if it's a labeled statement
// or case. When the colon is typed we'll want ot immediately have those
// statements snap to their appropriate indentation level.
if
(
token
.
IsKind
(
SyntaxKind
.
ColonToken
)
&&
!(
token
.
Parent
.
IsKind
(
SyntaxKind
.
LabeledStatement
)
||
token
.
Parent
is
SwitchLabelSyntax
))
{
return
true
;
}
// Only format an { if it is the first token on a line. We don't want to
// mess with it if it's inside a line.
if
(
token
.
IsKind
(
SyntaxKind
.
OpenBraceToken
))
{
var
text
=
await
token
.
SyntaxTree
.
GetTextAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
if
(!
token
.
IsFirstTokenOnLine
(
text
))
{
return
true
;
}
}
return
false
;
}
public
async
Task
<
IList
<
TextChange
>>
GetFormattingChangesAsync
(
Document
document
,
char
typedChar
,
int
caretPosition
,
CancellationToken
cancellationToken
)
...
...
@@ -149,7 +176,7 @@ public async Task<IList<TextChange>> GetFormattingChangesAsync(Document document
var
formattingRules
=
this
.
GetFormattingRules
(
document
,
caretPosition
);
// first, find the token user just typed.
SyntaxToken
token
=
await
GetTokenBeforeTheCaretAsync
(
document
,
caretPosition
,
cancellationToken
).
ConfigureAwait
(
false
);
var
token
=
await
GetTokenBeforeTheCaretAsync
(
document
,
caretPosition
,
cancellationToken
).
ConfigureAwait
(
false
);
if
(
token
.
IsMissing
||
!
ValidSingleOrMultiCharactersTokenKind
(
typedChar
,
token
.
Kind
())
||
...
...
@@ -164,10 +191,8 @@ public async Task<IList<TextChange>> GetFormattingChangesAsync(Document document
return
null
;
}
// Check to see if any of the below. If not, bail.
// case 1: The token is ')' and the parent is an using statement.
// case 2: The token is ':' and the parent is either labelled statement or case switch or default switch
if
(
TokenShouldNotFormatOnTypeChar
(
token
))
var
shouldNotFormat
=
await
TokenShouldNotFormatOnTypeCharAsync
(
token
,
cancellationToken
).
ConfigureAwait
(
false
);
if
(
shouldNotFormat
)
{
return
null
;
}
...
...
src/EditorFeatures/CSharp/Formatting/Indentation/SmartTokenFormatter.cs
浏览文件 @
babf816c
...
...
@@ -68,7 +68,8 @@ private bool CloseBraceOfTryOrDoBlock(SyntaxToken endToken)
(
endToken
.
Parent
.
IsParentKind
(
SyntaxKind
.
TryStatement
)
||
endToken
.
Parent
.
IsParentKind
(
SyntaxKind
.
DoStatement
));
}
public
Task
<
IList
<
TextChange
>>
FormatTokenAsync
(
Workspace
workspace
,
SyntaxToken
token
,
CancellationToken
cancellationToken
)
public
async
Task
<
IList
<
TextChange
>>
FormatTokenAsync
(
Workspace
workspace
,
SyntaxToken
token
,
CancellationToken
cancellationToken
)
{
Contract
.
ThrowIfTrue
(
token
.
Kind
()
==
SyntaxKind
.
None
||
token
.
Kind
()
==
SyntaxKind
.
EndOfFileToken
);
...
...
@@ -77,7 +78,7 @@ public Task<IList<TextChange>> FormatTokenAsync(Workspace workspace, SyntaxToken
if
(
previousToken
.
Kind
()
==
SyntaxKind
.
None
)
{
// no previous token. nothing to format
return
Task
.
FromResult
(
SpecializedCollections
.
EmptyList
<
TextChange
>()
);
return
SpecializedCollections
.
EmptyList
<
TextChange
>(
);
}
// This is a heuristic to prevent brace completion from breaking user expectation/muscle memory in common scenarios (see Devdiv:823958).
...
...
@@ -100,12 +101,19 @@ public Task<IList<TextChange>> FormatTokenAsync(Workspace workspace, SyntaxToken
var
smartTokenformattingRules
=
(
new
SmartTokenFormattingRule
()).
Concat
(
_formattingRules
);
var
adjustedStartPosition
=
previousToken
.
SpanStart
;
var
indentStyle
=
_optionSet
.
GetOption
(
FormattingOptions
.
SmartIndent
,
LanguageNames
.
CSharp
);
if
(
token
.
IsKind
(
SyntaxKind
.
OpenBraceToken
)
&&
token
.
IsFirstTokenOnLine
(
token
.
SyntaxTree
.
GetText
())
&&
indentStyle
!=
FormattingOptions
.
IndentStyle
.
Smart
)
if
(
token
.
IsKind
(
SyntaxKind
.
OpenBraceToken
)
&&
indentStyle
!=
FormattingOptions
.
IndentStyle
.
Smart
)
{
adjustedStartPosition
=
token
.
SpanStart
;
var
text
=
await
token
.
SyntaxTree
.
GetTextAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
if
(
token
.
IsFirstTokenOnLine
(
text
))
{
adjustedStartPosition
=
token
.
SpanStart
;
}
}
return
Formatter
.
GetFormattedTextChangesAsync
(
_root
,
new
TextSpan
[]
{
TextSpan
.
FromBounds
(
adjustedStartPosition
,
adjustedEndPosition
)
},
workspace
,
_optionSet
,
smartTokenformattingRules
,
cancellationToken
);
return
await
Formatter
.
GetFormattedTextChangesAsync
(
_root
,
new
TextSpan
[]
{
TextSpan
.
FromBounds
(
adjustedStartPosition
,
adjustedEndPosition
)
},
workspace
,
_optionSet
,
smartTokenformattingRules
,
cancellationToken
).
ConfigureAwait
(
false
);
}
private
class
NoLineChangeFormattingRule
:
AbstractFormattingRule
...
...
src/EditorFeatures/CSharpTest/Formatting/FormattingEngineTests.cs
浏览文件 @
babf816c
...
...
@@ -6,6 +6,7 @@
using
Microsoft.CodeAnalysis.CSharp
;
using
Microsoft.CodeAnalysis.Editor.Commands
;
using
Microsoft.CodeAnalysis.Editor.Implementation.Formatting
;
using
Microsoft.CodeAnalysis.Editor.Options
;
using
Microsoft.CodeAnalysis.Editor.Shared.Options
;
using
Microsoft.CodeAnalysis.Editor.UnitTests.Utilities
;
using
Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
;
...
...
@@ -162,7 +163,7 @@ static void Main(string[] args)
[
WorkItem
(
977133
,
"http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/977133"
)]
[
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Formatting
)]
public
async
Task
DoNotFormatRange
ButFormatTokenOnOpenBrac
e
()
public
async
Task
DoNotFormatRange
OrFormatTokenOnOpenBraceOnSameLin
e
()
{
var
code
=
@"class C
{
...
...
@@ -175,7 +176,30 @@ public void M()
{
public void M()
{
if (true) {
if (true) {
}
}"
;
await
AssertFormatAfterTypeCharAsync
(
code
,
expected
);
}
[
WorkItem
(
14491
,
"https://github.com/dotnet/roslyn/pull/14491"
)]
[
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Formatting
)]
public
async
Task
DoNotFormatRangeButFormatTokenOnOpenBraceOnNextLine
()
{
var
code
=
@"class C
{
public void M()
{
if (true)
{$$
}
}"
;
var
expected
=
@"class C
{
public void M()
{
if (true)
{
}
}"
;
await
AssertFormatAfterTypeCharAsync
(
code
,
expected
);
...
...
@@ -1142,6 +1166,64 @@ class C
await
AssertFormatAfterTypeCharAsync
(
code
,
expected
,
optionSet
);
}
[
WpfFact
,
WorkItem
(
4435
,
"https://github.com/dotnet/roslyn/issues/4435"
)]
[
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
SmartTokenFormatting
)]
public
async
Task
OpenCurlyNotFormattedIfNotAtStartOfLine
()
{
var
code
=
@"
class C
{
public int P {$$
}
"
;
var
expected
=
@"
class C
{
public int P {
}
"
;
var
optionSet
=
new
Dictionary
<
OptionKey
,
object
>
{
{
new
OptionKey
(
BraceCompletionOptions
.
EnableBraceCompletion
,
LanguageNames
.
CSharp
),
false
}
};
await
AssertFormatAfterTypeCharAsync
(
code
,
expected
);
}
[
WpfFact
,
WorkItem
(
4435
,
"https://github.com/dotnet/roslyn/issues/4435"
)]
[
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
SmartTokenFormatting
)]
public
async
Task
OpenCurlyFormattedIfAtStartOfLine
()
{
var
code
=
@"
class C
{
public int P
{$$
}
"
;
var
expected
=
@"
class C
{
public int P
{
}
"
;
var
optionSet
=
new
Dictionary
<
OptionKey
,
object
>
{
{
new
OptionKey
(
BraceCompletionOptions
.
EnableBraceCompletion
,
LanguageNames
.
CSharp
),
false
}
};
await
AssertFormatAfterTypeCharAsync
(
code
,
expected
);
}
[
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Formatting
)]
public
async
Task
DoNotFormatIncompleteBlockOnSingleLineIfNotTypingCloseCurly1
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录