Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
fsharp
提交
3a3fac20
F
fsharp
项目概览
dotNET Platform
/
fsharp
11 个月 前同步成功
通知
0
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
fsharp
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
3a3fac20
编写于
5月 14, 2021
作者:
P
Phillip Carter
提交者:
GitHub
5月 14, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add refactoring to type typeof<expr>.Name into nameof(expr) (#11566)
上级
35cbed42
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
181 addition
and
30 deletion
+181
-30
vsintegration/src/FSharp.Editor/CodeFix/RemoveUnusedBinding.fs
...egration/src/FSharp.Editor/CodeFix/RemoveUnusedBinding.fs
+0
-30
vsintegration/src/FSharp.Editor/Common/FSharpCodeAnalysisExtensions.fs
.../src/FSharp.Editor/Common/FSharpCodeAnalysisExtensions.fs
+49
-0
vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj
vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj
+2
-0
vsintegration/src/FSharp.Editor/FSharp.Editor.resx
vsintegration/src/FSharp.Editor/FSharp.Editor.resx
+3
-0
vsintegration/src/FSharp.Editor/Refactor/ChangeTypeofWithNameToNameofExpression.fs
...Editor/Refactor/ChangeTypeofWithNameToNameofExpression.fs
+62
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf
...tegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf
+5
-0
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf
...tegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf
+5
-0
未找到文件。
vsintegration/src/FSharp.Editor/CodeFix/RemoveUnusedBinding.fs
浏览文件 @
3a3fac20
...
...
@@ -9,36 +9,6 @@ open System.Threading.Tasks
open
Microsoft
.
CodeAnalysis
.
Text
open
Microsoft
.
CodeAnalysis
.
CodeFixes
open
FSharp
.
Compiler
.
CodeAnalysis
open
FSharp
.
Compiler
.
Syntax
open
FSharp
.
Compiler
.
Text
[<
AutoOpen
>]
module
FSharpParseFileResultsExtensions
=
type
FSharpParseFileResults
with
member
this
.
TryRangeOfBindingWithHeadPatternWithPos
pos
=
let
input
=
this
.
ParseTree
SyntaxTraversal
.
Traverse
(
pos
,
input
,
{
new
SyntaxVisitorBase
<_>()
with
member
_.
VisitExpr
(_,
_,
defaultTraverse
,
expr
)
=
defaultTraverse
expr
override
_.
VisitBinding
(_
path
,
defaultTraverse
,
binding
)
=
match
binding
with
|
SynBinding
(_,
SynBindingKind
.
Normal
,
_,
_,
_,
_,
_,
pat
,
_,
_,
_,
_)
as
binding
->
if
Position
.
posEq
binding
.
RangeOfHeadPattern
.
Start
pos
then
Some
binding
.
RangeOfBindingWithRhs
else
// Check if it's an operator
match
pat
with
|
SynPat
.
LongIdent
(
LongIdentWithDots
([
id
],
_),
_,
_,
_,
_,
_)
when
id
.
idText
.
StartsWith
(
"op_"
)
->
if
Position
.
posEq
id
.
idRange
.
Start
pos
then
Some
binding
.
RangeOfBindingWithRhs
else
defaultTraverse
binding
|
_
->
defaultTraverse
binding
|
_
->
defaultTraverse
binding
})
[<
ExportCodeFixProvider
(
FSharpConstants
.
FSharpLanguageName
,
Name
=
"RemoveUnusedBinding"
);
Shared
>]
type
internal
FSharpRemoveUnusedBindingCodeFixProvider
[<
ImportingConstructor
>]
...
...
vsintegration/src/FSharp.Editor/Common/FSharpCodeAnalysisExtensions.fs
0 → 100644
浏览文件 @
3a3fac20
[<
AutoOpen
>]
module
internal
FSharpParseFileResultsExtensions
open
FSharp
.
Compiler
.
CodeAnalysis
open
FSharp
.
Compiler
.
Syntax
open
FSharp
.
Compiler
.
Text
type
FSharpParseFileResults
with
member
this
.
TryRangeOfBindingWithHeadPatternWithPos
pos
=
let
input
=
this
.
ParseTree
SyntaxTraversal
.
Traverse
(
pos
,
input
,
{
new
SyntaxVisitorBase
<_>()
with
member
_.
VisitExpr
(_,
_,
defaultTraverse
,
expr
)
=
defaultTraverse
expr
override
_.
VisitBinding
(_
path
,
defaultTraverse
,
binding
)
=
match
binding
with
|
SynBinding
(_,
SynBindingKind
.
Normal
,
_,
_,
_,
_,
_,
pat
,
_,
_,
_,
_)
as
binding
->
if
Position
.
posEq
binding
.
RangeOfHeadPattern
.
Start
pos
then
Some
binding
.
RangeOfBindingWithRhs
else
// Check if it's an operator
match
pat
with
|
SynPat
.
LongIdent
(
LongIdentWithDots
([
id
],
_),
_,
_,
_,
_,
_)
when
id
.
idText
.
StartsWith
(
"op_"
)
->
if
Position
.
posEq
id
.
idRange
.
Start
pos
then
Some
binding
.
RangeOfBindingWithRhs
else
defaultTraverse
binding
|
_
->
defaultTraverse
binding
|
_
->
defaultTraverse
binding
})
member
this
.
TryRangeOfTypeofWithNameAndTypeExpr
pos
=
SyntaxTraversal
.
Traverse
(
pos
,
this
.
ParseTree
,
{
new
SyntaxVisitorBase
<_>()
with
member
_.
VisitExpr
(_
path
,
_,
defaultTraverse
,
expr
)
=
match
expr
with
|
SynExpr
.
DotGet
(
expr
,
_,
_,
range
)
->
match
expr
with
|
SynExpr
.
TypeApp
(
SynExpr
.
Ident
(
ident
),
_,
typeArgs
,
_,
_,
_,
_)
->
let
onlyOneTypeArg
=
match
typeArgs
with
|
[]
->
false
|
[_]
->
true
|
_
->
false
if
ident
.
idText
=
"typeof"
&&
onlyOneTypeArg
then
Some
{|
NamedIdentRange
=
typeArgs
.
Head
.
Range
;
FullExpressionRange
=
range
|}
else
defaultTraverse
expr
|
_
->
defaultTraverse
expr
|
_
->
defaultTraverse
expr
})
\ No newline at end of file
vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj
浏览文件 @
3a3fac20
...
...
@@ -31,6 +31,7 @@
<Compile
Include=
"Common\Error.fs"
/>
<Compile
Include=
"Common\Logging.fs"
/>
<Compile
Include=
"Common\RoslynHelpers.fs"
/>
<Compile
Include=
"Common\FSharpCodeAnalysisExtensions.fs"
/>
<Compile
Include=
"Common\CodeAnalysisExtensions.fs"
/>
<Compile
Include=
"Common\Vs.fs"
/>
<Compile
Include=
"Options\SettingsPersistence.fs"
/>
...
...
@@ -88,6 +89,7 @@
<Compile
Include=
"Commands\HelpContextService.fs"
/>
<Compile
Include=
"Commands\FsiCommandService.fs"
/>
<Compile
Include=
"Commands\XmlDocCommandService.fs"
/>
<Compile
Include=
"Refactor\ChangeTypeofWithNameToNameofExpression.fs"
/>
<Compile
Include=
"Refactor\AddExplicitTypeToParameter.fs"
/>
<Compile
Include=
"Refactor\ChangeDerefToValueRefactoring.fs"
/>
<Compile
Include=
"CodeFix\CodeFixHelpers.fs"
/>
...
...
vsintegration/src/FSharp.Editor/FSharp.Editor.resx
浏览文件 @
3a3fac20
...
...
@@ -282,4 +282,7 @@
<data
name=
"RemoveUnusedBinding"
xml:space=
"preserve"
>
<value>
Remove unused binding
</value>
</data>
<data
name=
"UseNameof"
xml:space=
"preserve"
>
<value>
Use 'nameof'
</value>
</data>
</root>
\ No newline at end of file
vsintegration/src/FSharp.Editor/Refactor/ChangeTypeofWithNameToNameofExpression.fs
0 → 100644
浏览文件 @
3a3fac20
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace
Microsoft
.
VisualStudio
.
FSharp
.
Editor
open
System
open
System
.
Composition
open
System
.
Threading
open
FSharp
.
Compiler
open
FSharp
.
Compiler
.
CodeAnalysis
open
FSharp
.
Compiler
.
Symbols
open
FSharp
.
Compiler
.
Text
open
FSharp
.
Compiler
.
Syntax
open
Microsoft
.
CodeAnalysis
.
Text
open
Microsoft
.
CodeAnalysis
.
CodeRefactorings
open
Microsoft
.
CodeAnalysis
.
CodeActions
[<
ExportCodeRefactoringProvider
(
FSharpConstants
.
FSharpLanguageName
,
Name
=
"ChangeTypeofWithNameToNameofExpression"
);
Shared
>]
type
internal
FSharpChangeTypeofWithNameToNameofExpressionRefactoring
[<
ImportingConstructor
>]
(
checkerProvider
:
FSharpCheckerProvider
,
projectInfoManager
:
FSharpProjectOptionsManager
)
=
inherit
CodeRefactoringProvider
()
static
let
userOpName
=
"ChangeTypeofWithNameToNameofExpression"
override
_.
ComputeRefactoringsAsync
context
=
asyncMaybe
{
let
document
=
context
.
Document
let
!
parsingOptions
,
_
=
projectInfoManager
.
TryGetOptionsForEditingDocumentOrProject
(
document
,
context
.
CancellationToken
,
userOpName
)
let
!
sourceText
=
context
.
Document
.
GetTextAsync
(
context
.
CancellationToken
)
let
!
parseResults
=
checkerProvider
.
Checker
.
ParseDocument
(
document
,
parsingOptions
,
userOpName
=
userOpName
)
let
selectionRange
=
RoslynHelpers
.
TextSpanToFSharpRange
(
document
.
FilePath
,
context
.
Span
,
sourceText
)
let
!
namedTypeOfResults
=
parseResults
.
TryRangeOfTypeofWithNameAndTypeExpr
(
selectionRange
.
Start
)
let
!
namedTypeSpan
=
RoslynHelpers
.
TryFSharpRangeToTextSpan
(
sourceText
,
namedTypeOfResults
.
NamedIdentRange
)
let
!
typeofAndNameSpan
=
RoslynHelpers
.
TryFSharpRangeToTextSpan
(
sourceText
,
namedTypeOfResults
.
FullExpressionRange
)
let
namedTypeName
=
sourceText
.
GetSubText
(
namedTypeSpan
)
let
replacementString
=
$
"nameof({namedTypeName})"
let
title
=
SR
.
UseNameof
()
let
getChangedText
(
sourceText
:
SourceText
)
=
sourceText
.
WithChanges
(
TextChange
(
typeofAndNameSpan
,
replacementString
))
let
codeAction
=
CodeAction
.
Create
(
title
,
(
fun
(
cancellationToken
:
CancellationToken
)
->
async
{
let
!
sourceText
=
context
.
Document
.
GetTextAsync
(
cancellationToken
)
|>
Async
.
AwaitTask
return
context
.
Document
.
WithText
(
getChangedText
sourceText
)
}
|>
RoslynHelpers
.
StartAsyncAsTask
(
cancellationToken
)),
title
)
context
.
RegisterRefactoring
(
codeAction
)
}
|>
Async
.
Ignore
|>
RoslynHelpers
.
StartAsyncUnitAsTask
(
context
.
CancellationToken
)
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
Pokud chcete změnit hodnotu, použijte
<
-.
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
Použijte upcast
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
"
<
-" zum Ändern des Werts verwenden
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
"upcast" verwenden
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
Usar "
<
-" para mutar el valor
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
Usar "upcast"
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
Utiliser '
<
-' pour muter la valeur
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
Utiliser 'upcast'
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
Usare '
<
-' per modificare il valore
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
Usare 'upcast'
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
'
<
-' を使用して値を変換する
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
'upcast' を使用する
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
'
<
-'를 사용하여 값 변경
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
'upcast' 사용
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
Użyj znaku „
<
-” w celu zmodyfikowania wartości
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
Użyj operatora „upcast”
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
Usar '
<
-' para modificar o valor
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
Usar 'upcast'
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
Используйте "
<
-", чтобы изменить значение
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
Используйте "upcast"
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
Değeri değiştirmek için '
<
-' kullan
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
'upcast' kullan
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
使用 "
<
-" 来更改值
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
使用“向上转换”
</target>
...
...
vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf
浏览文件 @
3a3fac20
...
...
@@ -252,6 +252,11 @@
<target
state=
"translated"
>
使用 '
<
-' 來變動值
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseNameof"
>
<source>
Use 'nameof'
</source>
<target
state=
"new"
>
Use 'nameof'
</target>
<note
/>
</trans-unit>
<trans-unit
id=
"UseUpcastKeyword"
>
<source>
Use 'upcast'
</source>
<target
state=
"translated"
>
使用「向上轉型」
</target>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录