Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
2e7ad085
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,发现更多精彩内容 >>
提交
2e7ad085
编写于
11月 02, 2016
作者:
C
CyrusNajmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add comments.
上级
90e1d9d8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
29 addition
and
20 deletion
+29
-20
src/Features/Core/Portable/ConvertToInterpolatedString/AbstractConvertConcatenationToInterpolatedStringRefactoringProvider.cs
...rtConcatenationToInterpolatedStringRefactoringProvider.cs
+29
-20
未找到文件。
src/Features/Core/Portable/ConvertToInterpolatedString/AbstractConvertConcatenationToInterpolatedStringRefactoringProvider.cs
浏览文件 @
2e7ad085
...
...
@@ -13,10 +13,17 @@
namespace
Microsoft.CodeAnalysis.ConvertToInterpolatedString
{
/// <summary>
/// Code refactoring that converts expresions of the form: a + b + " str " + d + e
/// into:
/// $"{a + b} str {d}{e}".
/// </summary>
internal
abstract
class
AbstractConvertConcatenationToInterpolatedStringRefactoringProvider
:
CodeRefactoringProvider
{
public
override
async
Task
ComputeRefactoringsAsync
(
CodeRefactoringContext
context
)
{
// Currently only supported if there is no selection. We could consider relaxing
// this if the selection is of a string concatenation expression.
if
(
context
.
Span
.
Length
>
0
)
{
return
;
...
...
@@ -25,45 +32,47 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
var
cancellationToken
=
context
.
CancellationToken
;
var
document
=
context
.
Document
;
var
semanticModel
=
await
document
.
GetSemanticModelAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
stringType
=
semanticModel
.
Compilation
.
GetSpecialType
(
SpecialType
.
System_String
);
if
(
stringType
==
null
)
{
return
;
}
var
position
=
context
.
Span
.
Start
;
var
root
=
await
document
.
GetSyntaxRootAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
token
=
root
.
FindToken
(
position
);
if
(!
token
.
Span
.
IntersectsWith
(
position
))
{
return
;
}
// Cursor has to at least be touching a string token.
var
syntaxFacts
=
document
.
GetLanguageService
<
ISyntaxFactsService
>();
if
(!
syntaxFacts
.
IsStringLiteral
(
token
))
if
(!
token
.
Span
.
IntersectsWith
(
position
)
||
!
syntaxFacts
.
IsStringLiteral
(
token
))
{
return
;
}
var
semanticModel
=
await
document
.
GetSemanticModelAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
// The string literal has to at least be contained in a concatenation of some form.
// i.e. "foo" + a or a + "foo". However, those concats could be in larger
// concats as well. Walk to the top of that entire chain.
var
literalExpression
=
token
.
Parent
;
var
literalParent
=
literalExpression
.
Parent
;
if
(!
IsStringConcat
(
syntaxFacts
,
literal
Parent
,
semanticModel
,
cancellationToken
))
var
top
=
literalExpression
;
while
(
IsStringConcat
(
syntaxFacts
,
top
.
Parent
,
semanticModel
,
cancellationToken
))
{
return
;
top
=
top
.
Parent
;
}
var
top
=
literalParent
;
while
(
IsStringConcat
(
syntaxFacts
,
top
.
Parent
,
semanticModel
,
cancellationToken
))
if
(
top
==
literalExpression
)
{
top
=
top
.
Parent
;
// We weren't in a concatenation at all.
return
;
}
// Now walk down the concatenation collecting all the pieces that we are
// concatenating.
var
pieces
=
new
List
<
SyntaxNode
>();
CollectPiecesDown
(
syntaxFacts
,
pieces
,
top
,
semanticModel
,
cancellationToken
);
// Make sure that all the string tokens we're concatenating are the same type
// of string literal. i.e. if we have an expression like: @" "" " + " \r\n "
// then we don't merge this. We don't want to be munging differnet types of
// escape sequences in these strings, so we only support combining the string
// tokens if they're all teh same type.
var
firstStringToken
=
pieces
.
First
(
syntaxFacts
.
IsStringLiteralExpression
).
GetFirstToken
();
if
(!
pieces
.
Where
(
syntaxFacts
.
IsStringLiteralExpression
).
All
(
lit
=>
SameLiteralKind
(
lit
,
firstStringToken
)))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录