Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
649960f4
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,发现更多精彩内容 >>
提交
649960f4
编写于
6月 15, 2015
作者:
P
Paul Harrington
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Address performance of smart indenter at end of file with inactive regions.
上级
e0371c92
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
147 addition
and
14 deletion
+147
-14
src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj
...EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj
+2
-1
src/EditorFeatures/CSharpTest/Extensions/SyntaxTreeExtensionsTests.cs
...atures/CSharpTest/Extensions/SyntaxTreeExtensionsTests.cs
+74
-0
src/EditorFeatures/CSharpTest/Formatting/Indentation/SmartIndenterTests.cs
...s/CSharpTest/Formatting/Indentation/SmartIndenterTests.cs
+33
-0
src/Workspaces/CSharp/Portable/Extensions/SyntaxNodeExtensions.cs
...spaces/CSharp/Portable/Extensions/SyntaxNodeExtensions.cs
+19
-0
src/Workspaces/CSharp/Portable/Extensions/SyntaxTreeExtensions.cs
...spaces/CSharp/Portable/Extensions/SyntaxTreeExtensions.cs
+11
-9
src/Workspaces/Core/Portable/Shared/Utilities/FindTokenHelper.cs
...kspaces/Core/Portable/Shared/Utilities/FindTokenHelper.cs
+8
-4
未找到文件。
src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj
浏览文件 @
649960f4
...
...
@@ -282,6 +282,7 @@
<Compile
Include=
"Extensions\ContextQuery\AbstractContextTests.cs"
/>
<Compile
Include=
"Extensions\ContextQuery\NamespaceContextTests.cs"
/>
<Compile
Include=
"Extensions\ContextQuery\TypeContextTests.cs"
/>
<Compile
Include=
"Extensions\SyntaxTreeExtensionsTests.cs"
/>
<Compile
Include=
"ExtractInterface\ExtractInterfaceTests.cs"
/>
<Compile
Include=
"ExtractMethod\ExtractMethodBase.cs"
/>
<Compile
Include=
"ExtractMethod\ExtractMethodTests.cs"
/>
...
...
@@ -675,4 +676,4 @@
<Import
Project=
"..\..\..\build\Roslyn.Toolsets.Xunit.targets"
/>
<Import
Project=
"$(SolutionDir)\.nuget\NuGet.targets"
Condition=
"Exists('$(SolutionDir)\.nuget\NuGet.targets')"
/>
</ImportGroup>
</Project>
</Project>
\ No newline at end of file
src/EditorFeatures/CSharpTest/Extensions/SyntaxTreeExtensionsTests.cs
0 → 100644
浏览文件 @
649960f4
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using
System.Threading
;
using
Microsoft.CodeAnalysis.CSharp
;
using
Microsoft.CodeAnalysis.CSharp.Extensions
;
using
Xunit
;
namespace
Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Extensions
{
public
class
SyntaxTreeExtensionsTests
{
private
static
void
VerifyWholeLineIsActive
(
SyntaxTree
tree
,
int
lineNumber
)
{
var
line
=
tree
.
GetText
().
Lines
[
lineNumber
];
for
(
int
pos
=
line
.
Start
;
pos
<
line
.
EndIncludingLineBreak
;
pos
++)
{
Assert
.
False
(
tree
.
IsInInactiveRegion
(
pos
,
CancellationToken
.
None
));
}
}
private
static
void
VerifyWholeLineIsInactive
(
SyntaxTree
tree
,
int
lineNumber
)
{
var
line
=
tree
.
GetText
().
Lines
[
lineNumber
];
for
(
int
pos
=
line
.
Start
;
pos
<
line
.
EndIncludingLineBreak
;
pos
++)
{
Assert
.
True
(
tree
.
IsInInactiveRegion
(
pos
,
CancellationToken
.
None
));
}
}
[
Fact
]
public
void
SimpleInactive
()
{
var
code
=
@"#if false
This is inactive
#else
// This is active
#endif
"
;
var
tree
=
CSharpSyntaxTree
.
ParseText
(
code
);
VerifyWholeLineIsActive
(
tree
,
0
);
VerifyWholeLineIsInactive
(
tree
,
1
);
VerifyWholeLineIsActive
(
tree
,
2
);
VerifyWholeLineIsActive
(
tree
,
3
);
VerifyWholeLineIsActive
(
tree
,
4
);
}
[
Fact
]
public
void
InactiveEof
()
{
var
code
=
@"#if false
This is inactive
"
;
var
tree
=
CSharpSyntaxTree
.
ParseText
(
code
);
VerifyWholeLineIsActive
(
tree
,
0
);
VerifyWholeLineIsInactive
(
tree
,
1
);
}
[
Fact
]
public
void
InactiveEof2
()
{
var
code
=
@"#if false
This is inactive
#endif
// This is active
"
;
var
tree
=
CSharpSyntaxTree
.
ParseText
(
code
);
VerifyWholeLineIsActive
(
tree
,
0
);
VerifyWholeLineIsInactive
(
tree
,
1
);
VerifyWholeLineIsActive
(
tree
,
2
);
VerifyWholeLineIsActive
(
tree
,
3
);
}
}
}
src/EditorFeatures/CSharpTest/Formatting/Indentation/SmartIndenterTests.cs
浏览文件 @
649960f4
...
...
@@ -50,6 +50,39 @@ public void NoPreviousLine()
expectedIndentation
:
0
);
}
[
Fact
]
[
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
SmartIndent
)]
public
void
EndOfFileInactive
()
{
var
code
=
@"
// Line 1
#if false
#endif
"
;
AssertSmartIndent
(
code
,
indentationLine
:
4
,
expectedIndentation
:
4
);
}
[
Fact
]
[
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
SmartIndent
)]
public
void
EndOfFileInactive2
()
{
var
code
=
@"
// Line 1
#if false
#endif
// Line 2
"
;
AssertSmartIndent
(
code
,
indentationLine
:
5
,
expectedIndentation
:
0
);
}
[
Fact
]
[
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
SmartIndent
)]
public
void
Comments
()
...
...
src/Workspaces/CSharp/Portable/Extensions/SyntaxNodeExtensions.cs
浏览文件 @
649960f4
...
...
@@ -780,10 +780,29 @@ public static IEnumerable<SyntaxNode> GetAncestorsOrThis(this SyntaxNode node, F
/// </summary>
private
static
IEnumerable
<
SyntaxToken
>
GetSkippedTokens
(
SyntaxTriviaList
list
)
{
// PERF: Avoid allocations in the most common case of no skipped tokens.
if
(!
HasSkippedTokens
(
list
))
{
return
SpecializedCollections
.
EmptyEnumerable
<
SyntaxToken
>();
}
return
list
.
Where
(
trivia
=>
trivia
.
RawKind
==
(
int
)
SyntaxKind
.
SkippedTokensTrivia
)
.
SelectMany
(
t
=>
((
SkippedTokensTriviaSyntax
)
t
.
GetStructure
()).
Tokens
);
}
private
static
bool
HasSkippedTokens
(
SyntaxTriviaList
list
)
{
foreach
(
var
trivia
in
list
)
{
if
(
trivia
.
RawKind
==
(
int
)
SyntaxKind
.
SkippedTokensTrivia
)
{
return
true
;
}
}
return
false
;
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the right.
/// </summary>
...
...
src/Workspaces/CSharp/Portable/Extensions/SyntaxTreeExtensions.cs
浏览文件 @
649960f4
...
...
@@ -534,24 +534,26 @@ private static bool AtEndOfIncompleteStringOrCharLiteral(SyntaxToken token, int
}
var
token
=
syntaxTree
.
FindTokenOrEndToken
(
position
,
cancellationToken
);
var
text
=
syntaxTree
.
GetText
(
cancellationToken
);
var
lineContainingPosition
=
text
.
Lines
.
IndexOf
(
position
);
if
(
token
.
Kind
()
==
SyntaxKind
.
EndOfFileToken
)
{
var
text
=
syntaxTree
.
GetText
(
cancellationToken
);
var
lineContainingPosition
=
text
.
Lines
.
IndexOf
(
position
);
var
triviaList
=
token
.
LeadingTrivia
;
foreach
(
var
triviaTok
in
triviaList
.
Reverse
())
{
if
(
triviaTok
.
HasStructure
)
var
triviaLine
=
text
.
Lines
.
IndexOf
(
triviaTok
.
SpanStart
);
if
(
triviaLine
<=
lineContainingPosition
)
{
if
(!
triviaTok
.
HasStructure
)
{
return
false
;
}
var
structure
=
triviaTok
.
GetStructure
();
if
(
structure
is
BranchingDirectiveTriviaSyntax
)
{
var
triviaLine
=
text
.
Lines
.
IndexOf
(
triviaTok
.
SpanStart
);
if
(
triviaLine
<
lineContainingPosition
)
{
var
branch
=
(
BranchingDirectiveTriviaSyntax
)
structure
;
return
!
branch
.
IsActive
||
!
branch
.
BranchTaken
;
}
var
branch
=
(
BranchingDirectiveTriviaSyntax
)
structure
;
return
!
branch
.
IsActive
||
!
branch
.
BranchTaken
;
}
}
}
...
...
src/Workspaces/Core/Portable/Shared/Utilities/FindTokenHelper.cs
浏览文件 @
649960f4
...
...
@@ -113,13 +113,17 @@ internal static class FindTokenHelper
public
static
SyntaxToken
FindSkippedTokenBackward
(
IEnumerable
<
SyntaxToken
>
skippedTokenList
,
int
position
)
{
// the given skipped token list is already in order
var
skippedTokenContainingPosition
=
skippedTokenList
.
LastOrDefault
(
skipped
=>
skipped
.
Span
.
Length
>
0
&&
skipped
.
SpanStart
<=
position
);
if
(
skippedTokenContainingPosition
!=
default
(
SyntaxToken
))
// PERF: Expansion of return skippedTokenList.LastOrDefault(skipped => skipped.Span.Length > 0 && skipped.SpanStart <= position);
var
skippedTokenContainingPosition
=
default
(
SyntaxToken
);
foreach
(
var
skipped
in
skippedTokenList
)
{
return
skippedTokenContainingPosition
;
if
(
skipped
.
Span
.
Length
>
0
&&
skipped
.
SpanStart
<=
position
)
{
skippedTokenContainingPosition
=
skipped
;
}
}
return
default
(
SyntaxToken
)
;
return
skippedTokenContainingPosition
;
}
/// <summary>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录