Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
ba30bca7
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,发现更多精彩内容 >>
提交
ba30bca7
编写于
5月 08, 2017
作者:
J
Julien Couvreur
提交者:
GitHub
5月 08, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Tuple name completion should not include colon (#19335)
上级
4fbb078a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
156 addition
and
7 deletion
+156
-7
src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb
...Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb
+132
-0
src/Features/CSharp/Portable/Completion/CompletionProviders/TupleNameCompletionProvider.cs
...letion/CompletionProviders/TupleNameCompletionProvider.cs
+24
-7
未找到文件。
src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb
浏览文件 @
ba30bca7
...
...
@@ -576,6 +576,138 @@ class C
End
Using
End
Function
<
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Completion
)
>
<
WorkItem
(
19335
,
"https://github.com/dotnet/roslyn/issues/19335"
)
>
Public
Async
Function
ColonInTupleNameInTupleLiteral
()
As
Task
Using
state
=
TestState
.
CreateCSharpTestState
(
<
Document
><
!
[
CDATA
[
class
C
{
public
void
M
()
{
(
int
first
,
int
second
)
t
=
(
$$
}
}
]]
></
Document
>
)
state
.
SendTypeChars
(
"fi"
)
Await
state
.
AssertSelectedCompletionItem
(
displayText
:
=
"first:"
,
isHardSelected
:
=
True
)
Assert
.
Equal
(
"first"
,
state
.
CurrentCompletionPresenterSession
.
SelectedItem
.
FilterText
)
state
.
SendTypeChars
(
":"
)
Assert
.
Contains
(
"(first:"
,
state
.
GetLineTextFromCaretPosition
(),
StringComparison
.
Ordinal
)
End
Using
End
Function
<
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Completion
)
>
<
WorkItem
(
19335
,
"https://github.com/dotnet/roslyn/issues/19335"
)
>
Public
Async
Function
ColonInExactTupleNameInTupleLiteral
()
As
Task
Using
state
=
TestState
.
CreateCSharpTestState
(
<
Document
><
!
[
CDATA
[
class
C
{
public
void
M
()
{
(
int
first
,
int
second
)
t
=
(
$$
}
}
]]
></
Document
>
)
state
.
SendTypeChars
(
"first"
)
Await
state
.
AssertSelectedCompletionItem
(
displayText
:
=
"first:"
,
isHardSelected
:
=
True
)
Assert
.
Equal
(
"first"
,
state
.
CurrentCompletionPresenterSession
.
SelectedItem
.
FilterText
)
state
.
SendTypeChars
(
":"
)
Assert
.
Contains
(
"(first:"
,
state
.
GetLineTextFromCaretPosition
(),
StringComparison
.
Ordinal
)
End
Using
End
Function
<
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Completion
)
>
<
WorkItem
(
19335
,
"https://github.com/dotnet/roslyn/issues/19335"
)
>
Public
Async
Function
ColonInTupleNameInTupleLiteralAfterComma
()
As
Task
Using
state
=
TestState
.
CreateCSharpTestState
(
<
Document
><
!
[
CDATA
[
class
C
{
public
void
M
()
{
(
int
first
,
int
second
)
t
=
(
0
,
$$
}
}
]]
></
Document
>
)
state
.
SendTypeChars
(
"se"
)
Await
state
.
AssertSelectedCompletionItem
(
displayText
:
=
"second:"
,
isHardSelected
:
=
True
)
Assert
.
Equal
(
"second"
,
state
.
CurrentCompletionPresenterSession
.
SelectedItem
.
FilterText
)
state
.
SendTypeChars
(
":"
)
Assert
.
Contains
(
"(0, second:"
,
state
.
GetLineTextFromCaretPosition
(),
StringComparison
.
Ordinal
)
End
Using
End
Function
<
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Completion
)
>
<
WorkItem
(
19335
,
"https://github.com/dotnet/roslyn/issues/19335"
)
>
Public
Async
Function
TabInTupleNameInTupleLiteral
()
As
Task
Using
state
=
TestState
.
CreateCSharpTestState
(
<
Document
><
!
[
CDATA
[
class
C
{
public
void
M
()
{
(
int
first
,
int
second
)
t
=
(
$$
}
}
]]
></
Document
>
)
state
.
SendTypeChars
(
"fi"
)
Await
state
.
AssertSelectedCompletionItem
(
displayText
:
=
"first:"
,
isHardSelected
:
=
True
)
Assert
.
Equal
(
"first"
,
state
.
CurrentCompletionPresenterSession
.
SelectedItem
.
FilterText
)
state
.
SendTab
()
state
.
SendTypeChars
(
":"
)
state
.
SendTypeChars
(
"0"
)
Assert
.
Contains
(
"(first:0"
,
state
.
GetLineTextFromCaretPosition
(),
StringComparison
.
Ordinal
)
End
Using
End
Function
<
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Completion
)
>
<
WorkItem
(
19335
,
"https://github.com/dotnet/roslyn/issues/19335"
)
>
Public
Async
Function
TabInExactTupleNameInTupleLiteral
()
As
Task
Using
state
=
TestState
.
CreateCSharpTestState
(
<
Document
><
!
[
CDATA
[
class
C
{
public
void
M
()
{
(
int
first
,
int
second
)
t
=
(
$$
}
}
]]
></
Document
>
)
state
.
SendTypeChars
(
"first"
)
Await
state
.
AssertSelectedCompletionItem
(
displayText
:
=
"first:"
,
isHardSelected
:
=
True
)
Assert
.
Equal
(
"first"
,
state
.
CurrentCompletionPresenterSession
.
SelectedItem
.
FilterText
)
state
.
SendTab
()
state
.
SendTypeChars
(
":"
)
state
.
SendTypeChars
(
"0"
)
Assert
.
Contains
(
"(first:0"
,
state
.
GetLineTextFromCaretPosition
(),
StringComparison
.
Ordinal
)
End
Using
End
Function
<
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Completion
)
>
<
WorkItem
(
19335
,
"https://github.com/dotnet/roslyn/issues/19335"
)
>
Public
Async
Function
TabInTupleNameInTupleLiteralAfterComma
()
As
Task
Using
state
=
TestState
.
CreateCSharpTestState
(
<
Document
><
!
[
CDATA
[
class
C
{
public
void
M
()
{
(
int
first
,
int
second
)
t
=
(
0
,
$$
}
}
]]
></
Document
>
)
state
.
SendTypeChars
(
"se"
)
Await
state
.
AssertSelectedCompletionItem
(
displayText
:
=
"second:"
,
isHardSelected
:
=
True
)
Assert
.
Equal
(
"second"
,
state
.
CurrentCompletionPresenterSession
.
SelectedItem
.
FilterText
)
state
.
SendTab
()
state
.
SendTypeChars
(
":"
)
state
.
SendTypeChars
(
"1"
)
Assert
.
Contains
(
"(0, second:1"
,
state
.
GetLineTextFromCaretPosition
(),
StringComparison
.
Ordinal
)
End
Using
End
Function
<
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Completion
)
>
<
WorkItem
(
13527
,
"https://github.com/dotnet/roslyn/issues/13527"
)
>
Public
Async
Function
TestKeywordInTupleLiteral
()
As
Task
...
...
src/Features/CSharp/Portable/Completion/CompletionProviders/TupleNameCompletionProvider.cs
浏览文件 @
ba30bca7
...
...
@@ -2,20 +2,22 @@
using
System.Collections.Immutable
;
using
System.Linq
;
using
System.Threading
;
using
System.Threading.Tasks
;
using
Microsoft.CodeAnalysis.Completion
;
using
Microsoft.CodeAnalysis.Completion.Providers
;
using
Microsoft.CodeAnalysis.CSharp.Extensions
;
using
Microsoft.CodeAnalysis.CSharp.Extensions.ContextQuery
;
using
Microsoft.CodeAnalysis.CSharp.Syntax
;
using
Microsoft.CodeAnalysis.LanguageServices
;
using
Microsoft.CodeAnalysis.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Text
;
namespace
Microsoft.CodeAnalysis.CSharp.Completion.Providers
{
internal
class
TupleNameCompletionProvider
:
CommonCompletionProvider
{
private
static
readonly
CompletionItemRules
_cachedRules
=
CompletionItemRules
.
Default
.
WithCommitCharacterRule
(
CharacterSetModificationRule
.
Create
(
CharacterSetModificationKind
.
Remove
,
':'
));
private
const
string
ColonString
=
":"
;
public
override
async
Task
ProvideCompletionsAsync
(
CompletionContext
completionContext
)
{
...
...
@@ -40,7 +42,7 @@ public override async Task ProvideCompletionsAsync(CompletionContext completionC
.
Cast
<
INamedTypeSymbol
>()
.
ToImmutableArray
();
AddItems
(
inferredTypes
,
index
.
Value
,
completionContext
);
AddItems
(
inferredTypes
,
index
.
Value
,
completionContext
,
context
.
TargetToken
.
Parent
.
SpanStart
);
}
private
int
?
GetElementIndex
(
CSharpSyntaxContext
context
)
...
...
@@ -65,7 +67,7 @@ public override async Task ProvideCompletionsAsync(CompletionContext completionC
return
null
;
}
private
void
AddItems
(
ImmutableArray
<
INamedTypeSymbol
>
inferredTypes
,
int
index
,
CompletionContext
context
)
private
void
AddItems
(
ImmutableArray
<
INamedTypeSymbol
>
inferredTypes
,
int
index
,
CompletionContext
context
,
int
spanStart
)
{
foreach
(
var
type
in
inferredTypes
)
{
...
...
@@ -74,11 +76,26 @@ private void AddItems(ImmutableArray<INamedTypeSymbol> inferredTypes, int index,
return
;
}
// Note: the filter text does not include the ':'. We want to ensure that if
// the user types the name exactly (up to the colon) that it is selected as an
// exact match.
var
field
=
type
.
TupleElements
[
index
];
var
item
=
CommonCompletionItem
.
Create
(
field
.
Name
+
":"
,
_cachedRules
,
Glyph
.
FieldPublic
);
context
.
AddItem
(
item
);
context
.
AddItem
(
SymbolCompletionItem
.
CreateWithSymbolId
(
displayText
:
field
.
Name
+
ColonString
,
symbols
:
ImmutableArray
.
Create
(
field
),
rules
:
CompletionItemRules
.
Default
,
contextPosition
:
spanStart
,
filterText
:
field
.
Name
));
}
}
protected
override
Task
<
TextChange
?>
GetTextChangeAsync
(
CompletionItem
selectedItem
,
char
?
ch
,
CancellationToken
cancellationToken
)
{
return
Task
.
FromResult
<
TextChange
?>(
new
TextChange
(
selectedItem
.
Span
,
selectedItem
.
DisplayText
.
Substring
(
0
,
selectedItem
.
DisplayText
.
Length
-
ColonString
.
Length
)));
}
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录