Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
fsharp
提交
142c0345
F
fsharp
项目概览
dotNET Platform
/
fsharp
10 个月 前同步成功
通知
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,体验更适合开发者的 AI 搜索 >>
未验证
提交
142c0345
编写于
1月 15, 2021
作者:
C
Chet Husk
提交者:
GitHub
1月 15, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement walking of Attribute super types to check AttributeUsage (#10834)
上级
83a0acb6
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
39 addition
and
2 deletion
+39
-2
src/fsharp/TypedTreeOps.fs
src/fsharp/TypedTreeOps.fs
+11
-2
tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
...iler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
+1
-0
tests/FSharp.Compiler.ComponentTests/Language/AttributeCheckingTests.fs
...ompiler.ComponentTests/Language/AttributeCheckingTests.fs
+27
-0
未找到文件。
src/fsharp/TypedTreeOps.fs
浏览文件 @
142c0345
...
...
@@ -3013,6 +3013,11 @@ let superOfTycon (g: TcGlobals) (tycon: Tycon) =
|
None
->
g
.
obj_ty
|
Some
ty
->
ty
/// walk a TyconRef's inheritance tree, yielding any parent types as an array
let
supersOfTyconRef
(
tcref
:
TyconRef
)
=
Array
.
unfold
(
fun
(
tcref
:
TyconRef
)
->
match
tcref
.
TypeContents
.
tcaug_super
with
Some
(
TType_app
(
sup
,
_))
->
Some
(
sup
,
sup
)
|
_
->
None
)
tcref
//----------------------------------------------------------------------------
// Detect attributes
//----------------------------------------------------------------------------
...
...
@@ -3119,12 +3124,16 @@ let TryFindTyconRefBoolAttribute g m attribSpec tcref =
|
([
Some
((:?
bool
as
v
)
:
obj
)
],
_)
->
Some
v
|
_
->
None
)
/// Try to find the resolved attributeusage for an type by walking its inheritance tree and picking the correct attribute usage value
let
TryFindAttributeUsageAttribute
g
m
tcref
=
TryBindTyconRefAttribute
g
m
g
.
attrib_AttributeUsageAttribute
tcref
[|
yield
tcref
yield
!
supersOfTyconRef
tcref
|]
|>
Array
.
tryPick
(
fun
tcref
->
TryBindTyconRefAttribute
g
m
g
.
attrib_AttributeUsageAttribute
tcref
(
fun
(_,
named
)
->
named
|>
List
.
tryPick
(
function
(
"AllowMultiple"
,
_,
_,
ILAttribElem
.
Bool
res
)
->
Some
res
|
_
->
None
))
(
fun
(
Attrib
(_,
_,
_,
named
,
_,
_,
_))
->
named
|>
List
.
tryPick
(
function
AttribNamedArg
(
"AllowMultiple"
,
_,
_,
AttribBoolArg
res
)
->
Some
res
|
_
->
None
))
(
fun
(_,
named
)
->
named
|>
List
.
tryPick
(
function
(
"AllowMultiple"
,
Some
((:?
bool
as
res
)
:
obj
))
->
Some
res
|
_
->
None
))
)
/// Try to find a specific attribute on a type definition, where the attribute accepts a string argument.
///
...
...
tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
浏览文件 @
142c0345
...
...
@@ -43,6 +43,7 @@
<Compile
Include=
"ErrorMessages\WrongSyntaxInForLoop.fs"
/>
<Compile
Include=
"ErrorMessages\ConfusingTypeName.fs"
/>
<Compile
Include=
"Language\RegressionTests.fs"
/>
<Compile
Include=
"Language\AttributeCheckingTests.fs"
/>
<Compile
Include=
"Language\XmlComments.fs"
/>
<Compile
Include=
"Language\CompilerDirectiveTests.fs"
/>
<Compile
Include=
"Language\CodeQuotationTests.fs"
/>
...
...
tests/FSharp.Compiler.ComponentTests/Language/AttributeCheckingTests.fs
0 → 100644
浏览文件 @
142c0345
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace
FSharp
.
Compiler
.
ComponentTests
.
AttributeChecking
open
Xunit
open
FSharp
.
Test
.
Utilities
.
Compiler
module
AttributeCheckingTests
=
[<
Fact
>]
let
``attributes check inherited AllowMultiple``
()
=
Fsx
"""
open System
[<AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)>]
type HttpMethodAttribute() = inherit Attribute()
type HttpGetAttribute() = inherit HttpMethodAttribute()
[<HttpGet; HttpGet>] // this shouldn't error like
[<HttpMethod; HttpMethod>] // this doesn't
type C() =
member _.M() = ()
"""
|>
ignoreWarnings
|>
compile
|>
shouldSucceed
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录