Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
356bce2e
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,发现更多精彩内容 >>
未验证
提交
356bce2e
编写于
9月 28, 2020
作者:
M
msftbot[bot]
提交者:
GitHub
9月 28, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #48107 from davidwengier/FixNativeCasts
Don't offer to remove necessary native integer casts
上级
2366c3c5
c9751800
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
200 addition
and
0 deletion
+200
-0
src/Analyzers/CSharp/Tests/RemoveUnnecessaryCast/RemoveUnnecessaryCastTests.cs
...Tests/RemoveUnnecessaryCast/RemoveUnnecessaryCastTests.cs
+156
-0
src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Simplification/Simplifiers/CastSimplifier.cs
...piler/CSharp/Simplification/Simplifiers/CastSimplifier.cs
+44
-0
未找到文件。
src/Analyzers/CSharp/Tests/RemoveUnnecessaryCast/RemoveUnnecessaryCastTests.cs
浏览文件 @
356bce2e
...
...
@@ -8131,5 +8131,161 @@ void Goo()
}
}"
);
}
[
WorkItem
(
47800
,
"https://github.com/dotnet/roslyn/issues/47800"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsRemoveUnnecessaryCast
)]
public
async
Task
RemoveNativeIntCastsAsIdentity
()
{
var
source
=
@"using System;
public class C {
public nint N(IntPtr x) => [|(nint)|]x;
}"
;
var
fixedCode
=
@"using System;
public class C {
public nint N(IntPtr x) => x;
}"
;
var
test
=
new
VerifyCS
.
Test
()
{
TestCode
=
source
,
FixedCode
=
fixedCode
,
LanguageVersion
=
LanguageVersion
.
CSharp9
};
await
test
.
RunAsync
();
}
[
WorkItem
(
47800
,
"https://github.com/dotnet/roslyn/issues/47800"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsRemoveUnnecessaryCast
)]
public
async
Task
DoRemoveNativeIntCasts
()
{
var
source
=
@"using System;
public class C {
public nuint N(IntPtr x) => (nuint)(nint)x;
}"
;
var
test
=
new
VerifyCS
.
Test
()
{
TestCode
=
source
,
FixedCode
=
source
,
LanguageVersion
=
LanguageVersion
.
CSharp9
};
await
test
.
RunAsync
();
}
[
WorkItem
(
47800
,
"https://github.com/dotnet/roslyn/issues/47800"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsRemoveUnnecessaryCast
)]
public
async
Task
RemoveNativeUIntCastsAsIdentity
()
{
var
source
=
@"using System;
public class C {
public nuint N(UIntPtr x) => [|(nuint)|]x;
}"
;
var
fixedCode
=
@"using System;
public class C {
public nuint N(UIntPtr x) => x;
}"
;
var
test
=
new
VerifyCS
.
Test
()
{
TestCode
=
source
,
FixedCode
=
fixedCode
,
LanguageVersion
=
LanguageVersion
.
CSharp9
};
await
test
.
RunAsync
();
}
[
WorkItem
(
47800
,
"https://github.com/dotnet/roslyn/issues/47800"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsRemoveUnnecessaryCast
)]
public
async
Task
DoRemoveNativeUIntCasts
()
{
var
source
=
@"using System;
public class C {
public nint N(UIntPtr x) => (nint)(nuint)x;
}"
;
var
test
=
new
VerifyCS
.
Test
()
{
TestCode
=
source
,
FixedCode
=
source
,
LanguageVersion
=
LanguageVersion
.
CSharp9
};
await
test
.
RunAsync
();
}
[
WorkItem
(
47800
,
"https://github.com/dotnet/roslyn/issues/47800"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsRemoveUnnecessaryCast
)]
public
async
Task
RemoveIntPtrCastsAsIdentity
()
{
var
source
=
@"
using System;
class C
{
public void M(IntPtr x)
{
var v = [|(IntPtr)|]x;
}
}"
;
var
fixedCode
=
@"
using System;
class C
{
public void M(IntPtr x)
{
var v = x;
}
}"
;
await
VerifyCS
.
VerifyCodeFixAsync
(
source
,
fixedCode
);
}
[
WorkItem
(
47800
,
"https://github.com/dotnet/roslyn/issues/47800"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsRemoveUnnecessaryCast
)]
public
async
Task
RemoveUIntPtrCastsAsIdentity
()
{
var
source
=
@"
using System;
class C
{
public void M(UIntPtr x)
{
var v = [|(UIntPtr)|]x;
}
}"
;
var
fixedCode
=
@"
using System;
class C
{
public void M(UIntPtr x)
{
var v = x;
}
}"
;
await
VerifyCS
.
VerifyCodeFixAsync
(
source
,
fixedCode
);
}
}
}
src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Simplification/Simplifiers/CastSimplifier.cs
浏览文件 @
356bce2e
...
...
@@ -455,6 +455,50 @@ private static bool IsObjectCastInInterpolation(ExpressionSyntax castNode, IType
if
(
IsTypeLessExpressionNotInTargetTypedLocation
(
castNode
,
castedExpressionType
))
return
true
;
// If we have something like `(nuint)(nint)x` where x is an IntPtr then the nint cast cannot be removed
// as IntPtr to nuint is invalid.
if
(
IsIntPtrToNativeIntegerNestedCast
(
castNode
,
castType
,
castedExpressionType
,
semanticModel
,
cancellationToken
))
return
true
;
return
false
;
}
private
static
bool
IsIntPtrToNativeIntegerNestedCast
(
ExpressionSyntax
castNode
,
ITypeSymbol
castType
,
ITypeSymbol
castedExpressionType
,
SemanticModel
semanticModel
,
CancellationToken
cancellationToken
)
{
if
(
castedExpressionType
==
null
)
{
return
false
;
}
if
(
castType
.
SpecialType
is
not
(
SpecialType
.
System_IntPtr
or
SpecialType
.
System_UIntPtr
))
{
return
false
;
}
if
(
castNode
.
WalkUpParentheses
().
Parent
is
CastExpressionSyntax
castExpression
)
{
var
parentCastType
=
semanticModel
.
GetTypeInfo
(
castExpression
,
cancellationToken
).
Type
;
if
(
parentCastType
==
null
)
{
return
false
;
}
var
oppositeType
=
castType
.
SpecialType
==
SpecialType
.
System_IntPtr
?
SpecialType
.
System_UIntPtr
:
SpecialType
.
System_IntPtr
;
// Given (nuint)(nint)myIntPtr we would normally suggest removing the (nint) cast as being identity
// but it is required as a means to get from IntPtr to nuint, and vice versa from UIntPtr to nint,
// so we check for an identity cast from [U]IntPtr to n[u]int, and a parent cast to the opposite.
if
(
castedExpressionType
.
SpecialType
==
castType
.
SpecialType
&&
!
castedExpressionType
.
IsNativeIntegerType
&&
castType
.
IsNativeIntegerType
&&
parentCastType
.
IsNativeIntegerType
&&
parentCastType
.
SpecialType
==
oppositeType
)
{
return
true
;
}
}
return
false
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录