|
672 | 672 | /// F# syntax: lazy expr |
673 | 673 | | Lazy of SynExpr * range: range |
674 | 674 |
|
675 | | - /// Seq(seqPoint, isTrueSeq, e1, e2, m) |
| 675 | + /// Sequential(seqPoint, isTrueSeq, e1, e2, m) |
676 | 676 | /// isTrueSeq: false indicates "let v = a in b; v" |
677 | 677 | /// |
678 | 678 | /// F# syntax: expr; expr |
@@ -750,10 +750,12 @@ and |
750 | 750 | /// Computation expressions only, based on JOIN_IN token from lex filter |
751 | 751 | | JoinIn of SynExpr * range * SynExpr * range: range |
752 | 752 |
|
753 | | - /// F# syntax: <implicit> |
754 | | - /// Computation expressions only, implied by final "do" or "do!" |
| 753 | + /// Used internally during type checking for translating computation expressions. |
755 | 754 | | ImplicitZero of range: range |
756 | 755 |
|
| 756 | + /// Used internally during type checking for translating computation expressions. |
| 757 | + | SequentialOrImplicitYield of seqPoint:SequencePointInfoForSeq * expr1:SynExpr * expr2:SynExpr * ifNotStmt:SynExpr * range:range |
| 758 | + |
757 | 759 | /// F# syntax: yield expr |
758 | 760 | /// F# syntax: return expr |
759 | 761 | /// Computation expressions only |
|
834 | 836 | | SynExpr.TryWith (range=m) |
835 | 837 | | SynExpr.TryFinally (range=m) |
836 | 838 | | SynExpr.Sequential (range=m) |
| 839 | + | SynExpr.SequentialOrImplicitYield (range=m) |
837 | 840 | | SynExpr.ArbitraryAfterError (range=m) |
838 | 841 | | SynExpr.FromParseError (range=m) |
839 | 842 | | SynExpr.DiscardAfterMissingQualificationAfterDot (range=m) |
@@ -873,138 +876,25 @@ and |
873 | 876 | /// range ignoring any (parse error) extra trailing dots |
874 | 877 | member e.RangeSansAnyExtraDot = |
875 | 878 | match e with |
876 | | - | SynExpr.Paren (range=m) |
877 | | - | SynExpr.Quote (range=m) |
878 | | - | SynExpr.Const (range=m) |
879 | | - | SynExpr.Typed (range=m) |
880 | | - | SynExpr.Tuple (range=m) |
881 | | - | SynExpr.ArrayOrList (range=m) |
882 | | - | SynExpr.AnonRecd (range=m) |
883 | | - | SynExpr.Record (range=m) |
884 | | - | SynExpr.New (range=m) |
885 | | - | SynExpr.ObjExpr (range=m) |
886 | | - | SynExpr.While (range=m) |
887 | | - | SynExpr.For (range=m) |
888 | | - | SynExpr.ForEach (range=m) |
889 | | - | SynExpr.CompExpr (range=m) |
890 | | - | SynExpr.ArrayOrListOfSeqExpr (range=m) |
891 | | - | SynExpr.Lambda (range=m) |
892 | | - | SynExpr.Match (range=m) |
893 | | - | SynExpr.MatchLambda (range=m) |
894 | | - | SynExpr.Do (range=m) |
895 | | - | SynExpr.Assert (range=m) |
896 | | - | SynExpr.App (range=m) |
897 | | - | SynExpr.TypeApp (range=m) |
898 | | - | SynExpr.LetOrUse (range=m) |
899 | | - | SynExpr.TryWith (range=m) |
900 | | - | SynExpr.TryFinally (range=m) |
901 | | - | SynExpr.Sequential (range=m) |
902 | | - | SynExpr.ArbitraryAfterError (range=m) |
903 | | - | SynExpr.FromParseError (range=m) |
904 | | - | SynExpr.IfThenElse (range=m) |
905 | | - | SynExpr.LongIdentSet (range=m) |
906 | | - | SynExpr.NamedIndexedPropertySet (range=m) |
907 | | - | SynExpr.DotIndexedGet (range=m) |
908 | | - | SynExpr.DotIndexedSet (range=m) |
909 | | - | SynExpr.DotSet (range=m) |
910 | | - | SynExpr.Set (range=m) |
911 | | - | SynExpr.DotNamedIndexedPropertySet (range=m) |
912 | | - | SynExpr.LibraryOnlyUnionCaseFieldGet (range=m) |
913 | | - | SynExpr.LibraryOnlyUnionCaseFieldSet (range=m) |
914 | | - | SynExpr.LibraryOnlyILAssembly (range=m) |
915 | | - | SynExpr.LibraryOnlyStaticOptimization (range=m) |
916 | | - | SynExpr.TypeTest (range=m) |
917 | | - | SynExpr.Upcast (range=m) |
918 | | - | SynExpr.AddressOf (range=m) |
919 | | - | SynExpr.Downcast (range=m) |
920 | | - | SynExpr.JoinIn (range=m) |
921 | | - | SynExpr.InferredUpcast (range=m) |
922 | | - | SynExpr.InferredDowncast (range=m) |
923 | | - | SynExpr.Null (range=m) |
924 | | - | SynExpr.Lazy (range=m) |
925 | | - | SynExpr.TraitCall (range=m) |
926 | | - | SynExpr.ImplicitZero (range=m) |
927 | | - | SynExpr.YieldOrReturn (range=m) |
928 | | - | SynExpr.YieldOrReturnFrom (range=m) |
929 | | - | SynExpr.LetOrUseBang (range=m) |
930 | | - | SynExpr.MatchBang (range=m) |
931 | | - | SynExpr.DoBang (range=m) -> m |
932 | 879 | | SynExpr.DotGet (expr, _, lidwd, m) -> if lidwd.ThereIsAnExtraDotAtTheEnd then unionRanges expr.Range lidwd.RangeSansAnyExtraDot else m |
933 | 880 | | SynExpr.LongIdent (_, lidwd, _, _) -> lidwd.RangeSansAnyExtraDot |
934 | 881 | | SynExpr.DiscardAfterMissingQualificationAfterDot (expr, _) -> expr.Range |
935 | | - | SynExpr.Fixed (_, m) -> m |
936 | | - | SynExpr.Ident id -> id.idRange |
| 882 | + | _ -> e.Range |
937 | 883 |
|
938 | 884 | /// Attempt to get the range of the first token or initial portion only - this is extremely ad-hoc, just a cheap way to improve a certain 'query custom operation' error range |
939 | 885 | member e.RangeOfFirstPortion = |
940 | 886 | match e with |
941 | | - // haven't bothered making these cases better than just .Range |
942 | | - | SynExpr.Quote (range=m) |
943 | | - | SynExpr.Const (range=m) |
944 | | - | SynExpr.Typed (range=m) |
945 | | - | SynExpr.Tuple (range=m) |
946 | | - | SynExpr.ArrayOrList (range=m) |
947 | | - | SynExpr.AnonRecd (range=m) |
948 | | - | SynExpr.Record (range=m) |
949 | | - | SynExpr.New (range=m) |
950 | | - | SynExpr.ObjExpr (range=m) |
951 | | - | SynExpr.While (range=m) |
952 | | - | SynExpr.For (range=m) |
953 | | - | SynExpr.CompExpr (range=m) |
954 | | - | SynExpr.ArrayOrListOfSeqExpr (range=m) |
955 | | - | SynExpr.Lambda (range=m) |
956 | | - | SynExpr.Match (range=m) |
957 | | - | SynExpr.MatchLambda (range=m) |
958 | | - | SynExpr.Do (range=m) |
959 | | - | SynExpr.Assert (range=m) |
960 | | - | SynExpr.TypeApp (range=m) |
961 | | - | SynExpr.LetOrUse (range=m) |
962 | | - | SynExpr.TryWith (range=m) |
963 | | - | SynExpr.TryFinally (range=m) |
964 | | - | SynExpr.ArbitraryAfterError (range=m) |
965 | | - | SynExpr.FromParseError (range=m) |
966 | | - | SynExpr.DiscardAfterMissingQualificationAfterDot (range=m) |
967 | | - | SynExpr.IfThenElse (range=m) |
968 | | - | SynExpr.LongIdent (range=m) |
969 | | - | SynExpr.LongIdentSet (range=m) |
970 | | - | SynExpr.NamedIndexedPropertySet (range=m) |
971 | | - | SynExpr.DotIndexedGet (range=m) |
972 | | - | SynExpr.DotIndexedSet (range=m) |
973 | | - | SynExpr.DotGet (range=m) |
974 | | - | SynExpr.DotSet (range=m) |
975 | | - | SynExpr.Set (range=m) |
976 | | - | SynExpr.DotNamedIndexedPropertySet (range=m) |
977 | | - | SynExpr.LibraryOnlyUnionCaseFieldGet (range=m) |
978 | | - | SynExpr.LibraryOnlyUnionCaseFieldSet (range=m) |
979 | | - | SynExpr.LibraryOnlyILAssembly (range=m) |
980 | | - | SynExpr.LibraryOnlyStaticOptimization (range=m) |
981 | | - | SynExpr.TypeTest (range=m) |
982 | | - | SynExpr.Upcast (range=m) |
983 | | - | SynExpr.AddressOf (range=m) |
984 | | - | SynExpr.Downcast (range=m) |
985 | | - | SynExpr.JoinIn (range=m) |
986 | | - | SynExpr.InferredUpcast (range=m) |
987 | | - | SynExpr.InferredDowncast (range=m) |
988 | | - | SynExpr.Null (range=m) |
989 | | - | SynExpr.Lazy (range=m) |
990 | | - | SynExpr.TraitCall (range=m) |
991 | | - | SynExpr.ImplicitZero (range=m) |
992 | | - | SynExpr.YieldOrReturn (range=m) |
993 | | - | SynExpr.YieldOrReturnFrom (range=m) |
994 | | - | SynExpr.LetOrUseBang (range=m) |
995 | | - | SynExpr.MatchBang (range=m) |
996 | | - | SynExpr.DoBang (range=m) -> m |
997 | 887 | // these are better than just .Range, and also commonly applicable inside queries |
998 | 888 | | SynExpr.Paren (_, m, _, _) -> m |
999 | 889 | | SynExpr.Sequential (_, _, e1, _, _) |
| 890 | + | SynExpr.SequentialOrImplicitYield (_, e1, _, _, _) |
1000 | 891 | | SynExpr.App (_, _, e1, _, _) -> |
1001 | 892 | e1.RangeOfFirstPortion |
1002 | 893 | | SynExpr.ForEach (_, _, _, pat, _, _, r) -> |
1003 | 894 | let start = r.Start |
1004 | 895 | let e = (pat.Range: range).Start |
1005 | 896 | mkRange r.FileName start e |
1006 | | - | SynExpr.Ident id -> id.idRange |
1007 | | - | SynExpr.Fixed (_, m) -> m |
| 897 | + | _ -> e.Range |
1008 | 898 |
|
1009 | 899 | and |
1010 | 900 | [<NoEquality; NoComparison; RequireQualifiedAccess>] |
@@ -2580,6 +2470,8 @@ let rec synExprContainsError inpExpr = |
2580 | 2470 | walkExpr e1 || walkExpr e2 |
2581 | 2471 | | SynExpr.Sequential (_, _, e1, e2, _) -> |
2582 | 2472 | walkExpr e1 || walkExpr e2 |
| 2473 | + | SynExpr.SequentialOrImplicitYield (_, e1, e2, _, _) -> |
| 2474 | + walkExpr e1 || walkExpr e2 |
2583 | 2475 | | SynExpr.IfThenElse (e1, e2, e3opt, _, _, _, _) -> |
2584 | 2476 | walkExpr e1 || walkExpr e2 || walkExprOpt e3opt |
2585 | 2477 | | SynExpr.DotIndexedGet (e1, es, _, _) -> |
|
0 commit comments