Skip to content

Commit c550c88

Browse files
committed
wip
1 parent 976907f commit c550c88

File tree

5 files changed

+72
-44
lines changed

5 files changed

+72
-44
lines changed

src/Compiler/TypedTree/TcGlobals.fs

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ type TcGlobals(
401401
let v_list_tcr_nice = mk_MFCollections_tcref fslibCcu "list`1"
402402
let v_lazy_tcr_nice = mk_MFControl_tcref fslibCcu "Lazy`1"
403403
let v_seq_tcr = mk_MFCollections_tcref fslibCcu "seq`1"
404+
let v_resize_array_tcr = mk_MFCollections_tcref fslibCcu "ResizeArray`1"
404405
let v_format_tcr = mk_MFCore_tcref fslibCcu "PrintfFormat`5"
405406
let v_format4_tcr = mk_MFCore_tcref fslibCcu "PrintfFormat`4"
406407
let v_date_tcr = findSysTyconRef sys "DateTime"
@@ -966,24 +967,27 @@ type TcGlobals(
966967
let mkDebuggerTypeProxyAttribute (ty : ILType) = mkILCustomAttribute (findSysILTypeRef tname_DebuggerTypeProxyAttribute, [ilg.typ_Type], [ILAttribElem.TypeRef (Some ty.TypeRef)], [])
967968

968969
let betterTyconEntries =
969-
[| sys, "Int32" , v_int_tcr
970-
sys, "IntPtr" , v_nativeint_tcr
971-
sys, "UIntPtr" , v_unativeint_tcr
972-
sys, "Int16" , v_int16_tcr
973-
sys, "Int64" , v_int64_tcr
974-
sys, "UInt16" , v_uint16_tcr
975-
sys, "UInt32" , v_uint32_tcr
976-
sys, "UInt64" , v_uint64_tcr
977-
sys, "SByte" , v_sbyte_tcr
978-
sys, "Decimal" , v_decimal_tcr
979-
sys, "Byte" , v_byte_tcr
980-
sys, "Boolean" , v_bool_tcr
981-
sys, "String" , v_string_tcr
982-
sys, "Object" , v_obj_tcr
983-
sys, "Exception" , v_exn_tcr
984-
sys, "Char" , v_char_tcr
985-
sys, "Double" , v_float_tcr
986-
sys, "Single" , v_float32_tcr |]
970+
[| yield sys, "Int32" , v_int_tcr
971+
yield sys, "IntPtr" , v_nativeint_tcr
972+
yield sys, "UIntPtr" , v_unativeint_tcr
973+
yield sys, "Int16" , v_int16_tcr
974+
yield sys, "Int64" , v_int64_tcr
975+
yield sys, "UInt16" , v_uint16_tcr
976+
yield sys, "UInt32" , v_uint32_tcr
977+
yield sys, "UInt64" , v_uint64_tcr
978+
yield sys, "SByte" , v_sbyte_tcr
979+
yield sys, "Decimal" , v_decimal_tcr
980+
yield sys, "Byte" , v_byte_tcr
981+
yield sys, "Boolean" , v_bool_tcr
982+
yield sys, "String" , v_string_tcr
983+
yield sys, "Object" , v_obj_tcr
984+
yield sys, "Exception", v_exn_tcr
985+
yield sys, "Char" , v_char_tcr
986+
yield sys, "Double" , v_float_tcr
987+
yield sys, "Single" , v_float32_tcr
988+
if not compilingFSharpCore then
989+
yield sysGenerics, "IEnumerable`1", v_seq_tcr
990+
yield sysGenerics, "List`1" , v_resize_array_tcr |]
987991
|> Array.map (fun (qualifier, nm, tcr) ->
988992
let ty = mkNonGenericTy tcr
989993
nm, findSysTyconRef qualifier nm, (fun typars nullness ->
@@ -1011,14 +1015,6 @@ type TcGlobals(
10111015
"ValueTuple`8" , v_struct_tuple8_tcr , decodeTupleTyAndNullnessIfPossible v_struct_tuple8_tcr tupInfoStruct |]
10121016

10131017
let betterEntries = Array.append betterTyconEntries decompileTyconEntries
1014-
let betterEntries2 =
1015-
Array.append
1016-
betterEntries
1017-
[| "IEnumerable`1", findSysTyconRef sysGenerics "IEnumerable`1", (fun typars nullness ->
1018-
match typars, nullness with
1019-
| [], Nullness.Known NullnessInfo.WithoutNull -> mkNonGenericTy v_seq_tcr
1020-
| [], nullness -> mkNonGenericTyWithNullness v_seq_tcr nullness
1021-
| _ -> TType_app(v_seq_tcr, typars, nullness)) |]
10221018

10231019
let mutable decompileTypeDict = Unchecked.defaultof<_>
10241020
let mutable betterTypeDict1 = Unchecked.defaultof<_>
@@ -1061,7 +1057,7 @@ type TcGlobals(
10611057
let getBetterTypeDict2 () =
10621058
match box betterTypeDict2 with
10631059
| null ->
1064-
let entries = betterEntries2
1060+
let entries = betterEntries
10651061
let t = Dictionary.newWithSize entries.Length
10661062
for _, tcref, builder in entries do
10671063
if tcref.CanDeref then

tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1488,7 +1488,7 @@ let f () : Task<IList<string>> = task {
14881488
|> shouldFail
14891489
|> withDiagnostics [
14901490
(Error 193, Line 13, Col 12, Line 13, Col 30, "Type constraint mismatch. The type
1491-
'TaskCode<List<'a>,List<'a>>'
1491+
'TaskCode<ResizeArray<'a>,ResizeArray<'a>>'
14921492
is not compatible with type
14931493
'TaskCode<IList<string>,IList<string>>'
14941494
")

tests/FSharp.Compiler.Service.Tests/Symbols.fs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -528,24 +528,27 @@ let f (x: {declaredType}) = ()
528528
typeArg.Format(symbolUse.DisplayContext) |> shouldEqual formattedType
529529

530530
[<Theory>]
531-
[<InlineData("IEnumerable<int>", "IEnumerable<int>")>]
532-
let ``Format explicit IEnumerable as IEnumerable`` declaredType formattedType =
531+
[<InlineData("let x: IEnumerable<int> = []", "IEnumerable<int>")>]
532+
[<InlineData("let x = List<int>()", "List<int>")>]
533+
let ``Format explicit collection type as is`` code formattedType =
533534
let _, checkResults = getParseAndCheckResults $"""
534535
open System.Collections.Generic
535-
let f (x: {declaredType}) = ()
536+
{code}
536537
"""
537538
let symbolUse = findSymbolUseByName "x" checkResults
538539
let symbol = symbolUse.Symbol :?> FSharpMemberOrFunctionOrValue
539540
let typeArg = symbol.FullType
540541
typeArg.Format(symbolUse.DisplayContext) |> shouldEqual formattedType
541542

542543
[<Theory>]
543-
[<InlineData("IEnumerable<int>", "int seq")>]
544-
let ``Format implicit IEnumerable as seq`` declaredType formattedType =
544+
[<InlineData("[1].AsEnumerable()", "int seq")>]
545+
[<InlineData("[1].ToList()", "ResizeArray<int>")>]
546+
let ``Format implicit collection type as a better type`` expression formattedType =
545547
let _, checkResults = getParseAndCheckResults $"""
548+
open System.Collections.Generic
546549
open System.Linq
547550
548-
let x = [1].AsEnumerable()
551+
let x = {expression}
549552
"""
550553
let symbolUse = findSymbolUseByName "x" checkResults
551554
let symbol = symbolUse.Symbol :?> FSharpMemberOrFunctionOrValue

vsintegration/tests/FSharp.Editor.Tests/QuickInfoProviderTests.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ let res8 = abs 5.0<kg>
226226
[
227227
mkDesc
228228
"GroupBy"
229-
"(extension) System.Collections.Generic.IEnumerable.GroupBy<'TSource,'TKey>(keySelector: System.Func<'TSource,'TKey>) : System.Collections.Generic.IEnumerable<IGrouping<'TKey,'TSource>>
229+
"(extension) System.Collections.Generic.IEnumerable.GroupBy<'TSource,'TKey>(keySelector: System.Func<'TSource,'TKey>) : IGrouping<'TKey,'TSource> seq
230230
'TSource is int * string
231231
'TKey is int"
232232
mkDesc

vsintegration/tests/FSharp.Editor.Tests/Refactors/AddReturnTypeTests.fs

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ let ``Binding linq function doesnt crash`` () =
298298
let code =
299299
$"""
300300
let skip1 elements =
301-
System.Linq.Enumerable.Skip(elements, 1)
301+
System.Linq.Enumerable.Skip(elements, 1).GetEnumerator()
302302
"""
303303

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

310310
let expectedCode =
311311
$"""
312-
let skip1 elements : System.Collections.Generic.IEnumerable<'a> =
313-
System.Linq.Enumerable.Skip(elements, 1)
312+
let skip1 elements : System.Collections.Generic.IEnumerator<'a> =
313+
System.Linq.Enumerable.Skip(elements, 1).GetEnumerator()
314314
"""
315315

316316
let resultText = newDoc.GetTextAsync() |> GetTaskResult
@@ -325,7 +325,7 @@ let ``Handle already existing opens on Linq`` () =
325325
open System
326326
327327
let skip1 elements =
328-
Linq.Enumerable.Skip(elements, 1)
328+
Linq.Enumerable.Skip(elements, 1).GetEnumerator()
329329
"""
330330

331331
use context = TestContext.CreateWithCode code
@@ -338,8 +338,8 @@ let skip1 elements =
338338
$"""
339339
open System
340340
341-
let skip1 elements : Collections.Generic.IEnumerable<'a> =
342-
Linq.Enumerable.Skip(elements, 1)
341+
let skip1 elements : Collections.Generic.IEnumerator<'a> =
342+
Linq.Enumerable.Skip(elements, 1).GetEnumerator()
343343
"""
344344

345345
let resultText = newDoc.GetTextAsync() |> GetTaskResult
@@ -355,7 +355,7 @@ open System
355355
open System.Linq
356356
357357
let skip1 elements =
358-
Enumerable.Skip(elements, 1)
358+
Enumerable.Skip(elements, 1).GetEnumerator()
359359
"""
360360

361361
use context = TestContext.CreateWithCode code
@@ -369,8 +369,37 @@ let skip1 elements =
369369
open System
370370
open System.Linq
371371
372-
let skip1 elements : Collections.Generic.IEnumerable<'a> =
373-
Enumerable.Skip(elements, 1)
372+
let skip1 elements : Collections.Generic.IEnumerator<'a> =
373+
Enumerable.Skip(elements, 1).GetEnumerator()
374+
"""
375+
376+
let resultText = newDoc.GetTextAsync() |> GetTaskResult
377+
Assert.Equal(expectedCode, resultText.ToString())
378+
379+
[<Fact>]
380+
let ``Handle seq`` () =
381+
let symbolName = "skip1"
382+
383+
let code =
384+
$"""
385+
open System
386+
387+
let skip1 elements =
388+
Linq.Enumerable.Skip(elements, 1)
389+
"""
390+
391+
use context = TestContext.CreateWithCode code
392+
393+
let spanStart = code.IndexOf symbolName
394+
395+
let newDoc = tryRefactor code spanStart context (new AddReturnType())
396+
397+
let expectedCode =
398+
$"""
399+
open System
400+
401+
let skip1 elements : 'a seq =
402+
Linq.Enumerable.Skip(elements, 1)
374403
"""
375404

376405
let resultText = newDoc.GetTextAsync() |> GetTaskResult

0 commit comments

Comments
 (0)