Skip to content

Commit cc161ad

Browse files
cartermpbaronfel
authored andcommitted
Be very literal about the LangVersion string (#7895)
* Be very literal about the LangVersion string * Skip timing test
1 parent 6c2221f commit cc161ad

File tree

2 files changed

+63
-23
lines changed

2 files changed

+63
-23
lines changed

src/fsharp/LanguageFeatures.fs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@ type LanguageFeature =
2929
| ImplicitYield = 7
3030
| OpenStaticClasses = 8
3131

32-
3332
/// LanguageVersion management
34-
type LanguageVersion (specifiedVersion) =
33+
type LanguageVersion (specifiedVersionAsString) =
3534

3635
// When we increment language versions here preview is higher than current RTM version
3736
static let languageVersion46 = 4.6m
@@ -44,30 +43,34 @@ type LanguageVersion (specifiedVersion) =
4443
static let validOptions = [| "preview"; "default"; "latest"; "latestmajor" |]
4544
static let languageVersions = set [| languageVersion46; languageVersion47 |]
4645

47-
static let features = dict [|
48-
// Add new LanguageVersions here ...
49-
LanguageFeature.LanguageVersion46, languageVersion46
50-
LanguageFeature.LanguageVersion47, languageVersion47
51-
LanguageFeature.PreviewVersion, previewVersion
52-
LanguageFeature.SingleUnderscorePattern, languageVersion47
53-
LanguageFeature.WildCardInForLoop, languageVersion47
54-
LanguageFeature.RelaxWhitespace, languageVersion47
55-
LanguageFeature.NameOf, previewVersion
56-
LanguageFeature.ImplicitYield, languageVersion47
57-
LanguageFeature.OpenStaticClasses, previewVersion
58-
|]
46+
static let features =
47+
dict [
48+
// Add new LanguageVersions here ...
49+
LanguageFeature.LanguageVersion46, languageVersion46
50+
LanguageFeature.LanguageVersion47, languageVersion47
51+
LanguageFeature.PreviewVersion, previewVersion
52+
53+
// F# 4.7
54+
LanguageFeature.SingleUnderscorePattern, languageVersion47
55+
LanguageFeature.WildCardInForLoop, languageVersion47
56+
LanguageFeature.RelaxWhitespace, languageVersion47
57+
LanguageFeature.ImplicitYield, languageVersion47
58+
59+
// Add new Language Features here...
60+
LanguageFeature.NameOf, previewVersion
61+
LanguageFeature.OpenStaticClasses, previewVersion
62+
]
5963

6064
let specified =
61-
match specifiedVersion with
65+
match specifiedVersionAsString with
6266
| "?" -> 0m
6367
| "preview" -> previewVersion
6468
| "default" -> defaultVersion
6569
| "latest" -> latestVersion
6670
| "latestmajor" -> latestMajorVersion
67-
| _ ->
68-
match Decimal.TryParse(specifiedVersion) with
69-
| true, v -> v
70-
| _ -> 0m
71+
| "4.6" -> languageVersion46
72+
| "4.7" -> languageVersion47
73+
| _ -> 0m
7174

7275
/// Check if this feature is supported by the selected langversion
7376
member __.SupportsFeature featureId =
@@ -79,10 +82,7 @@ type LanguageVersion (specifiedVersion) =
7982
member __.ContainsVersion version =
8083
match version with
8184
| "?" | "preview" | "default" | "latest" | "latestmajor" -> true
82-
| _ ->
83-
match Decimal.TryParse(specifiedVersion) with
84-
| true, v -> languageVersions.Contains v
85-
| _ -> false
85+
| _ -> languageVersions.Contains specified
8686

8787
/// Get a list of valid strings for help text
8888
member __.ValidOptions = validOptions

tests/FSharp.Compiler.Private.Scripting.UnitTests/FSharpScriptTests.fs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,43 @@ type InteractiveTests() =
7272
let _result, errors = script.Eval(sprintf "#r \"%s\"" testAssembly)
7373
Assert.AreEqual(1, errors.Length)
7474
Assert.False(foundAssemblyReference)
75+
76+
[<Test>]
77+
member _.``Compilation errors report a specific exception``() =
78+
use script = new FSharpScript()
79+
let result, _errors = script.Eval("abc")
80+
match result with
81+
| Ok(_) -> Assert.Fail("expected a failure")
82+
| Error(ex) -> Assert.IsInstanceOf<FsiCompilationException>(ex)
83+
84+
[<Test>]
85+
member _.``Runtime exceptions are propagated``() =
86+
use script = new FSharpScript()
87+
let result, errors = script.Eval("System.IO.File.ReadAllText(\"not-a-file-path-that-can-be-found-on-disk.txt\")")
88+
Assert.IsEmpty(errors)
89+
match result with
90+
| Ok(_) -> Assert.Fail("expected a failure")
91+
| Error(ex) -> Assert.IsInstanceOf<FileNotFoundException>(ex)
92+
93+
[<Test; Ignore("This timing test fails in different environments. Skipping so that we don't assume an arbitrary CI environment has enough compute/etc. for what we need here.")>]
94+
member _.``Evaluation can be cancelled``() =
95+
use script = new FSharpScript()
96+
let sleepTime = 10000
97+
let mutable result = None
98+
let mutable wasCancelled = false
99+
use tokenSource = new CancellationTokenSource()
100+
let eval () =
101+
try
102+
result <- Some(script.Eval(sprintf "System.Threading.Thread.Sleep(%d)\n2" sleepTime, tokenSource.Token))
103+
// if execution gets here (which it shouldn't), the value `2` will be returned
104+
with
105+
| :? OperationCanceledException -> wasCancelled <- true
106+
let sw = Stopwatch.StartNew()
107+
let evalTask = Task.Run(eval)
108+
// cancel and wait for finish
109+
tokenSource.Cancel()
110+
evalTask.GetAwaiter().GetResult()
111+
// ensure we cancelled and didn't complete the sleep or evaluation
112+
Assert.True(wasCancelled)
113+
Assert.LessOrEqual(sw.ElapsedMilliseconds, sleepTime)
114+
Assert.AreEqual(None, result)

0 commit comments

Comments
 (0)