Skip to content

Commit bc8a8f1

Browse files
committed
make things tail-recursive
1 parent a2dc4ee commit bc8a8f1

File tree

3 files changed

+23
-17
lines changed

3 files changed

+23
-17
lines changed

src/Compiler/Checking/Expressions/CheckArrayOrListComputedExpressions.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ open FSharp.Compiler.Syntax
1616

1717
let private tcMixedSequencesWithRanges (cenv: TcFileState) env overallTy tpenv isArray elems m =
1818
let g = cenv.g
19-
let transformedBody = transformMixedListWithRangesToSeqExpr elems m
19+
let transformedBody = insertImplicitYieldsAndYieldBangs elems m
2020

2121
let genCollElemTy = NewInferenceType g
2222
let genCollTy = (if isArray then mkArrayType else mkListTy) g genCollElemTy

src/Compiler/Checking/Expressions/CheckComputationExpressions.fs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,6 +1574,19 @@ let rec TryTranslateComputationExpression
15741574

15751575
let containsRangeExpressions = containsRangeExpressions comp
15761576

1577+
/// Report language feature error for each range expression in a sequence
1578+
let reportRangeExpressionsNotSupported ceenv expr =
1579+
let rec loop exprs =
1580+
match exprs with
1581+
| [] -> ()
1582+
| SynExpr.IndexRange(_, _, _, _, _, m) :: exprs ->
1583+
checkLanguageFeatureAndRecover ceenv.cenv.g.langVersion LanguageFeature.AllowMixedRangesAndValuesInSeqExpressions m
1584+
loop exprs
1585+
| SynExpr.Sequential(_, true, e1, e2, _, _) :: exprs -> loop (e1 :: e2 :: exprs)
1586+
| _ :: exprs -> loop exprs
1587+
1588+
loop [ expr ]
1589+
15771590
if
15781591
ceenv.cenv.g.langVersion.SupportsFeature LanguageFeature.AllowMixedRangesAndValuesInSeqExpressions
15791592
&& containsRangeExpressions
@@ -1591,9 +1604,12 @@ let rec TryTranslateComputationExpression
15911604
// Transform each part to yield/yieldFrom
15921605
let e1Transformed = TransformExprToYieldOrYieldFrom ceenv e1
15931606
// Create a new sequential expression with the transformed parts
1594-
loop e2 (cont << fun e2Transformed -> SynExpr.Sequential(sp, true, e1Transformed, e2Transformed, m, trivia))
1607+
loop
1608+
e2
1609+
(cont
1610+
<< fun e2Transformed -> SynExpr.Sequential(sp, true, e1Transformed, e2Transformed, m, trivia))
15951611
| e -> cont (TransformExprToYieldOrYieldFrom ceenv e)
1596-
1612+
15971613
loop expr id
15981614

15991615
let transformed = transformSequenceWithRanges ceenv comp
@@ -2687,26 +2703,16 @@ and isSimpleExpr ceenv comp =
26872703
| SynExpr.DoBang _ -> false
26882704
| _ -> true
26892705

2690-
/// Report language feature error for each range expression in a sequence
2691-
and reportRangeExpressionsNotSupported ceenv expr =
2692-
match expr with
2693-
| SynExpr.IndexRange(_, _, _, _, _, m) ->
2694-
checkLanguageFeatureAndRecover ceenv.cenv.g.langVersion LanguageFeature.AllowMixedRangesAndValuesInSeqExpressions m
2695-
| SynExpr.Sequential(_, true, e1, e2, _, _) ->
2696-
reportRangeExpressionsNotSupported ceenv e1
2697-
reportRangeExpressionsNotSupported ceenv e2
2698-
| _ -> ()
2699-
27002706
/// Transform a single expression to Yield or YieldFrom based on whether it's a range
27012707
and TransformExprToYieldOrYieldFrom ceenv expr =
27022708
let m = expr.Range
2703-
2709+
27042710
let ``yield!`` rewrittenRange =
27052711
SynExpr.YieldOrReturnFrom((true, false), rewrittenRange, m, { YieldOrReturnFromKeyword = m })
2706-
2712+
27072713
let ``yield`` rewrittenRange =
27082714
SynExpr.YieldOrReturn((true, false), rewrittenRange, m, { YieldOrReturnKeyword = m })
2709-
2715+
27102716
// If there is no YieldFrom defined on the builder, use Yield;
27112717
// create a YieldOrReturn expression and let the CE machinery handle it.
27122718
match RewriteRangeExpr expr with

src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ let TcSequenceExpression (cenv: TcFileState) env tpenv comp (overallTy: OverallT
451451
delayedExpr, tpenv
452452

453453
let private TcMixedSequencesWithRanges cenv env tpenv overallTy elems m =
454-
let transformedBody = transformMixedListWithRangesToSeqExpr elems m
454+
let transformedBody = insertImplicitYieldsAndYieldBangs elems m
455455
TcSequenceExpression cenv env tpenv transformedBody overallTy m
456456

457457
let TcSequenceExpressionEntry (cenv: TcFileState) env (overallTy: OverallTy) tpenv (hasBuilder, comp) m =

0 commit comments

Comments
 (0)