Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
fsharp
提交
1013a8d7
F
fsharp
项目概览
dotNET Platform
/
fsharp
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
未验证
提交
1013a8d7
编写于
9月 20, 2020
作者:
D
Don Syme
提交者:
GitHub
9月 20, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10154 from dsyme/no4
fix nameof bug for operators
上级
7e4b03f1
a4270971
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
65 addition
and
56 deletion
+65
-56
src/fsharp/TypeChecker.fs
src/fsharp/TypeChecker.fs
+10
-0
tests/fsharp/core/nameof/preview/test.fsx
tests/fsharp/core/nameof/preview/test.fsx
+55
-56
未找到文件。
src/fsharp/TypeChecker.fs
浏览文件 @
1013a8d7
...
...
@@ -9550,6 +9550,16 @@ and TcNameOfExpr cenv env tpenv (synArg: SynExpr) =
let ad = env.eAccessRights
let result = defaultArg resultOpt (List.last longId)
// Demangle back to source operator name if the lengths in the ranges indicate the
// original source range matches exactly
let result =
if IsMangledOpName result.idText then
let demangled = DecompileOpName result.idText
if demangled.Length = result.idRange.EndColumn - result.idRange.StartColumn then
ident(demangled, result.idRange)
else result
else result
// Nameof resolution resolves to a symbol and in general we make that the same symbol as
// would resolve if the long ident was used as an expression at the given location.
//
tests/fsharp/core/nameof/preview/test.fsx
浏览文件 @
1013a8d7
...
...
@@ -9,10 +9,6 @@ open System
exception
ABC
type
Assert
=
static
member
AreEqual
(
a
,
b
)
=
a
=
b
static
member
Fail
=
raise
(
Exception
(
"Fail"
))
let
failures
=
ref
[]
let
report_failure
(
s
:
string
)
=
...
...
@@ -27,6 +23,9 @@ let test (s : string) b =
let
check
s
b1
b2
=
test
s
(
b1
=
b2
)
type
Assert
=
static
member
AreEqual
msg
(
a
,
b
)
=
check
msg
a
b
;
(
a
=
b
)
type
BasicNameOfTests
()
=
static
let
staticConstant
=
23
...
...
@@ -47,34 +46,34 @@ type BasicNameOfTests() =
static
member
``local variable name lookup``
()
=
let
a
=
0
let
b
=
nameof
a
let
result
=
Assert
.
AreEqual
(
"a"
,
b
)
let
result
=
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"a"
,
b
)
let
c
=
nameof
b
result
||
Assert
.
AreEqual
(
"b"
,
c
)
result
||
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"b"
,
c
)
static
member
``local int function name``
()
=
let
myFunction
x
=
0
*
x
let
result
=
nameof
myFunction
Assert
.
AreEqual
(
"myFunction"
,
result
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"myFunction"
,
result
)
static
member
``local curried function name``
()
=
let
curriedFunction
x
y
=
x
*
y
let
result
=
nameof
curriedFunction
Assert
.
AreEqual
(
"curriedFunction"
,
result
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"curriedFunction"
,
result
)
static
member
``local tupled function name``
()
=
let
tupledFunction
(
x
,
y
)
=
x
*
y
let
result
=
nameof
tupledFunction
Assert
.
AreEqual
(
"tupledFunction"
,
result
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"tupledFunction"
,
result
)
static
member
``local unit function name``
()
=
let
myFunction
()
=
1
let
result
=
nameof
(
myFunction
)
Assert
.
AreEqual
(
"myFunction"
,
result
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"myFunction"
,
result
)
static
member
``local function parameter name``
()
=
let
myFunction
parameter1
=
nameof
parameter1
let
result
=
myFunction
"x"
Assert
.
AreEqual
(
"parameter1"
,
result
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"parameter1"
,
result
)
static
member
``can get name from inside a local function (needs to be let rec)``
()
=
let
rec
myLocalFunction
x
=
...
...
@@ -82,91 +81,91 @@ type BasicNameOfTests() =
nameof
myLocalFunction
+
" "
+
z
.
ToString
()
let
a
=
myLocalFunction
23
let
result
=
Assert
.
AreEqual
(
"myLocalFunction 46"
,
a
)
let
result
=
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"myLocalFunction 46"
,
a
)
let
b
=
myLocalFunction
25
result
||
Assert
.
AreEqual
(
"myLocalFunction 50"
,
b
)
result
||
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"myLocalFunction 50"
,
b
)
static
member
``can get name from inside static member``
()
=
let
b
=
nameof
(
BasicNameOfTests
.
``can get name from inside static member``
)
Assert
.
AreEqual
(
"can get name from inside static member"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"can get name from inside static member"
,
b
)
member
this
.
``can get name from inside instance member``
()
=
let
b
=
nameof
(
this
.
``can get name from inside instance member``
)
Assert
.
AreEqual
(
"can get name from inside instance member"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"can get name from inside instance member"
,
b
)
static
member
``can get name of static member``
()
=
let
b
=
nameof
(
BasicNameOfTests
.
``can get name of static member``
)
Assert
.
AreEqual
(
"can get name of static member"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"can get name of static member"
,
b
)
member
this
.
``can get name of instance member``
()
=
let
b
=
nameof
(
this
.
MemberMethod
)
Assert
.
AreEqual
(
"MemberMethod"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"MemberMethod"
,
b
)
member
this
.
``can get name of instance member via unchecked``
()
=
let
b
=
nameof
(
Unchecked
.
defaultof
<
BasicNameOfTests
>.
MemberMethod
)
Assert
.
AreEqual
(
"MemberMethod"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"MemberMethod"
,
b
)
member
this
.
``can get name of method type parameter``
<
'
TTT
>
()
=
let
b
=
nameof
<
'
TTT
>
Assert
.
AreEqual
(
"TTT"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"TTT"
,
b
)
static
member
``namespace name``
()
=
let
b
=
nameof
(
FSharp
.
Core
)
Assert
.
AreEqual
(
"Core"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"Core"
,
b
)
static
member
``module name``
()
=
let
b
=
nameof
(
FSharp
.
Core
.
Operators
)
Assert
.
AreEqual
(
"Operators"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"Operators"
,
b
)
static
member
``exception name``
()
=
let
b
=
nameof
(
ABC
)
Assert
.
AreEqual
(
"ABC"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"ABC"
,
b
)
static
member
``nested type name 1``
()
=
let
b
=
nameof
(
System
.
Collections
.
Generic
.
List
.
Enumerator
<_>)
Assert
.
AreEqual
(
"Enumerator"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"Enumerator"
,
b
)
static
member
``type name 2``
()
=
let
b
=
nameof
(
System
.
Action
<_>)
Assert
.
AreEqual
(
"Action"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"Action"
,
b
)
static
member
``member function which is defined below``
()
=
let
x
=
BasicNameOfTests
()
let
b
=
nameof
(
x
.
MemberMethodDefinedBelow
)
Assert
.
AreEqual
(
"MemberMethodDefinedBelow"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"MemberMethodDefinedBelow"
,
b
)
member
this
.
MemberMethodDefinedBelow
(
x
,
y
)
=
x
*
y
static
member
``static member function name``
()
=
let
b
=
nameof
(
BasicNameOfTests
.
StaticMethod
)
Assert
.
AreEqual
(
"StaticMethod"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"StaticMethod"
,
b
)
member
this
.
``class member lookup``
()
=
let
b
=
nameof
(
localConstant
)
Assert
.
AreEqual
(
"localConstant"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"localConstant"
,
b
)
static
member
``static property name``
()
=
let
b
=
nameof
(
BasicNameOfTests
.
StaticProperty
)
Assert
.
AreEqual
(
"StaticProperty"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"StaticProperty"
,
b
)
member
this
.
get_XYZ
()
=
1
static
member
``member method starting with get_``
()
=
let
x
=
BasicNameOfTests
()
let
b
=
nameof
(
x
.
get_XYZ
)
Assert
.
AreEqual
(
"get_XYZ"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"get_XYZ"
,
b
)
static
member
get_SXYZ
()
=
1
static
member
``static method starting with get_``
()
=
let
b
=
nameof
(
BasicNameOfTests
.
get_SXYZ
)
Assert
.
AreEqual
(
"get_SXYZ"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"get_SXYZ"
,
b
)
static
member
``nameof local property with encapsulated name``
()
=
let
``local property with encapsulated name and %.f``
=
0
let
b
=
nameof
(
``local property with encapsulated name and %.f``
)
Assert
.
AreEqual
(
"local property with encapsulated name and %.f"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"local property with encapsulated name and %.f"
,
b
)
type
MethodGroupNameOfTests
()
=
member
this
.
MethodGroup
()
=
()
...
...
@@ -178,20 +177,20 @@ type MethodGroupNameOfTests() =
member
this
.
``single argument method group name lookup``
()
=
let
b
=
nameof
(
this
.
MethodGroup
)
Assert
.
AreEqual
(
"MethodGroup"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"MethodGroup"
,
b
)
member
this
.
``multiple argument method group name lookup``
()
=
let
b
=
nameof
(
this
.
MethodGroup1
:
(
float
*
int64
->
_))
Assert
.
AreEqual
(
"MethodGroup1"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"MethodGroup1"
,
b
)
type
FrameworkMethodTests
()
=
member
this
.
``library function name``
()
=
let
b
=
nameof
(
List
.
map
)
Assert
.
AreEqual
(
"map"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"map"
,
b
)
member
this
.
``static class function name``
()
=
let
b
=
nameof
(
System
.
Tuple
.
Create
)
Assert
.
AreEqual
(
"Create"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"Create"
,
b
)
type
CustomUnionType
=
|
OptionA
...
...
@@ -206,22 +205,22 @@ type UnionAndRecordNameOfTests() =
member
this
.
``measure 1``
()
=
let
b
=
nameof
(
Milliquacks
)
Assert
.
AreEqual
(
"Milliquacks"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"Milliquacks"
,
b
)
member
this
.
``record case 1``
()
=
let
sample
=
Unchecked
.
defaultof
<
CustomRecordType
>
let
b
=
nameof
(
sample
.
X
)
let
result
=
Assert
.
AreEqual
(
"X"
,
b
)
let
result
=
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"X"
,
b
)
let
b
=
nameof
(
sample
.
Y
)
result
||
Assert
.
AreEqual
(
"Y"
,
b
)
result
||
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"Y"
,
b
)
member
this
.
``union case 1``
()
=
let
b
=
nameof
(
OptionA
)
Assert
.
AreEqual
(
"OptionA"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"OptionA"
,
b
)
member
this
.
``union case 2``
()
=
let
b
=
nameof
(
OptionB
)
Assert
.
AreEqual
(
"OptionB"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"OptionB"
,
b
)
type
AttributeNameOfTests
()
=
...
...
@@ -230,33 +229,33 @@ type AttributeNameOfTests() =
let
t
=
typeof
<
AttributeNameOfTests
>.
GetMethod
(
"ok in attribute"
)
let
attrs
=
t
.
GetCustomAttributes
(
typeof
<
ObsoleteAttribute
>,
false
)
let
attr
=
attrs
.[
0
]
:?>
ObsoleteAttribute
Assert
.
AreEqual
(
attr
.
Message
,
"test string"
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
attr
.
Message
,
"test string"
)
type
OperatorNameOfTests
()
=
member
this
.
``lookup name of typeof operator``
()
=
let
b
=
nameof
(
typeof
<
int
>)
Assert
.
AreEqual
(
"typeof"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"typeof"
,
b
)
member
this
.
``lookup name of + operator``
()
=
let
b
=
nameof
(+)
Assert
.
AreEqual
(
"+"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"+"
,
b
)
let
b2
=
nameof
(
op_Addition
)
Assert
.
AreEqual
(
"op_Addition"
,
b2
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"op_Addition"
,
b2
)
let
b3
=
nameof
(
FSharp
.
Core
.
Operators
.
(+))
Assert
.
AreEqual
(
"+"
,
b3
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"+"
,
b3
)
let
b4
=
nameof
(
FSharp
.
Core
.
Operators
.
op_Addition
)
Assert
.
AreEqual
(
"op_Addition"
,
b4
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"op_Addition"
,
b4
)
member
this
.
``lookup name of |> operator``
()
=
let
a
=
nameof
(|>)
let
result
=
Assert
.
AreEqual
(
"|>"
,
a
)
let
result
=
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"|>"
,
a
)
let
b
=
nameof
(
op_PipeRight
)
result
||
Assert
.
AreEqual
(
"op_PipeRight"
,
b
)
result
||
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"op_PipeRight"
,
b
)
member
this
.
``lookup name of nameof operator``
()
=
let
b
=
nameof
(
nameof
)
Assert
.
AreEqual
(
"nameof"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"nameof"
,
b
)
type
PatternMatchingOfOperatorNameTests
()
=
member
this
.
Method1
(
i
:
int
)
=
()
...
...
@@ -279,17 +278,17 @@ type NameOfOperatorForGenerics() =
member
this
.
``use it in a generic function``
()
=
let
fullyGeneric
x
=
x
let
b
=
nameof
(
fullyGeneric
)
Assert
.
AreEqual
(
"fullyGeneric"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"fullyGeneric"
,
b
)
member
this
.
``lookup name of a generic class``
()
=
let
b
=
nameof
System
.
Collections
.
Generic
.
List
<
int
>
Assert
.
AreEqual
(
"List"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"List"
,
b
)
type
UserDefinedNameOfTests
()
=
static
member
``user defined nameof should shadow the operator``
()
=
let
nameof
x
=
"test"
+
x
.
ToString
()
let
y
=
nameof
1
Assert
.
AreEqual
(
"test1"
,
y
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"test1"
,
y
)
type
Person
=
{
Name
:
string
...
...
@@ -304,25 +303,25 @@ type GenericClassNameOfTests<'TTT>() =
static
member
``can get name of class type parameter``
()
=
let
b
=
nameof
<
'
TTT
>
Assert
.
AreEqual
(
"TTT"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"TTT"
,
b
)
type
GenericClassNameOfTests2
<[<
Measure
>]
'
TTT
>()
=
static
member
``can get name of class unit of measure type parameter``
()
=
let
b
=
nameof
<
'
TTT
>
Assert
.
AreEqual
(
"TTT"
,
b
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"TTT"
,
b
)
module
RecTest
=
let
rec
[<
Literal
>]
two
=
2
and
twoName
=
nameof
(
two
)
let
``can get name of recursive literal``
()
=
Assert
.
AreEqual
(
"two"
,
twoName
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"two"
,
twoName
)
module
rec
RecTest2
=
let
[<
Literal
>]
two
=
2
let
twoName
=
nameof
(
two
)
let
``can get name of literal in recursive module``
()
=
Assert
.
AreEqual
(
"two"
,
twoName
)
Assert
.
AreEqual
(
"line "
+
string
__
LINE__
)
(
"two"
,
twoName
)
do
test
"local variable name lookup"
(
BasicNameOfTests
.
``local variable name lookup``
()
)
do
test
"local int function name"
(
BasicNameOfTests
.
``local int function name``
()
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录