Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/release-notes/.FSharp.Compiler.Service/10.0.100.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
* Use `errorR` instead of `error` in `CheckDeclarations.fs` when possible. ([PR #18645](https://github.com/dotnet/fsharp/pull/18645))
* Parser: Capture named fields block separators. ([PR #18857](https://github.com/dotnet/fsharp/pull/18857))
* Type checker: use inner expr range in upcast constraints errors ([PR #18850](https://github.com/dotnet/fsharp/pull/18850))
* Import `IEnumerable` as `seq`. ([PR #18865](https://github.com/dotnet/fsharp/pull/18865))
* Parser: Capture multiple block separators ([PR #18899](https://github.com/dotnet/fsharp/pull/18899))

### Breaking Changes
Expand Down
49 changes: 26 additions & 23 deletions src/Compiler/TypedTree/TcGlobals.fs
Original file line number Diff line number Diff line change
Expand Up @@ -966,30 +966,33 @@ type TcGlobals(
let mkDebuggerTypeProxyAttribute (ty : ILType) = mkILCustomAttribute (findSysILTypeRef tname_DebuggerTypeProxyAttribute, [ilg.typ_Type], [ILAttribElem.TypeRef (Some ty.TypeRef)], [])

let betterTyconEntries =
[| "Int32" , v_int_tcr
"IntPtr" , v_nativeint_tcr
"UIntPtr" , v_unativeint_tcr
"Int16" , v_int16_tcr
"Int64" , v_int64_tcr
"UInt16" , v_uint16_tcr
"UInt32" , v_uint32_tcr
"UInt64" , v_uint64_tcr
"SByte" , v_sbyte_tcr
"Decimal" , v_decimal_tcr
"Byte" , v_byte_tcr
"Boolean" , v_bool_tcr
"String" , v_string_tcr
"Object" , v_obj_tcr
"Exception", v_exn_tcr
"Char" , v_char_tcr
"Double" , v_float_tcr
"Single" , v_float32_tcr |]
|> Array.map (fun (nm, tcr) ->
[| yield sys, "Int32" , v_int_tcr
yield sys, "IntPtr" , v_nativeint_tcr
yield sys, "UIntPtr" , v_unativeint_tcr
yield sys, "Int16" , v_int16_tcr
yield sys, "Int64" , v_int64_tcr
yield sys, "UInt16" , v_uint16_tcr
yield sys, "UInt32" , v_uint32_tcr
yield sys, "UInt64" , v_uint64_tcr
yield sys, "SByte" , v_sbyte_tcr
yield sys, "Decimal" , v_decimal_tcr
yield sys, "Byte" , v_byte_tcr
yield sys, "Boolean" , v_bool_tcr
yield sys, "String" , v_string_tcr
yield sys, "Object" , v_obj_tcr
yield sys, "Exception", v_exn_tcr
yield sys, "Char" , v_char_tcr
yield sys, "Double" , v_float_tcr
yield sys, "Single" , v_float32_tcr
if not compilingFSharpCore then
yield sysGenerics, "IEnumerable`1", v_seq_tcr |]
|> Array.map (fun (qualifier, nm, tcr) ->
let ty = mkNonGenericTy tcr
nm, findSysTyconRef sys nm, (fun _ nullness ->
match nullness with
| Nullness.Known NullnessInfo.WithoutNull -> ty
| _ -> mkNonGenericTyWithNullness tcr nullness))
nm, findSysTyconRef qualifier nm, (fun typars nullness ->
match typars, nullness with
| [], Nullness.Known NullnessInfo.WithoutNull -> ty
| [], nullness -> mkNonGenericTyWithNullness tcr nullness
| _ -> TType_app(tcr, typars, nullness)))

let decompileTyconEntries =
[|
Expand Down
6 changes: 3 additions & 3 deletions tests/FSharp.Compiler.Service.Tests/EditorTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -130,15 +130,15 @@ let ``GetMethodsAsSymbols should return all overloads of a method as FSharpSymbo
yield ms.Symbol.DisplayName, extractCurriedParams ms ]
|> List.sortBy (fun (_name, parameters) -> parameters.Length, (parameters |> List.map snd ))
let expected =
[("Concat", [("values", "Collections.Generic.IEnumerable<'T>")]);
("Concat", [("values", "Collections.Generic.IEnumerable<string>")]);
[("Concat", [("values", "'T seq")]);
#if NETCOREAPP
("Concat", [("args", "ReadOnlySpan<obj>")]);
("Concat", [("values", "ReadOnlySpan<string>")]);
#endif
("Concat", [("arg0", "obj")]);
("Concat", [("args", "obj array")]);
("Concat", [("values", "string array")]);
("Concat", [("values", "string array")])
("Concat", [("values", "string seq")])
#if NETCOREAPP
("Concat", [("str0", "ReadOnlySpan<char>");("str1", "ReadOnlySpan<char>")]);
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3216,7 +3216,7 @@ let ``Test Project22 IList contents`` () =
set [ for x in ilistTypeDefn.AllInterfaces -> x.TypeDefinition.DisplayName, attribsOfSymbol x.TypeDefinition ]
|> shouldEqual
(set [("IList", ["interface"]); ("ICollection", ["interface"]);
("IEnumerable", ["interface"]); ("IEnumerable", ["interface"])])
("IEnumerable", ["interface"]); ("seq", ["abbrev"])])

arrayTypes |> shouldEqual [|("[]", 1); ("[,,]", 3)|]

Expand Down
14 changes: 14 additions & 0 deletions tests/FSharp.Compiler.Service.Tests/Symbols.fs
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,20 @@ let f2 b1 b2 b3 b4 b5 =
let ``Nullable types`` declaredType formattedType =
let _, checkResults = getParseAndCheckResults $"""
let f (x: {declaredType}) = ()
"""
let symbolUse = findSymbolUseByName "x" checkResults
let symbol = symbolUse.Symbol :?> FSharpMemberOrFunctionOrValue
let typeArg = symbol.FullType
typeArg.Format(symbolUse.DisplayContext) |> shouldEqual formattedType

[<Theory>]
[<InlineData("let x: IEnumerable<int> = []", "IEnumerable<int>")>]
[<InlineData("let x = [1].AsEnumerable()", "int seq")>]
let ``Format IEnumerable`` code formattedType =
let _, checkResults = getParseAndCheckResults $"""
open System.Collections.Generic
open System.Linq
{code}
"""
let symbolUse = findSymbolUseByName "x" checkResults
let symbol = symbolUse.Symbol :?> FSharpMemberOrFunctionOrValue
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ let res8 = abs 5.0<kg>
[
mkDesc
"GroupBy"
"(extension) System.Collections.Generic.IEnumerable.GroupBy<'TSource,'TKey>(keySelector: System.Func<'TSource,'TKey>) : System.Collections.Generic.IEnumerable<IGrouping<'TKey,'TSource>>
"(extension) System.Collections.Generic.IEnumerable.GroupBy<'TSource,'TKey>(keySelector: System.Func<'TSource,'TKey>) : IGrouping<'TKey,'TSource> seq
'TSource is int * string
'TKey is int"
mkDesc
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ let ``Binding linq function doesnt crash`` () =
let code =
$"""
let skip1 elements =
System.Linq.Enumerable.Skip(elements, 1)
System.Linq.Enumerable.Skip(elements, 1).GetEnumerator()
"""

use context = TestContext.CreateWithCode code
Expand All @@ -309,8 +309,8 @@ let skip1 elements =

let expectedCode =
$"""
let skip1 elements : System.Collections.Generic.IEnumerable<'a> =
System.Linq.Enumerable.Skip(elements, 1)
let skip1 elements : System.Collections.Generic.IEnumerator<'a> =
System.Linq.Enumerable.Skip(elements, 1).GetEnumerator()
"""

let resultText = newDoc.GetTextAsync() |> GetTaskResult
Expand All @@ -325,7 +325,7 @@ let ``Handle already existing opens on Linq`` () =
open System

let skip1 elements =
Linq.Enumerable.Skip(elements, 1)
Linq.Enumerable.Skip(elements, 1).GetEnumerator()
"""

use context = TestContext.CreateWithCode code
Expand All @@ -338,8 +338,8 @@ let skip1 elements =
$"""
open System

let skip1 elements : Collections.Generic.IEnumerable<'a> =
Linq.Enumerable.Skip(elements, 1)
let skip1 elements : Collections.Generic.IEnumerator<'a> =
Linq.Enumerable.Skip(elements, 1).GetEnumerator()
"""

let resultText = newDoc.GetTextAsync() |> GetTaskResult
Expand All @@ -355,7 +355,7 @@ open System
open System.Linq

let skip1 elements =
Enumerable.Skip(elements, 1)
Enumerable.Skip(elements, 1).GetEnumerator()
"""

use context = TestContext.CreateWithCode code
Expand All @@ -369,8 +369,37 @@ let skip1 elements =
open System
open System.Linq

let skip1 elements : Collections.Generic.IEnumerable<'a> =
Enumerable.Skip(elements, 1)
let skip1 elements : Collections.Generic.IEnumerator<'a> =
Enumerable.Skip(elements, 1).GetEnumerator()
"""

let resultText = newDoc.GetTextAsync() |> GetTaskResult
Assert.Equal(expectedCode, resultText.ToString())

[<Fact>]
let ``Handle seq`` () =
let symbolName = "skip1"

let code =
$"""
open System

let skip1 elements =
Linq.Enumerable.Skip(elements, 1)
"""

use context = TestContext.CreateWithCode code

let spanStart = code.IndexOf symbolName

let newDoc = tryRefactor code spanStart context (new AddReturnType())

let expectedCode =
$"""
open System

let skip1 elements : 'a seq =
Linq.Enumerable.Skip(elements, 1)
"""

let resultText = newDoc.GetTextAsync() |> GetTaskResult
Expand Down
Loading