Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
0fa63cd5
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,发现更多精彩内容 >>
提交
0fa63cd5
编写于
11月 06, 2019
作者:
D
David Poeschl
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Show QuickInfo on references to indexers
Fixes #38283
上级
f1f2f517
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
159 addition
and
10 deletion
+159
-10
src/EditorFeatures/CSharpTest/QuickInfo/SemanticQuickInfoSourceTests.cs
...ures/CSharpTest/QuickInfo/SemanticQuickInfoSourceTests.cs
+50
-0
src/EditorFeatures/VisualBasicTest/QuickInfo/SemanticQuickInfoSourceTests.vb
...VisualBasicTest/QuickInfo/SemanticQuickInfoSourceTests.vb
+63
-0
src/Features/CSharp/Portable/QuickInfo/CSharpSemanticQuickInfoProvider.cs
...arp/Portable/QuickInfo/CSharpSemanticQuickInfoProvider.cs
+13
-0
src/Features/Core/Portable/QuickInfo/CommonSemanticQuickInfoProvider.cs
...ore/Portable/QuickInfo/CommonSemanticQuickInfoProvider.cs
+22
-10
src/Features/VisualBasic/Portable/QuickInfo/VisualBasicSemanticQuickInfoProvider.vb
...ortable/QuickInfo/VisualBasicSemanticQuickInfoProvider.vb
+11
-0
未找到文件。
src/EditorFeatures/CSharpTest/QuickInfo/SemanticQuickInfoSourceTests.cs
浏览文件 @
0fa63cd5
...
...
@@ -6678,5 +6678,55 @@ void M(string[] a)
await
TestInClassAsync
(
code
,
MainDescription
(
$"(
{
FeaturesResources
.
range_variable
}
) IGrouping<int, string> g"
));
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
QuickInfo
)]
[
WorkItem
(
38283
,
"https://github.com/dotnet/roslyn/issues/38283"
)]
public
async
Task
QuickInfoOnIndexerCloseBracket
()
{
await
TestAsync
(
@"
class C
{
public int this[int x] { get { return 1; } }
void M()
{
var x = new C()[5$$];
}
}"
,
MainDescription
(
"int C.this[int x] { get; }"
));
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
QuickInfo
)]
[
WorkItem
(
38283
,
"https://github.com/dotnet/roslyn/issues/38283"
)]
public
async
Task
QuickInfoOnIndexerOpenBracket
()
{
await
TestAsync
(
@"
class C
{
public int this[int x] { get { return 1; } }
void M()
{
var x = new C()$$[5];
}
}"
,
MainDescription
(
"int C.this[int x] { get; }"
));
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
QuickInfo
)]
[
WorkItem
(
38283
,
"https://github.com/dotnet/roslyn/issues/38283"
)]
public
async
Task
QuickInfoOnIndexer_NotOnArrayAccess
()
{
await
TestAsync
(
@"
class Program
{
void M()
{
int[] x = new int[4];
int y = x[3$$];
}
}"
,
MainDescription
(
"struct System.Int32"
));
}
}
}
src/EditorFeatures/VisualBasicTest/QuickInfo/SemanticQuickInfoSourceTests.vb
浏览文件 @
0fa63cd5
...
...
@@ -2439,5 +2439,68 @@ Class C
End Class"
,
Documentation
(
"Summary for property Goo"
))
End
Function
<
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
QuickInfo
)
>
<
WorkItem
(
38283
,
"https://github.com/dotnet/roslyn/issues/38283"
)
>
Public
Async
Function
QuickInfoOnIndexerOpenParen
()
As
Task
Await
TestAsync
(
"
Class C
Default Public ReadOnly Property Item(ByVal index As Integer) As Integer
Get
Return 1
End Get
End Property
Sub M()
Dim x = New C()
Dim y = x$$(4)
End Sub
End Class"
,
MainDescription
(
"ReadOnly Property C.Item(index As Integer) As Integer"
))
End
Function
<
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
QuickInfo
)
>
<
WorkItem
(
38283
,
"https://github.com/dotnet/roslyn/issues/38283"
)
>
Public
Async
Function
QuickInfoOnIndexerCloseParen
()
As
Task
Await
TestAsync
(
"
Class C
Default Public ReadOnly Property Item(ByVal index As Integer) As Integer
Get
Return 1
End Get
End Property
Sub M()
Dim x = New C()
Dim y = x(4$$)
End Sub
End Class"
,
MainDescription
(
"ReadOnly Property C.Item(index As Integer) As Integer"
))
End
Function
<
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
QuickInfo
)
>
<
WorkItem
(
38283
,
"https://github.com/dotnet/roslyn/issues/38283"
)
>
Public
Async
Function
QuickInfoOnIndexer_MissingOnRegularMethodCall
()
As
Task
Await
TestAsync
(
"
Class C
Sub M()
M($$)
End Sub
End Class"
,
Nothing
)
End
Function
<
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
QuickInfo
)
>
<
WorkItem
(
38283
,
"https://github.com/dotnet/roslyn/issues/38283"
)
>
Public
Async
Function
QuickInfoOnIndexer_MissingOnArrayAccess
()
As
Task
Await
TestAsync
(
"
Class C
Sub M()
Dim x(4) As Integer
Dim y = x(3$$)
End Sub
End Class"
,
MainDescription
(
"Structure System.Int32"
))
End
Function
End
Class
End
Namespace
src/Features/CSharp/Portable/QuickInfo/CSharpSemanticQuickInfoProvider.cs
浏览文件 @
0fa63cd5
...
...
@@ -42,6 +42,19 @@ protected override bool GetBindableNodeForTokenIndicatingLambda(SyntaxToken toke
return
false
;
}
protected
override
bool
GetBindableNodeForTokenIndicatingPossibleIndexerAccess
(
SyntaxToken
token
,
out
SyntaxNode
found
)
{
if
(
token
.
IsKind
(
SyntaxKind
.
CloseBracketToken
,
SyntaxKind
.
OpenBracketToken
)
&&
token
.
Parent
?.
Parent
.
IsKind
(
SyntaxKind
.
ElementAccessExpression
)
==
true
)
{
found
=
token
.
Parent
.
Parent
;
return
true
;
}
found
=
null
;
return
false
;
}
protected
override
bool
ShouldCheckPreviousToken
(
SyntaxToken
token
)
{
return
!
token
.
Parent
.
IsKind
(
SyntaxKind
.
XmlCrefAttribute
);
...
...
src/Features/Core/Portable/QuickInfo/CommonSemanticQuickInfoProvider.cs
浏览文件 @
0fa63cd5
...
...
@@ -303,6 +303,7 @@ void AddSection(string kind, ImmutableArray<TaggedText> taggedParts)
}
protected
abstract
bool
GetBindableNodeForTokenIndicatingLambda
(
SyntaxToken
token
,
out
SyntaxNode
found
);
protected
abstract
bool
GetBindableNodeForTokenIndicatingPossibleIndexerAccess
(
SyntaxToken
token
,
out
SyntaxNode
found
);
protected
virtual
ImmutableArray
<
TaggedText
>
TryGetNullabilityAnalysis
(
Workspace
workspace
,
SemanticModel
semanticModel
,
SyntaxToken
token
,
CancellationToken
cancellationToken
)
=>
default
;
...
...
@@ -313,16 +314,7 @@ void AddSection(string kind, ImmutableArray<TaggedText> taggedParts)
var
semanticModel
=
await
document
.
GetSemanticModelAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
enclosingType
=
semanticModel
.
GetEnclosingNamedType
(
token
.
SpanStart
,
cancellationToken
);
ImmutableArray
<
ISymbol
>
symbols
;
if
(
GetBindableNodeForTokenIndicatingLambda
(
token
,
out
var
lambdaSyntax
))
{
symbols
=
ImmutableArray
.
Create
(
semanticModel
.
GetSymbolInfo
(
lambdaSyntax
).
Symbol
);
}
else
{
symbols
=
semanticModel
.
GetSemanticInfo
(
token
,
document
.
Project
.
Solution
.
Workspace
,
cancellationToken
)
.
GetSymbols
(
includeType
:
true
);
}
var
symbols
=
GetSymbolsFromToken
(
token
,
document
.
Project
.
Solution
.
Workspace
,
semanticModel
,
cancellationToken
);
var
bindableParent
=
syntaxFacts
.
GetBindableParent
(
token
);
var
overloads
=
semanticModel
.
GetMemberGroup
(
bindableParent
,
cancellationToken
);
...
...
@@ -353,6 +345,26 @@ void AddSection(string kind, ImmutableArray<TaggedText> taggedParts)
return
(
semanticModel
,
ImmutableArray
<
ISymbol
>.
Empty
);
}
private
ImmutableArray
<
ISymbol
>
GetSymbolsFromToken
(
SyntaxToken
token
,
Workspace
workspace
,
SemanticModel
semanticModel
,
CancellationToken
cancellationToken
)
{
if
(
GetBindableNodeForTokenIndicatingLambda
(
token
,
out
var
lambdaSyntax
))
{
return
ImmutableArray
.
Create
(
semanticModel
.
GetSymbolInfo
(
lambdaSyntax
,
cancellationToken
).
Symbol
);
}
if
(
GetBindableNodeForTokenIndicatingPossibleIndexerAccess
(
token
,
out
var
elementAccessExpression
))
{
var
symbol
=
semanticModel
.
GetSymbolInfo
(
elementAccessExpression
,
cancellationToken
).
Symbol
;
if
(
symbol
?.
IsIndexer
()
==
true
)
{
return
ImmutableArray
.
Create
(
symbol
);
}
}
return
semanticModel
.
GetSemanticInfo
(
token
,
workspace
,
cancellationToken
)
.
GetSymbols
(
includeType
:
true
);
}
private
static
bool
IsOk
(
ISymbol
symbol
)
=>
symbol
!=
null
&&
!
symbol
.
IsErrorType
();
...
...
src/Features/VisualBasic/Portable/QuickInfo/VisualBasicSemanticQuickInfoProvider.vb
浏览文件 @
0fa63cd5
...
...
@@ -106,6 +106,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.QuickInfo
Return
False
End
Function
Protected
Overrides
Function
GetBindableNodeForTokenIndicatingPossibleIndexerAccess
(
token
As
SyntaxToken
,
ByRef
found
As
SyntaxNode
)
As
Boolean
If
token
.
IsKind
(
SyntaxKind
.
OpenParenToken
,
SyntaxKind
.
CloseParenToken
)
AndAlso
token
.
Parent
?
.
Parent
.
IsKind
(
SyntaxKind
.
InvocationExpression
)
=
True
Then
found
=
token
.
Parent
.
Parent
Return
True
End
If
found
=
Nothing
Return
False
End
Function
Private
Overloads
Async
Function
BuildContentAsync
(
document
As
Document
,
token
As
SyntaxToken
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录