Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
a9d3a76d
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,发现更多精彩内容 >>
提交
a9d3a76d
编写于
4月 12, 2016
作者:
C
CyrusNajmabadi
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10517 from CyrusNajmabadi/codeGen
Don't block in library code.
上级
69233e8c
0c9f8fbc
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
26 addition
and
21 deletion
+26
-21
src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractMemberInsertingCompletionProvider.cs
...ionProviders/AbstractMemberInsertingCompletionProvider.cs
+10
-8
src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractOverrideCompletionProvider.cs
...CompletionProviders/AbstractOverrideCompletionProvider.cs
+5
-5
src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractPartialCompletionProvider.cs
.../CompletionProviders/AbstractPartialCompletionProvider.cs
+2
-2
src/Workspaces/Core/Portable/Shared/Extensions/ICodeDefinitionFactoryExtensions.cs
...ble/Shared/Extensions/ICodeDefinitionFactoryExtensions.cs
+9
-6
未找到文件。
src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractMemberInsertingCompletionProvider.cs
浏览文件 @
a9d3a76d
...
...
@@ -2,6 +2,7 @@
using
System.Linq
;
using
System.Threading
;
using
System.Threading.Tasks
;
using
Microsoft.CodeAnalysis.CodeGeneration
;
using
Microsoft.CodeAnalysis.Completion
;
using
Microsoft.CodeAnalysis.Editing
;
...
...
@@ -25,7 +26,7 @@ internal abstract class AbstractMemberInsertingCompletionProvider : CompletionLi
protected
abstract
SyntaxToken
GetToken
(
MemberInsertionCompletionItem
completionItem
,
SyntaxTree
tree
,
CancellationToken
cancellationToken
);
protected
abstract
ISymbol
GenerateMember
(
ISymbol
member
,
INamedTypeSymbol
containingType
,
Document
document
,
MemberInsertionCompletionItem
item
,
CancellationToken
cancellationToken
);
protected
abstract
Task
<
ISymbol
>
GenerateMemberAsync
(
ISymbol
member
,
INamedTypeSymbol
containingType
,
Document
document
,
MemberInsertionCompletionItem
item
,
CancellationToken
cancellationToken
);
protected
abstract
int
GetTargetCaretPosition
(
SyntaxNode
caretTarget
);
protected
abstract
SyntaxNode
GetSyntax
(
SyntaxToken
commonSyntaxToken
);
...
...
@@ -44,12 +45,13 @@ public void Commit(CompletionItem completionItem, ITextView textView, ITextBuffe
allowCancel
:
true
,
action
:
c
=>
{
var
newDocument
=
DetermineNewDocument
((
MemberInsertionCompletionItem
)
completionItem
,
currentSnapshot
,
c
.
CancellationToken
);
var
cancellationToken
=
c
.
CancellationToken
;
var
newDocument
=
DetermineNewDocumentAsync
((
MemberInsertionCompletionItem
)
completionItem
,
currentSnapshot
,
cancellationToken
).
WaitAndGetResult
(
cancellationToken
);
// Apply the new document to workspace
newDocument
.
Project
.
Solution
.
Workspace
.
ApplyDocumentChanges
(
newDocument
,
c
.
C
ancellationToken
);
newDocument
.
Project
.
Solution
.
Workspace
.
ApplyDocumentChanges
(
newDocument
,
cancellationToken
);
var
newRoot
=
newDocument
.
GetSyntaxRootAsync
(
c
.
CancellationToken
).
WaitAndGetResult
(
c
.
C
ancellationToken
);
var
newRoot
=
newDocument
.
GetSyntaxRootAsync
(
c
ancellationToken
).
WaitAndGetResult
(
c
ancellationToken
);
// Attempt to find the inserted node and move the caret appropriately
if
(
newRoot
!=
null
)
...
...
@@ -74,7 +76,7 @@ public void Commit(CompletionItem completionItem, ITextView textView, ITextBuffe
});
}
private
Document
DetermineNewDocument
(
MemberInsertionCompletionItem
completionItem
,
ITextSnapshot
textSnapshot
,
CancellationToken
cancellationToken
)
private
async
Task
<
Document
>
DetermineNewDocumentAsync
(
MemberInsertionCompletionItem
completionItem
,
ITextSnapshot
textSnapshot
,
CancellationToken
cancellationToken
)
{
// The span we're going to replace
var
line
=
textSnapshot
.
GetLineFromLineNumber
(
completionItem
.
Line
);
...
...
@@ -89,7 +91,7 @@ private Document DetermineNewDocument(MemberInsertionCompletionItem completionIt
var
annotatedRoot
=
tree
.
GetRoot
(
cancellationToken
).
ReplaceToken
(
token
,
token
.
WithAdditionalAnnotations
(
_otherAnnotation
));
document
=
document
.
WithSyntaxRoot
(
annotatedRoot
);
Document
memberContainingDocument
=
GenerateMemberAndUsings
(
document
,
completionItem
,
line
,
cancellationToken
);
var
memberContainingDocument
=
await
GenerateMemberAndUsingsAsync
(
document
,
completionItem
,
line
,
cancellationToken
).
ConfigureAwait
(
false
);
var
insertionRoot
=
PrepareTreeForMemberInsertion
(
memberContainingDocument
,
cancellationToken
);
var
insertionText
=
GenerateInsertionText
(
memberContainingDocument
,
cancellationToken
);
...
...
@@ -106,7 +108,7 @@ private Document DetermineNewDocument(MemberInsertionCompletionItem completionIt
return
Formatter
.
FormatAsync
(
document
,
_annotation
,
cancellationToken
:
cancellationToken
).
WaitAndGetResult
(
cancellationToken
);
}
private
Document
GenerateMemberAndUsings
(
private
async
Task
<
Document
>
GenerateMemberAndUsingsAsync
(
Document
document
,
MemberInsertionCompletionItem
completionItem
,
ITextSnapshotLine
line
,
...
...
@@ -124,7 +126,7 @@ private Document DetermineNewDocument(MemberInsertionCompletionItem completionIt
// CodeGenerationOptions containing before and after
var
options
=
new
CodeGenerationOptions
(
contextLocation
:
semanticModel
.
SyntaxTree
.
GetLocation
(
TextSpan
.
FromBounds
(
line
.
Start
,
line
.
Start
)));
var
generatedMember
=
GenerateMember
(
overriddenMember
,
containingType
,
document
,
completionItem
,
cancellationToken
);
var
generatedMember
=
await
GenerateMemberAsync
(
overriddenMember
,
containingType
,
document
,
completionItem
,
cancellationToken
).
ConfigureAwait
(
false
);
generatedMember
=
_annotation
.
AddAnnotationToSymbol
(
generatedMember
);
Document
memberContainingDocument
=
null
;
...
...
src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractOverrideCompletionProvider.cs
浏览文件 @
a9d3a76d
...
...
@@ -41,7 +41,7 @@ public override async Task ProduceCompletionListAsync(CompletionListContext cont
}
}
protected
override
ISymbol
GenerateMember
(
ISymbol
newOverriddenMember
,
INamedTypeSymbol
newContainingType
,
Document
newDocument
,
MemberInsertionCompletionItem
completionItem
,
CancellationToken
cancellationToken
)
protected
override
async
Task
<
ISymbol
>
GenerateMemberAsync
(
ISymbol
newOverriddenMember
,
INamedTypeSymbol
newContainingType
,
Document
newDocument
,
MemberInsertionCompletionItem
completionItem
,
CancellationToken
cancellationToken
)
{
// Figure out what to insert, and do it. Throw if we've somehow managed to get this far and can't.
var
syntaxFactory
=
newDocument
.
GetLanguageService
<
SyntaxGenerator
>();
...
...
@@ -50,13 +50,13 @@ protected override ISymbol GenerateMember(ISymbol newOverriddenMember, INamedTyp
var
modifiers
=
completionItem
.
Modifiers
.
WithIsUnsafe
(
completionItem
.
Modifiers
.
IsUnsafe
|
newOverriddenMember
.
IsUnsafe
());
if
(
newOverriddenMember
.
Kind
==
SymbolKind
.
Method
)
{
return
syntaxFactory
.
OverrideMethod
((
IMethodSymbol
)
newOverriddenMember
,
modifiers
,
newContainingType
,
newDocument
,
cancellationToken
);
return
await
syntaxFactory
.
OverrideMethodAsync
((
IMethodSymbol
)
newOverriddenMember
,
modifiers
,
newContainingType
,
newDocument
,
cancellationToken
)
.
ConfigureAwait
(
false
)
;
}
else
if
(
newOverriddenMember
.
Kind
==
SymbolKind
.
Property
)
{
return
syntaxFactory
.
OverrideProperty
((
IPropertySymbol
)
newOverriddenMember
,
modifiers
,
newContainingType
,
newDocument
,
cancellationToken
);
return
await
syntaxFactory
.
OverridePropertyAsync
((
IPropertySymbol
)
newOverriddenMember
,
modifiers
,
newContainingType
,
newDocument
,
cancellationToken
)
.
ConfigureAwait
(
false
)
;
}
else
{
...
...
src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractPartialCompletionProvider.cs
浏览文件 @
a9d3a76d
...
...
@@ -63,10 +63,10 @@ public override async Task ProduceCompletionListAsync(CompletionListContext cont
}
}
protected
override
ISymbol
GenerateMember
(
ISymbol
member
,
INamedTypeSymbol
containingType
,
Document
document
,
MemberInsertionCompletionItem
item
,
CancellationToken
cancellationToken
)
protected
override
async
Task
<
ISymbol
>
GenerateMemberAsync
(
ISymbol
member
,
INamedTypeSymbol
containingType
,
Document
document
,
MemberInsertionCompletionItem
item
,
CancellationToken
cancellationToken
)
{
var
syntaxFactory
=
document
.
GetLanguageService
<
SyntaxGenerator
>();
var
semanticModel
=
document
.
GetSemanticModelAsync
(
cancellationToken
).
WaitAndGetResult
(
cancellationToken
);
var
semanticModel
=
await
document
.
GetSemanticModelAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
return
CodeGenerationSymbolFactory
.
CreateMethodSymbol
(
attributes
:
new
List
<
AttributeData
>(),
accessibility
:
Accessibility
.
NotApplicable
,
...
...
src/Workspaces/Core/Portable/Shared/Extensions/ICodeDefinitionFactoryExtensions.cs
浏览文件 @
a9d3a76d
...
...
@@ -4,6 +4,7 @@
using
System.Collections.Immutable
;
using
System.Linq
;
using
System.Threading
;
using
System.Threading.Tasks
;
using
Microsoft.CodeAnalysis.CodeGeneration
;
using
Microsoft.CodeAnalysis.Editing
;
using
Microsoft.CodeAnalysis.FindSymbols
;
...
...
@@ -208,7 +209,7 @@ private static bool TryGetValue(IDictionary<string, ISymbol> dictionary, string
}
}
public
static
IPropertySymbol
OverrideProperty
(
public
static
async
Task
<
IPropertySymbol
>
OverridePropertyAsync
(
this
SyntaxGenerator
codeFactory
,
IPropertySymbol
overriddenProperty
,
DeclarationModifiers
modifiers
,
...
...
@@ -225,7 +226,8 @@ private static bool TryGetValue(IDictionary<string, ISymbol> dictionary, string
// Implement an abstract property by throwing not implemented in accessors.
if
(
overriddenProperty
.
IsAbstract
)
{
getBody
=
codeFactory
.
CreateThrowNotImplementStatement
(
document
.
Project
.
GetCompilationAsync
(
cancellationToken
).
WaitAndGetResult
(
cancellationToken
));
var
compilation
=
await
document
.
Project
.
GetCompilationAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
getBody
=
codeFactory
.
CreateThrowNotImplementStatement
(
compilation
);
setBody
=
getBody
;
}
else
if
(
overriddenProperty
.
IsIndexer
()
&&
document
.
Project
.
Language
==
LanguageNames
.
CSharp
)
...
...
@@ -247,8 +249,8 @@ private static bool TryGetValue(IDictionary<string, ISymbol> dictionary, string
{
// Call accessors directly if C# overriding VB
if
(
document
.
Project
.
Language
==
LanguageNames
.
CSharp
&&
SymbolFinder
.
FindSourceDefinitionAsync
(
overriddenProperty
,
document
.
Project
.
Solution
,
cancellationToken
)
.
WaitAndGetResult
(
CancellationToken
.
None
)
.
Language
==
LanguageNames
.
VisualBasic
)
&&
(
await
SymbolFinder
.
FindSourceDefinitionAsync
(
overriddenProperty
,
document
.
Project
.
Solution
,
cancellationToken
).
ConfigureAwait
(
false
)
)
.
Language
==
LanguageNames
.
VisualBasic
)
{
var
getName
=
overriddenProperty
.
GetMethod
!=
null
?
overriddenProperty
.
GetMethod
.
Name
:
null
;
var
setName
=
overriddenProperty
.
SetMethod
!=
null
?
overriddenProperty
.
SetMethod
.
Name
:
null
;
...
...
@@ -351,7 +353,7 @@ private static bool TryGetValue(IDictionary<string, ISymbol> dictionary, string
name
:
overriddenEvent
.
Name
);
}
public
static
IMethodSymbol
OverrideMethod
(
public
static
async
Task
<
IMethodSymbol
>
OverrideMethodAsync
(
this
SyntaxGenerator
codeFactory
,
IMethodSymbol
overriddenMethod
,
DeclarationModifiers
modifiers
,
...
...
@@ -362,11 +364,12 @@ private static bool TryGetValue(IDictionary<string, ISymbol> dictionary, string
// Abstract: Throw not implemented
if
(
overriddenMethod
.
IsAbstract
)
{
var
compilation
=
await
newDocument
.
Project
.
GetCompilationAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
return
CodeGenerationSymbolFactory
.
CreateMethodSymbol
(
overriddenMethod
,
accessibility
:
overriddenMethod
.
ComputeResultantAccessibility
(
newContainingType
),
modifiers
:
modifiers
,
statements
:
new
[]
{
codeFactory
.
CreateThrowNotImplementStatement
(
newDocument
.
Project
.
GetCompilationAsync
(
cancellationToken
).
WaitAndGetResult
(
cancellationToken
)
)
});
statements
:
new
[]
{
codeFactory
.
CreateThrowNotImplementStatement
(
compilation
)
});
}
else
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录