Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4967093

Browse files
authored
Make enum cases public (dotnet#5002)
* Make Enum have public cases* simplify* add some tests* Test case
1 parentb328b74 commit4967093

File tree

3 files changed

+73
-5
lines changed

3 files changed

+73
-5
lines changed

‎src/fsharp/IlxGen.fs‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6294,15 +6294,17 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) =
62946294
[for fspecin tycon.AllFieldsAsListdo
62956295

62966296
letuseGenuineField= useGenuineField tycon fspec
6297-
6297+
62986298
// The property (or genuine IL field) is hidden in these circumstances:
62996299
// - secret fields apart from "__value" fields for enums
63006300
// - the representation of the type is hidden
63016301
// - the F# field is hidden by a signature or private declaration
6302-
letisPropHidden=
6303-
((fspec.IsCompilerGenerated&&not tycon.IsEnumTycon)||
6304-
hiddenRepr||
6305-
IsHiddenRecdField eenv.sigToImplRemapInfo(tcref.MakeNestedRecdFieldRef fspec))
6302+
letisPropHidden=
6303+
// Enums always have public cases irrespective of Enum Visibility
6304+
if tycon.IsEnumTyconthenfalse
6305+
else
6306+
(fspec.IsCompilerGenerated|| hiddenRepr||
6307+
IsHiddenRecdField eenv.sigToImplRemapInfo(tcref.MakeNestedRecdFieldRef fspec))
63066308
letilType= GenType cenv.amap m eenvinner.tyenv fspec.FormalType
63076309
letilFieldName= ComputeFieldName tycon fspec
63086310

‎tests/fsharp/core/enum/test.fsx‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// #Conformance #Regression
2+
#if TESTS_AS_APP
3+
moduleCore_enum
4+
#endif
5+
6+
openSystem.Reflection
7+
letfailures= ref[]
8+
9+
letreport_failure(s:string)=
10+
stderr.Write" Failed:"
11+
stderr.WriteLine s
12+
failures:=!failures@[s]
13+
14+
lettest(s:string)b=
15+
stderr.Write(s)
16+
if bthen stderr.WriteLine" Passed"
17+
else report_failure(s)
18+
19+
letcheck s b1 b2= test s(b1= b2)
20+
21+
typeinternalinternalEnum= Red=0| Yellow=1| Blue=2
22+
typepublicpublicEnum= Red=0| Yellow=1| Blue=2
23+
24+
moduleenum=
25+
26+
letAreCasesPublic(t:System.Type)=
27+
letbindingFlags= BindingFlags.Static||| BindingFlags.Public
28+
try
29+
letred= t.GetField("Red", bindingFlags)
30+
letyellow= t.GetField("Yellow", bindingFlags)
31+
letblue= t.GetField("Blue", bindingFlags)
32+
letvalue__= t.GetField("value__", bindingFlags||| BindingFlags.Instance)
33+
34+
if isNull red||not(red.IsPublic)then failwith(sprintf"Type:%s) - Red is not public. All enum cases should always be public" t.FullName)
35+
if isNull yellow||not(yellow.IsPublic)then failwith(sprintf"Type:%s) - Yellow is not public. All enum cases should always be public" t.FullName)
36+
if isNull blue||not(blue.IsPublic)then failwith(sprintf"Type:%s) - Blue is not public. All enum cases should always be public" t.FullName)
37+
if isNull value__||not(value__.IsPublic)then failwith(sprintf"Type:%s) - value__ is not public. value__ should always be public" t.FullName)
38+
true
39+
with_->false
40+
41+
do check"publicEnum"(AreCasesPublic typeof<publicEnum>)true
42+
do check"internalEnum"(AreCasesPublic typeof<internalEnum>)true
43+
44+
45+
#if TESTS_AS_APP
46+
letRUN()=!failures
47+
#else
48+
letaa=
49+
match!failureswith
50+
|[]->
51+
stdout.WriteLine"Test Passed"
52+
System.IO.File.WriteAllText("test.ok","ok")
53+
exit0
54+
|_->
55+
stdout.WriteLine"Test Failed"
56+
exit1
57+
#endif
58+

‎tests/fsharp/tests.fs‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,14 @@ module CoreTests =
237237
[<Test>]
238238
letcsext()= singleTestBuildAndRun"core/csext" FSC_BASIC
239239

240+
241+
[<Test>]
242+
letfscenum()= singleTestBuildAndRun"core/enum" FSC_BASIC
243+
244+
[<Test>]
245+
letfsienum()= singleTestBuildAndRun"core/enum" FSI_BASIC
246+
247+
240248
#if!FSHARP_SUITE_DRIVES_CORECLR_TESTS
241249

242250
[<Test>]

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp