@@ -6666,6 +6666,9 @@ and TcIndexingThen cenv env overallTy mWholeExpr mDot tpenv setInfo synLeftExprO
6666
6666
/// The `GetSlice` method name.
6667
6667
let GetSlice = "GetSlice"
6668
6668
6669
+ /// The `SetSlice` method name.
6670
+ let SetSlice = "SetSlice"
6671
+
6669
6672
/// The `Slice` method name.
6670
6673
let Slice = "Slice"
6671
6674
@@ -6735,35 +6738,35 @@ and TcIndexingThen cenv env overallTy mWholeExpr mDot tpenv setInfo synLeftExprO
6735
6738
6736
6739
let parenthesize synExpr = SynExpr.Paren (synExpr, range0, None, idxRange)
6737
6740
6738
- let tupleIfMultiple expandedIndexArgs =
6739
- match expandedIndexArgs with
6740
- | [arg] -> arg
6741
- | args -> SynExpr.Tuple (false, args, [], idxRange)
6741
+ let tupleIfMultiple decodedIndexArgs expandedIndexArgs =
6742
+ match decodedIndexArgs, expandedIndexArgs with
6743
+ | [IndexArgItem _], [ arg] -> arg
6744
+ | _, args -> SynExpr.Tuple (false, args, [], idxRange)
6742
6745
6743
6746
/// expr1[expr2]
6744
- let mkDelayedIndexedGet indexer =
6747
+ let mkDelayedIndexedGet indexer indexArgs =
6745
6748
[ DelayedDotLookup([ident(indexer, mWholeExpr)], mWholeExpr)
6746
- DelayedApp(ExprAtomicFlag.Atomic, true, synLeftExprOpt, parenthesize (tupleIfMultiple expandedIndexArgs), mWholeExpr) ]
6749
+ DelayedApp(ExprAtomicFlag.Atomic, true, synLeftExprOpt, parenthesize (tupleIfMultiple indexArgs expandedIndexArgs), mWholeExpr) ]
6747
6750
6748
6751
/// expr1[expr2] <- expr3
6749
- let mkDelayedIndexedSet indexer setArg mOfLeftOfSet =
6752
+ let mkDelayedIndexedSet indexer indexArgs setArg mOfLeftOfSet =
6750
6753
[ DelayedDotLookup([ident(indexer, mOfLeftOfSet)], mOfLeftOfSet)
6751
- DelayedApp(ExprAtomicFlag.Atomic, true, synLeftExprOpt, parenthesize (tupleIfMultiple expandedIndexArgs), mOfLeftOfSet)
6754
+ DelayedApp(ExprAtomicFlag.Atomic, true, synLeftExprOpt, parenthesize (tupleIfMultiple indexArgs expandedIndexArgs), mOfLeftOfSet)
6752
6755
MakeDelayedSet(setArg, mWholeExpr) ]
6753
6756
6754
6757
/// expr1[expr2..]
6755
6758
/// expr1[..expr2]
6756
6759
/// expr1[expr2..expr3]
6757
- let mkDelayedGetSlice indexer =
6760
+ let mkDelayedGetSlice indexer indexArgs =
6758
6761
[ DelayedDotLookup([ident(indexer, mWholeExpr)], mWholeExpr)
6759
- DelayedApp(ExprAtomicFlag.Atomic, true, synLeftExprOpt, parenthesize (SynExpr.Tuple (false, expandedIndexArgs, [], idxRange) ), mWholeExpr) ]
6762
+ DelayedApp(ExprAtomicFlag.Atomic, true, synLeftExprOpt, parenthesize (tupleIfMultiple indexArgs expandedIndexArgs), mWholeExpr) ]
6760
6763
6761
6764
/// expr1[expr2..] <- expr3
6762
6765
/// expr1[..expr2] <- expr3
6763
6766
/// expr1[expr2..expr3] <- expr3
6764
- let mkDelayedSetSlice setArg mOfLeftOfSet =
6765
- [ DelayedDotLookup([ident(" SetSlice" , mOfLeftOfSet)], mOfLeftOfSet)
6766
- DelayedApp(ExprAtomicFlag.Atomic, true, synLeftExprOpt, parenthesize (SynExpr.Tuple (false, expandedIndexArgs @ [setArg], [], idxRange )), mOfLeftOfSet) ]
6767
+ let mkDelayedSetSlice indexArgs setArg mOfLeftOfSet =
6768
+ [ DelayedDotLookup([ident(SetSlice, mOfLeftOfSet)], mOfLeftOfSet)
6769
+ DelayedApp(ExprAtomicFlag.Atomic, true, synLeftExprOpt, parenthesize (tupleIfMultiple indexArgs ( expandedIndexArgs @ [setArg])), mOfLeftOfSet) ]
6767
6770
6768
6771
/// Match if we can generate a call to a `Slice` method.
6769
6772
let (|Sliceable|_|) ((indexArgs, setInfo), exprTy) =
@@ -6774,9 +6777,9 @@ and TcIndexingThen cenv env overallTy mWholeExpr mDot tpenv setInfo synLeftExprO
6774
6777
6775
6778
/// Match if the given expression is or is equivalent to System.Int32,
6776
6779
/// ignoring units of measure if present.
6777
- let (|Int32|_|) expr =
6778
- let expr, tpenv = TcExpr cenv (MustEqual (NewInferenceType g)) env tpenv expr
6779
- if typeEquivAux EraseMeasures g (tyOfExpr g expr) g.int32_ty then Some (Int32 (expr, tpenv))
6780
+ let (|Int32|_|) synExpr =
6781
+ let expr, ty, tpenv = TcExprOfUnknownType cenv env tpenv synExpr
6782
+ if typeEquivAux EraseMeasures g ty g.int32_ty then Some (Int32 (expr, tpenv))
6780
6783
else None
6781
6784
6782
6785
match indexArgs with
@@ -6963,36 +6966,38 @@ and TcIndexingThen cenv env overallTy mWholeExpr mDot tpenv setInfo synLeftExprO
6963
6966
let propagateThenTcDelayed tpenv expr exprTy delayed =
6964
6967
PropagateThenTcDelayed cenv overallTy env tpenv mDot (MakeApplicableExprNoFlex cenv expr) exprTy ExprAtomicFlag.Atomic delayed
6965
6968
6966
- match (DecodeIndexArgs cenv indexArgs, setInfo), exprTy with
6969
+ let decodedIndexArgs = DecodeIndexArgs cenv indexArgs
6970
+
6971
+ match (decodedIndexArgs, setInfo), exprTy with
6967
6972
// Look for FSharp.Core array and string indexing/slicing helpers.
6968
6973
| (_, Array) & (ArrayIndexerOrSlicer (path, meth, args), _)
6969
6974
| (_, String) & (StringIndexerOrSlicer (path, meth, args), _) -> tcArrayOrStringIndexing (path, meth, args)
6970
6975
6971
6976
// Look for an indexer property or method, or delay lookup while assuming `Item`.
6972
6977
| (Indexing, Getting), Indexable indexer
6973
6978
| (Indexing, Getting), (Array | Nominal) & PossiblyIndexable indexer ->
6974
- propagateThenTcDelayed tpenv expr exprTy (mkDelayedIndexedGet indexer @ delayed)
6979
+ propagateThenTcDelayed tpenv expr exprTy (mkDelayedIndexedGet indexer decodedIndexArgs @ delayed)
6975
6980
6976
6981
// Look for `GetSlice`.
6977
6982
| (Slicing, Getting), Nominal & GetSliceable slicer ->
6978
- propagateThenTcDelayed tpenv expr exprTy (mkDelayedGetSlice slicer @ delayed)
6983
+ propagateThenTcDelayed tpenv expr exprTy (mkDelayedGetSlice slicer decodedIndexArgs @ delayed)
6979
6984
6980
6985
// In the absence of `GetSlice`, look for `Slice`.
6981
6986
| ((Slicing, Getting), Nominal) & Sliceable (tpenv, expr, exprTy) ->
6982
6987
propagateThenTcDelayed tpenv expr exprTy delayed
6983
6988
6984
6989
// In the immediate absence of either, delay lookup while assuming `GetSlice`.
6985
6990
| (Slicing, Getting), PossiblyGetSliceable slicer ->
6986
- propagateThenTcDelayed tpenv expr exprTy (mkDelayedGetSlice slicer @ delayed)
6991
+ propagateThenTcDelayed tpenv expr exprTy (mkDelayedGetSlice slicer decodedIndexArgs @ delayed)
6987
6992
6988
6993
// Look for an indexer property or method, or delay lookup while assuming `Item`.
6989
6994
| (Indexing, Setting (setArg, mOfLeftOfSet)), Indexable indexer
6990
6995
| (Indexing, Setting (setArg, mOfLeftOfSet)), (Array | Nominal) & PossiblyIndexable indexer ->
6991
- propagateThenTcDelayed tpenv expr exprTy (mkDelayedIndexedSet indexer setArg mOfLeftOfSet @ delayed)
6996
+ propagateThenTcDelayed tpenv expr exprTy (mkDelayedIndexedSet indexer decodedIndexArgs setArg mOfLeftOfSet @ delayed)
6992
6997
6993
6998
// Delay lookup of `SetSlice`.
6994
6999
| (Slicing, Setting (setArg, mOfLeftOfSet)), (Array | Nominal) ->
6995
- propagateThenTcDelayed tpenv expr exprTy (mkDelayedSetSlice setArg mOfLeftOfSet @ delayed)
7000
+ propagateThenTcDelayed tpenv expr exprTy (mkDelayedSetSlice decodedIndexArgs setArg mOfLeftOfSet @ delayed)
6996
7001
6997
7002
| _ ->
6998
7003
// deprecated constrained lookup
0 commit comments