Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
49c929da
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,发现更多精彩内容 >>
提交
49c929da
编写于
8月 02, 2018
作者:
J
JieCarolHu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixing false unresolvedConflict when renaming overloaded VB properties
上级
bf97306c
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
77 addition
and
7 deletion
+77
-7
src/Workspaces/Core/Portable/Rename/ConflictEngine/ConflictResolver.cs
...s/Core/Portable/Rename/ConflictEngine/ConflictResolver.cs
+18
-4
src/Workspaces/Core/Portable/Rename/ConflictEngine/DeclarationConflictHelpers.cs
...table/Rename/ConflictEngine/DeclarationConflictHelpers.cs
+56
-3
src/Workspaces/VisualBasic/Portable/Rename/VisualBasicRenameRewriterLanguageService.vb
...rtable/Rename/VisualBasicRenameRewriterLanguageService.vb
+3
-0
未找到文件。
src/Workspaces/Core/Portable/Rename/ConflictEngine/ConflictResolver.cs
浏览文件 @
49c929da
...
...
@@ -40,7 +40,7 @@ internal static partial class ConflictResolver
/// <param name="originalText">The original name of the identifier.</param>
/// <param name="replacementText">The new name of the identifier</param>
/// <param name="optionSet">The option for rename</param>
/// <param name="hasConflict">Called after renaming references. Can be used by callers to
/// <param name="hasConflict">Called after renaming references. Can be used by callers to
/// indicate if the new symbols that the reference binds to should be considered to be ok or
/// are in conflict. 'true' means they are conflicts. 'false' means they are not conflicts.
/// 'null' means that the default conflict check should be used.</param>
...
...
@@ -185,10 +185,24 @@ private static bool IsRenameValid(ConflictResolution conflictResolution, ISymbol
{
var
otherThingsNamedTheSame
=
renamedSymbol
.
ContainingType
.
GetMembers
(
renamedSymbol
.
Name
)
.
Where
(
s
=>
!
s
.
Equals
(
renamedSymbol
)
&&
string
.
Equals
(
s
.
MetadataName
,
renamedSymbol
.
MetadataName
,
StringComparison
.
Ordinal
)
&&
(
s
.
Kind
!=
SymbolKind
.
Method
||
renamedSymbol
.
Kind
!=
SymbolKind
.
Method
));
string
.
Equals
(
s
.
MetadataName
,
renamedSymbol
.
MetadataName
,
StringComparison
.
Ordinal
));
AddConflictingSymbolLocations
(
otherThingsNamedTheSame
,
conflictResolution
,
reverseMappedLocations
);
// excluded Method or Property(only for VB) here, as they may have the same name but different parameters
IEnumerable
<
ISymbol
>
otherThingsNamedTheSameExcludeMethodAndParameterizedProperty
;
if
(
renamedSymbol
.
Language
==
LanguageNames
.
VisualBasic
)
{
// Only VB allows Parameterized Properties
otherThingsNamedTheSameExcludeMethodAndParameterizedProperty
=
otherThingsNamedTheSame
.
Where
(
s
=>
(
s
.
Kind
!=
SymbolKind
.
Method
&&
s
.
Kind
!=
SymbolKind
.
Property
)
||
(
renamedSymbol
.
Kind
!=
SymbolKind
.
Method
&&
renamedSymbol
.
Kind
!=
SymbolKind
.
Property
));
}
else
{
otherThingsNamedTheSameExcludeMethodAndParameterizedProperty
=
otherThingsNamedTheSame
.
Where
(
s
=>
s
.
Kind
!=
SymbolKind
.
Method
||
renamedSymbol
.
Kind
!=
SymbolKind
.
Method
);
}
AddConflictingSymbolLocations
(
otherThingsNamedTheSameExcludeMethodAndParameterizedProperty
,
conflictResolution
,
reverseMappedLocations
);
}
...
...
src/Workspaces/Core/Portable/Rename/ConflictEngine/DeclarationConflictHelpers.cs
浏览文件 @
49c929da
...
...
@@ -44,6 +44,36 @@ public static ImmutableArray<Location> GetMembersWithConflictingSignatures(IMeth
return
builder
.
ToImmutableAndFree
();
}
public
static
ImmutableArray
<
Location
>
GetMembersWithConflictingSignatures
(
IPropertySymbol
renamedProperty
,
bool
trimOptionalParameters
)
{
var
potentiallyConfictingProperties
=
renamedProperty
.
ContainingType
.
GetMembers
(
renamedProperty
.
Name
)
.
OfType
<
IPropertySymbol
>()
.
Where
(
m
=>
!
m
.
Equals
(
renamedProperty
)
&&
m
.
Parameters
.
Count
()
==
renamedProperty
.
Parameters
.
Count
());
var
signatureToConflictingMember
=
new
Dictionary
<
ImmutableArray
<
ITypeSymbol
>,
IPropertySymbol
>(
ConflictingSignatureComparer
.
Instance
);
foreach
(
var
property
in
potentiallyConfictingProperties
)
{
foreach
(
var
signature
in
GetAllSignatures
(
property
,
trimOptionalParameters
))
{
signatureToConflictingMember
[
signature
]
=
property
;
}
}
var
builder
=
ArrayBuilder
<
Location
>.
GetInstance
();
foreach
(
var
signature
in
GetAllSignatures
(
renamedProperty
,
trimOptionalParameters
))
{
if
(
signatureToConflictingMember
.
TryGetValue
(
signature
,
out
var
conflictingSymbol
))
{
builder
.
AddRange
(
conflictingSymbol
.
Locations
);
}
}
return
builder
.
ToImmutableAndFree
();
}
private
sealed
class
ConflictingSignatureComparer
:
IEqualityComparer
<
ImmutableArray
<
ITypeSymbol
>>
{
public
static
readonly
ConflictingSignatureComparer
Instance
=
new
ConflictingSignatureComparer
();
...
...
@@ -57,9 +87,9 @@ public bool Equals(ImmutableArray<ITypeSymbol> x, ImmutableArray<ITypeSymbol> y)
public
int
GetHashCode
(
ImmutableArray
<
ITypeSymbol
>
obj
)
{
// This is a very simple GetHashCode implementation. Doing something "fancier" here
// isn't really worth it, since to compute a proper hash we'd end up walking all the
// ITypeSymbols anyways.
// This is a very simple GetHashCode implementation. Doing something "fancier" here
// isn't really worth it, since to compute a proper hash we'd end up walking all the
// ITypeSymbols anyways.
return
obj
.
Length
;
}
}
...
...
@@ -91,5 +121,28 @@ private static ImmutableArray<ImmutableArray<ITypeSymbol>> GetAllSignatures(IMet
resultBuilder
.
Add
(
signatureBuilder
.
ToImmutableAndFree
());
return
resultBuilder
.
ToImmutableAndFree
();
}
private
static
ImmutableArray
<
ImmutableArray
<
ITypeSymbol
>>
GetAllSignatures
(
IPropertySymbol
method
,
bool
trimOptionalParameters
)
{
var
resultBuilder
=
ArrayBuilder
<
ImmutableArray
<
ITypeSymbol
>>.
GetInstance
();
var
signatureBuilder
=
ArrayBuilder
<
ITypeSymbol
>.
GetInstance
();
foreach
(
var
parameter
in
method
.
Parameters
)
{
// In VB, a method effectively creates multiple signatures which are produced by
// chopping off each of the optional parameters on the end, last to first, per 4.1.1 of
// the spec.
if
(
trimOptionalParameters
&&
parameter
.
IsOptional
)
{
resultBuilder
.
Add
(
signatureBuilder
.
ToImmutable
());
}
signatureBuilder
.
Add
(
parameter
.
Type
);
}
resultBuilder
.
Add
(
signatureBuilder
.
ToImmutableAndFree
());
return
resultBuilder
.
ToImmutableAndFree
();
}
}
}
src/Workspaces/VisualBasic/Portable/Rename/VisualBasicRenameRewriterLanguageService.vb
浏览文件 @
49c929da
...
...
@@ -731,6 +731,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Rename
.
Select
(
Function
(
loc
)
reverseMappedLocations
(
loc
)))
ElseIf
renamedSymbol
.
Kind
=
SymbolKind
.
Property
Then
conflicts
.
AddRange
(
DeclarationConflictHelpers
.
GetMembersWithConflictingSignatures
(
DirectCast
(
renamedSymbol
,
IPropertySymbol
),
trimOptionalParameters
:
=
True
)
_
.
Select
(
Function
(
loc
)
reverseMappedLocations
(
loc
)))
ConflictResolver
.
AddConflictingParametersOfProperties
(
referencedSymbols
.
Select
(
Function
(
s
)
s
.
Symbol
).
Concat
(
renameSymbol
).
Where
(
Function
(
sym
)
sym
.
Kind
=
SymbolKind
.
Property
),
renamedSymbol
.
Name
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录