Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
878f56bf
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,发现更多精彩内容 >>
提交
878f56bf
编写于
12月 16, 2019
作者:
C
Cyrus Najmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Match implicit '.Slice' pattern
上级
a58bcb8b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
108 addition
and
9 deletion
+108
-9
src/EditorFeatures/CSharpTest/UseIndexOrRangeOperator/UseRangeOperatorTests.cs
...harpTest/UseIndexOrRangeOperator/UseRangeOperatorTests.cs
+89
-3
src/Features/CSharp/Portable/UseIndexOrRangeOperator/CSharpUseRangeOperatorDiagnosticAnalyzer.InfoCache.cs
...tor/CSharpUseRangeOperatorDiagnosticAnalyzer.InfoCache.cs
+19
-6
未找到文件。
src/EditorFeatures/CSharpTest/UseIndexOrRangeOperator/UseRangeOperatorTests.cs
浏览文件 @
878f56bf
...
...
@@ -7,6 +7,7 @@
using
Microsoft.CodeAnalysis.Diagnostics
;
using
Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Diagnostics
;
using
Microsoft.CodeAnalysis.Test.Utilities
;
using
Microsoft.VisualStudio.Text
;
using
Roslyn.Test.Utilities
;
using
Xunit
;
...
...
@@ -20,9 +21,6 @@ internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProvider
private
static
readonly
CSharpParseOptions
s_parseOptions
=
CSharpParseOptions
.
Default
.
WithLanguageVersion
(
LanguageVersion
.
CSharp8
);
private
static
readonly
TestParameters
s_testParameters
=
new
TestParameters
(
parseOptions
:
s_parseOptions
);
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsUseRangeOperator
)]
public
async
Task
TestNotInCSharp7
()
{
...
...
@@ -221,6 +219,94 @@ void Goo(string s, string t)
{
var v = t.Substring(s[1..^1][0], t.Length - s[1..^1][0]);
}
}"
,
parseOptions
:
s_parseOptions
);
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsUseRangeOperator
)]
public
async
Task
TestWithTypeWithActualSliceMethod1
()
{
await
TestAsync
(
@"
using System;
namespace System
{
public struct Range { }
public readonly ref struct Span<T>
{
public int Length { get { } }
public Span<T> Slice(int start, int length) { }
}
}
class C
{
void Goo(Span<int> s)
{
var v = s.Slice([||]1, s.Length - 1);
}
}"
,
@"
using System;
namespace System
{
public struct Range { }
public readonly ref struct Span<T>
{
public int Length { get { } }
public Span<T> Slice(int start, int length) { }
}
}
class C
{
void Goo(Span<int> s)
{
var v = s[1..];
}
}"
,
parseOptions
:
s_parseOptions
);
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsUseRangeOperator
)]
public
async
Task
TestWithTypeWithActualSliceMethod2
()
{
await
TestAsync
(
@"
using System;
namespace System
{
public struct Range { }
public readonly ref struct Span<T>
{
public int Length { get { } }
public Span<T> Slice(int start, int length) { }
}
}
class C
{
void Goo(Span<int> s)
{
var v = s.Slice([||]1, s.Length - 2);
}
}"
,
@"
using System;
namespace System
{
public struct Range { }
public readonly ref struct Span<T>
{
public int Length { get { } }
public Span<T> Slice(int start, int length) { }
}
}
class C
{
void Goo(Span<int> s)
{
var v = s[1..^1];
}
}"
,
parseOptions
:
s_parseOptions
);
}
}
...
...
src/Features/CSharp/Portable/UseIndexOrRangeOperator/CSharpUseRangeOperatorDiagnosticAnalyzer.InfoCache.cs
浏览文件 @
878f56bf
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using
System
;
using
System.Collections.Concurrent
;
using
System.Diagnostics
;
using
System.Linq
;
...
...
@@ -83,21 +84,33 @@ private MemberInfo ComputeMemberInfo(IMethodSymbol sliceLikeMethod, bool require
}
// A Slice method can either be paired with an Range-taking indexer on the type, or
// an Range-taking overload.
// an Range-taking overload, or an explicit method called .Slice that takes two ints:
//
// https://github.com/dotnet/csharplang/blob/master/proposals/csharp-8.0/ranges.md#implicit-range-support
if
(
sliceLikeMethod
.
ReturnType
.
Equals
(
containingType
))
{
// it's a method like: MyType MyType.Slice(int start, int length). Look for an
// indexer like `MyType MyType.this[Range range]`. If we can't find one return
// 'default' so we'll consider this named-type non-viable.
// it's a method like: MyType MyType.Get(int start, int length). Look for an
// indexer like `MyType MyType.this[Range range]`.
var
indexer
=
GetIndexer
(
containingType
,
RangeType
,
containingType
);
if
(
indexer
!=
null
)
{
return
new
MemberInfo
(
lengthLikeProperty
,
overloadedMethodOpt
:
null
);
}
// Also, look to see if the type has a `.Slice(int start, int length)` method.
// This is also a method the compiler knows to look for when a user writes `x[a..b]`
var
actualSliceMethod
=
sliceLikeMethod
.
ContainingType
.
GetMembers
(
nameof
(
Span
<
int
>.
Slice
))
.
OfType
<
IMethodSymbol
>()
.
FirstOrDefault
(
s
=>
IsSliceLikeMethod
(
s
));
if
(
actualSliceMethod
!=
null
)
{
return
new
MemberInfo
(
lengthLikeProperty
,
overloadedMethodOpt
:
null
);
}
}
// it's a method like: `SomeType MyType.
Slice
(int start, int length)`. Look
// for an overload like: `SomeType MyType.
Slice
(Range)`
// it's a method like: `SomeType MyType.
Get
(int start, int length)`. Look
// for an overload like: `SomeType MyType.
Get
(Range)`
var
overloadedRangeMethod
=
GetOverload
(
sliceLikeMethod
,
RangeType
);
if
(
overloadedRangeMethod
!=
null
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录