未验证 提交 7d842a5e 编写于 作者: E Eugene Auduchinok 提交者: GitHub

Use synthetic ranges when rewriting range expressions (#13958)

Co-authored-by: NDon Syme <dsyme@users.noreply.github.com>
Co-authored-by: NTomas Grosup <tomasgrosup@microsoft.com>
Co-authored-by: NDon Syme <donsyme@fastmail.fm>
Co-authored-by: NVlad Zarytovskii <vzaritovsky@hotmail.com>
上级 2178ab35
......@@ -81,10 +81,11 @@ let (|JoinRelation|_|) cenv env (expr: SynExpr) =
| _ -> None
let elimFastIntegerForLoop (spFor, spTo, id, start, dir, finish, innerExpr, m) =
let elimFastIntegerForLoop (spFor, spTo, id, start: SynExpr, dir, finish: SynExpr, innerExpr, m: range) =
let mOp = (unionRanges start.Range finish.Range).MakeSynthetic()
let pseudoEnumExpr =
if dir then mkSynInfix m start ".." finish
else mkSynTrifix m ".. .." start (SynExpr.Const (SynConst.Int32 -1, start.Range)) finish
if dir then mkSynInfix mOp start ".." finish
else mkSynTrifix mOp ".. .." start (SynExpr.Const (SynConst.Int32 -1, mOp)) finish
SynExpr.ForEach (spFor, spTo, SeqExprOnly false, true, mkSynPatVar None id, pseudoEnumExpr, innerExpr, m)
/// Check if a computation or sequence expression is syntactically free of 'yield' (though not yield!)
......
......@@ -6125,10 +6125,12 @@ and RewriteRangeExpr synExpr =
match synExpr with
// a..b..c (parsed as (a..b)..c )
| SynExpr.IndexRange(Some (SynExpr.IndexRange(Some synExpr1, _, Some synStepExpr, _, _, _)), _, Some synExpr2, _m1, _m2, mWhole) ->
let mWhole = mWhole.MakeSynthetic()
Some (mkSynTrifix mWhole ".. .." synExpr1 synStepExpr synExpr2)
// a..b
| SynExpr.IndexRange (Some synExpr1, mOperator, Some synExpr2, _m1, _m2, mWhole) ->
let otherExpr =
let mWhole = mWhole.MakeSynthetic()
match mkSynInfix mOperator synExpr1 ".." synExpr2 with
| SynExpr.App (a, b, c, d, _) -> SynExpr.App (a, b, c, d, mWhole)
| _ -> failwith "impossible"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册