Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
0457da1b
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,发现更多精彩内容 >>
未验证
提交
0457da1b
编写于
9月 19, 2020
作者:
S
Sam Harwell
提交者:
GitHub
9月 19, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #44453 from sharwell/top-extract-method
Update Extract Method to support top-level statements
上级
e91ccb5c
6f34b479
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
79 addition
and
18 deletion
+79
-18
src/EditorFeatures/CSharpTest/CodeActions/ExtractMethod/ExtractLocalFunctionTests.cs
...st/CodeActions/ExtractMethod/ExtractLocalFunctionTests.cs
+51
-4
src/EditorFeatures/CSharpTest/ExtractMethod/ExtractMethodBase.cs
...torFeatures/CSharpTest/ExtractMethod/ExtractMethodBase.cs
+2
-1
src/EditorFeatures/CSharpTest/ExtractMethod/ExtractMethodTests.cs
...orFeatures/CSharpTest/ExtractMethod/ExtractMethodTests.cs
+4
-2
src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.cs
...es/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.cs
+7
-0
src/Features/Core/Portable/ExtractMethod/AbstractExtractMethodService.cs
...re/Portable/ExtractMethod/AbstractExtractMethodService.cs
+0
-11
src/Workspaces/CSharp/Portable/CodeGeneration/CSharpCodeGenerationService.cs
...rp/Portable/CodeGeneration/CSharpCodeGenerationService.cs
+15
-0
未找到文件。
src/EditorFeatures/CSharpTest/CodeActions/ExtractMethod/ExtractLocalFunctionTests.cs
浏览文件 @
0457da1b
...
...
@@ -4746,14 +4746,61 @@ void NewMethod()
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
ExtractMethod
)]
public
async
Task
TopLevelStatement_ArgumentInInvocation
()
{
// ExtractLocalFunction currently disabled in the presence of top-level statements
// https://github.com/dotnet/roslyn/issues/44260
var
code
=
@"
System.Console.WriteLine([|""string""|]);
"
;
var
expected
=
@"
System.Console.WriteLine({|Rename:NewMethod|}());
static string NewMethod()
{
return ""string"";
}"
;
await
TestAsync
(
code
,
expected
,
TestOptions
.
Regular
.
WithLanguageVersion
(
LanguageVersion
.
CSharp9
),
index
:
CodeActionIndex
);
}
[
WorkItem
(
44260
,
"https://github.com/dotnet/roslyn/issues/44260"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
ExtractMethod
)]
public
async
Task
TopLevelStatement_InBlock_ArgumentInInvocation
()
{
var
code
=
@"
{
System.Console.WriteLine([|""string""|]);
}
"
;
var
expected
=
@"
{
System.Console.WriteLine({|Rename:NewMethod|}());
static string NewMethod()
{
return ""string"";
}
}
"
;
await
TestInRegularAndScriptAsync
(
code
,
expected
,
parseOptions
:
TestOptions
.
Regular
.
WithLanguageVersion
(
LanguageVersion
.
CSharp9
),
index
:
CodeActionIndex
);
}
[
WorkItem
(
44260
,
"https://github.com/dotnet/roslyn/issues/44260"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
ExtractMethod
)]
public
async
Task
TopLevelStatement_ArgumentInInvocation_InInteractive
()
{
var
code
=
@"
System.Console.WriteLine([|""string""|]);
"
;
await
TestExactActionSetOfferedAsync
(
code
,
new
[]
{
FeaturesResources
.
Extract_method
},
new
TestParameters
(
parseOptions
:
TestOptions
.
Regular
.
WithLanguageVersion
(
LanguageVersion
.
CSharp8
)));
var
expected
=
@"{
System.Console.WriteLine({|Rename:NewMethod|}());
static string NewMethod()
{
return ""string"";
}
}"
;
await
TestAsync
(
code
,
expected
,
TestOptions
.
Script
.
WithLanguageVersion
(
LanguageVersion
.
CSharp9
),
index
:
CodeActionIndex
);
}
}
}
src/EditorFeatures/CSharpTest/ExtractMethod/ExtractMethodBase.cs
浏览文件 @
0457da1b
...
...
@@ -12,6 +12,7 @@
using
Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
;
using
Microsoft.CodeAnalysis.ExtractMethod
;
using
Microsoft.CodeAnalysis.Test.Utilities
;
using
Roslyn.Test.Utilities
;
using
Xunit
;
namespace
Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.ExtractMethod
...
...
@@ -102,7 +103,7 @@ protected static async Task NotSupported_ExtractMethodAsync(string codeWithMarke
{
if
(
expected
!=
""
)
{
Assert
.
Equal
(
expected
,
actual
);
Assert
Ex
.
EqualOrDiff
(
expected
,
actual
);
}
else
{
...
...
src/EditorFeatures/CSharpTest/ExtractMethod/ExtractMethodTests.cs
浏览文件 @
0457da1b
...
...
@@ -11246,12 +11246,14 @@ public async Task TopLevelStatement_ValueInAssignment()
"
;
var
expected
=
@"
bool local;
local = NewMethod();
bool NewMethod()
{
return true;
}"
;
}
local = NewMethod();
"
;
await
TestExtractMethodAsync
(
code
,
expected
);
}
...
...
src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.cs
浏览文件 @
0457da1b
...
...
@@ -69,6 +69,13 @@ protected override async Task<InsertionPoint> GetInsertionPointAsync(SemanticDoc
return
await
InsertionPoint
.
CreateAsync
(
document
,
globalStatement
.
Parent
,
cancellationToken
).
ConfigureAwait
(
false
);
}
// check whether the global statement is a statement container
if
(!
globalStatement
.
Statement
.
IsStatementContainerNode
()
&&
!
root
.
SyntaxTree
.
IsScript
())
{
// The extracted function will be a new global statement
return
await
InsertionPoint
.
CreateAsync
(
document
,
globalStatement
.
Parent
,
cancellationToken
).
ConfigureAwait
(
false
);
}
return
await
InsertionPoint
.
CreateAsync
(
document
,
globalStatement
.
Statement
,
cancellationToken
).
ConfigureAwait
(
false
);
}
...
...
src/Features/Core/Portable/ExtractMethod/AbstractExtractMethodService.cs
浏览文件 @
0457da1b
...
...
@@ -4,9 +4,7 @@
using
System.Threading
;
using
System.Threading.Tasks
;
using
Microsoft.CodeAnalysis.LanguageServices
;
using
Microsoft.CodeAnalysis.Options
;
using
Microsoft.CodeAnalysis.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Text
;
namespace
Microsoft.CodeAnalysis.ExtractMethod
...
...
@@ -38,15 +36,6 @@ internal abstract class AbstractExtractMethodService<TValidator, TExtractor, TRe
return
new
FailedExtractMethodResult
(
selectionResult
.
Status
);
}
var
root
=
await
document
.
GetSyntaxRootAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
syntaxFacts
=
document
.
GetLanguageService
<
ISyntaxFactsService
>();
if
(
localFunction
&&
syntaxFacts
.
ContainsGlobalStatement
(
root
))
{
// ExtractLocalFunction doesn't yet support local functions in top-level statements
// https://github.com/dotnet/roslyn/issues/44260
return
new
FailedExtractMethodResult
(
OperationStatus
.
FailedWithUnknownReason
);
}
cancellationToken
.
ThrowIfCancellationRequested
();
// extract method
...
...
src/Workspaces/CSharp/Portable/CodeGeneration/CSharpCodeGenerationService.cs
浏览文件 @
0457da1b
...
...
@@ -482,6 +482,21 @@ protected override TDeclarationNode AddMembers<TDeclarationNode>(TDeclarationNod
{
return
(
accessorDeclaration
.
Body
==
null
)
?
destinationMember
:
Cast
<
TDeclarationNode
>(
accessorDeclaration
.
AddBodyStatements
(
StatementGenerator
.
GenerateStatements
(
statements
).
ToArray
()));
}
else
if
(
destinationMember
is
CompilationUnitSyntax
compilationUnit
&&
options
is
null
)
{
// Insert the new global statement(s) at the end of any current global statements
var
insertionIndex
=
compilationUnit
.
Members
.
LastIndexOf
(
memberDeclaration
=>
memberDeclaration
.
IsKind
(
SyntaxKind
.
GlobalStatement
))
+
1
;
var
wrappedStatements
=
StatementGenerator
.
GenerateStatements
(
statements
).
Select
(
generated
=>
SyntaxFactory
.
GlobalStatement
(
generated
)).
ToArray
();
return
Cast
<
TDeclarationNode
>(
compilationUnit
.
WithMembers
(
compilationUnit
.
Members
.
InsertRange
(
insertionIndex
,
wrappedStatements
)));
}
else
if
(
destinationMember
is
StatementSyntax
statement
&&
statement
.
IsParentKind
(
SyntaxKind
.
GlobalStatement
))
{
// We are adding a statement to a global statement in script, where the CompilationUnitSyntax is not a
// statement container. If the global statement is not already a block, create a block which can hold
// both the original statement and any new statements we are adding to it.
var
block
=
statement
as
BlockSyntax
??
SyntaxFactory
.
Block
(
statement
);
return
Cast
<
TDeclarationNode
>(
block
.
AddStatements
(
StatementGenerator
.
GenerateStatements
(
statements
).
ToArray
()));
}
else
{
return
AddStatementsWorker
(
destinationMember
,
statements
,
options
,
cancellationToken
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录