Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
9e10ff1c
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,发现更多精彩内容 >>
提交
9e10ff1c
编写于
10月 24, 2019
作者:
G
Gen Lu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Address review comments
上级
9add1fa8
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
62 addition
and
72 deletion
+62
-72
src/Features/Core/Portable/Completion/Providers/ImportCompletionProvider/AbstractImportCompletionProvider.cs
...ortCompletionProvider/AbstractImportCompletionProvider.cs
+2
-1
src/Features/Core/Portable/Completion/Providers/ImportCompletionProvider/AbstractTypeImportCompletionService.cs
...CompletionProvider/AbstractTypeImportCompletionService.cs
+1
-1
src/Features/Core/Portable/Completion/Providers/ImportCompletionProvider/ExtensionMethodImportCompletionService.CacheEntry.cs
...ider/ExtensionMethodImportCompletionService.CacheEntry.cs
+4
-8
src/Features/Core/Portable/Completion/Providers/ImportCompletionProvider/ExtensionMethodImportCompletionService.cs
...pletionProvider/ExtensionMethodImportCompletionService.cs
+7
-0
src/Workspaces/CSharp/Portable/FindSymbols/CSharpDeclaredSymbolInfoFactoryService.cs
...ble/FindSymbols/CSharpDeclaredSymbolInfoFactoryService.cs
+1
-0
src/Workspaces/Core/Portable/FindSymbols/SyntaxTree/SyntaxTreeIndex.cs
...s/Core/Portable/FindSymbols/SyntaxTree/SyntaxTreeIndex.cs
+10
-10
src/Workspaces/Core/Portable/FindSymbols/SyntaxTree/SyntaxTreeIndex_Create.cs
...Portable/FindSymbols/SyntaxTree/SyntaxTreeIndex_Create.cs
+37
-40
src/Workspaces/Core/Portable/FindSymbols/SyntaxTree/SyntaxTreeIndex_Forwarders.cs
...able/FindSymbols/SyntaxTree/SyntaxTreeIndex_Forwarders.cs
+0
-12
未找到文件。
src/Features/Core/Portable/Completion/Providers/ImportCompletionProvider/AbstractImportCompletionProvider.cs
浏览文件 @
9e10ff1c
...
...
@@ -129,11 +129,12 @@ internal override async Task<CompletionChange> GetChangeAsync(Document document,
var
rootWithImport
=
addImportService
.
AddImport
(
compilation
,
root
,
addImportContextNode
,
importNode
,
placeSystemNamespaceFirst
,
cancellationToken
);
var
documentWithImport
=
document
.
WithSyntaxRoot
(
rootWithImport
);
// This only formats the annotated import we just added, not the entire document.
var
formattedDocumentWithImport
=
await
Formatter
.
FormatAsync
(
documentWithImport
,
Formatter
.
Annotation
,
cancellationToken
:
cancellationToken
).
ConfigureAwait
(
false
);
var
builder
=
ArrayBuilder
<
TextChange
>.
GetInstance
();
// Get text change for add imp
ro
t
// Get text change for add imp
or
t
var
importChanges
=
await
formattedDocumentWithImport
.
GetTextChangesAsync
(
document
,
cancellationToken
).
ConfigureAwait
(
false
);
builder
.
AddRange
(
importChanges
);
...
...
src/Features/Core/Portable/Completion/Providers/ImportCompletionProvider/AbstractTypeImportCompletionService.cs
浏览文件 @
9e10ff1c
...
...
@@ -263,7 +263,7 @@ private enum ItemPropertyKind : byte
{
IsPublic
=
0x1
,
IsGeneric
=
0x2
,
IsAttribute
=
0x4
IsAttribute
=
0x4
,
}
}
}
...
...
src/Features/Core/Portable/Completion/Providers/ImportCompletionProvider/ExtensionMethodImportCompletionService.CacheEntry.cs
浏览文件 @
9e10ff1c
...
...
@@ -65,19 +65,13 @@ public void AddItem(SyntaxTreeIndex syntaxIndex)
{
foreach
(
var
index
in
symbolInfoIndices
)
{
if
(
syntaxIndex
.
TryGetDeclaredSymbolInfo
(
index
,
out
var
methodInfo
))
{
_simpleItemBuilder
.
Add
(
targetType
,
methodInfo
);
}
_simpleItemBuilder
.
Add
(
targetType
,
syntaxIndex
.
DeclaredSymbolInfos
[
index
]);
}
}
foreach
(
var
index
in
syntaxIndex
.
ComplexExtensionMethodInfo
)
{
if
(
syntaxIndex
.
TryGetDeclaredSymbolInfo
(
index
,
out
var
methodInfo
))
{
_complexItemBuilder
.
Add
(
methodInfo
);
}
_complexItemBuilder
.
Add
(
syntaxIndex
.
DeclaredSymbolInfos
[
index
]);
}
}
...
...
@@ -107,6 +101,8 @@ public CacheServiceFactory()
IImportCompletionCacheService
<
CacheEntry
,
object
>
cacheService
,
CancellationToken
cancellationToken
)
{
// While we are caching data from SyntaxTreeInfo, all the things we cared about here are actually based on sources symbols.
// So using source symbol checksum would suffice.
var
checksum
=
await
SymbolTreeInfo
.
GetSourceSymbolsChecksumAsync
(
project
,
cancellationToken
).
ConfigureAwait
(
false
);
// Cache miss, create all requested items.
...
...
src/Features/Core/Portable/Completion/Providers/ImportCompletionProvider/ExtensionMethodImportCompletionService.cs
浏览文件 @
9e10ff1c
...
...
@@ -37,6 +37,10 @@ public SerializableImportCompletionItem(string symbolKeyData, string name, int a
}
}
/// <summary>
/// Provides completion items for extension methods from unimported namespace.
/// </summary>
/// <remarks>It runs out-of-proc if it's enabled</remarks>
internal
static
partial
class
ExtensionMethodImportCompletionService
{
private
static
readonly
char
[]
s_dotSeparator
=
new
char
[]
{
'.'
};
...
...
@@ -174,6 +178,9 @@ internal static partial class ExtensionMethodImportCompletionService
using
var
symbolDisposer
=
ArrayBuilder
<
SymbolTreeInfo
>.
GetInstance
(
out
var
symbolBuilder
);
var
peReferences
=
PooledHashSet
<
PortableExecutableReference
>.
GetInstance
();
// We will only create missing indices in the following cases, neither would block completion.
// 1. User explicitly asked for them using expander.
// 2. We are trying to populate the data in background.
var
shouldCreateIndex
=
isExpandedCompletion
||
isPrecalculation
;
try
...
...
src/Workspaces/CSharp/Portable/FindSymbols/CSharpDeclaredSymbolInfoFactoryService.cs
浏览文件 @
9e10ff1c
...
...
@@ -492,6 +492,7 @@ private bool IsExtensionMethod(MethodDeclarationSyntax method)
=>
method
.
ParameterList
.
Parameters
.
Count
>
0
&&
method
.
ParameterList
.
Parameters
[
0
].
Modifiers
.
Any
(
SyntaxKind
.
ThisKeyword
);
// Root namespace is a VB only concept, which basically means root namespace is always global in C#.
public
override
string
GetRootNamespace
(
CompilationOptions
compilationOptions
)
=>
string
.
Empty
;
...
...
src/Workspaces/Core/Portable/FindSymbols/SyntaxTree/SyntaxTreeIndex.cs
浏览文件 @
9e10ff1c
...
...
@@ -80,8 +80,10 @@ public static Task<SyntaxTreeIndex> GetIndexAsync(Document document, Cancellatio
return
null
;
}
// Populate our cache with this data.
// Populate our cache
s
with this data.
s_documentToIndex
.
GetValue
(
document
,
_
=>
index
);
s_documentIdToIndex
.
Remove
(
document
.
Id
);
s_documentIdToIndex
.
GetValue
(
document
.
Id
,
_
=>
index
);
}
return
index
;
...
...
@@ -106,18 +108,16 @@ public static Task<SyntaxTreeIndex> GetIndexAsync(Document document, Cancellatio
// What we have in memory isn't valid. Try to load from the persistence service.
index
=
await
LoadAsync
(
document
,
checksum
,
cancellationToken
).
ConfigureAwait
(
false
);
if
(
index
==
null
&&
!
loadOnly
)
if
(
index
!=
null
||
loadOnly
)
{
// alright, we don't have cached information, re-calculate them here.
index
=
await
CreateIndexAsync
(
document
,
checksum
,
cancellationToken
).
ConfigureAwait
(
false
);
return
index
;
}
// okay, persist this info
await
index
.
SaveAsync
(
document
,
cancellationToken
).
ConfigureAwait
(
false
);
// alright, we don't have cached information, re-calculate them here.
index
=
await
CreateIndexAsync
(
document
,
checksum
,
cancellationToken
).
ConfigureAwait
(
false
);
// Populate our cache with this data.
s_documentIdToIndex
.
Remove
(
document
.
Id
);
s_documentIdToIndex
.
GetValue
(
document
.
Id
,
_
=>
index
);
}
// okay, persist this info
await
index
.
SaveAsync
(
document
,
cancellationToken
).
ConfigureAwait
(
false
);
return
index
;
}
...
...
src/Workspaces/Core/Portable/FindSymbols/SyntaxTree/SyntaxTreeIndex_Create.cs
浏览文件 @
9e10ff1c
...
...
@@ -248,7 +248,7 @@ internal sealed partial class SyntaxTreeIndex
new
DeclarationInfo
(
declaredSymbolInfos
.
ToImmutableAndFree
()),
new
ExtensionMethodInfo
(
simpleExtensionMethodInfoBuilder
.
ToImmutableDictionary
(
GetKey
,
GetImmutableValue
),
simpleExtensionMethodInfoBuilder
.
ToImmutableDictionary
(
s_getKey
,
s_getValuesAsImmutableArray
),
complexExtensionMethodInfoBuilder
.
ToImmutable
()));
}
finally
...
...
@@ -260,53 +260,50 @@ internal sealed partial class SyntaxTreeIndex
complexExtensionMethodInfoBuilder
.
Free
();
usingAliases
.
Free
();
}
}
static
void
AddExtensionMethodInfo
(
IDeclaredSymbolInfoFactoryService
infoFactory
,
SyntaxNode
node
,
PooledDictionary
<
string
,
string
>
aliases
,
int
declaredSymbolInfoIndex
,
DeclaredSymbolInfo
declaredSymbolInfo
,
PooledDictionary
<
string
,
ArrayBuilder
<
int
>>
simpleInfoBuilder
,
ArrayBuilder
<
int
>
complexInfoBuilder
)
private
static
readonly
Func
<
KeyValuePair
<
string
,
ArrayBuilder
<
int
>>,
string
>
s_getKey
=
kvp
=>
kvp
.
Key
;
private
static
readonly
Func
<
KeyValuePair
<
string
,
ArrayBuilder
<
int
>>,
ImmutableArray
<
int
>>
s_getValuesAsImmutableArray
=
kvp
=>
kvp
.
Value
.
ToImmutableAndFree
();
private
static
void
AddExtensionMethodInfo
(
IDeclaredSymbolInfoFactoryService
infoFactory
,
SyntaxNode
node
,
PooledDictionary
<
string
,
string
>
aliases
,
int
declaredSymbolInfoIndex
,
DeclaredSymbolInfo
declaredSymbolInfo
,
PooledDictionary
<
string
,
ArrayBuilder
<
int
>>
simpleInfoBuilder
,
ArrayBuilder
<
int
>
complexInfoBuilder
)
{
if
(
declaredSymbolInfo
.
Kind
!=
DeclaredSymbolInfoKind
.
ExtensionMethod
)
{
if
(
declaredSymbolInfo
.
Kind
!=
DeclaredSymbolInfoKind
.
ExtensionMethod
)
{
return
;
}
if
(!
infoFactory
.
TryGetTargetTypeName
(
node
,
out
var
targetTypeName
))
{
return
;
}
// complex type
if
(
targetTypeName
==
null
)
{
complexInfoBuilder
.
Add
(
declaredSymbolInfoIndex
);
return
;
}
return
;
}
if
(
aliases
.
TryGetValue
(
targetTypeName
,
out
var
original
Name
))
{
targetTypeName
=
originalName
;
}
if
(!
infoFactory
.
TryGetTargetTypeName
(
node
,
out
var
targetType
Name
))
{
return
;
}
// simple
type
if
(!
simpleInfoBuilder
.
TryGetValue
(
targetTypeName
,
out
var
arrayBuilder
)
)
{
arrayBuilder
=
ArrayBuilder
<
int
>.
GetInstance
(
);
simpleInfoBuilder
[
targetTypeName
]
=
arrayBuilder
;
}
// complex
type
if
(
targetTypeName
==
null
)
{
complexInfoBuilder
.
Add
(
declaredSymbolInfoIndex
);
return
;
}
arrayBuilder
.
Add
(
declaredSymbolInfoIndex
);
if
(
aliases
.
TryGetValue
(
targetTypeName
,
out
var
originalName
))
{
targetTypeName
=
originalName
;
}
static
string
GetKey
(
KeyValuePair
<
string
,
ArrayBuilder
<
int
>>
kvp
)
=>
kvp
.
Key
;
// simple type
if
(!
simpleInfoBuilder
.
TryGetValue
(
targetTypeName
,
out
var
arrayBuilder
))
{
arrayBuilder
=
ArrayBuilder
<
int
>.
GetInstance
();
simpleInfoBuilder
[
targetTypeName
]
=
arrayBuilder
;
}
static
ImmutableArray
<
int
>
GetImmutableValue
(
KeyValuePair
<
string
,
ArrayBuilder
<
int
>>
kvp
)
=>
kvp
.
Value
.
ToImmutableAndFree
();
arrayBuilder
.
Add
(
declaredSymbolInfoIndex
);
}
private
static
StringTable
GetStringTable
(
Project
project
)
...
...
src/Workspaces/Core/Portable/FindSymbols/SyntaxTree/SyntaxTreeIndex_Forwarders.cs
浏览文件 @
9e10ff1c
...
...
@@ -17,18 +17,6 @@ public ImmutableArray<int> ComplexExtensionMethodInfo
public
bool
ContainsExtensionMethod
=>
SimpleExtensionMethodInfo
.
Count
>
0
||
ComplexExtensionMethodInfo
.
Length
>
0
;
public
bool
TryGetDeclaredSymbolInfo
(
int
index
,
out
DeclaredSymbolInfo
declaredSymbolInfo
)
{
if
(
index
>=
DeclaredSymbolInfos
.
Length
)
{
declaredSymbolInfo
=
default
;
return
false
;
}
declaredSymbolInfo
=
DeclaredSymbolInfos
[
index
];
return
true
;
}
public
bool
ProbablyContainsIdentifier
(
string
identifier
)
=>
_identifierInfo
.
ProbablyContainsIdentifier
(
identifier
);
public
bool
ProbablyContainsEscapedIdentifier
(
string
identifier
)
=>
_identifierInfo
.
ProbablyContainsEscapedIdentifier
(
identifier
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录