Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
fsharp
提交
8b4c8811
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,发现更多精彩内容 >>
未验证
提交
8b4c8811
编写于
11月 03, 2022
作者:
G
Giannis Ntovas
提交者:
GitHub
11月 03, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Infer string type when using nameof pattern (#14065)
Co-authored-by:
N
Tomas Grosup
<
tomasgrosup@microsoft.com
>
上级
a3cb9950
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
71 addition
and
2 deletion
+71
-2
src/Compiler/Checking/CheckPatterns.fs
src/Compiler/Checking/CheckPatterns.fs
+2
-2
tests/FSharp.Compiler.ComponentTests/Language/NameofTests.fs
tests/FSharp.Compiler.ComponentTests/Language/NameofTests.fs
+69
-0
未找到文件。
src/Compiler/Checking/CheckPatterns.fs
浏览文件 @
8b4c8811
...
...
@@ -555,8 +555,8 @@ and TcPatLongIdentNewDef warnOnUpperForId warnOnUpper (cenv: cenv) env ad valRep
|
[
arg
]
when
g
.
langVersion
.
SupportsFeature
LanguageFeature
.
NameOf
&&
IsNameOf
cenv
env
ad
m
id
->
match
TcNameOfExpr
cenv
env
tpenv
(
ConvSynPatToSynExpr
arg
)
with
|
Expr
.
Const
(
c
,
m
,
_)
->
(
fun
_
->
TPat_const
(
c
,
m
)),
patEnv
|
_
->
failwith
"Impossible: TcNameOfExpr must return an Expr.Const"
|
Expr
.
Const
(
Const
.
String
s
,
m
,
_)
->
TcConstPat
warnOnUpper
cenv
env
vFlags
patEnv
ty
(
SynConst
.
String
(
s
,
SynStringKind
.
Regular
,
m
))
m
|
_
->
failwith
"Impossible: TcNameOfExpr must return an Expr.Const
of type string
"
|
_
->
let
_,
acc
=
TcArgPats
warnOnUpper
cenv
env
vFlags
patEnv
args
...
...
tests/FSharp.Compiler.ComponentTests/Language/NameofTests.fs
浏览文件 @
8b4c8811
...
...
@@ -60,3 +60,72 @@ if actual <> expected then failwith $"Expected nameof({{expected}}) to be '{{exp
|>
withLangVersion50
|>
compileAndRun
|>
shouldSucceed
[<
Fact
>]
let
``nameof() in a pattern should return the correct type``
()
=
let
source
=
$
"""
open Microsoft.FSharp.Reflection
let f x = match x with nameof x -> true | _ -> false
let expected = "
System
.
String
->
System
.
Boolean
"
let elms s = if FSharpType.IsFunction s then
let domain, range = FSharpType.GetFunctionElements s
$"
{{
domain
}}
->
{{
range
}}
"
else
""
let fType = f.GetType()
let actual = elms fType
if actual <> expected then failwith $"
Expected
type
to
be
'
{{
expected
}}
'
,
but
got
'
{{
actual
}}
'
"
"""
Fsx
source
|>
asExe
|>
withLangVersion50
|>
ignoreWarnings
|>
compileAndRun
|>
shouldSucceed
[<
Fact
>]
let
``nameof works for pattern matching of DU case names``
()
=
let
source
=
"""
/// Simplified version of EventStore's API
type RecordedEvent = { EventType: string; Data: string }
/// My concrete type:
type MyEvent =
| A of string
| B of string
let deserialize (e: RecordedEvent) : MyEvent =
printfn "
EventType
is
'
%
s'
" e.EventType
printfn "
Nameof
A
is
'
%
s'
" (nameof A)
printfn "
Nameof
B
is
'
%
s'
" (nameof B)
match e.EventType with
| nameof A -> A e.Data
| nameof B -> B e.Data
| t -> failwithf "
Invalid
EventType
:
'
%
s'
" t
let getData event =
match event with
| A amsg -> amsg
| B bmsg -> bmsg
let re1 = { EventType = nameof A; Data = "
hello
" }
let re2 = { EventType = nameof B; Data = "
world
" }
let a = deserialize re1
let b = deserialize re2
if not((getData a) = re1.Data) then
failwith $"
Record1
mismatch
;;
{
getData
a
}
<>
{
re1
.
Data
}
"
if not((getData b) = re2.Data) then
failwith $"
Record1
mismatch
;;
{
getData
b
}
<>
{
re2
.
Data
}
"
"""
Fsx
source
|>
asExe
|>
withLangVersionPreview
|>
ignoreWarnings
|>
compileAndRun
|>
shouldSucceed
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录