Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
f4c0f0e6
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,发现更多精彩内容 >>
提交
f4c0f0e6
编写于
8月 25, 2016
作者:
C
CyrusNajmabadi
提交者:
GitHub
8月 25, 2016
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #13359 from CyrusNajmabadi/findRefsClassification
Remove dependency on SemanticModel from FindRefs.
上级
f1d07ddc
63d80ff1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
118 addition
and
8 deletion
+118
-8
src/VisualStudio/Next/FindReferences/StreamingFindReferencesPresenter.TableDataSourceFindReferencesContext.cs
...ferencesPresenter.TableDataSourceFindReferencesContext.cs
+117
-7
src/Workspaces/Core/Portable/Classification/Classifier.cs
src/Workspaces/Core/Portable/Classification/Classifier.cs
+1
-1
未找到文件。
src/VisualStudio/Next/FindReferences/StreamingFindReferencesPresenter.TableDataSourceFindReferencesContext.cs
浏览文件 @
f4c0f0e6
...
...
@@ -358,22 +358,132 @@ private TextSpan GetRegionSpanForReference(SourceText sourceText, TextSpan refer
private
async
Task
<
TaggedTextAndHighlightSpan
>
GetTaggedTextForReferenceAsync
(
Document
document
,
TextSpan
referenceSpan
,
TextSpan
widenedSpan
,
CancellationToken
cancellationToken
)
{
var
semanticModel
=
await
document
.
GetSemanticModelAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
classificationService
=
document
.
GetLanguageService
<
IEditorClassificationService
>();
if
(
classificationService
==
null
)
{
return
new
TaggedTextAndHighlightSpan
(
ImmutableArray
<
TaggedText
>.
Empty
,
new
TextSpan
());
}
// Call out to the individual language to classify the chunk of text around the
// reference. We'll get both the syntactic and semantic spans for this region.
// Because the semantic tags may override the semantic ones (for example,
// "DateTime" might be syntactically an identifier, but semantically a struct
// name), we'll do a later merging step to get the final correct list of
// classifications. For tagging, normally the editor handles this. But as
// we're producing the list of Inlines ourselves, we have to handles this here.
var
syntaxSpans
=
new
List
<
ClassifiedSpan
>();
var
semanticSpans
=
new
List
<
ClassifiedSpan
>();
var
sourceText
=
await
document
.
GetTextAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
classifiedLineParts
=
await
Classifier
.
GetClassifiedSymbolDisplayPart
sAsync
(
semanticModel
,
widenedSpan
,
document
.
Project
.
Solution
.
Workspace
,
insertSourceTextInGaps
:
true
,
cancellationToken
:
cancellationToken
).
ConfigureAwait
(
false
);
await
classificationService
.
AddSyntacticClassification
sAsync
(
document
,
widenedSpan
,
syntaxSpans
,
cancellationToken
).
ConfigureAwait
(
false
);
await
classificationService
.
AddSemanticClassificationsAsync
(
document
,
widenedSpan
,
semanticSpans
,
cancellationToken
).
ConfigureAwait
(
false
);
var
taggedText
=
classifiedLineParts
.
ToTaggedText
();
var
allParts
=
MergeClassifiedSpans
(
syntaxSpans
,
semanticSpans
,
widenedSpan
,
sourceText
);
var
taggedText
=
allParts
.
ToTaggedText
();
var
highlightSpan
=
new
TextSpan
(
start
:
referenceSpan
.
Start
-
widenedSpan
.
Start
,
start
:
referenceSpan
.
Start
-
widenedSpan
.
Start
,
length
:
referenceSpan
.
Length
);
return
new
TaggedTextAndHighlightSpan
(
taggedText
,
highlightSpan
);
}
private
List
<
SymbolDisplayPart
>
MergeClassifiedSpans
(
List
<
ClassifiedSpan
>
syntaxSpans
,
List
<
ClassifiedSpan
>
semanticSpans
,
TextSpan
widenedSpan
,
SourceText
sourceText
)
{
// The spans produced by the language services may not be ordered
// (indeed, this happens with semantic classification as different
// providers produce different results in an arbitrary order). Order
// them first before proceeding.
Order
(
syntaxSpans
);
Order
(
semanticSpans
);
// Produce SymbolDisplayParts for both sets of ClassifiedSpans. This will
// also produce parts for the regions between the sections that the classifiers
// returned results for (i.e. for things like spaces and plain text).
var
syntaxParts
=
Classifier
.
ConvertClassifications
(
sourceText
,
widenedSpan
.
Start
,
syntaxSpans
,
insertSourceTextInGaps
:
true
);
var
semanticParts
=
Classifier
.
ConvertClassifications
(
sourceText
,
widenedSpan
.
Start
,
semanticSpans
,
insertSourceTextInGaps
:
true
);
// Now merge the lists together, taking all the results from syntaxParts
// unless they were overridden by results in semanticParts.
return
MergeParts
(
syntaxParts
,
semanticParts
);
}
private
void
Order
(
List
<
ClassifiedSpan
>
syntaxSpans
)
{
syntaxSpans
.
Sort
((
s1
,
s2
)
=>
s1
.
TextSpan
.
Start
-
s2
.
TextSpan
.
Start
);
}
private
List
<
SymbolDisplayPart
>
MergeParts
(
List
<
SymbolDisplayPart
>
syntaxParts
,
List
<
SymbolDisplayPart
>
semanticParts
)
{
// Take all the syntax parts. However, if any have been overridden by a
// semantic part, then choose that one.
// To make life easier, determine the spans for all the parts in the lists.
var
syntaxPartsAndSpans
=
AddSpans
(
syntaxParts
);
var
semanticPartsAndSpans
=
AddSpans
(
semanticParts
);
var
finalParts
=
new
List
<
SymbolDisplayPart
>();
var
lastReplacementIndex
=
0
;
for
(
int
i
=
0
,
n
=
syntaxPartsAndSpans
.
Count
;
i
<
n
;
i
++)
{
var
syntaxPartAndSpan
=
syntaxPartsAndSpans
[
i
];
// See if we can find a semantic part to replace this syntax part.
var
replacementIndex
=
semanticPartsAndSpans
.
FindIndex
(
lastReplacementIndex
,
t
=>
t
.
Item2
==
syntaxPartAndSpan
.
Item2
);
var
part
=
replacementIndex
>=
0
&&
ShouldUseSemanticPart
(
semanticPartsAndSpans
[
replacementIndex
])
?
semanticPartsAndSpans
[
replacementIndex
].
Item1
:
syntaxPartAndSpan
.
Item1
;
finalParts
.
Add
(
part
);
if
(
replacementIndex
>=
0
)
{
// If we found a semantic replacement, update the lastIndex.
// That way we can start searching from that point instead
// of checking all the elements each time.
lastReplacementIndex
=
replacementIndex
+
1
;
}
}
return
finalParts
;
}
private
bool
ShouldUseSemanticPart
(
ValueTuple
<
SymbolDisplayPart
,
TextSpan
>
partAndSpan
)
{
// Don't take 'text' from the semantic parts. We'll get those for the
// spaces between the actual interesting semantic spans, and we don't
// want them to override actual good syntax spans.
return
partAndSpan
.
Item1
.
Kind
!=
SymbolDisplayPartKind
.
Text
;
}
private
List
<
ValueTuple
<
SymbolDisplayPart
,
TextSpan
>>
AddSpans
(
List
<
SymbolDisplayPart
>
parts
)
{
var
result
=
new
List
<
ValueTuple
<
SymbolDisplayPart
,
TextSpan
>>(
parts
.
Count
);
var
position
=
0
;
foreach
(
var
part
in
parts
)
{
var
partLength
=
part
.
ToString
().
Length
;
result
.
Add
(
ValueTuple
.
Create
(
part
,
new
TextSpan
(
position
,
partLength
)));
position
+=
partLength
;
}
return
result
;
}
private
RoslynDefinitionBucket
GetOrCreateDefinitionBucket
(
DefinitionItem
definition
)
{
lock
(
_gate
)
...
...
src/Workspaces/Core/Portable/Classification/Classifier.cs
浏览文件 @
f4c0f0e6
...
...
@@ -78,7 +78,7 @@ public static class Classifier
return
ConvertClassifications
(
sourceText
,
textSpan
.
Start
,
classifiedSpans
,
insertSourceTextInGaps
);
}
private
static
List
<
SymbolDisplayPart
>
ConvertClassifications
(
internal
static
List
<
SymbolDisplayPart
>
ConvertClassifications
(
SourceText
sourceText
,
int
startPosition
,
IEnumerable
<
ClassifiedSpan
>
classifiedSpans
,
bool
insertSourceTextInGaps
=
false
)
{
var
parts
=
new
List
<
SymbolDisplayPart
>();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录