Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
7a80f546
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,发现更多精彩内容 >>
提交
7a80f546
编写于
4月 27, 2015
作者:
M
Matt Warren
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2295 from mattwar/Bug463
Change sibling check to use similarity instead of exact match
上级
64b237dc
ec08ef17
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
52 addition
and
67 deletion
+52
-67
src/Compilers/CSharp/Test/Syntax/Syntax/SyntaxDiffingTests.cs
...Compilers/CSharp/Test/Syntax/Syntax/SyntaxDiffingTests.cs
+1
-3
src/Compilers/Core/Portable/Syntax/SyntaxDiffer.cs
src/Compilers/Core/Portable/Syntax/SyntaxDiffer.cs
+51
-64
未找到文件。
src/Compilers/CSharp/Test/Syntax/Syntax/SyntaxDiffingTests.cs
浏览文件 @
7a80f546
...
...
@@ -321,7 +321,7 @@ private void TestQualifyWithThisCore(SyntaxNode root, int index)
Assert
.
Equal
(
"this."
,
changes
[
0
].
NewText
);
}
[
Fact
(
Skip
=
"463"
)
,
WorkItem
(
463
,
"https://github.com/dotnet/roslyn/issues/463"
)]
[
Fact
,
WorkItem
(
463
,
"https://github.com/dotnet/roslyn/issues/463"
)]
public
void
TestReplaceWithBuiltInType
()
{
var
original
=
@"
...
...
@@ -365,8 +365,6 @@ private void TestReplaceWithBuiltInTypeCore(SyntaxNode root, int index)
{
var
oldTree
=
root
.
SyntaxTree
;
var
nodesToReplace
=
root
.
DescendantNodes
().
Where
(
n
=>
n
is
SimpleNameSyntax
&&
n
.
ToString
()
==
"Object"
);
var
span
=
new
TextSpan
(
index
,
6
);
var
node
=
root
.
FindNode
(
span
,
getInnermostNodeForTie
:
true
)
as
SimpleNameSyntax
;
Assert
.
NotNull
(
node
);
...
...
src/Compilers/Core/Portable/Syntax/SyntaxDiffer.cs
浏览文件 @
7a80f546
...
...
@@ -242,12 +242,17 @@ private DiffAction GetNextAction()
// either there is no match for the first new-node in the old-list or the
// the similarity of the first old-node in the new-list is much greater
// if we find a match for the old node in the new list, that probably means nodes were inserted before it.
if
(
indexOfOldInNew
>
0
)
{
// look ahead to see if the old node also appears again later in its own list
var
oldHasIdenticalSibling
=
FindExactMatch
(
_oldNodes
,
_oldNodes
.
Peek
(),
1
)
>=
1
;
int
indexOfOldInOld
;
int
similarityOfOldInOld
;
FindBestMatch
(
_oldNodes
,
_oldNodes
.
Peek
(),
out
indexOfOldInOld
,
out
similarityOfOldInOld
,
1
);
if
(!
oldHasIdenticalSibling
)
// don't declare an insert if the node also appeared later in the original list
var
oldHasSimilarSibling
=
(
indexOfOldInOld
>=
1
&&
similarityOfOldInOld
>=
similarityOfOldInNew
);
if
(!
oldHasSimilarSibling
)
{
return
new
DiffAction
(
DiffOp
.
InsertNew
,
indexOfOldInNew
);
}
...
...
@@ -331,28 +336,7 @@ private static void ReplaceFirstWithChildren(Stack<SyntaxNodeOrToken> stack)
}
}
private
static
int
FindExactMatch
(
Stack
<
SyntaxNodeOrToken
>
stack
,
SyntaxNodeOrToken
node
,
int
startIndex
)
{
int
i
=
0
;
foreach
(
var
stackNode
in
stack
)
{
if
(
i
>=
MaxSearchLength
)
{
break
;
}
if
(
i
>=
startIndex
&&
AreIdentical
(
stackNode
,
node
))
{
return
i
;
}
i
++;
}
return
-
1
;
}
private
void
FindBestMatch
(
Stack
<
SyntaxNodeOrToken
>
stack
,
SyntaxNodeOrToken
node
,
out
int
index
,
out
int
similarity
)
private
void
FindBestMatch
(
Stack
<
SyntaxNodeOrToken
>
stack
,
SyntaxNodeOrToken
node
,
out
int
index
,
out
int
similarity
,
int
startIndex
=
0
)
{
index
=
-
1
;
similarity
=
-
1
;
...
...
@@ -365,64 +349,67 @@ private void FindBestMatch(Stack<SyntaxNodeOrToken> stack, SyntaxNodeOrToken nod
break
;
}
if
(
AreIdentical
(
stackNode
,
node
))
{
var
sim
=
node
.
FullSpan
.
Length
;
if
(
sim
>
similarity
)
{
index
=
i
;
similarity
=
sim
;
return
;
}
}
else
if
(
AreSimilar
(
stackNode
,
node
))
if
(
i
>=
startIndex
)
{
var
sim
=
GetSimilarity
(
stackNode
,
node
);
// Are these really the same? This may be expensive so only check this if
// similarity is rated equal to them being identical.
if
(
sim
==
node
.
FullSpan
.
Length
&&
node
.
IsToken
)
if
(
AreIdentical
(
stackNode
,
node
))
{
if
(
stackNode
.
ToFullString
()
==
node
.
ToFullString
())
var
sim
=
node
.
FullSpan
.
Length
;
if
(
sim
>
similarity
)
{
index
=
i
;
similarity
=
sim
;
return
;
}
}
if
(
sim
>
similarity
)
else
if
(
AreSimilar
(
stackNode
,
node
))
{
index
=
i
;
similarity
=
sim
;
}
}
else
{
// check one level deep inside list node's children
int
j
=
0
;
foreach
(
var
child
in
stackNode
.
ChildNodesAndTokens
())
{
if
(
j
>=
MaxSearchLength
)
var
sim
=
GetSimilarity
(
stackNode
,
node
);
// Are these really the same? This may be expensive so only check this if
// similarity is rated equal to them being identical.
if
(
sim
==
node
.
FullSpan
.
Length
&&
node
.
IsToken
)
{
break
;
if
(
stackNode
.
ToFullString
()
==
node
.
ToFullString
())
{
index
=
i
;
similarity
=
sim
;
return
;
}
}
j
++;
if
(
AreIdentical
(
child
,
node
))
if
(
sim
>
similarity
)
{
index
=
i
;
similarity
=
node
.
FullSpan
.
Length
;
return
;
similarity
=
sim
;
}
else
if
(
AreSimilar
(
child
,
node
))
}
else
{
// check one level deep inside list node's children
int
j
=
0
;
foreach
(
var
child
in
stackNode
.
ChildNodesAndTokens
())
{
var
sim
=
GetSimilarity
(
child
,
node
);
if
(
sim
>
similarity
)
if
(
j
>=
MaxSearchLength
)
{
break
;
}
j
++;
if
(
AreIdentical
(
child
,
node
))
{
index
=
i
;
similarity
=
sim
;
similarity
=
node
.
FullSpan
.
Length
;
return
;
}
else
if
(
AreSimilar
(
child
,
node
))
{
var
sim
=
GetSimilarity
(
child
,
node
);
if
(
sim
>
similarity
)
{
index
=
i
;
similarity
=
sim
;
}
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录